// version 2.1.0 29/05/2008 Andrea Rincon Ray and Filippo Balzano
// Investor page manager

var componentDivIndex = new Array();
var componentLinkIndex = new Array();
var outerDivIndex = new Array();
var headerDivIndex = new Array();

var colorList = new Array();


// funzioni di supporto

function Browser() {

	var ua, s, i;

	this.isIE    = false;
	this.isNS    = false;
	this.version = null;

	ua = navigator.userAgent;

	s = "MSIE";
	if ((i = ua.indexOf(s)) >= 0) {
    	this.isIE = true;
    	this.version = parseFloat(ua.substr(i + s.length));
    	return;
	}

	s = "Netscape6/";
	if ((i = ua.indexOf(s)) >= 0) {
    	this.isNS = true;
    	this.version = parseFloat(ua.substr(i + s.length));
    	return;
  	}

  	// Treat any other "Gecko" browser as NS 6.1.

  	s = "Gecko";
  	if ((i = ua.indexOf(s)) >= 0) {
    	this.isNS = true;
    	this.version = 6.1;
    	return;
  	}

}

var browser = new Browser();

// ---  Utility gestione cookie ---
function setCookie(c_name,value,expiredays) {
	var exdate = new Date();
	exdate.setDate(exdate.getDate()+expiredays);
	document.cookie  =c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}

function getCookie(c_name) {
	if (document.cookie.length>0) {
		c_start=document.cookie.indexOf(c_name + "=");
		if (c_start!=-1) { 
			c_start=c_start + c_name.length+1;
			c_end=document.cookie.indexOf(";",c_start);
			if (c_end==-1) c_end=document.cookie.length;
			return unescape(document.cookie.substring(c_start,c_end));
		} 
	}
	return null;
}

function findPos(obj) {
	
	var mw = mh = 0;
	mw = obj.offsetWidth;
	mh = obj.offsetHeight;
	
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	
	return [curleft,curtop,mw,mh];
}


// --- Load event non distruttivo ---
function addLoadEvent(func) {	
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
    	window.onload = func;
	} else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}


// --- Funzione di traversal ricorsiva ---
function widgetDOMTraversalComponent(node) {
	if ( node==null ) return null;
	if ( node.className.substr(0,11)=="widget_open" || node.className.substr(0,13)=="widget_closed" ) return node;
	return widgetDOMTraversalComponent( node.parentNode );
}

function widgetDOMTraversalClass(node, classe) {
	
	if ( node == null ) return null;
	if ( node.className == classe ) return node;
	return widgetDOMTraversalClass( node.parentNode, classe );

}

function setupWidgets() { 
	
	widgetStructureFix();

	var links = document.links;
	//var stackingOrder = 0;
	for(var i = 0; i < links.length; i++) {
		
		if (links[i].className.substr(0,13) == "widget_toggle") {
			
			links[i].id="component_toggle_"+i;
			//trova il parent
			parentComponent = widgetDOMTraversalComponent(links[i]);
			parentHeader = widgetDOMTraversalClass( links[i], "widget_header" );
			
			if ( parentComponent != null ) {
				
				// Setup dell'outer div
				var outerDivId = "div_toggle_"+i;

				if(document.all && navigator.appName == 'Microsoft Internet Explorer'){
					parentComponent.insertAdjacentHTML( "beforeBegin", "<div id=\""+outerDivId+"\" class=\"tratteggio_nascosto\"></div>" );
				}else{
					insertMethodH(parentComponent,'beforeBegin','<div id="'+outerDivId+'" class="tratteggio_nascosto"></div>');
				}

				var outerDiv = document.getElementById(outerDivId);
				outerDiv.appendChild(parentComponent);
				
				//FIX 23/10/2007 - IE Caratteri sfuggenti
				if(document.all && navigator.appName == 'Microsoft Internet Explorer'){
					outerDiv.insertAdjacentHTML( "beforeEnd", "<div style=\"position:absolute;width:1px;height:1px;top:0px;left:0px;border:none;display:block;\">&nbsp;</div>");
				}else{
					insertMethodH(outerDiv,'beforeEnd','<div style="position:absolute;width:1px;height:1px;top:0px;left:0px;border:none;display:block;">&nbsp;</div>');
				}
				
				var oldMarginBottom = parentComponent.style.marginBottom;
			
				//Setta il callback
				var impostazioni = parentComponent.id.split("_");
				if ( impostazioni[3]!="1" ) {
					links[i].onclick = function () { return toggleWidget(this); };
					parentHeader.onmousedown = function (event) { widgetMenuHide(); dragStart(event,this); };
					
				} else {
					links[i].onclick = function () { return false; };
					links[i].className = "widget_toggle_disabled" + links[i].className.substr(14);
					
				}
				parentHeader.onmouseover = function () { widgetMenuDisplay(this); }; // TODO modificare (attach finestra?)
				
				componentLinkIndex.push(links[i].id);
				componentDivIndex.push(parentComponent.id);
				outerDivIndex.push(outerDivId);
				headerDivIndex.push(parentHeader);
				colorList.push("");
			}
		}
	}
	
	widgetLoadComponentStatus();
	widgetLoadComponentColor()
	initColumnMatrix();
	
	widgetMenuInit();
	
	
document.getElementById("iosonoilbody").style.visibility = 'visible';
var pd = document.getElementById('layerbianco');
pd.style.display='none';

	
	
}
addLoadEvent(setupWidgets);

// Disabilita temporaneamente il toogle (in caso venga spostato)
function restoreToggle(currentTarget) {
	currentTarget.onclick = function () { return toggleWidget(this); };
	return false;
}

