// verifichiamo tipologia di browser
var ff = false;
var ie = false;
var safari = false;
if (navigator.userAgent.indexOf("Firefox") != -1) {
    ff = true;
} else if (navigator.appVersion.indexOf("MSIE") != -1) {
    ie = true;
} else if (navigator.userAgent.indexOf("Safari") != -1) {
    safari = true;
}

// verifichiamo la lingua
var pageLang = document.documentElement.lang;

// Cookie functions

function setCookie(key, value, path) {
    if (path.length == 0) {
        path = '/';
    }
    document.cookie = key + '=' + value + '; path=' + path;
}

function getCookie(key) {
    var cookies = document.cookie.split(';');
    var keyString = key + "=";
    for (var i = 0; i < cookies.length; i++) {
        var cookie = cookies[i];
        // skip any white spaces at the beginning
        while (cookie.charAt(0) == ' ') {
            cookie = cookie.substring(1, cookie.length);
        }
        var index = cookie.indexOf(keyString);
        if (index == 0) {
            return cookie.substring(keyString.length)
        }
    }
    return null;
}

// onLoad functions

function addToOnLoad(func) {
    var oldOnLoad = window.onload;
    if (oldOnLoad) {
        window.onload = function() {
            oldOnLoad();
            func();
        };
    } else {
        window.onload = func;
    }
}

// input validation

function ctrTypeString(attributo) {
    return true;
}

function ctrTypeBoolean(attributo) {
    return true;
}

function ctrCombo(attributo) {
    if (attributo.value != '')
        attributo.style.backgroundColor = 'white';
}

function backgroundDelete(attributo) {
    var lunghezza = (attributo.value).length;

    if (lunghezza != 0) {
        attributo.style.backgroundColor = 'white';
    }
}

function ctrTypeInteger(attributo, msg) {
    var result = /^\s*-?\d*\s*$/.test(attributo.value);

    if (result) {
        attributo.style.backgroundColor = 'white';
        return true;
    } else {
        alert(msg);
        attributo.style.backgroundColor = 'red';
        return false;
    }
}

function ctrTypeDecimal(attributo, msg) {
    var result = /^\s*-?\d*(\.\d+)?\s*$/.test(attributo.value);

    if (result) {
        attributo.style.backgroundColor = 'white';
        return true;
    } else {
        alert(msg);
        attributo.style.backgroundColor = 'red';
        return false;
    }
}

function ctrTypeDate(attributo, format, msg) {
    var trimmedValue = attributo.value.replace(/^\s+|\s+$/g, "");
    if (!isValidDate(trimmedValue, format)) {
        alert(msg);
        attributo.style.backgroundColor = 'red';
        return false;
    } else {
        attributo.style.backgroundColor = 'white';
        return true;
    }
}

function ctrRequired(attributo, msg) {
    var lunghezza = (attributo.value).length;

    if (lunghezza == 0) {
        alert(msg);
        attributo.style.backgroundColor = 'red';
        return false;
    } else {
        attributo.style.backgroundColor = 'white';
        return true;
    }
}

function valida(formobj, msg) {
    var inputList = formobj.getElementsByTagName("input");

    for (var i = 0; i < inputList.length; i++) {
        var inputElement = inputList[i];
        if (inputElement.style.backgroundColor == 'red') {
            alert(msg);
            return false;
        }
    }
    return true;
}

function verificaPassword(msg1, msg2) {
    var newpassword = document.inputform.newpassword.value;
    var confirmnewpassword = document.inputform.confirmnewpassword.value;

    if (( newpassword.length < 6 || confirmnewpassword.length < 6 )) {
        alert(msg1);
        return false;
    }
    if (newpassword != confirmnewpassword) {
        alert(msg2);
        document.inputform.newpassword.value = "";
        document.inputform.confirmnewpassword.value = "";
        return false;
    }
}

