
	var IE = document.all ? true : false;
	//alert ('Sono in '+IE);
	if (!IE) document.captureEvents(Event.MOUSEMOVE)
	
	//Global Variables
	var basePath = '../../';
	var uri = new Object();
    var myUri = getURL(uri);
	// Temporary variables to hold mouse x-y pos.s
	var mouseX = 0
	var mouseY = 0
	
	function getEventSource(e)
	{
	 	return IE ? e.srcElement : e.target;
	}
	
	document.onmousemove = function moveDecection (e)
	{ 
		getMouseXY(e); 
		moveObject(); 
		checkStructAreas();
		whereAmI();
	}		
			
	function getURL(uri) {
      uri.dir = location.href.substring(0, location.href.lastIndexOf('\/'));
      uri.dom = uri.dir; if (uri.dom.substr(0,7) == 'http:\/\/') uri.dom = uri.dom.substr(7);
      uri.path = ''; var pos = uri.dom.indexOf('\/'); if (pos > -1) {uri.path = uri.dom.substr(pos+1); uri.dom = uri.dom.substr(0,pos);}
      uri.page = location.href.substring(uri.dir.length+1, location.href.length+1);
      pos = uri.page.indexOf('?');if (pos > -1) {uri.page = uri.page.substring(0, pos);}
      pos = uri.page.indexOf('#');if (pos > -1) {uri.page = uri.page.substring(0, pos);}
      uri.ext = ''; pos = uri.page.indexOf('.');if (pos > -1) {uri.ext =uri.page.substring(pos+1); uri.page = uri.page.substr(0,pos);}
      uri.file = uri.page;
      if (uri.ext != '') uri.file += '.' + uri.ext;
      if (uri.file == '') uri.page = 'index';
      uri.args = location.search.substr(1).split("?");
 	       
      var toRoot = uri.path.split("/").length;
      basePath = "";
      for (var i=0;i<toRoot;i++)
      	basePath += "../";
      
      return uri;
   }   			
	
	var a=1;
	// Main function to retrieve mouse x-y pos.s
	
	function getMouseXY(e) {
		  if (IE) { 			 
		    mouseX = event.clientX + document.body.scrollLeft;
		    mouseY = event.clientY + document.body.scrollTop;		    
		  } else {  
		    mouseX = e.pageX;
		    mouseY = e.pageY;
		  }  
		  // catch possible negative values in NS4
		  if (mouseX < 0){mouseX = 0;}
		  if (mouseY < 0){mouseY = 0;}
		  
		  //document.getElementById('tempo').value = mouseX + '-' + mouseY;
		    		  
		  return true
	}
	
	function findPosX(obj)
	{
	    var curleft = 0;
	    if(obj.offsetParent)
	        while(1) 
	        {
	          curleft += obj.offsetLeft;
	          if(!obj.offsetParent)
	            break;
	          obj = obj.offsetParent;
	        }
	    else if(obj.x)
	        curleft += obj.x;
	    return curleft;
	}

	function findPosY(obj)
	{
	    var curtop = 0;
	    if(obj.offsetParent)
	        while(1)
	        {
	          curtop += obj.offsetTop;
	          if(!obj.offsetParent)
	            break;
	          obj = obj.offsetParent;
	        }
	    else if(obj.y)
	        curtop += obj.y;
	    return curtop;
	}
  
  function changeHref(url){
  	document.location.href = url;
  }
  
  //******************** GESTIONE DEL MENU ****************************/
  
  function showSubmenu(container,id){
	  /*
  	var opa = mimeGetOpacity(id);
  	//In explorer l'opacità massima è 100
  	if ( IE && (opa != 100) )
  		mimeFade(id,0,100,100); 
  	else
  	 if (opa != 1) //negli altri l'opacità massima è 1
  	   mimeFade(id,0,100,100);*/
	  
	var obj = document.getElementById(id);
	/*
	if (obj.parentNode.tagName == 'LI')
		container.removeChild(obj);
	
	document.body.appendChild(obj);
				
	var posX = findPosX(container);
	var posY = findPosY(container) + 25;
			
	obj.style.position = 'absolute';
	obj.style.top 	= posY + "px";
	obj.style.left 	= posX + "px";
	*/
	obj.style.width = "150px";
	obj.style.zIndex = 200;
	
	obj.style.display = 'block';
  }
  
  function hideSubmenu(obj){
	  //var cY = obj.style.top;
	  //var cX = obj.style.left;	 
	  //setTimeout ("hideShowId('"+obj.id+"')",4000);
  	  obj.style.display = 'none';
  }
   
  
  //******************** FUNZIONI SU ARRAY ****************************/
  
  function in_array(v,a){
      for(key in a){
         if(a[key]==v) return true
      }
      return false
   }
     
   function valueDelete(v,a){
   		var temp = new Array();   		
   		for (var i = 0, limit = a.length; i < limit; i++){
   			if (a[i] != v)
   				temp.push(a[i]);
   		}   		
   		return temp;
   }
   
   function unset(k,a){
   		var keys = array_keys(a);
   		var temp = new Array();
   		var lim = keys.length;
   		for (var i=0; i< lim; i++){
   		  if (keys[i] != k)
   			temp[keys[i]] = a[keys[i]];
   		}
   		return temp;
   }
   
   function array_keys(ary) {
		  var temp_arr = new Array();		  
		  for (var i in ary)
		  	temp_arr.push(i);		  			
		return temp_arr;
	}


