/*******************************************************************************
*
* DESCRIPTION
* Knihovna spolecnych javascriptovych funkci.
*
* AUTHOR
* Machalek Miroslav <miroslav.machalek@bluepixel.cz>
*
* FUNCTIONS
* contentHeaderRightLinksWidth()
* getObject(obj)
* getHttpObject()
* String.prototype.trim
* parseIntIsNaN(string)
* moveOption(value, direction)
* submitFormDetail()
* deleteActions(xmlHttp, id, list)
* removeActions(xmlHttp, id, script)
* solveActions(xmlHttp, id, list)
* showFormPart(tableRowPrefix)
* changeDelegatesList(type, tasksId)
* rightDisableIsDeny(rightsId)
* chooseAllRights()
* doFilter(url, linkAdd, reset)
* doPaging(e, resetPage)
* windowHeight()
* windowWidth()
* validateCheckboxes(parent, id, sublevel)
*
* EXAMPLE
*
*******************************************************************************/

/*******************************************************************************
* Upravuje sirku odkazu v elementu s id content-header-right
*******************************************************************************/
function contentHeaderRightLinksWidth() {
    if (getObject('content-header-right')) {
        var links = getObject('content-header-right').getElementsByTagName('a');

        for (i = 0; i < links.length; i++) {
            for (j = 0; j < links[i].childNodes.length; j++) {
                if (links[i].childNodes[j].nodeName == '#text') {
                    var width = (21 + (links[i].childNodes[j].nodeValue.length * 7));

                    if (links[i].childNodes[j].nodeValue.length >= 30) {
                        width = Math.round(width * 0.85);
                    } else if (links[i].childNodes[j].nodeValue.length >= 20) {
                        width = Math.round(width * 0.92);
                    }

                    links[i].style.width = width + 'px';
                }
            }
        }
    }
}

if (window.addEventListener){
    window.addEventListener("load", contentHeaderRightLinksWidth, false);
} else if (window.attachEvent) {
    window.attachEvent("onload", contentHeaderRightLinksWidth);
}

var IE = (document.all) ? 1 : 0;
var NS = (document.layers) ? 1 : 0;
var DOM = (document.getElementById) ? 1 : 0;

/*******************************************************************************
* Vraci odkaz na objekt
*******************************************************************************/
function getObject(obj) {
    if (DOM) {
        myObject = document.getElementById(obj);
    } else if (IE) {
        myObject = eval('document.all.' + obj);
    } else if (NS) {
        myObject = eval('document.layers.' + obj);
    }

	 return myObject;
}

/*******************************************************************************
* Vytvari http object
*******************************************************************************/
function getHttpObject() {
    var xmlHttp = null;

    if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest()
    } else if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject('Microsoft.XMLHTTP')
    }
  
    return xmlHttp;
}

/*******************************************************************************
* Definice funkce trim objektu String
*******************************************************************************/
String.prototype.trim =
    function() {
        return this.replace(/(^\s*)|(\s*$)/g, "");
    };

/*******************************************************************************
* Prevadi retezec na cislo, pokud neni retezec zadan, vraci 0
*******************************************************************************/
function parseIntIsNaN(string) {
    var integer = parseInt(string);
    
    return ((isNaN(integer)) ? 0 : integer);
}

