var uTimeoutID;

// Imposta il select ad un oggetto (se presente)
function setSelect(strElementName, uSleep) {

    var el = document.getElementById(strElementName);

    if (el)
	{
	    if (arguments.length == 1)
	    {
	        if (!el.disabled)
	        {
	            try
	            {
	                el.focus();

	                if (el.type != "submit")            
	                    el.select();
	            }
	            catch (e)
	            {
	            }
	        }
	    }
	    else
	    {
            clearTimeout(uTimeoutID);
	        uTimeoutID = setTimeout("setSelect('" + strElementName + "')", uSleep);
	    }
	}
}

// Visualizza il messaggio specificato (usa WLevel se specificato: AlertBox("n;messaggio"))
function myAlert(strMsg)
{
    // Controllo se è presente il WLevel nel messaggio
    if ((strMsg.split(";").length != 2) || (strMsg.split(";")[0].length != 1) || (strMsg.split(";")[0] != parseInt(strMsg.split(";")[0])))
    {
        alert(strMsg);
    }
    else
    {
        // Livello attuale
        var uWLevel = getCookie("WLevel");
        if (!uWLevel)
            uWLevel = 3;

        // Livello e messaggio attuali
        var uLev = strMsg.split(";")[0];
        var sMsg = strMsg.split(";")[1];

        // Controllo il livello del messaggio attuale
        if (uLev < uWLevel)
        {
            alert(sMsg);
        }
    }
}

// Ritarda il click sul bottone richiesto
function doClick(idEl)
{
    window.setTimeout('doClickNow(\'' + idEl + '\');', 1);
}

// Effettua il click sul bottone richiesto
function doClickNow(idEl)
{
    var el = document.getElementById(idEl);

    if (el)
	{
        if (el.click)
            el.click();
        else
            top.location.href = el.href;
	}
}

 // Esegue il click su bottone passato se il tasto premuto è INVIO
function makeClick(btnNameClick, event)
{
	// Se ho premuto invio e non sono in una TEXTAREA ...
	if (((event.keyCode == 13) && (event.srcElement.tagName != "TEXTAREA")) || ((event.keyCode == 10) && (event.ctrlKey)))
	{
		if (document.getElementById(btnNameClick))
		{
			event.cancelBubble = true;
			event.returnValue = false;
			event.cancel = true;

			// Se ho un evento onblur da far scattare ...
			if (event.srcElement.onblur != null)
			    event.srcElement.onblur();

			doClickNow(btnNameClick);
			return false;
		}
	}
}

// Cambia la classe del pulsante
function changeClass(btnName, btnNewClassName)
{
	if (document.getElementById(btnName))
	{
		document.getElementById(btnName).className = btnNewClassName;
	}
}