//************** FUNZIONI SUGLI ALBERI *******************/

function treeCollapsing(id){
    var obj = document.getElementById(id);    
    obj.className = (obj.className == 'minus') ? 'plus' : 'minus';   
        
    var tRow = obj.parentNode;
    var referenceChildren = tRow.childNodes.length;
    var tBody = obj.parentNode.parentNode;       
        
    for (i=1;i<tBody.childNodes.length;i++) {
        var child = tBody.childNodes[i];
        if (found)
          if (child.childNodes.length > referenceChildren)
            hideShow (child);
          else
            if (child.childNodes.length == referenceChildren)
              break;
        //If current row is the row of the ID of selected TD
        if (child.id == tRow.id) var found = true;                  
    }                 
}

function hideShow(obj){
    obj.style.display = (obj.style.display == 'none') ? 'block' : 'none';
}
function hideShowId(id){
	var obj = document.getElementById(id);
	hideShow(obj);
}

function switchClass (obj,c1,c2){
	obj.className = (obj.className == c1) ? c2 : c1; 
}
//Da migliorare
function openMenu(id){
	hideShowId(id);
	//var element = document.getElementById(id);
	
	//var children = element.childNodes.length;
	//var newHeight = 17*children; 			
	//element.tween('height', newHeight);			
}

function initializeMenu(){
	var list = document.getElementsByTagName('UL');
	for (var i = 0, limit = list.length; i < limit; i++)
		if (list[i].className == "adminMenu") {
			list[i].fade(0);
			list[i].tween('height', 0);
		}
}

function masterNotifier(mex){
    var obj = document.getElementById('masterNotifier');    
    obj.innerHTML.replace('[[notifier]]',mex);
    obj.style.display = 'block';    
}

var lastMessageId = null;
function manageMessagePreview(object,text,id){
    var obj = document.getElementById('previewMessage');        
    if ((obj.style.height == '80px') && (id == lastMessageId)) {
        bytefx.size(obj,{width:450,height:20},10)
        obj.innerHTML = "Messaggio Vuoto";        
    }
    else  {
        obj.innerHTML = '<b>'+object.replace("\'","'")+'</b><p style="padding-left:5px;">'+text.replace("\'","'")+'</p>';
        bytefx.size(obj,{width:450,height:80},10)
    }
    lastMessageId = id;
}

	function buildTimeImg(vector){
		var l = vector.length;
		var code = "";
		for (var i=0;i<l;i++)
			code += '<img src="'+basePath+'/library/javascript/numbers/'+vector[i]+'.png" >';
		return code;
	}