/*******************************************************************************
* Presouva prvek z jednoho vyberniku do druheho, jedna se o univerzalni funkci,
* ktera vyuziva dvou vyberniku s id idsNotSelected a idsSelected
* 
* @param value (integer)     - hodnota
* @param direction (integer) - smer presunu
*                              1: vyber
*                              2: zruseni vyberu
*******************************************************************************/
function moveOption(value, direction) {
    var direction = parseInt(direction);

    // smer presunu neni dobre zadan, proto se nic neprovede    
    if (direction != 1 && direction != 2) {
        return false;
    }

    // pokud mame oba vyberniky
    if (getObject('idsNotSelected') && getObject('idsSelected')) {
        var newOptionsArray = Array();
        var newOptionsIndex = 0;

        // vyber
        if (direction == 1) {
            var clickedSelectOptions = getObject('idsNotSelected').options;
            var clickedSelectName = 'idsNotSelected';
            var changedSelectName = 'idsSelected';
        // zruseni vyberu
        } else if (direction == 2) {
            var clickedSelectOptions = getObject('idsSelected').options;
            var clickedSelectName = 'idsSelected';
            var changedSelectName = 'idsNotSelected';
        }

        // projdeme vybernik, na ktery bylo kliknuto, a upravime polozky vyberniku
        for (i = 0; i < clickedSelectOptions.length; i++) {
            // vybrana hodnota, premistime ji do druheho vyberniku
            if (clickedSelectOptions[i].value == value) {
                getObject(changedSelectName).options[getObject(changedSelectName).options.length] =
                    new Option(clickedSelectOptions[i].text, clickedSelectOptions[i].value);
            } else {
                 newOptionsArray[newOptionsIndex] = clickedSelectOptions[i];
                 newOptionsIndex++;
            }
        }

        // pridame hodnoty do vyberniku 
        getObject(clickedSelectName).options.length = 0;

        for (i = 0; i < newOptionsArray.length; i++) {
            getObject(clickedSelectName).options[i] = newOptionsArray[i];
        }
    }
}

/*******************************************************************************
* Odesila formular s id formDetail, umoznuje odesilat formulare s multiple
* selectem idsSelected
*******************************************************************************/
function submitFormDetail() {
    if (getObject('idsSelected')) {
        var options = getObject('idsSelected').options;
        
        for (i = 0; i < options.length; i++) {
            getObject('idsSelected').options[i].selected = 'selected';
        }
    }

    getObject('formDetail').submit();
}

/*******************************************************************************
* Provadi akce po zneplatneni prvku
*
* @param xmlHttp (XMLHttpRequest) - request
* @param id (integer)             - identifikator prvku
* @param list (integer)           - prepinac mezi seznamem a detailem
*******************************************************************************/
function deleteActions(xmlHttp, id, list) {
    var resultXml = xmlHttp.responseXML;

    // zobrazime hlasku
    if (resultXml.getElementsByTagName('error')[0].firstChild.data == '0') {
        // skryjeme ikonu pro mazani
        if (getObject('table_col_delete_' + id)) {
            getObject('table_col_delete_' + id).innerHTML = '';
        }

        // skryjeme ikonu pro uzavreni
        if (getObject('table_col_close_' + id)) {
            getObject('table_col_close_' + id).innerHTML = '';
        }

        // zvyraznime smazany radek
        if (getObject('table_row_' + id)) {
            getObject('table_row_' + id).className = getObject('table_row_' + id).className + ' deleted';
        }

        if (getObject('errorText')) {
            getObject('errorText').innerHTML = '';
            getObject('errorText').className = 'dn';
        }

        if (getObject('infoText')) {
            getObject('infoText').innerHTML =
                resultXml.getElementsByTagName('message')[0].firstChild.data.replace(/\n/g, '<br />');
            getObject('infoText').className = 'info';
        }
    } else {
        if (getObject('errorText')) {
            getObject('errorText').innerHTML =
                resultXml.getElementsByTagName('message')[0].firstChild.data.replace(/\n/g, '<br />');
            getObject('errorText').className = 'error';
        }

        if (getObject('infoText')) {
            getObject('infoText').innerHTML = '';
            getObject('infoText').className = 'dn';
        }
    }

    // jedna se o zneplatneni z detailu
    if (resultXml.getElementsByTagName('error')[0].firstChild.data == '0' && !list) {
        location.reload();
    }
}