function toggleWidget(currentTarget) { 
		
	var numeroarray=null;
	for(var k=0; k< componentLinkIndex.length; k++) {
		if (componentLinkIndex[k]==currentTarget.id) {
			numeroarray=k;
		}
	}
	if (numeroarray==null) return;

	elementoRoot = document.getElementById(componentDivIndex[numeroarray]);
	
	var impostazioni = componentDivIndex[numeroarray].split("_");
	
	if ( impostazioni[3] != "1" ) {
		if (elementoRoot.className.substr(0,11) == "widget_open") {
			elementoRoot.className = "widget_closed" + elementoRoot.className.substr(11);
			
		} else if (elementoRoot.className.substr(0,13) == "widget_closed") {
			elementoRoot.className = "widget_open" + elementoRoot.className.substr(13);
		}
	}

	widgetSaveComponentStatus();
	return false;
}

function widgetSaveComponentStatus() {
	
	var statusVector = new Array();
	
	for (var i=0; i<componentDivIndex.length; i++) {
		elementoRoot = document.getElementById( componentDivIndex[i] );
		var dati_div = componentDivIndex[i].split("_");
		if ( dati_div.length==4 ) {
			if (elementoRoot.className.substr(0,11)=="widget_open") {
				statusVector.push( dati_div[1] + "_" + dati_div[2] + "_o" );
			} else if (elementoRoot.className.substr(0,13)=="widget_closed") {
				statusVector.push( dati_div[1] + "_" + dati_div[2] + "_c" );
			}
		}
	}
	setCookie("investor_widget_status", statusVector.join("."), 120);

}

function widgetLoadComponentStatus() {
	var statusCookie = getCookie("investor_widget_status");
	if ( statusCookie == null ) return false;
	var cookieArray = statusCookie.split(".");
	
	for (var j=0; j<cookieArray.length; j++ ) {
		var curdata = cookieArray[j].split("_");
		if (curdata.length==3) {
			var div_id = curdata[0];
			var div_ver = curdata[1];
			
			for (var i=0; i<componentDivIndex.length; i++ ) {
				
				var div_array = componentDivIndex[i].split("_");
				
				if ( div_array.length==4 && div_array[1]==div_id && div_array[2]==div_ver ) {
					elementoRoot = document.getElementById( componentDivIndex[i] );
					
					//estraiamo la seconda classe
					var secondaClasse = "";
					if (elementoRoot.className.substr(0,11) == "widget_open") {
						secondaClasse = elementoRoot.className.substr(11);
					} else if (elementoRoot.className.substr(0,13) == "widget_closed") {
						secondaClasse =  elementoRoot.className.substr(13);
					}
					
					if ( curdata[2] == "o" || div_array[3]=="1" ) {
						elementoRoot.className="widget_open" + secondaClasse;
						//alert("OPEN l'elemento root è " + elementoRoot.innerHTML);
						var imgs = elementoRoot.getElementsByTagName('img');
						for(n=0;n<imgs.length;n++){
							if(imgs.item(n).alt == 'expand or minimize'){
								imgs.item(n).className = 'exp';
								imgs.item(n).src = '/en_IT/static/images/expanded.gif';

							}
						}
					} else if (curdata[2]=="c" ) {
						elementoRoot.className="widget_closed" + secondaClasse;
						//alert("CLOSED l'elemento root è " + elementoRoot.innerHTML);
						var imgs = elementoRoot.getElementsByTagName('img');
						for(h=0;h<imgs.length;h++){
							if(imgs.item(h).alt == 'expand or minimize'){
								imgs.item(h).className = 'min';
								imgs.item(h).src = '/en_IT/static/images/minimized.gif';
							}
						}
					}	
				}	
			}		
		}
	}
	
}

// ----------------------------------------------------------| Funzionalità colore
function widgetSaveComponentColor() {
	
	var statusVector = new Array();
	
	for (var i=0; i<componentDivIndex.length; i++) {
		elementoRoot = document.getElementById( componentDivIndex[i] );
		var dati_div = componentDivIndex[i].split("_");
		if ( dati_div.length==4 ) {
			statusVector.push( dati_div[1] + "_" + colorList[i] );
		}
	}
	setCookie("investor_widget_color", statusVector.join("."), 120);
	
	//alert(statusVector.join("."));

}

function widgetLoadComponentColor() { 
	var statusCookie = getCookie("investor_widget_color");
	if ( statusCookie == null ) return false;
	
	var cookieArray = statusCookie.split(".");
	
	for (var j=0; j<cookieArray.length; j++ ) {
		var curdata = cookieArray[j].split("_");
		if (curdata.length==2) {
			var div_id = curdata[0];
			var div_col = curdata[1];
			
			for (var i=0; i<componentDivIndex.length; i++ ) {
				
				var div_array = componentDivIndex[i].split("_");
				
				if ( div_array.length==4 && div_array[1]==div_id ) {
					elementoRoot = document.getElementById( componentDivIndex[i] );
					
					setColorDiv( div_col, elementoRoot )
					
					//estraiamo la seconda classe
					
				}	
			}		
		}
	}
	
}

// chi trasciniamo
var dragObj = new Object();
dragObj.zIndex = 0;
dragObj.elNode = null;
var backingIframe = null;