//Clock Section
function masterClock() {
    day = new Date();
    hrNow = day.getHours();
    mnNow = day.getMinutes();	
    scNow = day.getSeconds();
    miNow = day.getTime();   
    yeNow = day.getFullYear();
    moNow = day.getMonth()+1;
    daNow = day.getDate();
    
    mnNow = (mnNow < 10) ? "0" + mnNow : mnNow;  
    hrNow = (hrNow < 10) ? "0" + hrNow : hrNow;
    daNow = (daNow < 10) ? "0" + daNow : daNow;
    
    moNow = (moNow < 10) ? "0" + moNow : moNow;
    
    var day = new Array();
    day[0] = 'w' + daNow.toString().substring(0,1);
    day[1] = 'w' + daNow.toString().substring(1,2);
    var dayImg = buildTimeImg(day);
    
    var month = new Array();
    month[0] = 'w' + moNow.toString().substring (0,1);
    month[1] = 'w' + moNow.toString().substring (1,2);
    var monthImg = buildTimeImg(month);
    
    var h = new Array();
    h[0] = 'w' + hrNow.toString().substring (0,1);
    h[1] = 'w' + hrNow.toString().substring (1,2);
    var hImg = buildTimeImg(h);
    
    var m = new Array();
    m[0] = 'w' + mnNow.toString().substring (0,1);
    m[1] = 'w' + mnNow.toString().substring (1,2);
    var mImg = buildTimeImg(m);
      
        
    var div = '<img src="'+basePath+'/library/javascript/numbers/wDiv.gif" >';
    var slash = '<img src="'+basePath+'/library/javascript/numbers/wSlash.png" >';
    
    time = hImg + div + mImg;
    document.getElementById('masterclock').innerHTML = time+"&nbsp;&nbsp;"+dayImg+slash+monthImg;           
    
    self.status = time;
    setTimeout('masterClock()',60000);
}