/*******************************************************************************
* Provadi akce po smazani prvku
*
* @param xmlHttp (XMLHttpRequest) - request
* @param id (mixed)               - identifikator prvku
* @param script (string)          - skript, na ktery se mame presmerovat po
*                                   smazani prvku
*******************************************************************************/
function removeActions(xmlHttp, id, script) {
    var resultXml = xmlHttp.responseXML;

    if (getObject('table_row_' + id) &&
        resultXml.getElementsByTagName('error')[0].firstChild.data == '0') {
        getObject('table_row_' + id).style.display = 'none';

        // mohlo se stat, ze jsou smazany vsechny radky, pokud ano, tak skryjeme
        // celou tabulku
        var tableHeaderVisible = 0;

        var tableRows = getObject('table').getElementsByTagName('tr');

        // projdeme radky tabulky a zjistime, zda existuje nejaky nesmazany
        // radek        
        for (i = 0; i < tableRows.length; i++) {
            // nejedna se o hlavicku tabulky a radek je nesmazany
            if (tableRows[i].id != 'table_row_header' && tableRows[i].style.display != 'none') {
                tableHeaderVisible = 1
            }
        }

        // pokud nemame zadny nesmazany radek, tak skryjeme celou tabulku
        if (!tableHeaderVisible) {
            getObject('table').style.display = 'none';
        }
    }

    // zobrazime hlasku
    if (resultXml.getElementsByTagName('error')[0].firstChild.data == '0') {
        if (getObject('errorText')) {
            getObject('errorText').innerHTML = '';
            getObject('errorText').className = 'dn';
        }

        if (getObject('infoText')) {
            getObject('infoText').innerHTML =
                resultXml.getElementsByTagName('message')[0].firstChild.data.replace(/\n/g, '<br />');
            getObject('infoText').className = 'info';
        }
    } else {
        if (getObject('errorText')) {
            getObject('errorText').innerHTML =
                resultXml.getElementsByTagName('message')[0].firstChild.data.replace(/\n/g, '<br />');
            getObject('errorText').className = 'error';
        }

        if (getObject('infoText')) {
            getObject('infoText').innerHTML = '';
            getObject('infoText').className = 'dn';
        }
    }

    // jedna se o mazani z detailu, proto se presmerujeme
    if (
        script &&
        (
            (
                resultXml.getElementsByTagName('noRedirect')[0] &&
                resultXml.getElementsByTagName('noRedirect')[0].firstChild.data == '0'
            ) ||
            !resultXml.getElementsByTagName('noRedirect')[0]
        ) &&
        resultXml.getElementsByTagName('error')[0].firstChild.data == '0'
       ) {
        var redirectScript = script;
        
        if (resultXml.getElementsByTagName('error')[0].firstChild.data == '1') {
            if (redirectScript.indexOf('?') == 0) {
                redirectScript += '&error=1';
            } else {
                redirectScript += '?error=1';
            }
        }

        location.href = applicationAddress + redirectScript;
    }
}

/*******************************************************************************
* Provadi akce po oznaceni prvku jako splneny
*
* @param xmlHttp (XMLHttpRequest) - request
* @param id (integer)             - identifikator prvku
* @param list (integer)           - prepinac mezi seznamem a detailem
*******************************************************************************/
function solveActions(xmlHttp, id, list) {
    var resultXml = xmlHttp.responseXML;

    // zobrazime hlasku
    if (resultXml.getElementsByTagName('error')[0].firstChild.data == '0') {
        // skryjeme ikonku pro zneplatneni
        if (getObject('table_col_delete_' + id)) {
            getObject('table_col_delete_' + id).innerHTML = '';
        }

        // skryjeme ikonku pro mazani
        if (getObject('table_col_remove_' + id)) {
            getObject('table_col_remove_' + id).innerHTML = '';
        }

        // skryjeme ikonku pro vyreseni
        if (getObject('table_col_solve_' + id)) {
            getObject('table_col_solve_' + id).innerHTML = '';
        }

        // zobrazime stav
        if (getObject('table_col_state_' + id)) {
            getObject('table_col_state_' + id).innerHTML =
                resultXml.getElementsByTagName('stateText')[0].firstChild.data;
        }

        // zvyraznime radek
        if (getObject('table_row_' + id)) {
            getObject('table_row_' + id).className =
                getObject('table_row_' + id).className + ' solved';
        }
    
        if (getObject('errorText')) {
            getObject('errorText').innerHTML = '';
            getObject('errorText').className = 'dn';
        }

        if (getObject('infoText')) {
            getObject('infoText').innerHTML =
                resultXml.getElementsByTagName('message')[0].firstChild.data.replace(/\n/g, '<br />');
            getObject('infoText').className = 'info';
        }
    } else {
        if (getObject('errorText')) {
            getObject('errorText').innerHTML =
                resultXml.getElementsByTagName('message')[0].firstChild.data.replace(/\n/g, '<br />');
            getObject('errorText').className = 'error';
        }

        if (getObject('infoText')) {
            getObject('infoText').innerHTML = '';
            getObject('infoText').className = 'dn';
        }
    }

    // jedna se o zneplatneni z detailu
    if (resultXml.getElementsByTagName('error')[0].firstChild.data == '0' && !list) {
        location.reload();
    }
}