// Nome della tabella, numero colonna da usare (0..), ordinamento (0 = AZ, 1 = ZA), colonna da usare in caso di uguaglianza su uColumn
function orderTable(sTableName, uColumn, uOrderType, uColumnEx)
{
	// Classi utilizzate per le righe dell'elenco
	var aClass = new Array(2);
	aClass[0] = "Item";
	aClass[1] = "Alternating";
	var bSwapped = false;
	
	uColumnEx = typeof uColumnEx != 'undefined' ? parseInt(uColumnEx) : 0;

	var myTable = document.getElementById(sTableName);
	
	// Se ho trovato la tabella da ordinare
	if (myTable)
	{
		// Se ho tante righe chiedo conferma
		if (myTable.rows.length > 150)
			if (!confirm("L'ordinamento potrebbe richiedere molto tempo, eseguirlo comunque?"))
				return;

		// Se ho almeno 2 righe ...
		if (myTable.rows.length > 1)
		{
			// Controllo che esista la colonna da usare per l'ordinamento ...
			if (uColumn < myTable.rows[0].cells.length)
			{
				var bSwap = false;	// Usato per determinare se devo scambiare le righe
				var displayStyle = myTable.style.display;	// Valore dello style precedente
				myTable.style["display"] = "none";

				// Ordinamento bubble-sort
				for (co = 1; co < myTable.rows.length; co++)
					for (uRow1 = 0; uRow1 < (myTable.rows.length - co); uRow1++)
					{
						// Riga con cui devo confrontare il dato
						uRow2 = 1 + uRow1;

						valR1 = GetTextFromNode(myTable.rows[uRow1].cells[uColumn]);
						valR2 = GetTextFromNode(myTable.rows[uRow2].cells[uColumn]);
						valR1Ex = GetTextFromNode(myTable.rows[uRow1].cells[uColumnEx]);
						valR2Ex = GetTextFromNode(myTable.rows[uRow2].cells[uColumnEx]);

						// Controllo se i 2 valori sono numerici
						if ((parseFloat(valR1) == valR1) && (parseFloat(valR2) == valR2))
						{
							// Controllo se devo invertire le righe numeriche
							if (uOrderType)
								bSwap = ((parseFloat(valR1) < parseFloat(valR2)) ||
										 ((parseFloat(valR1) == parseFloat(valR2)) && (valR1Ex < valR2Ex)));
							else
								bSwap = ((parseFloat(valR1) > parseFloat(valR2)) ||
										 ((parseFloat(valR1) == parseFloat(valR2)) && (valR1Ex > valR2Ex)));
						}
						else
						{
							// Controllo se devo invertire le righe NON numeriche
							if (uOrderType)
								bSwap = ((valR1 < valR2) ||
										 ((valR1 == valR2) && (valR1Ex < valR2Ex)));
							else
								bSwap = ((valR1 > valR2) ||
										 ((valR1 == valR2) && (valR1Ex > valR2Ex)));
						}
						
						// Se devo invertire le righe
						if (bSwap)
						{
							// Inverto i nodi
							myNodeEx = myTable.rows[uRow2];
							myTable.childNodes[myTable.childNodes.length - 1].removeChild(myTable.rows[uRow2]);
							myTable.childNodes[myTable.childNodes.length - 1].insertBefore(myNodeEx, myTable.rows[uRow1]);
							
							bSwapped = true;
						}						
					}

				// Rimetto a posto le classi per le righe "item" e "alternating" nel caso in cui siano state "invertite"
				if (bSwapped)
					for (co = 0; co < myTable.rows.length; co++)
						myTable.rows[co].className = myTable.rows[co].className.replace(aClass[1 - co % 2], aClass[co % 2]);
						
				// Torno allo stile precedente (avevo impostato su "none" per l'ordinamento)
				myTable.style["display"] = displayStyle;
			}
		}
	}

	// Cambio icone
	sName = ["AZ","ZA"];
	document.getElementById("cmdOrder" + document.getElementById("jssColumn").value + "_" + document.getElementById("jssAZZA").value).src = "Images/icon" + sName[document.getElementById("jssAZZA").value] + "2.gif";
	document.getElementById("cmdOrder" + uColumn + "_" + uOrderType).src = "Images/icon" + sName[uOrderType] + ".gif";

	// Memorizzo l'ordinamento utilizzato		
	document.getElementById("jssColumn").value = uColumn;
	document.getElementById("jssAZZA").value = uOrderType;
	
	return false;
}

// Ritorna il contenuto del testo "interno" di un nodo (usato in orderTable)
function GetTextFromNode(node)
{
	if (node.childNodes.length > 0)
		return GetTextFromNode(node.childNodes[0]);
	else
	{
		if (node.nodeName == "#text")
			return node.nodeValue;
		else
			return node.innerHTML;
	}
}

// Imposto il colore del background per l'elemento passato sulle chiamate FocusIn e FocusOut
function setFocusColor (element, sMode, sFocusColor)
{
	// se ho specificato un colore ...
	if (sFocusColor != null)
	{
	    // Se ho specificato 3 valori ...
	    if (sFocusColor.split(";").length == 3)
	    {
	        var sColor = "rgb(" + sFocusColor.replace(/;/g, ",").replace(/ /g, "") + ")";
	        var sColorSpace = sColor.replace(/,/g, ", ");

	        // focus in
	        if (sMode == "in")
	            if (element.style.backgroundColor == '')
	            element.style.backgroundColor = sColor;

	        // focus out
	        if (sMode == "out")
	            if ((element.style.backgroundColor == sColor) || (element.style.backgroundColor == sColorSpace))
	            element.style.backgroundColor = '';
	    }
	}
}

// Lettura di un cookie
function getCookie(name)
{
	var start = document.cookie.indexOf(name+"=");
	var len = start+name.length+1;

	if ((!start) && (name != document.cookie.substring(0,name.length)))
		return null;
		
	if (start == -1)
		return null;
		
	var end = document.cookie.indexOf(";",len);
	if (end == -1)
		end = document.cookie.length;
		
	return unescape(document.cookie.substring(len,end));
}

// Scrittura di un cookie
function setCookie(name, value, expires)
{ 
	var cookieString = name + "=" + escape(value) + 
       ( (expires) ? ";expires=" + expires.toGMTString() : "") + "; path=/";

	document.cookie = cookieString;
}

// Gestione errori AJAX
function EndRequestHandler(sender, args)
{
    var sMsg = "Rete di connessione scollegata, impossibile collegarsi al server.\nE' possibile che tra poco sia nuovamente disponibile.\n";
    var sStatusCode = "timeout";
    
    // Se ho avuto un errore ...
    if (args.get_error() != undefined)
    {
        // Se ho un codice d'errore disponibile ...
        if (args.get_response().get_responseAvailable())
            sStatusCode = args.get_response().get_statusCode();
            
        // Visualizzazione messaggio
        alert(sMsg + "Codice d\'errore: " + sStatusCode);
        args.set_errorHandled(true);
    }
}