function setupInputFocus() {
    if (safari) { // Safari gestisce da solo il focus degli input
        return;
    }

    var focusRegExp = new RegExp("( )?focus\\b");
    // scorriamo gli input
    var elements = document.getElementsByTagName("INPUT");
    var i;
    for (i = 0; i < elements.length; i++) {
        var element = elements[i];
        if (element.type != 'text' && element.type != 'password') {
            continue;
        }
        element.onfocus = function() {
            this.className += " focus";
        };
        element.onblur = function() {
            this.className = this.className.replace(focusRegExp, "");
        };
    }
    // scorriamo i textarea
    elements = document.getElementsByTagName("TEXTAREA");
    for (i = 0; i < elements.length; i++) {
        elements[i].onfocus = function() {
            this.className += " focus";
        };
        elements[i].onblur = function() {
            this.className =
            this.className.replace(focusRegExp, "");
        };
    }
}

function focusOnElement(elementId) {
    var element = document.getElementById(elementId);
    element.focus();
}

function verifyLine(textarea) {
    var brow = navigator.userAgent.toLowerCase();
    var dim = textarea.value.split('\n');
    var rows = 0;
    for (var i = 0; i < dim.length; i++) {
        if (dim[i].length >= textarea.cols)
            app += Math.floor(dim[i].length / textarea.cols);
    }
    rows += dim.length;
    if (rows > textarea.rows && brow.indexOf('opera') == -1)
        textarea.rows = rows;
}


function clearValue(selectTargetInput, selectTargetIdInput) {
    var targetDateField = document.inputform.elements[selectTargetInput];
    targetDateField.value = "";
    targetDateField = document.inputform.elements[selectTargetIdInput];
    targetDateField.value = "";
}

function setNoneAdvancedSearch(selectTargetInput, selectTargetIdInput) {
    var targetDateField = document.inputform.elements[selectTargetInput];
    targetDateField.value = "--Nessuno--";
    targetDateField = document.inputform.elements[selectTargetIdInput];
    targetDateField.value = "*";
}

function setAllAdvancedSearch(selectTargetInput, selectTargetIdInput) {
    var targetDateField = document.inputform.elements[selectTargetInput];
    targetDateField.value = "--Tutti--";
    targetDateField = document.inputform.elements[selectTargetIdInput];
    targetDateField.value = "";
}

function chainedSelect(elem, targetSelect, cls, model, msg2) {
    var form = elem.form;
    var target;
    for (var i = 0; i < form.length; i++) {
        var current = form.elements[i];
        if (current.name == targetSelect) {
            target = current;
            break;
        }
    }
    try {
        var value = elem.options[elem.selectedIndex].value;
        var reqStr = "Select?class=" +
                     urlencode(cls) +
                     "&contextid=" +
                     value;
        doXmlHttpRequest(reqStr, new SelectHandler(target));
    } catch(e) {
        var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Unknown Error");
        alert(msg2 + "\n" + msg);
    }
}

function SelectHandler(target) {
    var elem = target;
    this.handleRequest = handleRequest;

    function handleRequest(req) {
        var xmlObj = req.responseXML.documentElement;
        while (elem.length > 0) {
            elem.remove(0);
        }
        for (i = 0; i < xmlObj.childNodes.length; i++) {
            var xmlNode = xmlObj.childNodes[i];
            var y = document.createElement('option');
            y.value = xmlNode.getAttribute("value");
            y.selected = xmlNode.getAttribute("selected");
            // la seguente riga è più portabile rispetto a textContent/innerHTML/innerText
            y.text = xmlNode.childNodes[0].nodeValue;
            if (ie) {
                elem.add(y);
            } else {
                elem.add(y, null);
            }
        }
        if (elem.onchange) {
            elem.onchange();
        }
    }
}