function dragStart(event, currentTarget) {
	
	// Cancelliamo la selezione per pulizia
	if (document.selection) {
		
	} else if (navigator.vendor != "Apple Computer, Inc." && navigator.vendor != "KDE") {
		
		window.getSelection().removeAllRanges();
	}
	
	//FIX perdita click
	if (dragObj.elNode != null) {
		
		dragStop(event);
	}
	
	lastSwappedObject=null;
	
	var numeroarray=null;
	for(var k=0; k< componentLinkIndex.length; k++) {
		if (headerDivIndex[k]==currentTarget) {
			numeroarray=k;
		}
	}
	if (numeroarray==null) return;
	
	dragObj.outerDiv = document.getElementById( outerDivIndex[numeroarray]) ;
	dragObj.target = document.getElementById( componentLinkIndex[numeroarray]) ;

	id = componentDivIndex[numeroarray]; 
	
	// FIX stacking oggetti con iframe
	//dragObj.outerDiv.insertAdjacentHTML( "beforeEnd", "<iframe id=\"drag_iframe\" src=\"BLOCKED SCRIPT'&lt;html&gt;&lt;/html&gt;';\" scrolling=\"no\" frameborder=\"0\" style=\"position:absolute;width:100px;height:100px;top:0px;left:0px;border:none;display:block;\">");
	
	togli = document.getElementById("drag_iframe");
	if (togli!=null) {
		togli.parentNode.removeChild( togli );
	}
	
	if(document.all && navigator.appName == 'Microsoft Internet Explorer'){
		dragObj.outerDiv.insertAdjacentHTML( "beforeEnd", "<iframe id=\"drag_iframe\" src=\"about:blank\" scrolling=\"no\" frameborder=\"0\" style=\"position:absolute;width:1px;height:1px;top:0px;left:0px;border:none;display:block;\">");
	}else{
		insertMethodH(dragObj.outerDiv,'beforeEnd','<iframe id="drag_iframe" src="about:blank" scrolling="no" frameborder="0" style="position:absolute;width:1px;height:1px;top:0px;left:0px;border:none;display:block;">');
	}
	backingIframe = document.getElementById("drag_iframe");
	backingIframe.style.zIndex = ++dragObj.zIndex;
	

  var el;
  var x, y;

  // If an element id was given, find it. Otherwise use the element being
  // clicked on.

  if (id)

    dragObj.elNode = document.getElementById(id);
  else {
    if (browser.isIE){
      dragObj.elNode = window.event.srcElement;
    }else{
      dragObj.elNode = event.target;
	}
    // If this is a text node, use its parent element.

    if (dragObj.elNode.nodeType == 3)
      dragObj.elNode = dragObj.elNode.parentNode;
  }

  // Get cursor position with respect to the page.

  if (browser.isIE) {
    x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
  } else if(browser.isNS) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
 } else if(!browser.isNS && !browser.isIE) {
    x = event.clientX + window.pageXOffset;
    y = event.clientY + window.pageYOffset;
  }

  // Save starting positions of cursor and element.

  dragObj.cursorStartX = x;
  dragObj.cursorStartY = y;
  dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
  dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);

  if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
  if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;

  // Update element's z-index.

  dragObj.elNode.style.zIndex = ++dragObj.zIndex;

  // Capture mousemove and mouseup events on the page.

  if (browser.isIE) {
    document.attachEvent("onmousemove", dragGo);
    document.attachEvent("onmouseup",   dragStop);
	document.attachEvent("onmouseout", dragStopWin);
	document.attachEvent("onmousedown", dragStopWin);
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  } else {
    document.addEventListener("mousemove", dragGo,   true);
    document.addEventListener("mouseup",   dragStop, true);
	document.addEventListener("mouseout",   dragStopWin, true);
	document.addEventListener("mousedown",   dragStopWin, true);
    event.preventDefault();
  }

}

var lastSwappedObject = null;

// todo:
// espandere includendo la gestione matrix, con swap solo se necessari
// Aggiungere save su release

function mySwap( dragObj, oggetto, pos, oggettoDiv , iscolumn ) {
	
	
	var preferenzeTarget = oggetto.id.split("_");
	
	if ( preferenzeTarget[3]==1 && pos=="beforeBegin" ) return;
	
	//before 0, after 1
	var where=0;
	if ( pos.substr(0,5)=="after" ) where=1;
	
	if (dragObj.elNode == oggetto) return;

	if (lastSwappedObject!=oggettoDiv) {
		//lastSwappedObject=oggettoDiv;
		
		var oldPos = findPos( dragObj.outerDiv );
		var oldMatrixIndex = posizioneElementoMatrice(dragObj.outerDiv);
		rimuoviElementoMatrice(oldMatrixIndex[0],oldMatrixIndex[1]);
		
		dragObj.outerDiv.style.visibility="hidden";
		
		if (iscolumn) {
			
			var numColonna = posizioneColonna( oggetto );
			var numRiga = 0;
			if ( where==0 ) numRiga = posMatrix[numColonna].length;
			inserisciElementoMatrice( numColonna, numRiga, dragObj.outerDiv );
			
			if(document.all && navigator.appName == 'Microsoft Internet Explorer'){
				oggetto.insertAdjacentElement( pos, dragObj.outerDiv );
			}else{
				insertMethodE(oggetto,pos,dragObj.outerDiv);
			}
			
		} else {
			
			var newMatrixIndex = posizioneElementoMatrice(oggettoDiv);
			if ( where==1 ) newMatrixIndex[1] =  newMatrixIndex[1] + 1;
			inserisciElementoMatrice( newMatrixIndex[0], newMatrixIndex[1], dragObj.outerDiv );
			
			if(document.all && navigator.appName == 'Microsoft Internet Explorer'){
				oggettoDiv.insertAdjacentElement( pos, dragObj.outerDiv ); 
			}else{
				insertMethodE(oggettoDiv,pos,dragObj.outerDiv);
			}
			
		}
		var newPos = findPos( dragObj.outerDiv );
				
		dragObj.elStartLeft = dragObj.elStartLeft - (newPos[0] - oldPos[0]);
		dragObj.elStartTop = dragObj.elStartTop - (newPos[1] - oldPos[1]);
		
		if (dragObj.elNode.style.left!="") {
			dragObj.elNode.style.left = (parseInt(dragObj.elNode.style.left) - (newPos[0] - oldPos[0]))+"px";
			dragObj.elNode.style.top = ( parseInt(dragObj.elNode.style.top) - (newPos[1] - oldPos[1]))+"px";
			
			//Aggiorniamo anche l'idiv di copertura
			var posiz = findPos(dragObj.elNode);
  
  			backingIframe.style.left = posiz[0]+"px";
			backingIframe.style.top = posiz[1]+"px";
			backingIframe.style.width = posiz[2]+"px";
			backingIframe.style.height = posiz[3]+"px";
			
		}
		
		dragObj.outerDiv.style.visibility="";
	}
	
}

