var ColorsAverages = new Array();

function GetClientWidth()
{       
    // Restituisce la larghezza della area client del browser
    
    var tWidth = 0;  
    
    // Recupera la larghezza da un browser non Internet Explorer
    if (window.innerWidth) 
    {
        tWidth = window.innerWidth;
    }
    else 
    {
        // Recupera la larghezza da un browser Internet Explorer versione 6 o superiore
        if((document.documentElement) && ((document.documentElement.clientWidth) || (document.documentElement.clientHeight))) 
        {
            tWidth = document.documentElement.clientWidth;
        }
        else
        {
            // Recupera la larghezza da un browser Internet Explorer 4 compatibile
            if ((document.body) && ((document.body.clientWidth) || (document.body.clientHeight)))
            {
                tWidth = document.body.clientWidth;
            }
        }
    }
    
    return tWidth;
}

function GetClientHeight()
{        
    // Restituisce l'altezza dell'area client del browser

    var tHeight = 0;  
    
    // Recupera la larghezza da un browser non Internet Explorer
    if (window.innerHeight) 
    {
        tHeight = window.innerHeight;
    }
    else 
    {
        // Recupera la larghezza da un browser Internet Explorer versione 6 o superiore
        if((document.documentElement) && ((document.documentElement.clientHeight) || (document.documentElement.clientHeight))) 
        {
            tHeight = document.documentElement.clientHeight;
        }
        else
        {
            // Recupera la larghezza da un browser Internet Explorer 4 compatibile            
            if ((document.body) && ((document.body.clientHeight) || (document.body.clientHeight)))
            {
                tHeight = document.body.clientHeight;
            }
        }
    }
    
    return tHeight;
}

function GetAbsoluteTop(parElement)
{
    // Restituisce la posizione Top assoluta dell'elemento passato
    
    // parElement   -> Elemento di riferimento
    
    var tElement;
    var tAbsoluteTop;    
    
    tElement = parElement;
    tAbsoluteTop = 0;
    
    while (tElement!=null)
    {
        tAbsoluteTop += tElement.offsetTop;
        tElement = tElement.offsetParent;
        
        if (tElement!=null)
            tAbsoluteTop -= tElement.scrollTop;
    }
    
    return tAbsoluteTop;
}

function GetAbsoluteLeft(parElement)
{
    // Restituisce la posizione Left assoluta dell'elemento passato
    
    // parElement   -> Elemento di riferimento

    var tElement;
    var tAbsoluteLeft;    
    
    tElement = parElement;
    tAbsoluteLeft = 0;
    
    while (tElement!=null)
    {
        tAbsoluteLeft += tElement.offsetLeft;
        tElement = tElement.offsetParent;
        
        if (tElement!=null)
            tAbsoluteLeft -= tElement.scrollLeft;
    }
    
    return tAbsoluteLeft;
}

function GetDecimalSeparator()
{
    // Restituisce il carattere da utilizzare come separatore dei decimali (secondo le impostazioni internalzioni del Client)

    var tDecimal;    
    var tDecimalString;
    
    tDecimal = 0.1;
    
    tDecimalString = tDecimal.toLocaleString();
    
    return tDecimalString.substring(1,2);
}

function GetShortDateFormat()
{
    // Restituisce la stringa di formattazione per le date (secondo le impostazioni internalzioni del Client)
    
    if (GetDecimalSeparator() == ",")
        return "dd/MM/yyyy";
    else
        return "MM/dd/yyyy";
        
    // N.B. Il formato della data viene calcolato in base al separatore delle migliaia
    // in quanto non è possibile risalire alle impostazione internazionali del Client)
}

function GetBrowserType()
{
    // Restituisce il tipo di browser corrente
    
    return navigator.userAgent.toUpperCase();    
}