/*******************************************************************************
* Zobrazuje a skryva casti tabulky
*
* @param tableRowPrefix (string) - prefix radku tabulky, ktere se maji zobrazit
*******************************************************************************/
function showFormPart(tableRowPrefix) {
    // mame tabulku s castmi
    if (getObject('formParts')) {
        // nacteme radky tabulky s castmin
        var tableRows = getObject('formParts').getElementsByTagName('tr');

        // projdeme radky tabulky s castmin
        for (i = 0; i < tableRows.length; i++) {
            // jedna se o radek, ktery se ma zobrazovat nebo skryvat
            if (tableRows[i].id.indexOf('formPart') == 0) {
                // jedna se o radek, ktery mame zobrazit
                if (tableRows[i].id.indexOf(tableRowPrefix) == 0) {
                    tableRows[i].style.display = '';
                // nejedna se o radek, ktery mame zobrazit, proto jej skryjeme
                } else {
                    tableRows[i].style.display = 'none';
                }
            }
        }
    }

    return false;
}

/*******************************************************************************
* Meni seznam delegatu
*
* @param type (integer)    - typ delegata
* @param tasksId (integer) - identifikator ukolu, pouzije se jen pri
*                            zabezpecovani ukolu
*******************************************************************************/
function changeDelegatesList(type, tasksId) {
    tasksId = parseIntIsNaN(tasksId);

    // vytvorime si httpobject
    var xmlHttp = getHttpObject();
    
    xmlHttp.open('POST', applicationAddress + 'ajax/change_delegates_list.php', true);
    
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    
    xmlHttp.onreadystatechange =
        function () {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                // odstranime ze selectu vsechny polozky
                getObject('idsNotSelected').options.length = 0;
                getObject('idsSelected').options.length = 0;
              
                var resultXml = xmlHttp.responseXML;
            
                var optionsArray = resultXml.getElementsByTagName('option');
            
                for (i = 0; i < optionsArray.length; i++) {
                    childNodes = optionsArray[i].childNodes;
        
                    value = '';
                    text = '';

                    // projdeme child nodes a zjistime hodnotu a nazev polozky
                    for (j = 0; j < childNodes.length; j++) {
                        if (childNodes[j].nodeName == 'value') {
                            if (childNodes[j].firstChild) {
                                value = childNodes[j].firstChild.data;
                            }
                        }
                        else if (childNodes[j].nodeName == 'text') {
                            text = childNodes[j].firstChild.data;
                        }
                    }
        
                    document.getElementById('idsNotSelected').options[i] = new Option(text, value);
                }
            }
        };

    xmlHttp.send('type=' + type + '&tasksId=' + tasksId);

    return false;
}

/*******************************************************************************
* Znemoznuje zadat pravo jako odeprene, pokud neni vybrano
*
* @param rightsId (integer) - identifikator prava
*******************************************************************************/
function rightDisableIsDeny(rightsId) {
    if (getObject('rightsIds_' + rightsId).checked) {
        getObject('rightIsDeny_' + rightsId).disabled = '';
    } else {
        getObject('rightIsDeny_' + rightsId).checked = null;
        getObject('rightIsDeny_' + rightsId).disabled = 'disabled';
    }
}