// Funzioni di gestione della matrice
function posizioneElementoMatrice( elem ) { // si tratta dei div tratteggio
	for ( var i=0; i<posMatrix.length; i++ ) {
   		for (var k = 0; k < posMatrix[i].length; k++) {
			if ( posMatrix[i][k]==elem ) return [i,k];
		}
	}
	//alert("Non trovato " + elem.id);
	return false;
}

function posizioneColonna( col ) { // si tratta dei div tratteggio
	for ( var i=0; i<aColonne.length; i++ ) {
   		if (aColonne[i]==col) return i;
	}
	return false;
}

function rimuoviElementoMatrice( col, row ) {
	if (posMatrix[col].length<=0) return null;
	return posMatrix[col].splice(row,1);
}

function inserisciElementoMatrice( col, row, el ) {
	posMatrix[col].splice( row, 0, el );	
}




function dragGo(event) {
	
	//document.title = event.button;
	
	//Verifichiamo che la classe sia corretta x tratteggio
	dragObj.outerDiv.className="tratteggio_visibile";

  	var x, y;
//document.title=event.detail;
  	// Posizione relativa del cursore

  	if (browser.isIE) {
    	x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
    	y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
  	} else if (browser.isNS){
    	x = event.clientX + window.scrollX;
    	y = event.clientY + window.scrollY;
	} else if (!browser.isNS && !browser.isIE){
    	x = event.clientX + window.pageXOffset;
    	y = event.clientY + window.pageYOffset;
	}
  
  	// Accentratore casistiche hitlist
	var el_over = el_top = el_column = null;
	var trovato = false;
	
  	for(var k=0; k< componentDivIndex.length && trovato==false; k++) {
		
		var oggetto = document.getElementById( componentDivIndex[k] );
		var oggettoDiv = document.getElementById( outerDivIndex[k] );
		
		
			var po = findPos( oggettoDiv );
			
			if ( x>=po[0] && y>=po[1] && x<=po[0]+po[2] && y<=po[1]+po[3] ) {
				
				//document.title="HIT: "+oggettoDiv.id + " "+po[3];	
				var ps = posizioneElementoMatrice( oggettoDiv );
				var pe = posizioneElementoMatrice( dragObj.outerDiv );
				
				if (ps[0]!=pe[0] || ps[1]+1!=pe[1]) mySwap( dragObj, oggetto, "afterEnd", oggettoDiv, false );
				
				trovato = true;
				
			} else if ( x>=po[0] && y>=po[1]-9 && x<=po[0]+po[2] && y<=po[1] ) {
				
				//document.title="HIT2: "+oggettoDiv.id + " "+po[3];
				var ps = posizioneElementoMatrice( oggettoDiv );
				var pe = posizioneElementoMatrice( dragObj.outerDiv );
				
				var opzi = oggetto.id.split("_");
				if (opzi[3]!="1") {
					if (ps[0]!=pe[0] || ps[1]-1!=pe[1]) mySwap( dragObj, oggetto, "beforeBegin", oggettoDiv, false );
				}
				trovato = true;
				
			}
		
		
	}
	
	
	if (trovato==false) {
		//testiamo le colonne 
		
		for (j=0; j<aColonne.length; j++ ) {
		var po = findPos( aColonne[j] );
			
			if ( x>=po[0] && x<=po[0]+po[2] ) {
				if ( y<=po[1] ) {
					// solo se il primo elemento non è fisso
					var fattibile=true;
					if ( posMatrix[j].length>0 ) {
						var el = posMatrix[j][0].firstChild;
						var opz = el.id.split("_");
						if ( opz[3]=="1" ) fattibile = false;
						if (fattibile) {
							
							mySwap( dragObj, el, "beforeBegin", posMatrix[j][0], false );
						}
					} else {
						mySwap( dragObj, aColonne[j], "afterBegin", aColonne[j], true );
					}
					
					
					
					
				} else if ( y>=po[1]+po[3] ) {
					var pe = posizioneElementoMatrice( dragObj.outerDiv );
					if ( pe[0]!= j) mySwap( dragObj, aColonne[j], "beforeEnd", aColonne[j], true );
				}
				
			}
		}
	}
  
  
  

  // Move drag element by the same amount the cursor has moved.

  dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
  dragObj.elNode.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY) + "px";
  
  	var posiz = findPos(dragObj.elNode);
  
  	backingIframe.style.left = posiz[0]+"px";
	backingIframe.style.top = posiz[1]+"px";
	backingIframe.style.width = posiz[2]+"px";
	backingIframe.style.height = posiz[3]+"px";
	

  if (browser.isIE) {
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  } else {
    event.preventDefault();
  }

}

function dragStopWin(event) {
	var who;
	
	if (browser.isIE){who=event.srcElement;
	}else{who=event.target;}

	if (who!=null && (who.tagName=="HTML" || who.tagName=="BODY")) dragStop(event);
}

