//Tutti i browser

var SOWIN=(navigator.userAgent.toLowerCase().indexOf("win")>-1)?1:0;
var SOMAC=(navigator.userAgent.toLowerCase().indexOf("mac")>-1)?1:0;
var SOLIN=(navigator.userAgent.toLowerCase().indexOf("linux")>-1)?1:0;
var SOALT=(!SOWIN && !SOMAC && !SOLIN)?1:0;

var OP=((ind1=navigator.userAgent.indexOf("Opera"))>-1)?1:0;
var PUNTO=(OP)? navigator.userAgent.indexOf(".",ind1):0;
var OP5=(OP && parseInt(navigator.userAgent.substr(PUNTO-1))==5)?1:0;
var OP6=(OP && parseInt(navigator.userAgent.substr(PUNTO-1))==6)?1:0;

var IE =((ind2=navigator.appVersion.indexOf("MSIE"))>-1 && !OP)?1:0;
var IE4=(IE && parseInt(navigator.appVersion.substr(ind2+5))==4)?1:0;
var IE5=(IE && parseInt(navigator.appVersion.substr(ind2+5))==5)?1:0;
var IE6=(IE && parseInt(navigator.appVersion.substr(ind2+5))==6)?1:0;
var IE7=(IE && parseInt(navigator.appVersion.substr(ind2+5))==7)?1:0;
var IE8=(IE && parseInt(navigator.appVersion.substr(ind2+5))==8)?1:0;

var NN=(navigator.appName.indexOf("Netscape")>-1)?1:0;
var NN4=(NN && parseInt(navigator.appVersion)==4)?1:0;
var NN6=(NN && parseInt(navigator.appVersion)>4)?1:0;

var OT=(!IE && !NN && !OP)?1:0;

/**
 * Normalizes currentStyle and ComputedStyle.
 * @param {String/HTMLElement/Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
 * @param {String} property The style property whose value is returned.
 * @return {String/Array} The current value of the style property for the element(s).
 */
function getStyleProp(el,property) {
    var value = null;
    var dv = document.defaultView;
    switch(property) {
        case 'opacity':
            if(el.filters) {
                value = el.style.filter;
                value = value.split('opacity=');
                value = value[1];
                value = parseFloat(value);
                value = value / 100;
                break;
            }
        default:
            if (el.style[property]) {
                value = el.style[property];
            } else if (el.currentStyle && el.currentStyle[property]) {
                value = el.currentStyle[property];
            } else if ( dv && dv.getComputedStyle ) {
                var converted = '';
                for(var i = 0, len = property.length;i < len; ++i) {
                    if (property.charAt(i) == property.charAt(i).toUpperCase())
                    {
                        converted = converted + '-' + property.charAt(i).toLowerCase();
                    } else {
                        converted = converted + property.charAt(i);
                    }
                }
                if (dv.getComputedStyle(el, '') && dv.getComputedStyle(el, '').getPropertyValue(converted)) {
                    value = dv.getComputedStyle(el, '').getPropertyValue(converted);
                }
            }
    }
    return value;
}

/**
 * Wrapper for setting style properties of HTMLElements.  Normalizes "opacity" across modern browsers.
 * @param {String | HTMLElement} el Accepts either a string to use as an ID for getting a DOM reference, or an actual DOM reference.
 * @param {String} property The style property to be set.
 * @param {String} val The value to apply to the given property.
 */
function setStyle(el, property, val) {
    switch(property) {
        case 'opacity' :
            if (el.filters) {
                el.style.filter = 'alpha(opacity=' + val * 100 + ')';

                if (!el.currentStyle.hasLayout) {
                    el.style.zoom = 1;
                }
            } else {
                el.style.opacity = val;
                el.style['-moz-opacity'] = val;
                el.style['-khtml-opacity'] = val;
            }
            break;
        case 'style':
            if(document.all){
                el.style.cssText=val;
            }else{
                el.setAttribute("style",val);
            }
            break;
        default :
            el.style[property] = val;
    }
}