function doXmlHttpRequest(reqStr, handler) {
    // verifichiamo tipologia di browser
    var req = null;
    if (ie) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        req = new XMLHttpRequest();
    }

    if (req == null) {
        alert("Impossible to create AjaxRequest");
        return;
    }

    // inizializziamo la richiesta
    req.open('GET', reqStr, true);

    // leghiamo lo handler
    req.onreadystatechange = function() {
        if (req.readyState == 4 && req.status == 200) {
            handler.handleRequest(req);
        }
    }

    // inviamo la richiesta
    if (ie) {
        req.send();
    } else {
        req.send(null);
    }
}

function urlencode(str) {
    return escape(str).replace("+", "%2B").replace("@", "%23").replace("/", "%2F")
}

function refreshPagingForm(formName) {
    var form = document.getElementById(formName);
    refreshPageDisplay(form, false);
}

function refreshPageDisplay(form, doload) {
    var maxpage = Math.ceil(form.maxresults.value / form.pagesize.value);

    // verifichiamo che la pagina sia entro il limite superiore
    if (form.page.value > maxpage) {
        form.page.value = maxpage;
    }

    // verifichiamo che la pagina sia entro il limite inferiore
    if (form.page.value < 1) {
        form.page.value = 1;
    }

    /* tenere il seguente controllo a ">=" in modo da gestire il caso
     * di 0 risultati, altrimenti i pulsanti "Prossimo" e "Ultimo"
     * rimangono attivati.
     */
    if (form.page.value >= maxpage) {
        form.next.disabled = true;
        form.last.disabled = true;
    } else {
        form.next.disabled = false;
        form.last.disabled = false;
    }
    if (form.page.value == 1) {
        form.previous.disabled = true;
        form.first.disabled = true;
    } else {
        form.previous.disabled = false;
        form.first.disabled = false;
    }

    var firstinpage = (form.page.value - 1) * form.pagesize.value + 1;
    var lastinpage = form.page.value * form.pagesize.value;
    if (lastinpage > form.maxresults.value) {
        lastinpage = form.maxresults.value;
    }

    // sintetizziamo la stringa " of "
    var ofStr = " of ";
    if (pageLang == 'it') {
        ofStr = " di ";
    }

    // creiamo il testo 
    form.display.value =
    firstinpage + "-" + lastinpage + ofStr + form.maxresults.value;

    // caso particolare di testo se non ci sono elementi
    if (maxpage == 0) {
        form.display.value = " 0" + ofStr + "0";
    }

    // formattiamo la casella di testo in in modo che contenga almeno
    // 11 caratteri
    var size = form.display.value.length;
    if (size < 11)
        size = 11;
    form.display.size = size;

    if (doload) {
        var pagerType = form.className;
        if (pagerType == 'searchpager') {
            var elem = document.getElementById("searchpager" + form.qid.value);
            if (elem != null) {
                var omitRelAttr = null;
                if (form.omitRelAttr != null) {
                    omitRelAttr = form.omitRelAttr.value;
                }
                doSearchPager(elem, form.qid.value,
                        form.page.value, form.returnurl.value,
                        omitRelAttr);
            }
        } else if (pagerType == 'relendpager') {
            var elem = document.getElementById("relendpager" + form.code.value);
            if (elem != null) {
                doRelEndPager(elem, form.id.value,
                        form.relid.value, form.forward.value, form.page.value,
                        form.returnurl.value);
            }
        }
    }
}

function lastPage(form) {
    form.page.value = Math.ceil(form.maxresults.value / form.pagesize.value);
    refreshPageDisplay(form, true);
}

function nextPage(form) {
    form.page.value++;
    refreshPageDisplay(form, true);
}

function previousPage(form) {
    form.page.value--;
    refreshPageDisplay(form, true);
}

function firstPage(form) {
    form.page.value = 1;
    refreshPageDisplay(form, true);
}

function restoreRelGroup(relGroupId, isModel, cookiePath) {
    var cookieName = (isModel ? "model_" : "") + relGroupId;
    var relId = getCookie(cookieName);
    selectRelTab(relGroupId, relId, isModel, cookiePath);
}