function dragStop(event) {
	
	dragObj.outerDiv.className="tratteggio_nascosto";
	
	//dragObj.outerDiv.removeChild(backingIframe);
	togli = document.getElementById("drag_iframe");
	if (togli!=null) {
		togli.parentNode.removeChild( togli );
	}

	if ( dragObj.elNode.style.left!="" || dragObj.elNode.style.top!="" ) {
		dragObj.elNode.style.left = "";
  		dragObj.elNode.style.top  = "";
		//if (!browser.isIE) dragObj.target.onclick = function () { return restoreToggle(this); };
	}
  
	dragObj.elNode = null;

	// Distacca eventi

	if (browser.isIE) {
		document.detachEvent("onmousemove", dragGo);
		document.detachEvent("onmouseup",   dragStop);
		document.detachEvent("onmouseout",   dragStopWin);
		document.detachEvent("onmousedown",   dragStopWin);
	} else {
		document.removeEventListener("mousemove", dragGo,   true);
		document.removeEventListener("mouseup",   dragStop, true);
		document.removeEventListener("mouseout",   dragStopWin, true);
		document.removeEventListener("mousedown",   dragStopWin, true);
	} 

	// Salviamo la posizione
	saveColumnMatrix();
	
	
	
}

// Gestione matrix colonna

var aColonne = new Array();
var posMatrix = new Array();

function initColumnMatrix() {
	
	// inserimento colonne
	aColonne.push( document.getElementById( "colonna_1" ) );
	aColonne.push( document.getElementById( "colonna_2" ) );
	aColonne.push( document.getElementById( "colonna_3" ) );
	
	
	//FIX COLLASSABILITà
	//document.getElementById( "colonna_1" ).insertAdjacentHTML( "beforeEnd", "<div style='clear:both; height:1px;'></div>" ); 
	//document.getElementById( "colonna_2" ).insertAdjacentHTML( "beforeEnd", "<div style='clear:both; height:1px;'></div>" ); 
	//document.getElementById( "colonna_3" ).insertAdjacentHTML( "beforeEnd", "<div style='clear:both; height:1px;'></div>" ); 
	
	
	//Creazione matrice
	for ( var i=0; i<aColonne.length; i++ ) {
		
		var colonna = new Array();
		var children = aColonne[i].childNodes;
   		for (var k = 0; k < children.length; k++) {
			if ( children[k].className == "tratteggio_nascosto" ) {
				colonna.push(children[k]);
			}
		}
		posMatrix.push( colonna );
	}
	
	// Inserire funzione di restore dalle preferenze
	loadColumnMatrix();
	
}

function saveColumnMatrix() {
	var out="";
	for ( var i=0; i<posMatrix.length; i++ ) {
		if (i>0) out += ";";
		for (var k = 0; k < posMatrix[i].length; k++) {
			if (k>0) out += ".";
			var info = posMatrix[i][k].firstChild.id.split("_");
			out += info[1];
		}
	}
	//alert(out);
	setCookie("investor_widget_position", out, 120);
}

function loadColumnMatrix() {
	var cook = getCookie("investor_widget_position"); 
	
	if (cook==null) return;
	
	var colonne = cook.split(";");
	
	for ( var i=0; i<colonne.length; i++ ) {
		var elementi = colonne[i].split(".");
		
		for ( var k=0; k<elementi.length; k++) { //alert(k+" "+i);
			
			var idElenco = objectIndexById( elementi[k] );
			
			if ( idElenco!==false ) {
				
				var myDragObj = new Object();
				myDragObj.outerDiv = document.getElementById( outerDivIndex[idElenco] ) ;
				myDragObj.target = componentDivIndex[idElenco];
				myDragObj.elNode = document.getElementById( componentDivIndex[idElenco] );
			
				mySwap( myDragObj, aColonne[i], "beforeEnd", aColonne[i], true );
			
			}
			
		}
		
	}
}

function objectIndexById( myid ) {
	for (var i=0; i<componentDivIndex.length; i++) {
		var esp = componentDivIndex[i].split("_");
		if (myid==esp[1]) return i;
	}
	return false;
}

function andre_reset() {
	setCookie("investor_widget_status", "", 1);
	setCookie("investor_widget_position", "", 1);
}

// Inizio funzioni di gestione del menù
var menudiv = null;
var menuouterdiv = null;
var statomenu = -1; // -1:init 0:hidden 1:visible: 2:expanded
var menuWidgetIndex = -1;

function widgetMenuInit() {
	
	var htmlMenu = "";
	
	htmlMenu += "<div id='widget_menu'>";
	htmlMenu += "<a href='javascript:widgetMenuExpand();' id='widget_menu_modifica'><img src='/en_IT/static/images/investor_popup/more.gif' border='0' /> Modifica</a>";
	htmlMenu += "<div id='widget_menu_inner'>";
	htmlMenu += "<img src='/en_IT/static/images/investor_popup/palette.gif' vspace='1' border='0' />";
	htmlMenu += "<a href='javascript:setColor(0);'><img src='/en_IT/static/images/investor_popup/col_0.gif' vspace='1' border='0' /></a>";
	htmlMenu += "<a href='javascript:setColor(1);'><img src='/en_IT/static/images/investor_popup/col_1.gif' vspace='1' border='0' /></a>";
	htmlMenu += "<a href='javascript:setColor(2);'><img src='/en_IT/static/images/investor_popup/col_2.gif' vspace='1' border='0' /></a>";
	htmlMenu += "<a href='javascript:setColor(3);'><img src='/en_IT/static/images/investor_popup/col_3.gif' vspace='1' border='0' /></a>";
	htmlMenu += "<a href='javascript:setColor(4);'><img src='/en_IT/static/images/investor_popup/col_4.gif' vspace='1' border='0' /></a>";
	htmlMenu += "<a href='javascript:setColor(5);'><img src='/en_IT/static/images/investor_popup/col_5.gif' vspace='1' border='0' /></a>";
	htmlMenu += "<a href='javascript:setColor(6);'><img src='/en_IT/static/images/investor_popup/col_6.gif' vspace='1' border='0' /></a>";
	htmlMenu += "<br>";
	htmlMenu += "<a id='wdg_move_top' href='javascript:moveWidget(0);'><img src='/en_IT/static/images/investor_popup/top.gif' border='0' /> Sposta in cima</a>";
	htmlMenu += "<a id='wdg_move_up' href='javascript:moveWidget(1);'><img src='/en_IT/static/images/investor_popup/up.gif' border='0' /> Sposta sopra</a>";
	htmlMenu += "<a id='wdg_move_dx' href='javascript:moveWidget(2);'><img src='/en_IT/static/images/investor_popup/dx.gif' border='0' /> Sposta a destra</a>";
	htmlMenu += "<a id='wdg_move_sx' href='javascript:moveWidget(3);'><img src='/en_IT/static/images/investor_popup/sx.gif' border='0' /> Sposta a sinistra</a>";
	htmlMenu += "<a id='wdg_move_down' href='javascript:moveWidget(4);'><img src='/en_IT/static/images/investor_popup/down.gif' border='0' />Sposta sotto</a>";
	htmlMenu += "<a id='wdg_move_bottom' href='javascript:moveWidget(5);'><img src='/en_IT/static/images/investor_popup/bottom.gif' border='0' />Sposta in fondo</a>";
	htmlMenu += "</div>";
	
	htmlMenu += "</div>";
	
	if(document.all && navigator.appName == 'Microsoft Internet Explorer'){
		document.body.insertAdjacentHTML( "beforeEnd", htmlMenu );
	}else{
		insertMethodH(document.body,'beforeEnd',htmlMenu);
	}
	menudiv = document.getElementById("widget_menu");
	
	statomenu=0;
	menudiv.className = "menu_hidden";
	
}

