/********************************************************************************************
 *
 * csspopup.js
 *
 * funzioni javascript per la gestione delle finistre popup CSS 
 *
 * version: 1.0 2006-09-18
 * author:  Massimo Viti <mviti@lamma.rete.toscana.it>, IBIMET Firenze Italy
 *
 ********************************************************************************************/

/********************************************************************************************/

/*
 *
 * gestori dell'evento 'focus' per i vari elemnti della finestra popup
 *
 */

// contiene l'oggetto 'Event' che ha perso il focus
var lastfocus_evt = null;

// gestore dell'evento onfocus
function popup_onfocus(e) {
	var evt = EventUtil.getEvent(e);
}
// gestore dell'evento onblur
function popup_onblur(e) {
	lastfocus_evt = EventUtil.getEvent(e);
}


/********************************************************************************************/

// calcola la coordinata 'top' della posizione visibile della finestra
// Questo valore puo' essere maggiore di 0 se parte della finestra e' scrollato
function getFirstVisibleTopWin() 
{
	var scrollTop = -1;
	
	if (document.documentElement && document.documentElement.scrollTop)
		scrollTop = document.documentElement.scrollTop;
	else if (document.body)
		scrollTop = document.body.scrollTop;
		
	return scrollTop;
}

// calcola la coordinata 'left' della posizione visibile della finestra
// Questo valore puo' essere maggiore di 0 se parte della finestra e' scrollato
function getFirstVisibleLeftWin() 
{
	var scrollLeft = -1;
	
	if (document.documentElement && document.documentElement.scrollLeft)
		scrollLeft = document.documentElement.scrollLeft;
	else if (document.body)
		scrollLeft = document.body.scrollLeft;
		
	return scrollLeft;
}

/********************************************************************************************/

// rende true se la finestra popupCSS e' aperta
function isOpen_CSSPopup(id_popup)
{
	var retval = false;
	var popupCSS = document.getElementById(id_popup);
	if (popupCSS)
	{
		var popupCSS_Style = popupCSS.style;
		retval = (popupCSS_Style.display && popupCSS_Style.display != 'none');
	}
	return retval;
}

// apre o chiude una finestra popup CSS
function toggleCSSPopup(id_popup)
{
try {
	var popupCSS = document.getElementById(id_popup);
	
	if (!popupCSS)
		return;
		
	var popupCSS_Style = popupCSS.style;
		
	if (!popupCSS_Style.display || popupCSS_Style.display == 'none') 
	{
		// se la larghezza non e' dichiarata la pone uguale a 300px
		if (!popupCSS_Style.width)
			popupCSS_Style.width = '300px';
		
		// centra, orizzontalmente la finestra popup 
		var popupWidth = parseInt(popupCSS_Style.width, 10);
		if (!isNaN(popupWidth))
		{
			var winLeft = (getDocumentWidth() - popupWidth) / 2;
			popupCSS_Style.left  = winLeft +  'px';
		}
		
		// la finestra viene mostrata in alto
		var headerHeight = 130; // altezza della testata della pagina
		
		// si ricava la distanza tra il top-of del body 
		// la parte alta della porzione attualmente visibile della finestra
		var scrollTop = -1;
		if (document.documentElement && document.documentElement.scrollTop)
			scrollTop = document.documentElement.scrollTop;
		else if (document.body)
			scrollTop = document.body.scrollTop;
		
		
		// di controlla che il 'top' per far vedere tutta la finestra-popup
		var popupHeight  = 220; // altezza del popup
		var windowHeight = (isIE ? document.body.clientHeight : window.innerHeight);
		var minPopupTop = windowHeight - (popupHeight + headerHeight);
//alert(windowHeight + "\n" + minPopupTop);
		if (minPopupTop < 50)
			headerHeight = 20;
					
		if (scrollTop > headerHeight)
			popupCSS_Style.top = scrollTop + 50 + 'px';
		else
			popupCSS_Style.top = headerHeight + 'px';
		
		// imposta un elevato z-index per assicurarsi che la finestra sia visibile 
		if (popupCSS_Style.zIndex < 100)
			popupCSS_Style.zIndex  = '100';    
			
		// mostra la finestra
		popupCSS_Style.display  = 'block';
		
		// modifca la gestione dell'eventi 'blur' al fine di 
		// registrare chi ha perso il fucus. Questa operazione e'
		// impiegata per restiturie il focus al giusto elemento 
		// dopo lo spostamento della finestra
		var tags = popupCSS.getElementsByTagName("*");
		for (var i = 0; i < tags.length; i++)
		{
		 	tags[i].onblur=popup_onblur;
  		}
	}
	else {
		popupCSS_Style.display = 'none';
	}
}
catch (e) { 
	alert("toggleCSSPopup() catching\n" + e + "\n" + str); 
}
	
	return false;
}


// chiude la finestra popupCSS
function closeCSSPopup(id_popup)
{
	var popupCSS = document.getElementById(id_popup);
	if (popupCSS && (popupCSS.style.display && popupCSS.style.display != 'none'))
		popupCSS.style.display = 'none';
}

// apre la finestra popupCSS
function openCSSPopup(id_popup)
{
	if (!isOpen_CSSPopup(id_popup))
		toggleCSSPopup(id_popup);
}