function selectRelTab(relGroupId, relId, isModel, cookiePath) {
    var relGroupDiv = document.getElementById(relGroupId);
    var relTabs = relGroupDiv.firstChild;
    var ulist = relTabs.firstChild;

    // if a tab was not specified take the first element in the list.
    if (relId == null) {
        relId = ulist.firstChild.id.substring(7);
    }

    // select the tab
    var found = false;
    var relTabId = 'reltab_' + relId;
    var litems = ulist.childNodes;
    for (var i = 0; i < litems.length; i++) {
        var litem = litems[i];
        if (litem.id == relTabId) {
            litem.className = 'selected';
            found = true;
        } else {
            litem.className = '';
        }
    }

    // if the specified tab didn't match any tab in the list,
    // select the first element in the list.
    // this may happen if tabs are rearranged upstairs, and the
    // page is reloaded downstairs
    if (!found) {
        relId = ulist.firstChild.id.substring(7);
        relTabId = 'reltab_' + relId;
        ulist.firstChild.className = 'selected';
    }

    // select the div
    var relDivId = 'reldiv_' + relId;
    var relDivs = relGroupDiv.childNodes;
    for (i = 1; i < relDivs.length; i++) {
        var relDiv = relDivs[i];
        if (relDiv.id == relDivId) {
            relDiv.className = 'rel selected';
        } else {
            relDiv.className = 'rel';
        }
    }

    var cookieName = (isModel ? "model_" : "") + relGroupId;
    setCookie(cookieName, relId, cookiePath);

    return false;
}

function doSearchPager(elem, qid, page, returnurl, omitRelAttr) {
    var reqStr = 'SearchPager?qid=' + urlencode(qid) +
                 '&page=' + urlencode(page) +
                 '&returnurl=' + urlencode(returnurl);
    if (omitRelAttr != null) {
        reqStr += '&omitRelAttr=' + urlencode(omitRelAttr);
    }

    doXmlHttpRequest(reqStr, new ReplaceInnerHtmlHandler(elem));
}

function doRelEndPager(elem, id, relid, forward, page, returnurl) {
    var reqStr = 'RelEndPager?&id=' + urlencode(id) +
                 '&relid=' + urlencode(relid) +
                 '&forward=' + urlencode(forward) +
                 '&page=' + urlencode(page) +
                 '&returnurl=' + urlencode(returnurl);

    doXmlHttpRequest(reqStr, new ReplaceInnerHtmlHandler(elem));
}

function ReplaceInnerHtmlHandler(target) {
    this.handleRequest = handleRequest;

    function handleRequest(req) {
        target.innerHTML = "";
        target.innerHTML = req.responseText;
    }
}

function handleAdvancedCheckbox(cb) {
    var listItems = cb.form.firstChild.firstChild.childNodes;
    for (var i = 0; i < listItems.length; i++) {
        var item = listItems[i];
        if (cb.checked) {
            if (item.className == 'advanced-hide') {
                item.className = 'advanced-show';
            }
        } else {
            if (item.className == 'advanced-show') {
                item.className = 'advanced-hide';
            }
        }
    }
}

function mouseOverItem(target) {
    var classes = target.className.split(" ");
    for (var i in classes) {
        var current = classes[i];
        if (current == "mouseOver") {
            return;
        }
    }
    if (classes.length == 0) {
        target.className = "mouseOver";
    } else {
        target.className = target.className + " mouseOver";
    }
}

function mouseOutItem(target) {
    var classes = target.className.split(' ');
    var first = true;
    var newClassName = '';
    for (var i in classes) {
        var current = classes[i];
        if (current == 'mouseOver') {
            continue;
        }
        if (first) {
            newClassName = current;
            first = false;
        } else {
            newClassName = newClassName + ' ' + current;
        }
    }
    target.className = newClassName;
}

addToOnLoad(function() {
    setupInputFocus();
});