function widgetMenuDisplay( currentTarget ) {
	
	if ( dragObj.elNode!=null) return;
	
	//posizioniamo
	var numeroarray=null;
	for(var k=0; k< headerDivIndex.length; k++) {
		if (headerDivIndex[k]==currentTarget) {
			numeroarray=k;
		}
	}
	if (numeroarray==null) return;
	
	var mymenuouterdiv = document.getElementById( componentDivIndex[numeroarray] );
	
	
	if ( menuouterdiv == mymenuouterdiv && statomenu!=0 ) return;
	menuouterdiv = mymenuouterdiv;
	
	menuWidgetIndex = numeroarray;
	
	//Settiamo la classe opportuna, lo zindex e nascondiamo
	menudiv.style.visibility = "hidden";
	menudiv.style.zIndex = ++dragObj.zIndex;
	//alert(menudiv.className);
	menudiv.className="inv_menu_small";
//alert(menudiv.className);
	
	
	var coordinate = findPos( menuouterdiv );
	var coordinateMenu = findPos( menudiv );
	
	//document.title = coordinate[0] +" " + coordinate[1];
	
	var left = coordinate[0] + coordinate[2] - coordinateMenu[2] -1;
	var top = coordinate[1] + 1;
	
	menudiv.style.left = left + "px";
	menudiv.style.top = top + "px";
	
	if (browser.isIE) {
    	document.attachEvent("onmousemove", menuTrack);
	} else {
    	document.addEventListener("mousemove", menuTrack,   true);
	}
	
	statomenu=1;
	menudiv.style.visibility = "";

	
}

// nel caso di out nascondiamo il menu
function menuTrack(event) {
  	
	var x, y;
  	if (browser.isIE) {
    	x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
    	y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
  	} else if (browser.isNS){
    	x = event.clientX + window.scrollX;
    	y = event.clientY + window.scrollY;
	} else if (!browser.isNS && !browser.isIE){
    	x = event.clientX + window.pageXOffset;
    	y = event.clientY + window.pageYOffset;
	}
	
	var coordinate = findPos( menuouterdiv );//document.title=x;
	//var coordinateMenu = findPos( menudiv );
	if ( x<coordinate[0] || x>coordinate[0]+coordinate[2] || y<coordinate[1] || y>coordinate[1]+40 ) {
		
		
		if (browser.isIE) {
			document.detachEvent("onmousemove", menuTrack);
		} else {
			document.removeEventListener("mousemove", menuTrack,   true);
		}
		
		widgetMenuHide();
	
	}
	
}

// funzione che nasconde il menu
function widgetMenuHide() {
	
	if ( statomenu!=1 && statomenu!=2 ) return;
	statomenu = 0;
	menudiv.className = "menu_hidden";
	
}