/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
 */
var getElementsByClassName = function (className, tag, elm){
    if (document.getElementsByClassName) {
        getElementsByClassName = function (className, tag, elm) {
            elm = elm || document;
            var elements = elm.getElementsByClassName(className),
            nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
            returnElements = [],
            current;
            for(var i=0, il=elements.length; i<il; i+=1){
                current = elements[i];
                if(!nodeName || nodeName.test(current.nodeName)) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    else if (document.evaluate) {
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
            classesToCheck = "",
            xhtmlNamespace = "http://www.w3.org/1999/xhtml",
            namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
            returnElements = [],
            elements,
            node;
            for(var j=0, jl=classes.length; j<jl; j+=1){
                classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
            }
            try	{
                elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
            }
            catch (e) {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
            }
            while ((node = elements.iterateNext())) {
                returnElements.push(node);
            }
            return returnElements;
        };
    }else{
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
            classesToCheck = [],
            elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
            current,
            returnElements = [],
            match;
            for(var k=0, kl=classes.length; k<kl; k+=1){
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for(var l=0, ll=elements.length; l<ll; l+=1){
                current = elements[l];
                match = false;
                for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
                    match = classesToCheck[m].test(current.className);
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    return getElementsByClassName(className, tag, elm);
}

function set_hasFocus() {
    var form, f = 0, el, e, old_focus_handler, old_blur_handler, left_curly, right_curly;
    for (f; f < document.forms.length; ++f)
    {
        form = document.forms[f];
        for (e = 0; e < form.elements.length; ++e)
        {
            el = form.elements[e];
            if (el.className != 'exception') //don't want this included
            {
                old_focus_handler = null;
                if (el.onfocus != null)
                {
                    old_focus_handler = String(el.onfocus);
                    left_curly = old_focus_handler.indexOf('{') + 1;
                    right_curly = old_focus_handler.indexOf('}');
                    old_focus_handler = old_focus_handler.slice(left_curly, right_curly);
                }
                old_blur_handler = null;
                if (el.onblur != null)
                {
                    old_blur_handler = String(el.onblur);
                    left_curly = old_blur_handler.indexOf('{') + 1;
                    right_curly = old_blur_handler.indexOf('}');
                    old_blur_handler = old_blur_handler.slice(left_curly, right_curly);
                }
                el.onfocus = new Function('document.hasFocus=this;'+((old_focus_handler)?old_focus_handler:''));
                el.onblur = new Function('document.hasFocus=null;'+((old_blur_handler)?old_blur_handler:''));
            }
        }
    }
}

function hideMessage(){
    var div=getElementReference('message');
    var form=div.getElementsByTagName('form');
    var action=form[0].setAttribute('action','#');
    hideElement(div);
}

//genera un riferimento all'oggetto del parent con l'id specificato
function getElementReferenceParent(id) {
    if(window.opener==null){
        return;
    }
    //W3C
    if( window.opener.parent.document.getElementById ) return window.opener.parent.document.getElementById(id);
    //IE et al.
    else if( window.opener.parent.document.all ) return window.opener.parent.document.all[id];
    //NS: funziona solo con i layers non nidificati
    else if( window.opener.parent.document.layers ) return window.opener.parent.document.layers[id];
    else return null;
}

//restituisce il valore di un attributo di stile per un elemento
function getCurrentStyle(element, attribute) {
    //W3C
    if( window.getComputedStyle) return window.getComputedStyle(element,"")[attribute]
    //IE
    else if (element.currentStyle) return element.currentStyle[attribute];
    //User-set
    else if (element.style) return element.style[attribute];
    else return "";
}

//restituisce la posizione del mouse rispetto alla pagina al verificarsi dell'evento e
function getMousePos(e)
{
    alert(e);
    if (!(e.pageX && e.pageY)) {
        if( document.documentElement && (
            document.documentElement.scrollTop ||
            document.documentElement.scrollLeft ) ) {

            return {
                x: e.clientX + document.documentElement.scrollLeft,
                y: e.clientY + document.documentElement.scrollTop
            }

        } else if( document.body && (
            document.body.scrollTop || document.body.scrollLeft )) {

            return {
                x: e.clientX + document.body.scrollLeft,
                y: e.clientY + document.body.scrollTop
            }

        } else {
            //niente da fare
            return {
                x: e.clientX,
                y:e.clientY
            }
        }
    } else {
        //IE et al.
        return {
            x: e.pageX,
            y: e.pageY
        }
    }
}

//normalizza l'evento e nel formato W3C
function getW3CEvent(e)
{
    //l?evento IE è una proprietà di window
    e = (window.event?window.event:e);
    //l?attributo target di IE si chiama scrElement
    //if (e.srcElement) e.currentTarget = e.target = e.srcElement;
    //il testo non è un target valido!
    if (e.target.nodeType == 3) e.target = e.target.parentNode;

    //mouse page position
    if (!e.pageX) {
        pagePos = getMousePos(e);
        e.pageX = pagePos.x;
        e.pageY = pagePos.y;
    }

    //keyboard key pressed
    if (!e.keyCode) {
        if (e.which) e.keyCode=e.which;
        else e.keyCode=e.charCode;
    }
    return e;
}

//imposta la posizione di un elemento posizionato
function setElementPosition(e,offsetX,offsetY)
{
    if (e.style && (getCurrentStyle(e,"position") == "relative" || getCurrentStyle(e,"position") == "absolute")) {
        e.style.left = offsetX+"px";
        e.style.top = offsetY+"px";
    }
}

//imposta la dimensione di un elemento
function setElementSize(e,SizeX,SizeY)
{
    if (e.style) {
        if (SizeX>=0) e.style.width = SizeX+"px";
        if (SizeY>=0) e.style.height = SizeY+"px";
    }
}

//nasconde un elemento
function hideElement(e)
{
    if (e.style) {
        e.style.display = "none";
    }
}

//mostra in elemento (block o inline) nascosto
function showElement(e,inline)
{
    if (e.style) {
        if (inline != undefined) e.style.display = (inline?"inline":"block");
        else e.style.display = "block";
    }
}

//restituisce la posizione di un elemento rispetto alla finestra
function getElementWindowPosition(e){
    if(!e) return null;
    var coords = [e.offsetLeft,e.offsetTop];
    while(e.offsetParent) {
        var pcoords = [e.offsetParent.offsetLeft,e.offsetParent.offsetTop];
        coords[0]+=pcoords[0];
        coords[1]+=pcoords[1];
        e=e.offsetParent;
    }
    return coords;
}

//restituisce la dimensione di un elemento
function getElementSize(e)
{
    if(!e) return null;
    if (e.offsetWidth && e.offsetHeight){
        return [e.offsetWidth,e.offsetHeight];
    } else {
        return [0,0];
    }
}

//accoda un handler a quelli già presenti nell'oggetto e per l'evento specificati
function appendEventHandler(f,obj,hnd) {
    //W3C
    if (obj.addEventListener) {
        obj.addEventListener(hnd,f,false);
    //IE
    } else if (obj.attachEvent){
        hnd = "on"+hnd;
        obj.attachEvent(hnd, f);
    } else {
        //altri
        hnd = "on"+hnd;
        var oldhandler = obj[hnd];
        if (oldhandler != 'function') {
            obj[hnd] = f;
        } else {
            obj[hnd] = function() {
                var hr1= oldhandler();
                var hr2 = f();
                return (hr1 && hr2);
            }
        }
    }
}

//genera un riferimento all'oggetto con l'id specificato
function getElementReference(id) {
    //W3C
    if( document.getElementById ) return document.getElementById(id);
    //IE et al.
    else if( document.all ) return document.all[id];
    //NS: funziona solo con i layers non nidificati
    else if( document.layers ) return document.layers[id];
    else return null;
}

/*Servono per aggiungi etichetta ed autore*/

//inserisce un elemento figlio
function appendElement(name, parent, attributes) {
    if (!parent) parent = document.body;
    //W3C
    if( document.createElement && parent.appendChild) {
        var e = document.createElement(name);
        for(a in attributes) e.setAttribute(a,attributes[a]);
        parent.appendChild(e);
        return e;
    //IE: in questo caso non possiamo restituire il riferimento all'elemento
    //l'utente dovr? occuparsenel, ad esempio dotandolo di id e poi chiamando
    //getElementReference
    } else if (parent.innerHTML) {
        var html = "<"+name;
        for(a in attributes){
            html+=" "+a+"=\""+attributes[a]+"\"";
            console.log(a);
        }
        html+="/>";
        perent.innerHTML += s;
    }
}

function appendElement(name, parent, attributes) {
    if (!parent) parent = document.body;
    //W3C
    if( document.createElement && parent.appendChild) {
        var e = document.createElement(name);
        for(a in attributes) e.setAttribute(a,attributes[a]);
        parent.appendChild(e);
        return e;
    //IE: in questo caso non possiamo restituire il riferimento all'elemento
    //l'utente dovr? occuparsenel, ad esempio dotandolo di id e poi chiamando
    //getElementReference
    } else if (parent.innerHTML) {
        var html = "<"+name;
        for(a in attributes){
            html+=" "+a+"=\""+attributes[a]+"\"";
            console.log(a);
        }
        html+="/>";
        perent.innerHTML += s;
    }
}

//preleva il contenuto testuale di un elemento
function getTextContent(element) {
    //W3C
    if (element.textContent) return element.textContent;
    else if (element.innerText) return element.innerText;
}

//imposta text come contenuto di element
function setTextContent(element, text) {
    emptyContent(element);
    //W3C
    if (element.textContent) element.textContent = text;
    else if( document.createTextNode && element.appendChild) {
        var t = document.createTextNode(text);
        element.appendChild(t);
    //IE et al.
    } else if (element.innerHTML) element.innerHTML=text;
}

//elimina tutto il contenuto di element
function emptyContent(element)
{
    //W3C
    if (element.textContent) element.textContent = "";
    else if (element.removeChild && element.hasChildNodes)
        while(element.hasChildNodes()) element.removeChild(element.firstChild);
    //IE et al.
    else if (element.innerHTML) element.innerHTML="";
}

//elimina tutto il contenuto di element compreso element
function emptyContentAll(element){
    //W3C
    if (element.textContent){
        element.textContent = "";
    }else if (element.removeChild && element.hasChildNodes){
        while(element.hasChildNodes()) element.removeChild(element.firstChild);
        if(element.parentNode){
            element.parentNode.removeChild(element);
        }
    }else{
        //IE et al.
        if (element.innerHTML){
            element.innerHTML="";
        }
        if(element.layer){
            element.parentNode.removeChild(element);
        }
    }
}

//Prendo il parent di un elemento
function getParentNode(element){
    //W3C
    if (element.parentNode){
        return element.parentNode;
    }
    return null;
}

//restituisce rapidamente tutti gli elementi nidificati in quello dato
function getAllChildren(element) {
    return element.all ? element.all : element.getElementsByTagName('*');
}

function getSizeScreen(){
    if(document.documentElement.clientWidth){
        //Per tutti (forse incluso IE)
        return [document.documentElement.clientWidth,document.documentElement.clientHeight]
    }else if(window.innerHeight){
        //Per tutti tranne IE
        return [window.innerWidth,window.innerHeight]
    }
    return null;
}

function getScrollXY() {
    var scrOfX = 0, scrOfY = 0;
    if( typeof( window.pageYOffset ) == 'number' ) {
        //Netscape compliant
        scrOfY = window.pageYOffset;
        scrOfX = window.pageXOffset;
    } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
        //DOM compliant
        scrOfY = document.body.scrollTop;
        scrOfX = document.body.scrollLeft;
    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
        //IE6 standards compliant mode
        scrOfY = document.documentElement.scrollTop;
        scrOfX = document.documentElement.scrollLeft;
    }
    return [scrOfX, scrOfY];
}
///////////////////////Modify//////////
function removeElement(id){
    var obj = getElementReference(id);
    if(obj != null){
        obj.parentNode.removeChild(obj);
        return obj;
    } else {
        return null;
    }
}

function removeElementByObj(obj){
    if(obj != null){
        obj.parentNode.removeChild(obj);
        return obj;
    } else {
        return null;
    }
}

function addClass(element, value) {
    if (!element.className) {
        element.className = value;
    } else {
        var newClassName = element.className;
        newClassName += " ";
        newClassName += value;
        element.className = newClassName;
    }
}

function hasClass (element, value) {
    if (typeof element == 'undefined' || element==null ) {
        return false;
    }
    if(element.className) {
        str = element.className.split( " " );
        for( i = 0; i < str.length; i++ ){
            if(str[i]==value) return true;
        }
    }
    return false;
}

function hasId (element, value) {
    if (typeof element == 'undefined' || element==null ) {
        return false;
    }
    if(str[i]==value) return true;
    return false;
}

function removeClass(element, value) {
    if (element.className) {
        var newClassName = "";
        str = element.className.split( " " );
        for( i = 0; i < str.length; i++ ){
            if( str[i] != value && str[i]!="" ) newClassName += ( i==0 ? "" : " " ) + str[i];
        }
        element.className = newClassName;
    }
    return 0;
}

function addClassSimple(element, value) {
    element.className = value;
}

function removeClassSimple(element) {
    element.className = '';
}

//rimuove un handler a quelli già presenti nell'oggetto e per l'evento specificati
function removeEventHandler(f,obj,hnd) {
    //W3C
    if (obj.removeEventListener) {
        obj.removeEventListener(hnd,f,false);
    //IE
    } else if (obj.detachEvent){
        hnd = "on"+hnd;
        obj.detachEvent(hnd, f);
    } else {
    //        //altri
    //        hnd = "on"+hnd;
    //        var oldhandler = obj[hnd];
    //        if (oldhandler != 'function') {
    //            obj[hnd] = f;
    //        } else {
    //            obj[hnd] = function() {
    //                var hr1= oldhandler();
    //                var hr2 = f();
    //                return (hr1 && hr2);
    //            }
    //        }
    }
}

//Inserisce un insieme di elementi
function xAppendDom(dom, parent) {
    if(parent.appendChild){
        parent.appendChild(dom.cloneNode(true));
        return true;
    }else{
        return false;
    }
}

//crea un elemento e non lo appende
function xCreateElement(name, attributes) {
    //W3C
    if(document.createElement) {
        var e = document.createElement(name);
        if(IE6 || IE7){
            for(a in attributes){
                if(a=="class"){
                    e.setAttribute("className",attributes[a]);
                }else{
                    e.setAttribute(a,attributes[a]);
                }
            }
        }else{
            for(a in attributes) e.setAttribute(a,attributes[a]);
        }
        return e;
    //IE: in questo caso non possiamo restituire il riferimento all'elemento
    //l'utente dovr? occuparsenel, ad esempio dotandolo di id e poi chiamando
    //getElementReference
    } else if (document.innerHTML) {
        var oData;
        oData.innerHTML=""
        var html = "<"+name;
        for(a in attributes){
            html+=" "+a+"=\""+attributes[a]+"\"";
            console.log(a);
        }
        html+="/>";
        oData.appendChild(html);
        //perent.innerHTML += s;
    }
}

//rimuove il parent dal dom passato ed appende i figli del parent ad element
function xRemoveParent(parent,element){
    var clNodes=parent.childNodes;
    if (clNodes) {
        for (var i = 0; i < clNodes.length; i++) {
            element.appendChild(clNodes[i].cloneNode(true))
        }
        return element;
    }
}