/*******************************************************************************
* Vybere vsechna prava
*******************************************************************************/
function chooseAllRights() {
    var inputs = document.getElementsByTagName('input');
    
    for (i = 0; i < inputs.length; i++) {
        // jedna se o vybernik prava
	   if (inputs[i].id.indexOf('rightsIds_') == 0) {
	       var idParts = inputs[i].id.split('_');
	   
	       getObject('rightsIds_' + idParts[1]).checked = 'checked';
	       getObject('rightIsDeny_' + idParts[1]).disabled = '';
	   }
    }
    
    return false;
}

/*******************************************************************************
* Filtruje
*
* @param url (string)     - adresa, na kterou se mame presmerovat
* @param linkAdd (string) - retezec, ktery se pridava do adresy
* @param reset (integer)  - prepinac, ktery zapina reset filtru
*******************************************************************************/
function doFilter(url, linkAdd, reset) {
    var reset = parseIntIsNaN(reset);

    var filters = '';

    // projedeme inputy
    var inputs = document.getElementsByTagName('input');

    for (i = 0; i < inputs.length; i++) {
        // jedna se o vybernik prava
	    if (inputs[i].id.indexOf('filter') == 0) {
            filters += '&' + inputs[i].id + '=' + ((reset) ? '' : inputs[i].value);
	   }
    }

    // projedeme selecty
    var selects = document.getElementsByTagName('select');

    for (i = 0; i < selects.length; i++) {
        // jedna se o vybernik prava
	    if (selects[i].id.indexOf('filter') == 0) {
            filters += '&' + selects[i].id + '=' + ((reset) ? selects[i].options[0].value : selects[i].value);
	   }
    }

    location.href = url + '?page=1' + filters + ((linkAdd) ? linkAdd : '');
}

/*******************************************************************************
* Strankuje
*
* @param e (event)           - udalost
* @param resetPage (integer) - prepinac, ktery nastavuje stranku na prvni
*******************************************************************************/
function doPaging(e, resetPage) {
    var keyCode = e.keyCode;

    // zmackli jsme enter
    if (e.keyCode == 13) {
        var resetPage = parseIntIsNaN(resetPage);
    
        if (resetPage) {
            getObject('paggingPage').value = '1';
        }
    
        getObject('paggingForm').submit();
    }
}

/*******************************************************************************
* Vraci vysku okna
*******************************************************************************/
function windowHeight() {
//     if (window.innerHeight) {
//         return window.innerHeight;
    if (document.documentElement && document.documentElement.clientHeight) {
        return document.documentElement.clientHeight;
    } else if (document.body && document.body.clientHeight) {
        return document.body.clientHeight;
    } else {
        return null;
    }
}

/*******************************************************************************
* Vraci sirku okna
*******************************************************************************/
function windowWidth() {
//     if (window.innerWidth) {
//         return window.innerWidth;
    if (document.documentElement && document.documentElement.clientWidth) {
    	return document.documentElement.clientWidth;
    } else if (document.body && document.body.clientWidth) {
    	return document.body.clientWidth;
    } else {
        return null;
    }
}

/*******************************************************************************
* Osetreni zaskrtavani checkboxu kategorii
*******************************************************************************/
function validateCheckboxes(id, group) {
    var parents = group.split("_");
    for(i = 1; i < parents.length; i++) {
        if(i == 1) {
            var startstring = "cat";
        }
        startstring = startstring + "_" + parents[i];
        $("input[id='" + startstring + "']:checked").removeAttr("checked");
    }
    $("input[id^='" + group + "_" + id + "_']:checked").removeAttr("checked");
}

/*******************************************************************************
* Osetreni nahrani souboru pri zachovani obsahu poli formulare
*******************************************************************************/
function submitPart(co) {
    if(co == 'soubor') {
        document.getElementById('register').value = "0";
    }
    document.getElementById('register_form').submit();
}