//espande il menu... richiede riconfigurazione
function widgetMenuExpand() {
	
	if (statomenu!=1) return;
	
	//inizio riconfiguratore
	var outerDiv = document.getElementById( outerDivIndex[menuWidgetIndex] );
	if (outerDiv==null) return;
	
	var pos = posizioneElementoMatrice(outerDiv);
	
	var canGoUp = true;
	if ( pos[1]>0 ) {
		var swapdiv = outerDivToInner(posMatrix[ pos[0]][ pos[1]-1 ]);
		var swapdivpref = swapdiv.id.split("_");
		if ( swapdivpref[3]==1 ) canGoUp=false;
	}
	
	var prefDiv = menuouterdiv.id.split("_");
	if (prefDiv[3]=="1") {
		document.getElementById( "wdg_move_top" ).style.display = "none";
		document.getElementById( "wdg_move_up" ).style.display = "none";
		document.getElementById( "wdg_move_sx" ).style.display = "none";
		document.getElementById( "wdg_move_dx" ).style.display = "none";
		document.getElementById( "wdg_move_bottom" ).style.display = "none";
		document.getElementById( "wdg_move_down" ).style.display = "none";
	} else {
	
		if ( pos[1]==0 || !canGoUp ) {
			document.getElementById( "wdg_move_top" ).style.display = "none";
			document.getElementById( "wdg_move_up" ).style.display = "none";
		} else {
			document.getElementById( "wdg_move_top" ).style.display = "";
			document.getElementById( "wdg_move_up" ).style.display = "";
		}
	
		if ( pos[0]==0 ) {
			document.getElementById( "wdg_move_sx" ).style.display = "none";
		} else {
			document.getElementById( "wdg_move_sx" ).style.display = "";
		}
	
		if ( pos[0]>=aColonne.length-1 ) {
			document.getElementById( "wdg_move_dx" ).style.display = "none";
		} else {
			document.getElementById( "wdg_move_dx" ).style.display = "";
		}
	
		if ( pos[1]>=posMatrix[ pos[0] ].length-1 ) {
			document.getElementById( "wdg_move_bottom" ).style.display = "none";
			document.getElementById( "wdg_move_down" ).style.display = "none";
		} else {
			document.getElementById( "wdg_move_bottom" ).style.display = "";
			document.getElementById( "wdg_move_down" ).style.display = "";
		}
	
	}
	
	
	if (browser.isIE) {
		document.detachEvent("onmousemove", menuTrack);
	} else {
		document.removeEventListener("mousemove", menuTrack,   true);
	}

	statomenu = 2;
	menudiv.className = "inv_menu_expanded";
	
	if (browser.isIE) {
		document.attachEvent("onmouseup", widgetMenuCloseAgain);
		//window.event.cancelBubble = true;
		//window.event.returnValue = false;
	} else {
		document.addEventListener("mouseup", widgetMenuCloseAgain,   true);
	}
	
}

// Controller di chiusura del menù in caso sia espanso e l'utente faccia un click al suo esterno
function widgetMenuCloseAgain(event) {
	var x, y;
  	if (browser.isIE) {
    	x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
    	y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
  	} else if (browser.isNS){
    	x = event.clientX + window.scrollX;
    	y = event.clientY + window.scrollY;
	} else if (!browser.isNS && !browser.isIE){
    	x = event.clientX + window.pageXOffset;
    	y = event.clientY + window.pageYOffset;
	}
	
	var coordinate = findPos( menuouterdiv );
	
	if ( x<coordinate[0] || x>coordinate[0]+coordinate[2] || y<coordinate[1] || y>coordinate[1]+40 ) {
		
		if (browser.isIE) { document.detachEvent("onmouseup", widgetMenuCloseAgain);
		} else {document.removeEventListener("mouseup", widgetMenuCloseAgain,   true);} 

		widgetMenuHide();
	}
}

// Movimentazione widget
function moveWidget( dove ) {
	
	var outerDiv = document.getElementById( outerDivIndex[menuWidgetIndex] );
	if (outerDiv==null) return;

	// troviamo nella matrice
	var pos = posizioneElementoMatrice(outerDiv);
	
	//coordinate
	var coord = findPos(outerDiv);
	
	var myDragObj = new Object();
	myDragObj.outerDiv = outerDiv;
	myDragObj.target = componentDivIndex[menuWidgetIndex];
	myDragObj.elNode = document.getElementById( componentDivIndex[menuWidgetIndex] );
			
				//mySwap( myDragObj, aColonne[i], "beforeEnd", aColonne[i], true );
	
	if ( dove==1 && pos[1]>0 ) {
		
		var swapdiv = posMatrix[ pos[0]][ pos[1]-1 ];
		mySwap(myDragObj, outerDivToInner( swapdiv ), "beforeBegin", swapdiv, false);
		
	} else if ( dove==4 ) {
		
		var swapdiv = posMatrix[ pos[0]][ pos[1]+1 ];
		mySwap(myDragObj, outerDivToInner( swapdiv ), "afterEnd", swapdiv, false);
		
	} else if ( dove==5 ) {
		
		var swapdiv = posMatrix[ pos[0]][ posMatrix[ pos[0]].length-1 ];
		mySwap(myDragObj, outerDivToInner( swapdiv ), "afterEnd", swapdiv, false);
		
	} else if ( dove==0 ) {
		
		var canGoUp = true;
		for ( var j=0; j<posMatrix[ pos[0]].length && j<pos[1]; j++ ) {
			
			var swapdiv = outerDivToInner( posMatrix[ pos[0] ][ j ]);
			var swapdivpref = swapdiv.id.split("_");
			
			if ( swapdivpref[3]!=1 ) {
				mySwap(myDragObj, swapdiv, "beforeBegin", posMatrix[ pos[0]][ j ], false);	
				j=posMatrix[ pos[0]].length;
			}
			
			
		}
	
	} else if ( dove==2 || dove==3 ) {
		
		//quale colonna?
		
		var col = pos[0];
		if ( dove==2 ) col++;
		if ( dove==3 ) col--;
		
		var trovato = false;
		
		for ( var j=0; j<posMatrix[ col ].length  && trovato==false; j++ ) {
			
			tcoord = findPos(posMatrix[ col ][ j ]);
			
			var preferenzeTarget = outerDivToInner(posMatrix[ col ][ j ]).id.split("_");
			
			if ( /*coord[1]>=tcoord[1]*/ preferenzeTarget[3]!=1  && coord[1]<tcoord[1]+tcoord[3] ) { 
				
				var swapdiv = posMatrix[ col ][ j ];
				mySwap(myDragObj, outerDivToInner( swapdiv ), "beforeBegin", swapdiv, false);	
				trovato = true;
			}
		}
		
		if (!trovato) {
			mySwap( myDragObj, aColonne[col], "beforeEnd", aColonne[col], true );
		}
		
		
	}
	
	//Salviamo 
	saveColumnMatrix();
	
	widgetMenuHide();

}

function outerDivToInner( outer ) {
	for (var i=0; i<outerDivIndex.length; i++) {
		if ( outer.id==outerDivIndex[i] ) return document.getElementById(componentDivIndex[i]);
	}
	return null;
}