//***********************************************************//
//Sezione per la gestione del Layout Grafico e Contenuti
//***********************************************************//
	//Variabili GLOBALI
	var draggingObject = null;
	var offsetX = null;
	var offsetY = null;
	var blockArea = null;
	var previewArea = null;
	//var totalBlockList = null;
	var sectionArea = new Array(); //Contiene gli oggetti Drop Area delle sezioni
	var sectionAreaStyle = new Array(); //Contiene lo stile originale del DIV Section. Utile per ripristinarlo all'occorrenza	
	//var sectionAreaBlock = new Array(); //Contiene l'elenco dei blocchi droppati o già presenti in quella sezione
	var notInsertedBlock = new Array(); //Contiene gli oggetti blocchi non ancora inseriti 
	var insertedBlock = new Array(); //Contiene gli oggetti blocchi già inseriti
	var structName = null; //Conterrà il nome della struttura corrente. Es. body01
	var scrollOffset = 0; //Conterrà il valore di quanto ho scrollato l'elenco dei blocchi.
	
	//******************* GESTIONE OGGETTI DRAG E DROP **************************//
	
	function sectionStyle(border,background){
		this.border = border;
		this.background = background;
	}
	
	//Generico Oggetto Drop Area caratterizzato ad un ID e dalle coordinate di inizio e fine
	function dropArea(id,x,y,x2,y2){			 
		this.id = id;
		this.x1 = x;
		this.y1 = y;
		this.x2 = x2;
		if (IE) {
		   scrOfY = document.documentElement.scrollTop;
		   y2 = y2 - scrOfY;
		}		
		this.y2 = y2;
	}
		
	
	//Questo metodo trasforma un oggetto DOM in un oggetto Area Droppabile
	function objToDropArea(obj){
		//alert (obj);	
		//Senza ID non posso creare un oggetto DROPAREA
		if ( (obj==null) || (obj.id == null)) return false;	
		var x1 = findPosX(obj);
		var y1 = findPosY(obj);		
		var x2 = obj.offsetWidth + x1;
		var y2 = obj.offsetHeight + y1;				
		
		//Correggo con un padding, i problemi di sbordatura in basso
		obj.style.paddingBottom = '5px';
		
		return new dropArea(obj.id,x1,y1,x2,y2);		
	}
	
	//Questo metodo trasforma un oggetto DOM un un oggetto Area Droppabile. Si aspetta un ID.
	function idToDropArea(id){	    		
		var obj = document.getElementById(id);			
		var ovj = objToDropArea(obj);		
		return ovj;
	}
	
	//Ritorna true se il mouse si trova sopra l'area passata
	function checkOver(area){	    
		if ( (mouseX > area.x1) && (mouseX < area.x2) &&
			 (mouseY > area.y1) && (mouseY < area.y2) )
			 return true; 
		return false;	 
	}
	
	//*********************** GESTIONE OGGETTI BLOCCO ************************//
			
	//Prototipo di oggetto Javascript che mi gestisce un singolo blocco
	//del moduli che trascinerò dentro la struttura
	function moduleBlock(id,name,module,idmodule,position,theme,header,footer){
		this.name = name;
		this.module = module;
		this.idmodule = idmodule;
		this.id = id;
		this.position = position;
		this.theme = theme;
		header = (header == "") ? 1 : header;
		this.viewHeader = header;
		footer = (footer == "") ? 1 : footer;
		this.viewFooter = footer;
	}
	
	function drawBlock(block){
		var code = '<div id="block_'+block.id+'" class="moduleBlock" onMouseDown="makeAdoption(this,event);" onMouseUp="releaseDrag();"><div class="moduleBlockInternal"><div class="moduleTitle">#'+block.id+' - '+block.module+'</div><div class="moduleName">'+data.name+'</div></div></div>';
		return code;
	}
			
	function structureObject(name,code,style){
		this.name = name;
		this.code = code;
		this.style = style;
	}
	
	
	//*********************** GESTIONE GENERICHE ************************//
	
	//Funzione generale per disegnare la preview richiamata SOLO quando clicco sull'icona
	//della struttura. Richiamo al drawStructure dopo aver fatto il merge dei vettori
	//che tengono conto dei blocchi
	function putCodeContent (name){
		//Riscrivo il nome della struttura corrente		
		structName = name;
		//Se cambio completamente la struttura della pagina per farne una nuova
		//allora l'elenco dei blocchi deve comprendere tutti i blocchi, compresi quelli
		//che in origine erano già stati inseriti nella pagina. Faccio quindi un merge
		//e svuoto l'array dei blocchi inseriti per poi ridisegnare l'area dell'elenco blocchi		
		notInsertedBlock = notInsertedBlock.concat(insertedBlock);
		insertedBlock = new Array();		
		redrawBlockArea();
		//Dato che se arrivo qua vuol dire che sto ristrutturando
		//devo azzerare il vettore delle aree che verrà ricreato
		//al richiamo della DrawStructure
		sectionAreaBlock = new Array();
		//Richiamo chi disegna effettivamente il codice di preview
		drawStructure(name);						
	}			
	
	//Funzione che recupera codice e style dall'oggetto struttura javascript
	//e lo inserisce all'interno del DIV di preview
	function drawStructure(name){
		//Recupero il DIV che contiene l'anteprima della pagina
		var obj = document.getElementById('previewPageStructure');		
		//Cancello ciò che c'è dentro
		obj.innerHTML = '';
				
		var code = document.getElementById('code_'+name);				
		var temp = document.createElement('DIV');
		temp.id = 'supportDIV';
		temp.style.width = '100%';
		temp.innerHTML = code.innerHTML.replace(/backup_/g,'preview_');		
		temp.style.display = '';
		obj.appendChild(temp);			
		//Recupero tutte le sezioni dell'area corrente			
		checkSectionArea(name);	
	}
	
	//Ricerco tramite espressione regolare, tutti i DIV che hanno come ID preview_sectionXX
	//Mi serve per conoscere le aree sensibili
	function checkSectionArea(name){			 		
		var structure = document.getElementById('previewPageStructure').innerHTML;		
		var myregexp = eval ("/"+name+"_preview_section[0-9]{2}/g");			
		var matching = structure.match(myregexp);		
		sectionArea = new Array();	
		sectionStyleArea = new Array();		
		for (var i = 0, limit = matching.length; i < limit; i++){					
			sectionArea.push(idToDropArea(matching[i]));			
			var obj = document.getElementById(matching[i]);
			sectionStyleArea[matching[i]] = new sectionStyle(obj.style.border,obj.style.backgroundColor);			
			//Le sezioni contenenti blocchi, vengono già inizializzati
			//ma le sezioni vuote no quindi devo inizializzarle a mano
			//controllando che non sia già stata inizializzata
			if (sectionAreaBlock[matching[i]] == null)
				sectionAreaBlock[matching[i]] = new Array(); //Inizializzo a ZERO il vettore dei blocchi			
		}				
	}
	
	//Metodo che compie una inizializzazione iniziale per visualizzare
	//La struttura della pagina all'apertura della pagina
	function inizializeComponent(structname){				
		structName = structname;	
		checkStructAreas();
		//Metto il codice della pagina
		drawStructure(structName);
				
		//Recupero le sezioni leggendo le chiavi dell'array delle sezioni
		var sections = array_keys(sectionAreaBlock);
		var limit = sections.length;		
		for (var i=0; i < limit; i++){
			//Section conterrà l'ID della sezione, es: body01_preview_section01
			var sectionID = sections[i];	
			//Cerco il DIV della preview per la sezione in cui andrà il blocchetto
			var sectionDIV = document.getElementById(sectionID);
			//Recupero il blocchetto che in questo preciso momento è a destra nell'elenco
			var blocksID = array_keys (sectionAreaBlock[sectionID]);
			var lim2 = blocksID.length;
			//Scorro l'elenco dei blocchi di quella sezione e faccio adottare al DIV, i DIV dei blocchi
			for (var j=0; j < lim2; j++){
				//sectionArrayBlock è un array associativo avente per chiave, l'ID del blocco				
				var block = document.getElementById(blocksID[j]);
			 	//Faccio adottare il blocco dalla sezione in modo tale che scompaia dall'elenco dei blocchi
				//da inserire e compaia giustamente nella preview
				sectionDIV.appendChild(makeBlockAppendable(block));				
			}			 				
			//Dato che aggiungere un blocco al DIV, ne aumenta l'altezza
			//Aggiorno il dato per avere l'altezza effettiva
			//Avendo però solo l'ID della sezione, devo andare a trovarlo
			//nell'elenco degli oggetti SECTION DROP AREA
			var lim2 = sectionArea.length;
			for (var j=0; j < lim2; j++){
				var area = sectionArea[j];
				if (area.id == sectionID)
				  sectionArea[j] = idToDropArea(area.id);	
			}						
		}		
	}
	
	//***********************************************************//
	//******   Metodo che viene richiamato se droppo un blocco  *//
	//***********************************************************//
	function releaseDrag(e){		
		//L'iconcina del Layout apre la finestra con un click
		//devo però catturare l'evento per evitare che il sistema
		//pensi che in realtà voglia spostare il blocco
		if (getEventSource(e).tagName == 'IMG') return;
			
		//Controllo se ho droppato sopra la BlockArea
		if (checkOver(blockArea)) {
			//Se sto trascinando un blocco dalla pagina all'elenco, allora lo devo
			//aggiungere all'elenco dei blocchi non inseriti e toglierlo da quello degli
			//inseriti
			if (!in_array(draggingObject.id,notInsertedBlock)) {
				//Aggiungo il blocco all'elenco dei blocchi non inseriti
				notInsertedBlock.push(draggingObject.id);
				//Tolgo il blocco all'elenco dei blocchi inseriti
				insertedBlock = valueDelete (draggingObject.id,insertedBlock);				
				removeAssociation(draggingObject.id);														
			}
			//Ridisegno i blocchi dentro il DIV dell'elenco dei blocchi
			redrawBlockArea();			
		}
		
		//Controllo se droppo sopra la Preview Area
		if (checkOver(previewArea)) {			
			for (var i = 0, limit = sectionArea.length; i < limit; i++){
				//Vero se ho droppato sopra un DIV marcato SECTIONXX
				if (checkOver(sectionArea[i])) {				
					var section = document.getElementById(sectionArea[i].id);
					section.appendChild(makeBlockAppendable(draggingObject));	
					//section.style.height = (section.style.height + draggingObject.style.height) + "px";									
					//Aggiungo il blocco all'elenco dei blocchi inseriti
					insertedBlock = valueDelete (draggingObject.id,insertedBlock);
					insertedBlock.push(draggingObject.id);
					//Tolgo il blocco all'elenco dei blocchi non ancora inseriti
					notInsertedBlock = valueDelete (draggingObject.id,notInsertedBlock);					
					//Dato che aggiungere un blocco al DIV, ne aumenta l'altezza
					//Aggiorno il dato per avere l'altezza effettiva					
					//sectionArea[i] = idToDropArea(sectionArea[i].id);
					
					var supportBlock = getBlock(totalBlockList,draggingObject.id);
					//Tolgo il blocco dalla sezione precedente nel caso si trovi già in una sezione
					//Utile se per esempio sposto un blocco dalla sectionX alla sectionY. Devo togliere
					//il blocco dalla sectionX prima di aggiungerlo alla sectionY															
					for (var section in sectionAreaBlock) {
						sectionAreaBlock[section] = unset ('block_'+supportBlock.id,sectionAreaBlock[section]);
					}
					//Aggiungo nel vettore della sezione, l'oggetto BLOCCO spostato prendendolo
					//dal vettore di tutti i blocchi										
					sectionAreaBlock[sectionArea[i].id]['block_'+supportBlock.id] = supportBlock;
					
					//Ogni volta che faccio un drop su una sezione, devo controllare l'ordine dei blocchi
					//per aggiornare il parametro position dentro all'oggetto block					
					checkBlockPosition(sectionArea[i].id);
													
					checkSectionArea(structName);
					
					break;					 
				}					
			}		
		}
			
		//Cancello l'oggetto corrente in drag
		draggingObject = null;				
	}		
	
	//Controlla la posizione dei blocchi all'interno della sezione per poter 
	//impostare il valore POSITION dentro il blocco
	function checkBlockPosition(sectionID){
		var area = document.getElementById(sectionID);
		var lim = area.childNodes.length;
			for (var j=1; j < lim; j++){
				var blockDIV = area.childNodes[j];				
				var blockObject = getBlock(sectionAreaBlock[sectionID],blockDIV.id);				
				blockObject.position = j;																					
			}		
	} 
	
		
	//Questo metodo effettua alcuni cambiamenti agli attributi del blocco
	//per permettergli di essere adottato da un DIV dopo essere stato solitamente nel BODY
	//Se un blocco è figlio di BODY, ha posizionamento assoluto
	//Se un blocco è figlio di un DIV, ha posizioanemnto relativo con 0 offset
	function makeBlockAppendable(block){
		 block.parentNode.removeChild(block);
		 block.style.position = "relative";
		 block.style.left = "0px";
		 block.style.top = "0px";
		 block.style.width = "98%";
		 return block;
	}
	
	//Funzione che ridisegna l'elenco dei blocchi utilizzando la lista dei blocchi
	//NON ancora inseriti.
	function redrawBlockArea(){				
		var limit = notInsertedBlock.length;		
		var block = null;
		for (var i=0; i < limit; i++) {
		  //Qui recupero l'oggetto DIV del blocco
		  //che però non contiene dentro di se le info
		  block = document.getElementById(notInsertedBlock[i]);		  		 		  	
		  if (block == null) continue;	  
		  block = makeBlockAppendable (block);	
		  //Le devo quindi andare a pescare dal vettore con gli oggetti
		  //Nello specifico mi serve l'id del modulo di appartenenza		   		  
		  var blockObject = totalBlockList[notInsertedBlock[i]];
		  var blockListArea = document.getElementById('blockContainer_'+blockObject.idmodule);	  		  
		  blockListArea.appendChild (block);		  
		}		  				
	}
	
	//Questo metodo serve per evitare che i blocchi che si spostano
	//rimangano confinati nel DIV di partenza. 	
	//Per evitare ciò, viene fatto adottare dal body
	function makeAdoption(obj,e){			
		if (getEventSource(e).tagName == 'IMG') return;
		hideInfoContainer (obj.id.replace('block_',''));		
		var cm = -1;
		
		if (in_array(obj.id,insertedBlock)) {
			//var blockListContainer = document.getElementById('blocklist');
			//blockListContainer.scrollTop = 0;		
			scrollOffset = 0;
			var cm = 1;
		}
				
		var x = findPosX(obj);
		var y = findPosY(obj) + (scrollOffset * cm);
		//Trovo l'offset tra la posizione del blocco e quella del mouse
		//al momento del click
		offsetX = mouseX-x;
		offsetY = mouseY-y;
	
	    obj.parentNode.removeChild(obj);
	    obj.style.width = "150px";
	    var body = document.body;
		//lo faccio adottare dal body			
		body.appendChild(obj);
	    //tolgo il blocco dal proprio padre	    
		obj.style.position = 'absolute';
		obj.style.left = x + "px";
		obj.style.top = y + "px";
		draggingObject = obj;		//INSERISCO IL DIV BLOCCO NELLA VARIABILE TEMPORANEA				
	}
	
	//Sposto l'oggetto nella posizione del mouse sommato all'offset calcolato al
	//momento del click sul blocco
	function moveObject(){
		if (draggingObject == null) return;
		draggingObject.style.left = (mouseX-offsetX) + "px";
		draggingObject.style.top = (mouseY-offsetY) + "px";
	}	
	
	//Questo metodo ricerca nella pagina i DIV per la gestione delle struttura
	//e prende traccia della loro posizione per poter gestire il DROP dei blocchi	
	function checkStructAreas(){
		//Creo un Area droppabile per il BlockList
		var blockList = document.getElementById('blocklist');
		if (blockList == null) return;					
		blockArea = objToDropArea(blockList);
		//Creo un Area droppabile per la Preview
		var area = document.getElementById('previewPageStructure');
		if (area == null) return;				
		previewArea  = objToDropArea(area);								
	}		
	
	
	//Funzione che controlla se il mouse si trova sopra una section
	//mentre ancora sta tenendo il blocco sospeso	
	function whereAmI(){
		for (var i = 0, limit = sectionArea.length; i < limit; i++) {
			var section = document.getElementById(sectionArea[i].id);
			if (checkOver(sectionArea[i])) {													
				section.style.border = "2px solid blue";					
			}
			else
				section.style.border = "1px dotted gray";
		}
	}
			
	
	
	//Funzione che toglie uno dei token IDSECTION-IDBLOCK dal vettore che ne tiene traccia
	//Viene richiamata quando un blocco viene spostato dalla preview all'elenco dei blocchi
	//Oppure quando viene cliccato la X di chiusura sul blocco stesso
	function removeAssociation(blockID){
		var sectionsIDS = array_keys(sectionAreaBlock);		
		var limit = sectionsIDS.length;
		for (var i=0; i < limit; i++){
			var blocksInside = array_keys(sectionAreaBlock[sectionsIDS[i]]);
			if (in_array(blockID,blocksInside))
				sectionAreaBlock[sectionsIDS[i]] = unset (blockID,sectionAreaBlock[sectionsIDS[i]]);
		}
	}		
		
	//Restituisce l'oggetto BLOCK contenuto nell'array passato
	function getBlock(sourceArray,blockID){
		var keys = array_keys(sourceArray);
		var lim = keys.length;
		for (var i=0; i < lim; i++) {			
			if (keys[i] == blockID)
				return sourceArray[keys[i]];
		}
		return false;
	}
	
	
	//Metodo richiamato se premo la X sul blocco
	//Indipendentemente da dove si trova, lo risposiziona nell'elenco dei blocchi
	function repositioning(blockid){
		//Tolgo il blocco dal vettore che possiede i blocchi
		removeAssociation(blockid);		
		notInsertedBlock.push(blockid);
		//Tolgo il blocco all'elenco dei blocchi inseriti
		insertedBlock = valueDelete (blockid,insertedBlock);
		hideInfoContainer (blockid.replace('block_',''));				
		//Ridisegno i blocchi dentro il DIV dell'elenco dei blocchi
		redrawBlockArea();				
	}
	
	
	function manageInfoContainer(blockid){
		var blockDivInfo = document.getElementById('infoblock_'+blockid+'');
		if (blockDivInfo.style.display == 'none')
			showInfoContainer(blockid);
		else
			hideInfoContainer(blockid);
	}
	
	//Visualizza il DIV che contiene le info del blocco
	//Ne gestisce anche la posizione dovendo farlo ereditare dal Body
	function showInfoContainer(blockid){
		var blockDivContainer = document.getElementById('infoblockcontainer_'+blockid+'');
		var x = findPosX(blockDivContainer);
		var y = findPosY(blockDivContainer);
		
		var blockDivInfo = document.getElementById('infoblock_'+blockid+'');
		makeBlockAppendable(blockDivInfo);
		var body = document.body;
		body.appendChild(blockDivInfo);
	    //tolgo il blocco dal proprio padre	    
		blockDivInfo.style.position = 'absolute';
		blockDivInfo.style.left = (x + 10) + "px";
		blockDivInfo.style.top = (y + 50) + "px";
		blockDivInfo.style.zIndex = 20;		
		blockDivInfo.style.display = '';	
	}
	
	
	//Nasconde il DIV che contiene le info del blocco
	function hideInfoContainer(blockid){
		var blockDivContainer = document.getElementById('infoblockcontainer_'+blockid+'');
		var blockDivInfo = document.getElementById('infoblock_'+blockid+'');		
		makeBlockAppendable(blockDivInfo);
		blockDivContainer.appendChild(blockDivInfo);
		blockDivInfo.style.display = 'none';	
		blockDivInfo.style.zIndex = 1;				
	}
	
	
	//Questo metodo switcha da true a false e viceversa
	//l'attributo passato come parametro
	function changeBlockAttribute(blockid,attribute){
		var limit = array_keys(totalBlockList).length;
		for (var blockID in totalBlockList){
			var block = totalBlockList[blockID];
			if ('block_'+block.id == blockid) {
				switch (attribute){
					case 'title': block.viewHeader = (block.viewHeader == "1" || block.viewHeader == "") ? "0" : "1"; break;
					case 'footer': block.viewFooter = (block.viewFooter == "1" || block.viewFooter == "") ? "0" : "1"; break;
				}
				totalBlockList[blockID] = block;
				break;
			}			
		}
	}
	
	//Funzione richiamata al momento del submit. Raccoglie le informazioni sui blocchi
	//e le mette in un Input nascosco che verrà passato via POST
	function retrieveAllChanges(){
		var filledSection = array_keys(sectionAreaBlock);
		var lim = filledSection.length;
		var hiddenData = document.getElementById('whatineed');
		var hiddenStructure = document.getElementById('structure');
		hiddenStructure.value = structName;
		for (var i=0; i < lim; i++){
			for (var blockID in sectionAreaBlock[filledSection[i]]) {
				var singleBlock = sectionAreaBlock[filledSection[i]][blockID];  
				var str = filledSection[i]+";"+singleBlock.id+";"+singleBlock.position+";"+singleBlock.viewHeader+";"+singleBlock.viewFooter+";"+singleBlock.theme+"--";
				hiddenData.value += str;
			} 
		}
	}
	
	function manageOrdering (tableid,rowid,where,hid){
		var myTable = document.getElementById(tableid);
		var myRow	= document.getElementById(rowid);		
		
		var myTBody = myTable.firstChild;
		
		var rt = myTBody.childNodes.length-1;
		
		var pRow = myRow.previousSibling;
		var nRow = myRow.nextSibling.nextSibling;
		
		if (where == 1){
			if (pRow.className != 'hikariHeadRow'){
				myTBody.removeChild(myRow);
				myTBody.insertBefore(myRow,pRow);
			}
		}
		else
			if (nRow.className != ''){
				myTBody.removeChild(myRow);
				myTBody.insertBefore(myRow,nRow);
			}
		
		var childrenIds = "";
		for (var i=2; i<rt ; i++){
			childrenIds += myTBody.childNodes[i].id + ";";			
		}
		return childrenIds;
	}
	
	
	