// 'rinfresca' (refresh) la finestra popup 
function refreshCSSPopup(id_popup)
{
	if (isOpen_CSSPopup(id_popup))
	{
		var popupLeft = null;
		var popupTop  = null;
		var popupCSS = document.getElementById(id_popup);	
		if (popupCSS)
		{			
			popupLeft = popupCSS.style.left;
			popupTop  = popupCSS.style.top;
		}
		closeCSSPopup(id_popup);
		
		openCSSPopup(id_popup);
		popupCSS = document.getElementById(id_popup);	
		if (popupCSS)
		{			
			popupCSS.style.left = popupLeft;
			popupCSS.style.top = popupTop;;
		}
	}
	else
	{
		openCSSPopup(id_popup);
	}
}



/***************************************************************************************
 * 
 * insieme di funzioni per lo spostamento della finestra popup css
 *
 ***************************************************************************************/
 
var popupOffsetX = 0; // posizione X del cursore alla pressione del bottone del mouse
var popupOffsetY = 0; // posizione Y del cursore alla pressione del bottone del mouse
var popupNowX    = 0; // indicazione della posizione left (X) del popup alla pressione del bottone del mouse
var popupNowY    = 0; // indicazione della posizione top (Y)  del popup alla pressione del bottone del mouse
var popupTrgt    = null; // oggetto che indica la finestra popup in esame

//var prevCursor   = 'default'; // tipo di cursore preceente

// funzione che risponde all'evento mousedown 
// id: ID della finestra popup in questione
function popupDown(e, id)
{ 
	var evt = EventUtil.getEvent();
	
	if (evt.target.onclick)
		return;
	
	popupOffsetX = evt.clientX;
	popupOffsetY = evt.clientY;

    popupTrgt = document.getElementById(id);
    if (popupTrgt)
    {
    	// ricava la posizione della finestra
		popupNowX = parseInt(popupTrgt.style.left);
		popupNowY = parseInt(popupTrgt.style.top);

    	// modifica il cursore
    	var header = evt.target;
    	if (header)
    	{
			//prevCursor = header.style.cursor;
			header.style.cursor = 'move';
		}
		//prevCursor = popupTrgt.style.cursor;
		//popupTrgt.style.cursor = 'move';
	
		// indica le funzioni per la gestione dei due eventi indicati	
		document.onmouseup   = popupUp;
		document.onmousemove = popupMove;
	}
}

// funzione che risponde all'evento mouseup
function popupUp(e)
{
	if (popupTrgt)
	{
		var evt    = EventUtil.getEvent();
		var header = evt.target;
		if (header)
		{
			/*
			header.style.cursor = prevCursor;
			prevCursor = 'default';
			*/
			header.style.cursor = 'default';
		}		
		//popupTrgt.style.cursor = prevCursor;
		
		popupTrgt=null;
		document.onmousemove = null;
		document.onmouseup   = null;
		if (lastfocus_evt)
		{
			lastfocus_evt.target.focus();		
			lastfocus_evt = null;
		}
	}
}

// funzione che risponde all'evento mousemove
function popupMove(e) 
{
  if (popupTrgt)
  {  
	var evt     = EventUtil.getEvent();
	var newLeft = (popupNowX + evt.clientX - popupOffsetX);
	var newTop  = (popupNowY + evt.clientY - popupOffsetY);
	
	// se e' necessario monitorare gli spostamenti del popp
	// fare un tag: <br /><span id="popupmoveinfo">...</span>	<br />
    // in questa posizione saranno mostrati i valori
    /*
	var infotxt = document.getElementById("infotxt");
	if (infotxt)
	{		
		infotxt.innerHTML = "getFirstVisibleTopWin(): " + getFirstVisibleTopWin() + "   getFirstVisibleLeftWin(): " + getFirstVisibleLeftWin() 
		+ "   newLeft: " + newLeft + "   newTop" + newTop;		
	}
	*/
	
	// controlla limiti 'left'
	minLeft = getFirstVisibleLeftWin();
	if (newLeft < minLeft)
	{
		newLeft = minLeft;
	}
	
	// controlla limiti 'top'
	minTop = getFirstVisibleTopWin();
	if (newTop < minTop)
	{
		newTop = minTop;
		//evt.clientY = (newTop - popupNowY) + popupOffsetY;
	}

	popupTrgt.style.left = newLeft + 'px';
	popupTrgt.style.top  = newTop + 'px';
	
	//popupTrgt.style.left = (popupNowX + evt.clientX - popupOffsetX) + 'px';
	//popupTrgt.style.top  = (popupNowY + evt.clientY - popupOffsetY) + 'px';
  }
}





/***************************************************************************************
 * 
 * controllo di alcuni eventi
 *
 ***************************************************************************************/



/***************************************************************************************
 * 
 * analizza il carattere imputato (onkeypress="return onEscape(event, callback);")
 * se si tratta di "ESC" esegue la funzione indicata con il parametro callback oppure se
 * callback non indica una funzione viene considerato l'ID del master-div
 * della finestra popup CSS da chiudere
 *
 ***************************************************************************************/
function onEscape(e, callback)
{
	var evt = EventUtil.getEvent();
	if (evt && evt.keyCode)
	{
		if (evt.keyCode == 27)
		{
			if (typeof callback == 'function')
				callback();
			else if (typeof callback == 'string')
				closeCSSPopup(callback);
			else
				alert("onEscape(): invalid callback parameter");
		}
	}
	return true;
}