function componentDivToIndex( outer ) {
	for (var i=0; i<componentDivIndex.length; i++) {
		if ( outer.id==componentDivIndex[i] ) return i;
	}
	return null;
}

// Funzioni di gestione dei colori

function setColor( col ) {
	
	setColorDiv( col, menuouterdiv );
	
	widgetMenuHide();
	widgetSaveComponentColor();
	
}

function setColorDiv( col, chi ) {
	
	var i = componentDivToIndex( chi );
	
	if ( col==0 ) chi.style.borderColor = "#fcafa9";
	else if ( col==1 ) chi.style.borderColor = "#fac17b";
	else if ( col==2 ) chi.style.borderColor = "#fdec6d";
	else if ( col==3 ) chi.style.borderColor = "#cae07e";
	else if ( col==4 ) chi.style.borderColor = "#a1d8e9";
	else if ( col==5 ) chi.style.borderColor = "#b9bcb8";
	else if ( col==6 ) chi.style.borderColor = "";
	

	/*
	if ( col==0 ) menuouterdiv.style.backgroundColor = "#fcafa9";
	else if ( col==1 ) menuouterdiv.style.backgroundColor = "#fac17b";
	else if ( col==2 ) menuouterdiv.style.backgroundColor = "#fdec6d";
	else if ( col==3 ) menuouterdiv.style.backgroundColor = "#cae07e";
	else if ( col==4 ) menuouterdiv.style.backgroundColor = "#a1d8e9";
	else if ( col==5 ) menuouterdiv.style.backgroundColor = "#b9bcb8";
	else if ( col==6 ) menuouterdiv.style.backgroundColor = "";
	*/
	
	colorList[i] = col;
	
}

function widgetStructureFix () { 
	
	var elencoColonne = new Array();
	
	elencoColonne.push( document.getElementById( "colonna_1" ) );
	elencoColonne.push( document.getElementById( "colonna_2" ) );
	elencoColonne.push( document.getElementById( "colonna_3" ) );
	
	//Creazione matrice
	for ( var i=0; i<elencoColonne.length; i++ ) {

		
		var widgetColonna = widgetDeepSearch( elencoColonne[i] );
		
		var container = elencoColonne[i];
		var figli = container.childNodes;
		
		
	
		while ( figli.length>0 ) {
			container.removeChild( figli[0] );
			figli = container.childNodes;
		}
	
		
		for ( var k=0; k<widgetColonna.length; k++ ) {
			container.appendChild( widgetColonna[k] );//alert(widgetColonna[k].innerHTML);
		}

	}
	
}

function widgetDeepSearch( nodo ) { 
	
	//Nodo nullo
	if ( nodo==null ) return new Array();
	
	// Nodo trovato
	if ( nodo.className!=null && (nodo.className.substr(0,11)=="widget_open" || nodo.className.substr(0,13)=="widget_closed") ) {
		return new Array( nodo );	
	}
	
	//nodo non trovato. Iteriamo i figli ricorsivamente
	var figli = nodo.childNodes;
	var risultato = new Array();
	for ( var k=0; k<figli.length; k++ ) {
			
			risultato=risultato.concat( widgetDeepSearch( figli[k] ) );
			
	}
	

	
	return risultato;
	
}


var divs = document.getElementsByTagName('div');

for(i=0;i<divs.length;i++){
	if(divs.item(i).className == 'widget_open' ||
       divs.item(i).className == 'widget_closed'){
		var imgs = divs.item(i).getElementsByTagName('img');
		for(h=0;h<imgs.length;h++){
			if(imgs.item(h).className == 'exp' ||
			   imgs.item(h).className == 'min'){
				if(divs.item(i).className == 'widget_open'){
					imgs.item(h).className = 'exp';
					imgs.item(h).src = '/en_IT/static/images/expanded.gif';
				}else{
					imgs.item(h).className = 'min';
					imgs.item(h).src = '/en_IT/static/images/minimized.gif';
				}
			}
		}
	}
}

// Workaround safari
if (navigator.vendor == "Apple Computer, Inc." || navigator.vendor == "KDE") { 
	
	function Document() {}
	function Event() {}
	function HTMLCollection() {}
	function HTMLElement() {}
	function Node() {}
	Document.prototype       = window["[[DOMDocument]]"];
	Event.prototype          = window["[[DOMEvent]]"];
	HTMLCollection.prototype = window["[[HTMLCollection.prototype]]"];
	HTMLElement.prototype    = window["[[DOMElement.prototype]]"];
	Node.prototype           = window["[[DOMNode.prototype]]"];
	
}
//Workaround per l'inserimento dinamico di elementi in firefox

function insertMethodE(inWich,where,what){
	switch (where){
	case 'beforeBegin':
		inWich.parentNode.insertBefore(what,inWich);
		break;
	case 'afterBegin':
		inWich.insertBefore(what,inWich.firstChild);
		break;
	case 'beforeEnd':
		inWich.appendChild(what);
		break;
	case 'afterEnd':
		if (inWich.nextSibling) inWich.parentNode.insertBefore(what,inWich.nextSibling);
		else inWich.parentNode.appendChild(what);
		break;
	}
}

function insertMethodH(inWich,where,htmlStr){
	var r = inWich.ownerDocument.createRange();
	r.setStartBefore(inWich);
	var parsedHTML = r.createContextualFragment(htmlStr);
	//this.insertAdjacentElement(where,parsedHTML)
	insertMethodE(inWich,where,parsedHTML);
}

function insertMethodT(inWich,where,txtStr){
	var parsedText = document.createTextNode(txtStr);
	//this.insertAdjacentElement(where,parsedText)
	insertMethodE(inWich,where,parsedText);
}