function GetAjax()
{
    // Restituisce un'istanza di Ajax (XMLHTTPRequest) secondo il tipo di browser corrente
    
	var tAjax;
	var tBrowserType;

    if ((typeof(XMLHttpRequest) === "function") || (typeof(XMLHttpRequest) === "object"))
    {
        // Restituisce l'istanza di Ajax per browser non Internet Explorer o Internet Explorer 7
        tAjax = new XMLHttpRequest();        
    }
    else
    {
        // Preleva il tipo del Browser
        tBrowserType = GetBrowserType();
        
        // Controllo che il Browser non sia Internet Explorer 4
        if ((window.ActiveXObject) && (tBrowserType.indexOf("MSIE 4") < 0))
        {            
            if (tBrowserType.indexOf("MSIE 5")<0)
            {
                // Restituisce l'instanza di Ajax per browser Internet Explorer 6.0
                tAjax = new ActiveXObject("Msxml2.XMLHTTP");
            }
            else
            {
                // Restituisce l'instanza di Ajax per browser Internet Explorer 5.0 - 5.5
                tAjax = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
    }
    
    return tAjax	
}

function GetMouseButton(e)
{
    // Restituisce il numero di pulsante premuto
    // 1 -> Sinistro
    // 2 -> Centrale
    // 3 -> Destro
    
    // parEvent -> EventArgs
    
    var tButton;
    
    if (e.which)
    {
        if (e.which>0)
        {
            // Parserizza il button per gli altri browsers
            switch (e.button)
            {
                case 0: // Sinistro
                    tButton=1;
                    break;
                case 1: // Centrale
                    tButton=2;
                    break;
                case 2: // Destro
                    tButton=3;
                    break;
                default:                   
                    tButton=0;
                    break;
            }
        }
        else
        {
            tButton=0;
        }
    }
    else
    {
        
        // Parserizza il button per Internet Explorer    
        switch (e.button)
        {
            case 1: // Sinistro
                tButton=1;             
                break;
            case 4: // Centrale              
                tButton=2;                
                break;
            case 2: // Destro
                tButton=3;                          
                break;
            default:
                tButton=0;
                break;
        }    
    }    
        
    return tButton;
}

function ApplyPNGFilter(parElement)
{
    // Applica il flitro di trasparenza per le immagini PNG

    // parElement   -> Elemento HTML a cui applicare il filtro

    var tVersion;            
    var tHTML;
    
    // Se il browser è Internet Explorer ...
    if (navigator.appVersion.indexOf("MSIE")>0)
    {
        tVersion = parseFloat(navigator.appVersion.split("MSIE")[1]);

        // ... se la versione e superiore o uguale alla 5.5 e inveriore alla 7
        if ((tVersion>=5.5) && (tVersion<7))
        {
            // Ricrea il codice HTML applicando il filtro per la trasparenza PNG
            tHTML = "<span ";
            if (parElement.id)
                tHTML += "id=\"" + tElement.id + "\" ";
            if (parElement.className)
                tHTML += "class=\"" + parElement.className + "\" ";
            if (parElement.title)
                tHTML += "title=\"" + parElement.title + "\" ";
            tHTML += "style=\"";
            tHTML += "width:" + parElement.style.width + "px;";
            tHTML += "height:" + parElement.style.height + "px;";
            tHTML += "display:inline-block;";
            tHTML += parElement.style.cssText + ";";
            tHTML += "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + parElement.src + "', sizingMethod='crop');";
            tHTML += "\"></span>";
        
            // Sosituisce l'HTML dell'elemento di origine
            parElement.outerHTML = tHTML;
        }
    }
}

function GetAverageColor(parColor1, parColor2)
{
    // Restituisce il colore dato dalla media dei due colori passati
    
    // parColor1    -> Colore 1
    // parColor2    -> Colore 2
    
    var tRed1;
    var tRed2;
    var tGreen1;
    var tGreen2;
    var tBlue1;
    var tBlue2;
    var tRed;
    var tGreen;
    var tBlue;
    var tAverageColor;
    var tStop    
    var tColor;
    var iColorsAverage;
    var tColorsAverage;
    var tColorsAverageTmp;
    
    // Cerca nell'array se è già presente la media per i colori passati
    tColorsAverage = null;
    for (iColorsAverage=0; iColorsAverage<ColorsAverages.length; iColorsAverage++)
    {
        tColorsAverageTmp = ColorsAverages[iColorsAverage];
        if ((tColorsAverageTmp.Color1 == parColor1) && (tColorsAverageTmp.Color2 == parColor2))
        {
            tColorsAverage = tColorsAverageTmp;
            break;
        }
    }

    // Se il colore era già presente nella cache allora ritorna quel colore    
    if (tColorsAverage != null)
    {
        tAverageColor = tColorsAverage.ColorAverage;
    }    
    // Altrimenti effettua il calcolo della media
    else
    {
        tAverageColor = parColor2;
        
        if ((parColor1!="") && (parColor2!=""))
        {    
            tStop = false;
        
            if (parColor1.substring(0,1) == "#")
            {
                tRed1 = parseInt(parColor1.substring(1,3),16);
                tGreen1 = parseInt(parColor1.substring(3,5),16)
                tBlue1 = parseInt(parColor1.substring(5,7),16)
            }
            else
            {
                if (parColor1.substring(0,4) == "rgb(")
                {
                    tColor = parColor1.substring(4, parColor1.length-1).split(",");
                    tRed1 = parseInt(tColor[0]);
                    tGreen1 = parseInt(tColor[1]);
                    tBlue1 = parseInt(tColor[2]);
                }
                else
                    tStop = true;            
            }
            
            if (!tStop)
            {
                if (parColor2.substring(0,1) == "#")
                {
                    tRed2 = parseInt(parColor2.substring(1,3),16);
                    tGreen2 = parseInt(parColor2.substring(3,5),16)
                    tBlue2 = parseInt(parColor2.substring(5,7),16)
                }
                else
                {
                    if (parColor2.substring(0,4) == "rgb(")
                    {
                        tColor = parColor2.substring(4, parColor2.length-1).split(",");
                        tRed2 = parseInt(tColor[0]);
                        tGreen2 = parseInt(tColor[1]);
                        tBlue2 = parseInt(tColor[2]);
                    }
                    else
                        tStop = true;
                }
            }
            
            if (!tStop)
            {
                tRed = parseInt((tRed1 + tRed2)/2);
                tGreen = parseInt((tGreen1 + tGreen2)/2);
                tBlue = parseInt((tBlue1 + tBlue2)/2);
                
                // Costruisce il colore medio
                tAverageColor = "#" + PadString(tRed.toString(16).toUpperCase(), 2, '0') + PadString(tGreen.toString(16).toUpperCase(), 2, '0') + PadString(tBlue.toString(16).toUpperCase(), 2, '0');
                
                // Aggiunge in cache la media dei colori appena calcolata
                tColorsAverage = new ColorsAverage();
                tColorsAverage.Color1 = parColor1;
                tColorsAverage.Color2 = parColor2;
                tColorsAverage.ColorAverage = tAverageColor;
                ColorsAverages.push(tColorsAverage);
            }
        }        
    }
    
    tColorsAverage = null;
    
    return tAverageColor;
}

function ColorsAverage()
{
    this.Color1 = "";
    this.Color2 = "";
    this.ColorAverage = "";
}

var EmptyTags = 
{
   "IMG":   true, 
   "BR":    true, 
   "INPUT": true, 
   "META":  true, 
   "LINK":  true, 
   "PARAM": true, 
   "HR":    true 
}; 

function GetOuterHTML(parElementId)
{
    // Restituisce l'OuterHTML dell'elemento corrispondente all'Id passato
    
    // parElementId     -> Id dell'elemento di riferimento

    var tAttributes;
    var iAttribute;
    var tOuterHTML;
    var tElement;
        
    // Inizializzazione variabili locali
    tOuterHTML = "";
    
    // Preleva il puntatore all'elemento di riferimento
    tElement = document.getElementById(parElementId);
    
    if (tElement != null)
    {   
        // Se il browser è Internet Explorer ...     
        if (navigator.appVersion.indexOf("MSIE")>0)    
        {
            // ... preleva direttamente la proprietà outerHTML dell'elemento di riferimento
            tOuterHTML = tElement.outerHTML;
        }
        else
        {
            // ... ricostruisce l'outerHTML per browser che non supportano la proprietà
        
            tAttributes = tElement.attributes;    
            tOuterHTML = "<" + tElement.tagName;
            
            for (iAttribute = 0; iAttribute < tAttributes.length; iAttribute++)
            {
                if (tAttributes[iAttribute].name == "id")
                    tOuterHTML += " " + tAttributes[iAttribute].name + "=" + tAttributes[iAttribute].value;
                else
                    tOuterHTML += " " + tAttributes[iAttribute].name + "=\"" + tAttributes[iAttribute].value + "\"";
            }
            
            tOuterHTML += ">";
            
            if (!EmptyTags[this.tagName]) 
                tOuterHTML += tElement.innerHTML + "</" + tElement.tagName + ">";                
        }        
    }                
       
    return tOuterHTML;
}

function IsChildElement(parParentElement, parChildElement)
{
    // Indica se il ChildElement passato è figlio del ParentElement

    // parParentElement -> Elemento padre
    // parChildElement  -> Elemento figlio

    var tIsChildElement;
    var tChildElement;

    tIsChildElement = false;

    if ((parParentElement != null) && (parChildElement != null))
    {
        tChildElement = parChildElement;    
        
        while (tChildElement.parentNode != null)
        {
            if (parParentElement == tChildElement)
            {
                tIsChildElement = true;
                break;
            }
            else
                tChildElement = tChildElement.parentNode;
            
        }
    }
    
    return tIsChildElement;
}


/*
* Verifica se l'evento passato per parametro corrisponde a un mouseEnter o a un mouseLeave            
*/
function EventIsMouseEnterOrMouseLeave(parElementId, parEvent)
{
    var tElement;
    var tRelatedTarget;
 
    // Se l'evento è un mouseover o un mouseout..   
    if((parEvent.type == "mouseover") || (parEvent.type == "mouseout"))
    {
        // .. verifica se esso corrisponde ad un evento di mouseenter o di mouseleave
        tElement = document.getElementById(parElementId);
        tRelatedTarget = parEvent.relatedTarget;
                            
        if ((tElement === tRelatedTarget) || (IsChildElement(tElement, tRelatedTarget)))
            return false;
    }
    
    return true;
}

/*
*  Effettua il padding (a sinistra) della stringa passata
*
*  parString      -> Stringa di cui effettuare il padding
*  parLength      -> Lunghezza finale della stringa
*  parPaddingChar -> Carattere di padding da utilizzare
*/
function PadString(parString, parLength, parPaddingChar)
{ 
    var tPaddingString;       
    
    while(parString.length < parLength)
        parString = parPaddingChar + parString;
    
    return parString;
}
