﻿
var baseURL = '/';
var decimalSeparator = '.';
var menuID = 0;
var languageID = 'NL';
var jsTreeLabels;
var labels;

var nav = window.Event ? true : false;
if (nav) {
    //window.captureEvents(Event.KEYDOWN); 
    window.onkeydown = NetscapeEventHandler_KeyDown;
} else {
    document.onkeydown = MicrosoftEventHandler_KeyDown;
}
function NetscapeEventHandler_KeyDown(e) {
    if (e.which == 13 && e.target.type != 'textarea' && e.target.type != 'submit' && e.target.type != 'image') {
        return false;
    } else {
        return true;
    }
}

function MicrosoftEventHandler_KeyDown() {
    if (event.keyCode == 13 && event.srcElement.type != 'textarea' && event.srcElement.type != 'submit' && event.srcElement.type != 'image') {
        return false;
    } else {
        return true;
    }
}

function GetMessages(request, settings) {
    if (settings.responseText == '' || settings.responseText.indexOf('{') != 0)
        return;

    var json = eval("(" + settings.responseText + ")");

    // If loginRequired boolean is present, the session has timed out, the person is redirected to the login page.
    if (json.loginRequired) {
        // If there is a returnUrl specified, redirect to it.
        if (json.returnUrl != 'undefined') {
            document.location.href = json.returnUrl;
        }
        else {
            document.location.href = baseURL + 'login/?c=timeout';
        }
    }

    if (!json || typeof (json) != 'object' || typeof (json.messages) == 'undefined') return;

    $(this).empty().show();
    addMessages($(this), json.messages.error, "error");
    addMessages($(this), json.messages.warning, "warning");
    addMessages($(this), json.messages.information, "information");
    addMessages($(this), json.messages.success, "success");
    addMessages($(this), json.messages.hint, "hint");

    messagesComplete($(this));
}
function messagesComplete(element) {
    setTooltips();
}
function addMessages(obj, messages, messagetype) {
    if (!messages)
        return;

    var html = '<div class="displayMessage ' + messagetype + '">';
    for (var index = 0; index < messages.length; index++)
        html += messages[index];
    html += '</div>';
    obj.append(html);
}
function setTooltips() {
    $("a, img, input, div").filter("[title!='']").easyTooltip();
}


function createPDF() {
    tb_waiting();

    $("textarea[id$='editor']").show();
    $("table.PropertyGrid input[type=text]").addClass("textbox");

    var created = false;
    jQuery.ajax({
        url: baseURL + 'ValentNet/Views/Shared/Handlers/Print.ashx',
        data: { html: $("#content").html(), pageUrl: document.location.href },
        success: function(data) { created = true; },
        async: false,
        dataType: 'html',
        type: 'POST'
    });

    $("textarea[id$='editor']").hide();
    tb_remove();

    return created;
}

function ieSecurityWorkAround() {
    // Prevents the message 'Click to activate this control' from displaying
    objects = document.getElementsByTagName("object");
    for (var i = 0; i < objects.length; i++) {
        objects[i].outerHTML = objects[i].outerHTML;
    }
}

function addToFavorites(strURL, strTitle) {
    if (navigator.userAgent.indexOf('MSIE') >= 0 && navigator.userAgent.indexOf('Opera') < 0) {
        window.external.AddFavorite(strURL, strTitle);
    } else {
        document.body.innerHTML += '<' + 'a href="' + strURL + '" title="' + strTitle + '" rel="sidebar" style="display: none;" id="addbookmark">click<' + '/a>';
        document.getElementById('addbookmark').click();
        document.getElementById('addbookmark').outerHTML = '';
    }
}

function cboKeySort_onKeyPress(cbo, caseSensitive, e) {
    if (!e) e = window.event;
    var undefined;
    if (cbo.keypressBuffer == undefined) {
        cbo.keypressBuffer = '';
    }
    var key = String.fromCharCode(e.keyCode);
    cbo.keypressBuffer += key;
    if (!caseSensitive) {
        cbo.keypressBuffer = cbo.keypressBuffer.toLowerCase();
    }
    var optionsLength = cbo.options.length;
    for (var n = 0; n < optionsLength; n++) {
        var optionText = cbo.options[n].text;
        if (!caseSensitive) {
            optionText = optionText.toLowerCase();
        }
        if (optionText.indexOf(cbo.keypressBuffer, 0) == 0) {
            cbo.selectedIndex = n;
            return false;
        }
    }
    cbo.keypressBuffer = key;
    return true;
}

function onEnter(strCommand, e) {
    if (keyEnter(13, e)) {
        eval(strCommand);
    }
}

function keyEnter(number, e) {
    var keynum = 0;
    if (window.event) { keynum = e.keyCode; }
    else if (e.which) { keynum = e.which; }

    return keynum == number;
}

function integerValidation(e, information) {
    var key;
    if (window.event) {
        key = e.keyCode;
    } else if (e.which) {
        key = e.which;
    }

    // 8: backspace | 9: tab | 37: left | 39: right | 46: delete
    return ((key >= 48 && key <= 57) || (key >= 96 && key <= 105) || key == 8 || key == 9 || key == 37 || key == 39 || key == 46);
}
function decimalValidation(e) {
    var key;
    if (window.event) {
        key = e.keyCode;
    } else if (e.which) {
        key = e.which;
    }

    return integerValidation(e) || key == 188 || key == 190 || key == 110;
}

function Trim(STRING) {
    STRING = LTrim(STRING);
    return RTrim(STRING);
}

function RTrim(STRING) {
    while (STRING.charAt((STRING.length - 1)) == " ") {
        STRING = STRING.substring(0, STRING.length - 1);
    }
    return STRING;
}

function LTrim(STRING) {
    while (STRING.charAt(0) == " ") {
        STRING = STRING.replace(STRING.charAt(0), "");
    }
    return STRING;
}

// * * * * dialog window * * * * //
function DialogWindow(strURL, lngImgWidth, lngImgHeight, blnScrollbars) {
    var lngLeftMargin;
    var lngTopMargin;
    var lngScrHeight = screen.height;
    var lngScrWidth = screen.width;
    var lngWinHeight;
    var lngWinWidth;
    var returnValue;
    if (((lngScrWidth - 40) / lngImgWidth) <= ((lngScrHeight - 55) / lngImgHeight)) {
        // Width is leading
        if ((lngScrWidth - 40) < lngImgWidth) {
            //Image width is larger than the screen width, change the image size
            lngImgHeight = Math.round(lngImgHeight * (lngScrWidth - 40) / lngImgWidth);
            lngImgWidth = lngScrWidth - 40;
        }
    } else {
        // Height is leading
        if ((lngScrHeight - 55) < lngImgHeight) {
            //Image height is larger than the screen height, change the image size
            lngImgWidth = Math.round(lngImgWidth * (lngScrHeight - 55) / lngImgHeight);
            lngImgHeight = lngScrHeight - 55;
        }
    }
    lngWinWidth = lngImgWidth + 40;
    if (lngWinWidth < 420) {
        lngWinWidth = 420;
    }
    lngWinHeight = lngImgHeight + 100;
    lngLeftMargin = (lngScrWidth - lngWinWidth) / 2;
    lngTopMargin = (lngScrHeight - lngWinHeight) / 2;
    if (!nav) {
        window.showModalDialog(strURL + "&intWidth=" + lngImgWidth + "&intHeight=" + lngImgHeight, "ValentNet",
		"dialogWidth:" + lngWinWidth + "px;dialogHeight=" + lngWinHeight + "px;dialogLeft:" + lngLeftMargin + "px;dialogTop:" + lngTopMargin + "px;edge:sunken;scroll:" + blnScrollbars + ";status:1;help:0;resizable:1");
    } else {
        window.open(strURL + '&intWidth=' + lngImgWidth + '&intHeight=' + lngImgHeight, 'ValentNet',
        'height=' + lngWinHeight + ',width=' + lngWinWidth + ',toolbar=no,directories=no,status=yes,menubar=no,scrollbars=' + blnScrollbars + ',resizable=yes ,modal=yes,left=' + lngLeftMargin + ',top=' + lngTopMargin);
    }
}
// * * * * popup window * * * * //
function PopupWindow(strUrl, lngImgWidth, lngImgHeight) {
    PopupWindow(strUrl, lngImgWidth, lngImgHeight, false);
}

function PopupWindow(strURL, lngImgWidth, lngImgHeight, blnScrollbars, blnResizable) {
    var lngWinWidth, lngWinHeight, lngLeftMargin, lngTopMargin;
    var lngScrWidth = screen.width;
    var lngScrHeight = screen.height;
    if (((lngScrWidth - 40) / lngImgWidth) <= ((lngScrHeight - 55) / lngImgHeight)) {
        // Width is leading
        if ((lngScrWidth - 40) < lngImgWidth) {
            //Image width is larger than the screen width, change the image size
            lngImgHeight = Math.round(lngImgHeight * (lngScrWidth - 40) / lngImgWidth);
            lngImgWidth = lngScrWidth - 40;
        }
    } else {
        // Height is leading
        if ((lngScrHeight - 55) < lngImgHeight) {
            //Image height is larger than the screen height, change the image size
            lngImgWidth = Math.round(lngImgWidth * (lngScrHeight - 55) / lngImgHeight);
            lngImgHeight = lngScrHeight - 55;
        }
    }
    lngWinWidth = lngImgWidth + 40;
    if (lngWinWidth < 200) {
        lngWinWidth = 200;
    }
    lngWinHeight = lngImgHeight + 55;
    lngLeftMargin = (lngScrWidth - lngWinWidth) / 2;
    lngTopMargin = (lngScrHeight - lngWinHeight) / 2;
    myWin = open(strURL + "&intWidth=" + lngImgWidth + "&intHeight=" + lngImgHeight, "ValentNet",
		"width=" + lngWinWidth + ",height=" + lngWinHeight + ",status=no,toolbar=no,menubar=no,resizable=" + ((blnResizable) ? "yes" : "no") + ",scrollbars=" + ((blnScrollbars) ? "yes" : "no") + ",left=" + lngLeftMargin + ",top=" + lngTopMargin);
    myWin.focus();
}

// * * * * Window Resize * * * * //
function setWinSize(intHeight, intWidth) {
    if (window.outerWidth) {
        window.outerWidth = intWidth;
        window.outerHeight = intHeight;
    } else if (window.resizeTo) {
        window.resizeTo(intWidth, intHeight);
    }
}

// * * * * AJAX * * * * //

function getJsonCI(typeName, action, callback, postData) {
    if (!postData) postData = new Object();
    postData.ID = menuID;
    postData.action = action;
    postData.name = typeName;
    postData.pageUrl = document.location.href;
    $.post(baseURL + 'ValentNet/Views/Shared/Handlers/ContentItemHandler.ashx', postData, callback, 'json');
}

// server validate
function serverValidate(text, action, required) {
    var isValid = false;
    jQuery.ajax({
        url: baseURL + 'ValentNet/Views/Shared/ValidationHandler.ashx?action=' + action + '&text=' + text + '&required=' + required + '&pageUrl=' + document.location.href,
        success: function(data) {
            isValid = data.isValid;
        },
        async: false,
        dataType: 'json'
    });
    return isValid;
}

// * AJAX version 1 * //
var id;
var obj;
function getResponse(strUrl, strFunction, strID) {
    obj = GetXmlHttpObject();
    if (obj != null) {
        if (strID != undefined && strID != null) {
            if (strID.length > 0) {
                id = strID;
            }
        }
        obj.onreadystatechange = strFunction;
        obj.open("GET", strUrl + '&' + Math.random(), true);
        obj.send(null);
    } else {
        alert('No AJAX-support!/nPlease use FireFox or Internet Explorer.');
    }
}
function GetXmlHttpObject() {
    var objXMLHttp = null;
    if (window.XMLHttpRequest) {
        objXMLHttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return objXMLHttp;
}
// * AJAX version 2 * //
var fAJAXResponse;
var objAJAX;

function sendAJAX(strUrl, postData) {
    objAJAX = GetXmlHttpObject();
    if (objAJAX != null) {
        objAJAX.onreadystatechange = showAJAXResponse;
        objAJAX.open("GET", strUrl + '?' + postData + '&' + Math.random(), true);
        objAJAX.send(postData);
    } else {
        alert('No AJAX-support!/nPlease use FireFox or Internet Explorer.');
    }
}
function getAJAXResponse(strURL) {
    objAJAX = GetXmlHttpObject();
    if (objAJAX != null) {
        if (objAJAX.readyState > 0 && objAJAX.readyState < 4) {
            objAJAX.abort(); // kill if 1,2,3
        }
        objAJAX.onreadystatechange = showAJAXResponse;
        objAJAX.open("GET", strURL + '&' + Math.random(), true);
        objAJAX.send(null);
    } else {
        alert('No AJAX-support!/nPlease use FireFox or Internet Explorer.');
    }
}
function showAJAXResponse() {
    if (objAJAX.readyState == 4) {
        if (objAJAX.status == 200) {
            if (fAJAXResponse != null) {
                fAJAXResponse();
            }
        }
    }
}

// * AJAX version 3 - supports simultaneous requests * //

function sendAJAX3(url, postData, strReceiveFunc) {
    var httpRequest = GetXmlHttpObject();
    httpRequest.onreadystatechange = function() { showAJAXResponse3(httpRequest, strReceiveFunc); };

    if (postData != null)
        httpRequest.open("GET", url + '?' + postData + '&' + Math.random(), true);
    else
        httpRequest.open("GET", url + '?' + Math.random(), true);

    httpRequest.send('');

}

function showAJAXResponse3(httpRequest, strReceiveFunc) {
    if (httpRequest.readyState == 4) {
        if (httpRequest.status == 200) {
            eval(strReceiveFunc);

        }
        else {
            alert('There was a problem with the request.\n' + httpRequest.status + '\n' + httpRequest.responseText);
        }
    }
}

function setPageMenuButton(id, index) {
    var pagemenu = document.getElementById(id + '_pnlMenu');
    if (!pagemenu) return;
    var buttons = pagemenu.getElementsByTagName('input');
    var l = buttons.length;
    for (var i = 0; i < l; i++)
        buttons[i].className = i == index ? 'selected' : '';
}

function toggleResponse(strImgID, intID, txtOK, txtCancel, imgOK, imgCancel) {
    var img = document.getElementById(strImgID);
    if (!img) { alert('Image not found!'); return; }
    switch (objAJAX.responseText) {
        case "0":
            img.src = baseURL + "ValentNet/Content/icons/" + imgCancel;
            img.title = txtCancel;
            break;
        case "1":
            img.src = baseURL + "ValentNet/Content/icons/" + imgOK;
            img.title = txtOK;
            break;
        default:
            alert(objAJAX.responseText);
            break;
    }
}
function toggleItem(strImgID, intID, url, txtOK, txtCancel, imgOK, imgCancel) {
    if (!txtOK) txtOK = 'Zet `dit item` uit';
    if (!txtCancel) txtCancel = 'Zet `dit item` aan';
    if (!imgOK) imgOK = 'ok.gif';
    if (!imgCancel) imgCancel = 'cancel.gif';

    fAJAXResponse = new Function("toggleResponse('" + strImgID + "'," + intID + ",'" + txtOK + "','" + txtCancel + "','" + imgOK + "','" + imgCancel + "');");
    getAJAXResponse(url);
}

function switchEditToSettings(classname, back) {
    var trList = document.getElementsByTagName('tr');
    var l = trList.length;
    for (var i = 0; i < l; i++) {
        var tr = trList[i];
        if (!tr.className) continue;

        if (tr.className.indexOf(classname + 'field') != -1) {
            if (back) tr.className = tr.className.replace('hidden', '');
            else tr.className = tr.className + ' hidden';
            continue;
        }
        if (tr.className.indexOf(classname + 'setting') != -1) {
            if (back) tr.className = tr.className + ' hidden';
            else tr.className = tr.className.replace('hidden', '');
        }
    }
}

function switchListToSettings(listID, settingsID, back) {
    var list = $get(listID);
    var settings = $get(settingsID);
    if (!list || !settings) return;

    list.className = back ? list.className.replace('hidden', '') : list.className + ' hidden';
    settings.className = back ? settings.className + ' hidden' : settings.className.replace('hidden', '');
}

// * * * * DTPicker *  * * * //
function clearPicker(strBase, blnTime) {
    document.getElementById(strBase + 'txtDisplayDate').value = '';
    if (blnTime == true) {
        document.getElementById(strBase + 'cboHours').selectedIndex = 0;
        document.getElementById(strBase + 'cboMinutes').selectedIndex = 0;
    }
    closePicker(strBase);
    document.getElementById(strBase + 'txtDisplayDate').focus();
}

function closePicker(strBase) {
    document.getElementById(strBase + 'pnlPicker').style.display = 'none';
}

function getPickerDateSelected(strBase) {
    return document.getElementById(strBase + 'txtDisplayDate').value;
}

function getPickerResponse(strBase, strLanguage, strBaseDate, strSelDate) {

    fAJAXResponse = new Function('showPicker(\'' + strBase + '\',\'' + strLanguage + '\');');

    getAJAXResponse(baseURL + 'ValentNet/Views/Shared/Controls/DateTime/DTPickerCallbacks.aspx?lan=' + strLanguage + '&dtm=' + strBaseDate + '&dtmSel=' + strSelDate);
}

function loadPicker(strBase, strLanguage) {
    var oDivs = document.getElementsByTagName('div');
    var strDate = getPickerDateSelected(strBase);

    // Close any other calendar popups
    for (var n = 0; n < oDivs.length; n++) {
        if (oDivs[n].id != null && oDivs[n].id.indexOf('pnlPicker') > 0 && oDivs[n].id.indexOf(strBase) < 0)
            oDivs[n].style.display = 'none';
    }

    getPickerResponse(strBase, strLanguage, strDate, strDate);
}

function navigatePicker(strBase, strLanguage, strBaseDate) {
    var strDateSelected = getPickerDateSelected(strBase);

    getPickerResponse(strBase, strLanguage, strBaseDate, strDateSelected);
}

function setPickerDate(strBase, strDate) {
    document.getElementById(strBase + 'txtDisplayDate').value = strDate;
    document.getElementById(strBase + 'pnlPicker').style.display = 'none';
    document.getElementById(strBase + 'txtDisplayDate').focus();
}

function showPicker(strBase, strLanguage) {
    //alert(objAJAX.responseText);
    var intCss = 7;
    var intDay = 3;
    var intDisplay = 0;
    var intMainButtons = 5;
    var intMainDates = 0;
    var intMainMonth = 2;
    var intMainWeek = 3;
    var intMainWeekDays = 4;
    var intMainYear = 1;
    var intMonth = 4;
    var intMonthName = 5;
    var intYear = 6;
    var intWeek = 1;
    var intWeekday = 2;
    var n;
    var oButton;
    var oButtons;
    var oDate;
    var oDates;
    var oPicker = document.getElementById(strBase + 'pnlPicker');
    var oWeekDays;
    var strMonth;
    var strResult = '';
    var strWeek;
    var strYear;
    var tbCal = document.getElementById(strBase + 'tbCalendar');
    var td;
    var tr;
    var x = 0;
    var xmlDates = LoadXMLText(objAJAX.responseText);
    var y = 0;

    for (n = tbCal.rows.length - 1; n > 3; n--) {
        tbCal.deleteRow(n);
    }
    //alert(xmlDates.childNodes[0].childNodes.length);
    oButtons = xmlDates.childNodes[0].childNodes[intMainButtons].childNodes;
    oDates = xmlDates.childNodes[0].childNodes[intMainDates].childNodes;
    oWeekDays = xmlDates.childNodes[0].childNodes[intMainWeekDays].childNodes;
    strYear = xmlDates.childNodes[0].childNodes[intMainYear].childNodes[0].nodeValue;
    strMonth = xmlDates.childNodes[0].childNodes[intMainMonth].childNodes[0].nodeValue;
    strWeek = xmlDates.childNodes[0].childNodes[intMainWeek].childNodes[0].nodeValue;

    //Years
    // -1
    td = tbCal.rows[1].cells[0]
    td.onclick = new Function('navigatePicker(\'' + strBase + '\', \'' + strLanguage + '\', \'' + oButtons[0].childNodes[1].childNodes[0].nodeValue + '\');');
    td.title = oButtons[0].childNodes[0].childNodes[0].nodeValue
    // -10
    td = tbCal.rows[1].cells[1]
    td.onclick = new Function('navigatePicker(\'' + strBase + '\', \'' + strLanguage + '\', \'' + oButtons[1].childNodes[1].childNodes[0].nodeValue + '\');');
    td.title = oButtons[1].childNodes[0].childNodes[0].nodeValue
    // current year
    tbCal.rows[1].cells[2].innerHTML = strYear;
    // +1
    td = tbCal.rows[1].cells[3]
    td.onclick = new Function('navigatePicker(\'' + strBase + '\', \'' + strLanguage + '\', \'' + oButtons[3].childNodes[1].childNodes[0].nodeValue + '\');');
    td.title = oButtons[3].childNodes[0].childNodes[0].nodeValue
    // +10
    td = tbCal.rows[1].cells[4]
    td.onclick = new Function('navigatePicker(\'' + strBase + '\', \'' + strLanguage + '\', \'' + oButtons[2].childNodes[1].childNodes[0].nodeValue + '\');');
    td.title = oButtons[2].childNodes[0].childNodes[0].nodeValue

    //Months
    // -1
    td = tbCal.rows[2].cells[0]
    td.onclick = new Function('navigatePicker(\'' + strBase + '\', \'' + strLanguage + '\', \'' + oButtons[4].childNodes[1].childNodes[0].nodeValue + '\');');
    td.title = oButtons[4].childNodes[0].childNodes[0].nodeValue
    // current month
    tbCal.rows[2].cells[1].innerHTML = strMonth;
    // +1
    td = tbCal.rows[2].cells[2]
    td.onclick = new Function('navigatePicker(\'' + strBase + '\', \'' + strLanguage + '\', \'' + oButtons[5].childNodes[1].childNodes[0].nodeValue + '\');');
    td.title = oButtons[5].childNodes[0].childNodes[0].nodeValue

    for (n = 0; n < 7; n++) {
        tbCal.rows[3].cells[n + 1].innerHTML = oWeekDays[n].childNodes[0].nodeValue.substring(0, 1);
        tbCal.rows[3].cells[n + 1].title = oWeekDays[n].childNodes[0].nodeValue;
    }

    for (n = 0; n < oDates.length; n++) {
        oDate = oDates[n];
        if (oDate.childNodes[intWeekday].childNodes[0].nodeValue == '1') {
            tbCal.insertRow(tbCal.rows.length);
            tr = tbCal.rows[tbCal.rows.length - 1];
            tr.insertCell(tr.cells.length);
            td = tr.cells[tr.cells.length - 1];
            td.className = 'DPWeekNr';
            td.innerHTML = oDate.childNodes[intWeek].childNodes[0].nodeValue;
            td.title = strWeek + ' ' + oDate.childNodes[intWeek].childNodes[0].nodeValue;
        }
        tr.insertCell(tr.cells.length);
        td = tr.cells[tr.cells.length - 1];
        td.className = oDate.childNodes[intCss].childNodes[0].nodeValue;
        td.innerHTML = oDate.childNodes[intDay].childNodes[0].nodeValue;
        td.onclick = new Function('setPickerDate(\'' + strBase + '\', \'' + oDate.childNodes[intDisplay].childNodes[0].nodeValue + '\');');
        td.title = oWeekDays[parseInt(oDate.childNodes[intWeekday].childNodes[0].nodeValue) - 1].childNodes[0].nodeValue + ' ' + oDate.childNodes[intDay].childNodes[0].nodeValue + ' ' + oDate.childNodes[intMonthName].childNodes[0].nodeValue + ' ' + oDate.childNodes[intYear].childNodes[0].nodeValue;
    }
    x = Sys.UI.DomElement.getLocation(document.getElementById(strBase + 'txtDisplayDate')).x;
    y = Sys.UI.DomElement.getLocation(document.getElementById(strBase + 'txtDisplayDate')).y;

    Sys.UI.DomElement.setLocation(oPicker, x, y + 20);

    // remove the relative attribute from the parent divs
    oPicker.parentNode.style.position = 'static';
    oPicker.parentNode.parentNode.style.position = 'static';
    oPicker.style.display = 'block';
}

// * * * * Menu Tree * * * * //
var MT_ul = null;
function MT_AppendChilds(id, pid, mt, cmdID) {
    var ID = 0;
    var intTimer;
    var intName = 1;
    var intURL = 2;
    var intChilds = 3;
    var t;
    var tbId;
    var n;
    var xmlItem;
    var xmlMenu = LoadXMLText(objAJAX.responseText);

    var img = document.getElementById(cmdID);
    var li = img.parentNode;
    var ul = document.createElement('ul');
    li.appendChild(ul);
    MT_ul = ul;

    for (n = 0; n < xmlMenu.childNodes[0].childNodes.length; n++) {
        intTimer = (n + 1) * 25;
        //MT_AppendItem(id, mt, tbId, xmlMenu.childNodes[0].childNodes[n].childNodes[ID].childNodes[0].nodeValue, xmlMenu.childNodes[0].childNodes[n].childNodes[intName].childNodes[0].nodeValue, xmlMenu.childNodes[0].childNodes[n].childNodes[intURL].childNodes[0].nodeValue, xmlMenu.childNodes[0].childNodes[n].childNodes[intChilds].childNodes[0].nodeValue);
        xmlItem = xmlMenu.childNodes[0].childNodes[n];
        setTimeout("MT_AppendItem('" + id + "', '" + mt + "', '" + ul.id + "', '" + xmlItem.childNodes[ID].childNodes[0].nodeValue + "', '" + xmlItem.childNodes[intName].childNodes[0].nodeValue + "', '" + xmlItem.childNodes[intURL].childNodes[0].nodeValue + "', '" + xmlItem.childNodes[intChilds].childNodes[0].nodeValue + "')", intTimer);
    }
    img.src = baseURL + 'ValentNet/Content/icons/trvmin.gif';
}

function MT_AppendItem(id, mt, ul, intMenuID, strName, strURL, intHasChilds) {
    var image = '<img src="' + baseURL + 'ValentNet/Content/icons/empty.gif"  height="16" width="16" alt="" />';
    if (intHasChilds != '0')
        image = '<img id="cmd' + intMenuID + '" src="' + baseURL + 'ValentNet/Content/icons/trvplus.gif" height="16" width="16" alt="open" onclick="' +
           'MT_ToggleChilds(\'' + id + '\', \'' + intMenuID + '\', \'' + mt + '\', this);" />';

    var li = document.createElement('li');
    li.id = 'li' + intMenuID;
    li.innerHTML = image + '<a href="' + strURL + '" title="' + strName + '">' + strName + '</a>';
    MT_ul.appendChild(li);
}

function MT_GetChilds(id, pid, mt, cmdID) {
    fAJAXResponse = new Function('MT_AppendChilds(\'' + id + '\', \'' + pid + '\', \'' + mt + '\', \'' + cmdID.id + '\');');

    getAJAXResponse(baseURL + 'ValentNet/Views/Shared/Controls/MenuTree/MenuTreeCallbacks.aspx?ID=' + id + '&pID=' + pid + '&mt=' + mt);
}

function MT_ShowOrHideChilds(liList, cmdID, show) {
    var intTimer;
    var n;
    var src = !show ? 'plus' : 'min';
    show = !show ? 'none' : '';

    for (n = 0; n < liList.length; n++) {
        intTimer = (n + 1) * 25;
        setTimeout("document.getElementById('" + liList[n].id + "').style.display = '" + show + "'", intTimer);
    }
    cmdID.src = baseURL + 'ValentNet/Content/icons/trv' + src + '.gif';
}

function MT_ToggleChilds(id, pid, mt, cmdID) {
    var li = cmdID.parentNode;
    // search for ul
    var ulList = li.getElementsByTagName('ul');
    if (ulList.length > 0) {
        var liList = ulList[0].getElementsByTagName('li');
        MT_ShowOrHideChilds(liList, cmdID, liList[0].style.display == 'none');
    } else {
        MT_GetChilds(id, pid, mt, cmdID);
    }
}

// * * * * Printing * * * * //
function printSpecial(blnAuto) {
    if (document.getElementById != null) {
        var html = '<HTML>\n<HEAD>\n';

        if (document.getElementsByTagName != null) {
            var headTags = document.getElementsByTagName("head");
            if (headTags.length > 0) {
                html += headTags[0].innerHTML;
            }
        }

        html += '\n</HE' + 'AD>\n<BODY>\n';

        var printReadyElem = document.getElementById("printReady");

        if (printReadyElem != null) {
            html += printReadyElem.innerHTML;
        } else {
            alert("Could not find the printReady section in the HTML");
            return;
        }

        html += '\n</BO' + 'DY>\n</HT' + 'ML>';

        var printWin = window.open("", "printSpecial");
        printWin.document.open();
        printWin.document.write(html);
        printWin.document.close();
        if (blnAuto) {
            printWin.print();
        }
    } else {
        alert("Sorry, the print ready feature is only available in modern browsers.");
    }
}

// * * * * Email Validation * * * * //
function CheckEmail(strUrl, strFunction, id) {
    if (id != null && id != '') {
        //alert(o);
        var value = document.getElementById(id).value;
        // alert(value);
        var strImgId = id.replace('txt1', 'imgStatus');
        //alert(strImgId);

        imgStatus = document.getElementById(strImgId);

        if (value == '') {
            imgStatus.src = baseURL + 'ValentNet/Content/icons/cancel.gif';
            return
        }

        var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

        if (filter.test(value)) {

            // disable the textbox
            document.getElementById(id).disabled = true;

            var strHdnId = id.replace('txt1', 'hdnEmailCheckStatus');
            hdnStatus = document.getElementById(strHdnId);
            hdnStatus.value = '0';

            imgStatus.src = baseURL + 'ValentNet/Content/icons/loading.gif';
            //alert(strUrl);   
            getResponse(strUrl, strFunction, id);
            //alert('called');          

        }
        else {

            imgStatus.src = baseURL + 'ValentNet/Content/icons/cancel.gif';
            return
        }
    }
}

function generatePassword(btnName, passLength) {
    var chars = '23456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ!?@#$%&';
    var password = '';
    while (password.length < passLength) {
        password += chars.charAt(Math.round(Math.random() * (chars.length)));
    }
    var txtName = btnName.replace(/btnGenerate/, 'txt1');
    var textbox = document.getElementById(txtName);
    textbox.value = password;
}
// * * * * Password Validation * * * * //
function vnValidatePasswordStrength(source, args) {
    var score = 0;
    var result;

    if (args.Value.length > 0) {
        if (args.Value.length < 6) {
            score = score - 1;
        }
        if (!args.Value.match(/[a-z_]/i) || !args.Value.match(/[0-9]/)) {
            score = score - 1;
        }
        //        if(!pass.match(/\W/)){
        //          score = score - 1;
        //        }
        //        switch(score){
        //            case 0:
        //                result = 'Excellent';
        //                break;
        //            case -1:
        //                result = 'Good';
        //                break;
        //            case -2:
        //                result = 'Fair';
        //                break;
        //            default:
        //                result = 'Poor';
        //                break;
        //        }
        if (score == 0) {
            args.IsValid = true;
        } else {
            args.IsValid = false;
        }
    } else {
        args.IsValid = true;
    }
}

// * * * * Validation * * * * //
var Page_Validators_Copy;
function addValidator(id) {
    var n;
    for (n = 0; n < Page_Validators_Copy.length; n++) {
        if (Page_Validators_Copy[n].id.indexOf(id) >= 0) {
            Page_Validators.push(Page_Validators_Copy[n]);
        }
    }
}

function disableFileUpload() {
    //alert('dis');
    var arrInput = document.getElementsByTagName('input');
    var n = 0;
    for (n = 0; n < arrInput.length; n++) {
        //alert(arrInput[n].id);
        if (arrInput[n].type == 'file') {
            arrInput[n].disabled = true;
        }
    }
}

// * * * * XML * * * * //
function LoadXMLText(strText) {
    var xmlDoc;

    if (window.ActiveXObject) {
        // code for IE
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(strText);
    } else if (document.implementation && document.implementation.createDocument) {
        // code for Mozilla, Firefox, Opera, etc.
        var parser = new DOMParser();
        //xmlDoc.async = false;
        xmlDoc = parser.parseFromString(strText, "text/xml");
    } else {
        alert('Your browser cannot handle this script');
    }

    return (xmlDoc);
}

function FillFormByXML(oXML) {
    var n;
    var oField;
    var oNode;

    if (oXML) {
        if (oXML.firstChild.childNodes.length > 0) {
            for (n = 0; n < oXML.firstChild.childNodes.length; n++) {
                oNode = oXML.firstChild.childNodes[n];
                oField = document.getElementById(oNode.childNodes[0].firstChild.nodeValue);
                if (oField.type.toLowerCase() == 'radio') {
                    if (oNode.childNodes[1].childNodes.length > 0) {
                        ;
                        if (oNode.childNodes[1].firstChild.nodeValue == '1') {
                            oField.checked = true;
                            document.getElementById(oNode.childNodes[0].firstChild.nodeValue.replace('Yes', 'No')).checked = false;
                        } else {
                            oField.checked = false;
                            document.getElementById(oNode.childNodes[0].firstChild.nodeValue.replace('Yes', 'No')).checked = true;
                        }
                    }
                } else {
                    if (oNode.childNodes[1].childNodes.length > 0) {
                        ;
                        oField.value = oNode.childNodes[1].firstChild.nodeValue;
                    } else {
                        oField.value = '';
                    }
                }
            }
        }
    }
}

function ClearList(listID) {
    var lb;
    var n;

    lb = document.getElementById(listID);

    for (n = lb.options.length - 1; n > -1; n--) {
        lb.options[n] = null;
    }
}

function FillListByXML(listID, oXML) {
    var lb;
    var li;
    var n;
    var oNode;

    if (oXML) {
        if (oXML.firstChild.childNodes.length > 0) {

            lb = document.getElementById(listID);

            for (n = 0; n < oXML.firstChild.childNodes.length; n++) {
                oNode = oXML.firstChild.childNodes[n];
                li = new Option(oNode.childNodes[1].firstChild.nodeValue, oNode.childNodes[0].firstChild.nodeValue, false, false);
                lb.options[lb.length] = li;
            }
        }
    }
}

function GetWindowHeight() {
    if (nav) {
        return window.innerHeight;
    }
    else {
    }
}
function GetWindowWidth() {
    if (nav) {
        return window.innerWidth;
    } else {
        return document.body.offsetWidth;
    }
}

// * * * * MaxLangth function for textarea * * * * //
function ismaxlength(obj) {
    var mlength = obj.getAttribute ? parseInt(obj.getAttribute("maxlength")) : ""
    if (obj.getAttribute && obj.value.length > mlength) {
        obj.value = obj.value.substring(0, mlength)
    }
}

// Clears a dropdown list //
function clearSelectList(select_id) {
    var select = document.getElementById(select_id);
    select.options.length = 0;
}

// ********************************************************************************************
//    specific functions for Invoice and Contract
// ********************************************************************************************
var url = document.location.href;
var start = url.indexOf("?");
if (start > 0) url = url.substring(0, start);
var rowcount = 1;
function fillInvoiceRow(rowId) {
    var row = document.getElementById(rowId);
    if (!row) return;
    var values = objAJAX.responseText.split('|');
    fillInput(row.cells[2], values[0]);
    fillInput(row.cells[3], values[1]);
    fillInput(row.cells[4], values[2]);
    row.cells[5].innerHTML = parseFloat(values[1]) * parseFloat(values[2]);
    var vatInput = row.cells[6].getElementsByTagName('select');
    if (vatInput.length > 0) {
        for (var i = 0; i < vatInput[0].length; i++) {
            if (vatInput[0].options[i].value = values[4]) {
                vatInput[0].options[i].selected = true;
                break;
            }
        }
    }
    else row.cells[6].innerHTML = values[4] + '%';
    math(row, values[5], values[6], values[7]);
    addInvoiceRow(row);
}
function fillInput(cell, value) {
    var input = cell.getElementsByTagName('input');
    if (input) input[0].value = value;
}
function addInvoiceRow(row) {
    var rows = row.parentNode.rows;
    var last = rows[rowcount];
    if ((last.className == 'show' && last.cells[1].getElementsByTagName('select')[0].value == '')) return;
    rowcount++;
    rows[rowcount].className = 'show';
}
function getProduct(obj) {
    var id = obj.parentNode.parentNode.id;
    fAJAXResponse = new Function("fillInvoiceRow('" + id + "');");
    sendAJAX(url, "productID=" + obj.value + "&rowID=" + id);
}
function math(obj, deciml, group, symbol) {
    var row = obj.tagName == 'TR' ? obj : obj.parentNode.parentNode;
    var count = parseFloat(0 + row.cells[3].getElementsByTagName('input')[0].value.replace(/_/ig, '').replace(',', '.'));
    var price = parseFloat(0 + row.cells[4].getElementsByTagName('input')[0].value.replace(/_/ig, '').replace(',', '.'));
    var total = parseFloat(count * price);
    var vatpercent = '';

    var vatInput = row.cells[6].getElementsByTagName('select');
    if (vatInput.length > 0) vatpercent = vatInput[0].options[vatInput[0].selectedIndex].text.replace(/_/ig, '');
    else vatpercent = row.cells[6].innerHTML.replace('%', '');
    vatpercent = parseFloat(0 + vatpercent.replace(',', '.') / 100);

    row.cells[5].innerHTML = currency(total, deciml, group, symbol);
    row.cells[7].innerHTML = currency(parseFloat(total + (total * vatpercent)), deciml, group, symbol);

    var tdAmount = document.getElementById('tdAmount');
    var tdVat = document.getElementById('tdVat');
    var tdAmountTotal = document.getElementById('tdAmountTotal');
    if (!tdAmount || !tdVat || !tdAmountTotal) return;
    var amount = 0;
    var vat = 0;
    var rows = row.parentNode.rows;
    for (i = 1; i < rows.length - 1; i++) {
        var cell5 = rows[i].cells[5].innerHTML;
        if (cell5 == '0' || cell5 == '') continue;
        var a = currencyToFloat(cell5, deciml, group);
        amount += a;
        vat += (a * vatpercent);
    }
    tdAmount.innerHTML = currency(amount, deciml, group, symbol);
    tdVat.innerHTML = currency(vat, deciml, group, symbol);
    tdAmountTotal.innerHTML = currency(amount + vat, deciml, group, symbol);
}
function currency(value, deciml, group, symbol) {
    value = value.toFixed(2);
    value = value.replace(value.substr(value.length - 3, 1), deciml).replace(/,\./ig, group);
    return symbol + ' ' + value;
}
function currencyToFloat(value, deciml, group) {
    return parseFloat(0 + value.substr(2).replace(group, '').replace(deciml, '.'));
}
function selectInvoices(obj) {
    var check = obj.checked;
    while (obj && obj.tagName && obj.tagName.toLowerCase() != 'table')
        obj = obj.parentNode;
    if (!obj || !obj.tagName || obj.tagName.toLowerCase() != 'table') return;
    var list = obj.getElementsByTagName('input');
    for (var i = 0; i < list.length; i++) {
        if (list[i].type == 'checkbox') list[i].checked = check;
    }
}

// ******** Property Grid functions ****************************************************
function Visible_CheckedChanged(element) {
    elementBaseName = element.name.replace('visible', '');
    visible = document.getElementsByName(elementBaseName + 'visible').item(0);
    editable = document.getElementsByName(elementBaseName + 'editable').item(0);
    required = document.getElementsByName(elementBaseName + 'required').item(0);

    if (visible.checked) {
    }
    else {
        editable.checked = false;
        required.checked = false;
    }
}
function Editable_CheckedChanged(element) {
    elementBaseName = element.name.replace('editable', '');
    visible = document.getElementsByName(elementBaseName + 'visible').item(0);
    editable = document.getElementsByName(elementBaseName + 'editable').item(0);
    required = document.getElementsByName(elementBaseName + 'required').item(0);

    if (editable.checked) {
        visible.checked = true;
    }
    else {
        required.checked = false;
    }

    if (required.disabled) {
        required.checked = editable.checked;
    }
}
function Required_CheckedChanged(element) {
    elementBaseName = element.name.replace('required', '');
    visible = document.getElementsByName(elementBaseName + 'visible').item(0);
    editable = document.getElementsByName(elementBaseName + 'editable').item(0);
    required = document.getElementsByName(elementBaseName + 'required').item(0);

    if (required.checked) {
        visible.checked = true;
        editable.checked = true;
    }
    else {
    }
}

// ******** Stopwatch ***********************************************************
function Stopwatch(useExplicitStart) {
    // useExplicitStart: Use the Start method of the stopwatch to start
    // If not specified, the stopwatch imediately starts running
    var startedAt = useExplicitStart ? null : new Date();
    var stoppedAt = null;

    this.Display = function(showMilliseconds) {
        var totalMs = this.Read();
        var sec = Math.floor((totalMs / 1000) % 60);
        var min = Math.floor(totalMs / 60000);
        var ms = totalMs - (1000 * sec) - (60000 * min);
        if (showMilliseconds) {
            return min + ':' + AddLeadingZeroes(sec, 2) + '.' + AddLeadingZeroes(ms, 3);
        }
        return min + ':' + AddLeadingZeroes(sec, 2);
    }
    this.Read = function() {
        if (startedAt == null) {
            return 0;
        } else {
            if (stoppedAt == null) {
                return new Date().getTime() - startedAt.getTime();
            } else {
                return stoppedAt.getTime() - startedAt.getTime();
            }
        }
    }
    this.Start = function() {
        startedAt = new Date();
    }
    this.Stop = function() {
        stoppedAt = new Date();
    }
}
// ******** NUMBER FUNCTIONS ***********************************************************
function AddLeadingZeroes(number, length) {
    if (number == null || String(number).length >= length) {
        return number;
    }
    var output = String(number);
    for (var n = 0; n < (length - output.length); n++) {
        output = '0' + output;
    }
    return output;
}
function setNumberInTabelCell(selector, number, decimals, strong, euro) {
    var innerHtml = roundNumber(number, decimals);

    if (euro) {
        innerHtml = '&euro;&nbsp;' + innerHtml;
    }
    if (strong) {
        innerHtml = '<strong>' + innerHtml + '</strong>';
    }
    $(selector).html(innerHtml);
}


function toFloat(num) {
    if (num == null) {
        return 0;
    }

    if (!num) {
        num = 0;
    }

    num = num
        .toString()
        .replace('€', '')
        .replace('&euro;', '')
        .replace(String.fromCharCode(8364), '')
        .replace(',', '.')
        .replace(/^\s+|\s+$/g, '');

    return parseFloat(num);
}

function toEuro(num, dec) {
    return '&euro; ' + roundNumber(num, dec);
}

function toCultureNumber(num) {
    return toFloat(num).toString().replace('.', decimalSeparator);
}

function roundNumber(num, dec) {
    if (dec == null) dec = 2;
    var floatNumber = toFloat(num)

    result = 0;
    if (dec == -1) {
        result = floatNumber.toString();
    }
    else {
        result = floatNumber.toFixed(dec);
    }

    var arr = result.split('.');
    return arr.join(',');
}

// ******** VALIDATION FUNCTIONS ***********************************************************

var validationServiceUrl = 'ValentNet/Views/Shared/ValidationHandler.ashx';

// general function to show and hide messages after validation

function handleValidation(isValid, valid, invalid) {
    if (isValid) {
        $(valid).show();
        $(invalid).hide();
    }
    else {
        $(valid).hide();
        $(invalid).show();
    }
}

// should have value

function addShouldHaveValueHtmlValidation(control, valid, invalid) {
    $(control).blur(function() {
        var value = $(control).html();
        var isValid = shouldHaveValue(value);
        handleValidation(isValid, valid, invalid);
    });
    $(valid).hide();
    $(invalid).hide();
}
function addShouldHaveValueValidation(control, valid, invalid) {
    $(control).blur(function() {
        var value = $(control).val();
        var isValid = shouldHaveValue(value);
        handleValidation(isValid, valid, invalid);
    });
    $(valid).hide();
    $(invalid).hide();
}
function shouldHaveValue(value) {
    return value.length > 0;
}

// should equal

function addShouldEqualValidation(control, confirmControl, valid, invalid) {
    $(control).blur(function() {
        var value = $(control).val();
        var valueToEqual = $(confirmControl).val();
        var isValid = shouldEqual(value, valueToEqual);
        handleValidation(isValid, valid, invalid);
    });
    $(valid).hide();
    $(invalid).hide();
}
function shouldEqual(value, valueToEqual) {
    return value == valueToEqual;
}

// should be correct password

function addShouldBeCorrectPassword(passwordControl, loginNameControl, valid, invalid) {
    $(passwordControl).blur(function() {
        var password = $(passwordControl).val();
        var loginName = $(loginNameControl).text();
        var isValid = shouldBeCorrectPassword(password, loginName);
        handleValidation(isValid, valid, invalid);
    });
    $(valid).hide();
    $(invalid).hide();
}
function shouldBeCorrectPassword(password, loginName) {
    var isValid = null;
    jQuery.ajax({
        url: baseURL + validationServiceUrl +
                  '?action=ShouldBeCorrectPassword' +
                  '&password=' + password +
                  '&loginName=' + loginName,
        success: function(result) {
            var json = JSON.parse(result.toString());
            isValid = json.isValid;
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('status: ' + textStatus + '\n' + 'error: ' + errorThrown + '\n' + XMLHttpRequest.responseText);
        },
        async: false
    });
    return isValid;
}

// should be strong password

function addShouldBeStrongPasswordValidation(passwordControl, length, numericRequired, valid, invalid) {
    $(passwordControl).blur(function() {
        var password = $(passwordControl).val();
        var isValid = shouldBeStrongPassword(password, length, numericRequired);
        handleValidation(isValid, valid, invalid);
    });
    $(valid).hide();
    $(invalid).hide();
}
function shouldBeStrongPassword(password, length, numericRequired) {
    var isValid = null;
    jQuery.ajax({
        url: baseURL + validationServiceUrl +
                  '?action=ShouldBeStrongPassword' +
                  '&password=' + password +
                  '&length=' + length +
                  '&numericRequired=' + numericRequired,
        success: function(result) {
            var json = JSON.parse(result.toString());
            isValid = json.isValid;
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('status: ' + textStatus + '\n' + 'error: ' + errorThrown + '\n' + XMLHttpRequest.responseText);
        },
        async: false
    });
    return isValid;
}

// should be valid postcode

function addShouldBeValidPostcode(postcodeControl, countryCodeControl, valid, invalid) {
    $(postcodeControl).blur(function() {
        var postcode = $(postcodeControl).val();
        var countryCode = $(countryCodeControl).val();
        var isValid = (postcode.length > 0);
        if (isValid) {
            isValid = shouldBeValidPostcode(postcode, countryCode);
        }
        handleValidation(isValid, valid, invalid);
    });
    $(valid).hide();
    $(invalid).hide();
}
function shouldBeValidPostcode(postcode, countryCode) {
    var isValid = null;
    jQuery.ajax({
        url: baseURL + validationServiceUrl +
                  '?action=ShouldBeValidPostcode' +
                  '&postcode=' + postcode +
                  '&countryCode=' + countryCode,
        success: function(result) {
            var json = JSON.parse(result.toString());
            isValid = json.isValid;
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('status: ' + textStatus + '\n' + 'error: ' + errorThrown + '\n' + XMLHttpRequest.responseText);
        },
        async: false
    });
    return isValid;
}

// should be correct vat number

function addShouldBeValidVatNumber(vatNumberControl, countryCodeControl, valid, invalid) {
    $(vatNumberControl).blur(function() {
        var vatNumber = $(vatNumberControl).val();
        var countryCode = $(countryCodeControl).val();
        var isValid = shouldBeValidVatNumber(vatNumber, countryCode);
        handleValidation(isValid, valid, invalid);
    });
    $(valid).hide();
    $(invalid).hide();
}
function shouldBeValidVatNumber(vatNumber, countryCode) {
    var isValid = null;
    jQuery.ajax({
        url: baseURL + validationServiceUrl +
                  '?action=ShouldBeValidVatNumber' +
                  '&vatNumber=' + vatNumber +
                  '&countryCode=' + countryCode,
        success: function(result) {
            var json = JSON.parse(result.toString());
            isValid = json.isValid;
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('status: ' + textStatus + '\n' + 'error: ' + errorThrown + '\n' + XMLHttpRequest.responseText);
        },
        async: false
    });
    return isValid;
}


// ******** CODE FROM IVAN FOR ELEMENT TREE ***********************************************
var elementsHandler;
function GetElementsHandler(action) {
    if (!elementsHandler) {
        elementsHandler = baseURL + "ValentNet/Views/Generic/Elements/AjaxHandler.ashx";
    }
    return elementsHandler + "?action=" + action;
}
$(function() {
    var elements
    if ($("#container_panel").size() > 0) {
        Panel = {};
        Panel.id = menuID;
        Panel.language = languageID;
        $("a.lang[href$=" + languageID.toLowerCase() + "]").prependTo($("a.lang[href$=" + languageID.toLowerCase() + "]").parent());
        Panel.is_copy = false;
        Panel.lang_change = false;

        // TinyMCE setup
        Panel.tinyMCE = new tinymce.Editor('editor-panel', {
            mode: 'exact',
            elements: "editor",
            relative_urls: true,
            plugins: 'table,advimage,advlink,preview,searchreplace,paste',
            theme: 'advanced',
            theme_advanced_toolbar_align: 'left',
            theme_advanced_toolbar_location: 'top',
            content_css: '/css/css_texteditor.css',
            height: "392",
            language: languageID == 'UK' ? 'en' : languageID.toLowerCase(),
            external_link_list_url: baseURL + 'ValentNet/Views/Shared/Controls/TinyMCE/InternalLinks.ashx?ID=' + menuID,
            external_document_list_url: baseURL + 'ValentNet/Views/Shared/Controls/TinyMCE/Documents.ashx?ID=' + menuID,
            external_form_list_url: baseURL + 'ValentNet/Views/Shared/Controls/TinyMCE/Forms.ashx?ID=' + menuID,
            theme_advanced_image_image_browser_callback: 'tinyMCE_ImageBrowser',
            urlconverter_callback: 'tinyMCE_URLConverter',
            theme_advanced_buttons1: 'savebutton,newdocument,cleanup,removeformat,|,undo,redo,|,cut,copy,paste,pastetext,|,bold,italic,underline,strikethrough,|,charmap,|,forecolor,backcolor',
            theme_advanced_buttons2: 'justifyleft,justifycenter,justifyright,justifyfull,|,numlist,bullist,|,indent,outdent,|,table,hr,|,image,|,anchor,link,unlink,|,code,|,preview,search',
            theme_advanced_buttons3: ''
        });
        Panel.tinyMCE.addButton('savebutton', {
            title: jsTreeLabels.save,
            image: baseURL + 'ValentNet/Content/js/jstree/themes/default/save.png',
            onclick: function() {
                if (Panel.jsTree.selected && !Panel.tinyMCE.isHidden()) {
                    Panel.tinyMCE.setProgressState(1);
                    $.ajax({ type: 'POST', async: false, url: GetElementsHandler("SetDescription") + "&ID=" + Panel.id + "&elementID=" + Panel.jsTree.selected.attr("id") + "&language=" + Panel.language,
                        data: { description: Panel.tinyMCE.getContent() },
                        dataType: 'json'
                    });
                    setTimeout(function() { Panel.tinyMCE.setProgressState(0) }, 500);
                }
            }
        });
        Panel.tinyMCE.render_state = 0;

        // jsTree setup
        Panel.jsTree = $.tree_create();
        Panel.jsTree.init($("#tree-panel .tree"), {
            data: { type: "json", async: true, url: GetElementsHandler("GetElements"), async_data: function(NODE) { return { parentID: $(NODE).attr("id") || 0, ID: Panel.id, language: Panel.language} } },
            lang: { new_node: "Nieuw element" },
            ui: { hover_mode: true,
                theme_path: baseURL + "valentnet/content/js/jstree/themes/",
                context: [
				{
				    id: "create_lower", label: jsTreeLabels.create + " " + jsTreeLabels.lower, icon: "create_lower.png",
				    visible: function(NODE, TREE_OBJ) { if (NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
				    action: function(NODE, TREE_OBJ) { Panel.jsTree.create(false, $(NODE)); }
				},
				{
				    id: "create_after", label: jsTreeLabels.create + " " + jsTreeLabels.after, icon: "create_after.png",
				    visible: function(NODE, TREE_OBJ) { if (NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
				    action: function(NODE, TREE_OBJ) { Panel.jsTree.create(false, $(NODE), "after"); }
				},
				{
				    id: "create_before", label: jsTreeLabels.create + " " + jsTreeLabels.before, icon: "create_before.png",
				    visible: function(NODE, TREE_OBJ) { if (NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
				    action: function(NODE, TREE_OBJ) { Panel.jsTree.create(false, $(NODE), "before"); }
				},
				{
				    id: "rename", label: jsTreeLabels.rename, icon: "rename.png",
				    visible: function(NODE, TREE_OBJ) { if (NODE.length != 1) return false; return TREE_OBJ.check("renameable", NODE); },
				    action: function(NODE, TREE_OBJ) { TREE_OBJ.rename(NODE); }
				},
				{
				    id: "change_type", label: jsTreeLabels.change + " " + jsTreeLabels.type, icon: "cubes.png",
				    visible: function(NODE, TREE_OBJ) { return true },
				    action: function(NODE, TREE_OBJ) { Panel.doc('/?server&type=types&id=' + $(NODE).attr('id')); }
				},
				{
				    id: "remove", label: jsTreeLabels.remove, icon: "remove.png",
				    visible: function(NODE, TREE_OBJ) { var ok = true; $.each(NODE, function() { if (TREE_OBJ.check("deletable", this) == false) ok = false; return false; }); return ok; },
				    action: function(NODE, TREE_OBJ) { $.each(NODE, function() { TREE_OBJ.remove(this); }); }
				},
				{
				    id: "copy", label: jsTreeLabels.copy, icon: "copy.png",
				    visible: function(NODE, TREE_OBJ) { return true; },
				    action: function(NODE, TREE_OBJ) { TREE_OBJ.copy($(NODE)); $('.paste-cmenu').removeClass("disabled").find("[rel=paste_disabled]").hide(); }
				},
				{
				    id: "cut", label: jsTreeLabels.cut, icon: "cut.png",
				    visible: function(NODE, TREE_OBJ) { return true; },
				    action: function(NODE, TREE_OBJ) { TREE_OBJ.cut($(NODE)); $('.paste-cmenu').removeClass("disabled").find("[rel=paste_disabled]").hide(); }
				},
				{
				    id: "paste_lower", label: jsTreeLabels.paste + " " + jsTreeLabels.lower, icon: "paste_lower.png",
				    visible: function(NODE, TREE_OBJ) { return true },
				    action: function(NODE, TREE_OBJ) { Panel.jsTree.paste(NODE); $('.paste-cmenu').addClass("disabled").find("[rel=paste_disabled]").show(); }
				},
				{
				    id: "paste_after", label: jsTreeLabels.paste + " " + jsTreeLabels.after, icon: "paste_after.png",
				    visible: function(NODE, TREE_OBJ) { return true },
				    action: function(NODE, TREE_OBJ) { Panel.jsTree.paste(NODE, "after"); $('.paste-cmenu').addClass("disabled").find("[rel=paste_disabled]").show(); }
				},
				{
				    id: "paste_before", label: jsTreeLabels.paste + " " + jsTreeLabels.before, icon: "paste_before.png",
				    visible: function(NODE, TREE_OBJ) { return true },
				    action: function(NODE, TREE_OBJ) { Panel.jsTree.paste(NODE, "before"); $('.paste-cmenu').addClass("disabled").find("[rel=paste_disabled]").show(); }
				},
				{
				    id: "refresh", label: jsTreeLabels.refresh, icon: "refresh.png",
				    visible: function(NODE, TREE_OBJ) { return true },
				    action: function(NODE, TREE_OBJ) { Panel.jsTree.refresh($(NODE)); }
				}
			]
            },
            rules: { draggable: "all" },

            callback: {
                onJSONdata: function(data) {
                    var tmp = [];
                    for (var i in data.Items) {
                        tmp.push({ attributes: { id: data.Items[i].ID }, state: (data.Items[i].HasChildren == true ? "closed" : ""), data: { title: (data.Items[i].Name.length ? data.Items[i].Name : " "), icon: data.Items[i].Icon} });
                    }
                    return tmp;
                },
                beforechange: function(n, t) {
                    if (!Panel.lang_change && Panel.jsTree.selected && !Panel.tinyMCE.isHidden()) {
                        Panel.tinyMCE.setProgressState(1);
                        $.ajax({ type: 'POST', async: false, url: GetElementsHandler("SetDescription") + "&ID=" + Panel.id + "&elementID=" + Panel.jsTree.selected.attr("id") + "&language=" + Panel.language,
                            data: { description: Panel.tinyMCE.getContent() },
                            dataType: 'json'
                        });
                        setTimeout(function() { Panel.tinyMCE.setProgressState(0) }, 500);
                    }
                    return true;
                },
                onchange: function(n) {
                    if (n.id) Panel.loadContent(n.id);
                },

                // THINK OF ROLLBACK!
                oncreate: function(n, r, h, t) {
                    if (!Panel.tinyMCE.isHidden()) Panel.tinyMCE.hide();
                    $("#editor").html("<p class='message'>Please create the node first</p>");
                    Panel.creating = 1;
                    $(n).children("a").addClass($(n).attr("rel"));
                    Panel.move(n, r, h);
                },
                onrename: function(n, l, t, r) {
                    $.getJSON(GetElementsHandler("Rename"), { newName: $(n).children("a:visible").text(), language: Panel.language, elementID: n.id });
                    if (Panel.creating == 1) {
                        Panel.loadContent(n.id);
                        Panel.creating = 0;
                    }
                },
                onmove: function(n, r, h) {
                    Panel.move(n, r, h);
                },
                oncopy: function(n, r, h) {
                    Panel.move(n, r, h, true);
                },
                beforedelete: function(n) {
                    return confirm(labels.areYouSure);
                },
                ondelete: function(n) {
                    $.getJSON(GetElementsHandler("Delete") + "&ID=" + Panel.id + "&elementID=" + n.id + "&language=" + Panel.language);
                    if (!Panel.tinyMCE.isHidden()) Panel.tinyMCE.hide();
                    $("#editor").html("<p class='message'>Click a node on the left to edit its content</p>");
                },
                onload: function(t) {
                    if (Panel.lang_change) { Panel.lang_change = false; }
                    else if (Panel.is_copy) { Panel.is_copy = false; }
                    else { t.select_branch(t.container.find("li:eq(0)")); }
                    switch (Panel.language) {
                        case "NL": t.settings.lang.new_node = "Nieuw element"; break;
                        case "UK": t.settings.lang.new_node = "New element"; break;
                        case "DE": t.settings.lang.new_node = "Neues element"; break;
                        case "FR": t.settings.lang.new_node = "Nouvel élément"; break;
                        default: t.settings.lang.new_node = "New element"; break;
                    }
                },
                onerror: function(str) { alert(str); }
            }
        });
        Panel.creating = 0;

        // Functions
        Panel.loadContent = function(id) {
            if (Panel.tinyMCE.render_state == 0) {
                Panel.tinyMCE.onInit.add(function(ed) {
                    ed.setContent("");
                    ed.render_state = 1;
                    Panel.loadContent(id);
                });
                Panel.tinyMCE.render();
            }
            else {
                if (Panel.tinyMCE.isHidden()) Panel.tinyMCE.show();
                //Panel.tinyMCE.setProgressState(1);
                $.ajax({ type: 'POST', async: false, url: GetElementsHandler("GetDescription") + "&ID=" + Panel.id + "&elementID=" + id + "&language=" + Panel.language,
                    dataType: 'json',
                    success: function(data) {
                        if (data.Description.length) Panel.tinyMCE.setContent(data.Description);
                        else Panel.tinyMCE.setContent("");
                        //setTimeout(function() { Panel.tinyMCE.setProgressState(0) }, 500);
                    }
                });
            }
        }
        Panel.move = function(n, r, h, is_copy) {
            var position = "";
            if (!n.id || n.id == "") {
                if (h == "inside") position = "Lower";
                if (h == "before") position = "Before";
                if (h == "after") position = "After";
                $.getJSON(GetElementsHandler("Create") + "&ID=" + Panel.id + "&referenceElementID=" + r.id + "&position=" + position + "&language=" + Panel.language, function(data) {
                    n.id = data.ID;
                    $(n).children("a, span").css("background-image", "url(" + data.Icon + ")");
                });
            }
            else {
                if (h == "inside") position = "Lower";
                if (h == "before") position = "Before";
                if (h == "after") position = "After";
                if (is_copy && Panel.jsTree.selected && !Panel.tinyMCE.isHidden()) {
                    Panel.tinyMCE.setProgressState(1);
                    $.ajax({ type: 'POST', async: false, url: GetElementsHandler("SetDescription") + "&ID=" + Panel.id + "&elementID=" + Panel.jsTree.selected.attr("id") + "&language=" + Panel.language,
                        data: { description: Panel.tinyMCE.getContent() },
                        dataType: 'json'
                    });
                    setTimeout(function() { Panel.tinyMCE.setProgressState(0) }, 500);
                }
                $.getJSON(GetElementsHandler("Move") + "&elementID=" + n.id.toString().replace(/_copy/ig, "") + "&ID=" + Panel.id + "&referenceElementID=" + r.id + "&position=" + position + "&language=" + Panel.language + "&copy=" + (is_copy ? "true" : "false"), function(data) {
                    if (is_copy) {
                        n.id = data.ID;
                        $(n).children("a, span").css("background-image", "url(" + data.Icon + ")");
                        Panel.is_copy = true;
                        Panel.jsTree.refresh(n);
                    }
                });
            }
        }
        Panel.create_lower = function() { Panel.jsTree.create(false, (Panel.jsTree.container.find("li").size() == 0 ? -1 : false)); }
        Panel.create_after = function() { Panel.jsTree.create(false, false, "after"); }
        Panel.create_before = function() { Panel.jsTree.create(false, false, "before"); }
        Panel.rename = function() { Panel.jsTree.rename(); }
        Panel.change_type = function() { if (Panel.jsTree.selected) Panel.doc('/?server&type=types&id=' + Panel.jsTree.selected.attr('id')); }
        Panel.remove = function() { Panel.jsTree.remove(); }
        Panel.copy = function() { if (Panel.jsTree.selected) { Panel.jsTree.copy(); $('.paste-cmenu').removeClass("disabled").find("[rel=paste_disabled]").hide(); } }
        Panel.cut = function() { if (Panel.jsTree.selected) { Panel.jsTree.cut(); $('.paste-cmenu').removeClass("disabled").find("[rel=paste_disabled]").hide(); } }
        Panel.paste_lower = function() { Panel.jsTree.paste(); $('.paste-cmenu').addClass("disabled").find("[rel=paste_disabled]").show(); }
        Panel.paste_after = function() { Panel.jsTree.paste(false, "after"); $('.paste-cmenu').addClass("disabled").find("[rel=paste_disabled]").show(); }
        Panel.paste_before = function() { Panel.jsTree.paste(false, "before"); $('.paste-cmenu').addClass("disabled").find("[rel=paste_disabled]").show(); }
        Panel.paste_disabled = function() { alert("Cut or copy nodes first!"); }
        Panel.type_save = function(id, tp, icon) {
            $.getJSON(GetElementsHandler("SetElementType") + "&ID=" + Panel.id + "&elementID=" + id + "&language=" + Panel.language + "&elementTypeID=" + tp, function(data) {
                $("#" + id).children("a:visible").attr("rel", tp).css("background-image", "url(" + data.Icon + ")");
                Panel.blend(false);
            });
        }

        // Lightbox functions
        Panel.blend = function(on) {
            if (on) {
                var b = $("<div id='blend'>&nbsp;</div>");
                $("html, body").css("overflow", "hidden");
                b.height($(document).height()).width($(document).width()).css("opacity", "0.5");
                $("body").append(b);
            }
            else {
                $("#blend, #document").remove();
                $("html, body").css("overflow", "auto");
            }
        }
        Panel.doc = function(url) {
            Panel.blend(true);
            $("body").append("<div id='document'>&nbsp;</div>");
            var c = $.tree_focused().selected.children("a:visible").attr("rel");
            var t = $.tree_focused().selected.children("a:visible").css("background-image").replace(/^url\(/i, "").replace(/\)$/i, "");
            $.getJSON(GetElementsHandler("GetElementTypes") + "&Language=" + Panel.language + "&ID=" + Panel.id, function(data) {
                var str = "";
                for (i in data.ItemTypes) {
                    str += "<a href='#' ondblclick='Panel.type_save($.tree_focused().selected.attr(\"id\")," + data.ItemTypes[i].ID + ",\"" + data.ItemTypes[i].Icon + "\"); return false' class='a_type " + ((data.ItemTypes[i].ID == c || t.indexOf(data.ItemTypes[i].Icon) != -1) ? "selected" : "") + "' onclick='$(this).parent().children().removeClass(\"selected\"); $(this).addClass(\"selected\"); return false;' rel='" + data.ItemTypes[i].ID + "' style='background-image:url(\"" + data.ItemTypes[i].Icon + "\");'>" + data.ItemTypes[i].Name + "</a>";
                }
                str += "<div style='clear:both; height:1px;'>&nbsp;</div>";
                str += "<input type='button' onclick='Panel.type_save($.tree_focused().selected.attr(\"id\"),$(\"#document a.selected\").attr(\"rel\"),$(\"#document a.selected\").css(\"backgroundImage\"));' value='" + jsTreeLabels.save + "' class='save' />";
                str += "<input type='button' value='" + jsTreeLabels.cancel + "' onclick='Panel.blend(false);' class='cancel' />";
                $("#document").html(str).css("background", "white");
            });
            return false;
        }

        // Keyboard shortcuts
        $(document)
		    .bind('keydown', { combi: 'up', disableInInput: true }, function() { Panel.jsTree.get_prev(); return false; })
		    .bind('keydown', { combi: 'down', disableInInput: true }, function() { Panel.jsTree.get_next(); return false; })
		    .bind('keydown', { combi: 'left', disableInInput: true }, function() { Panel.jsTree.get_left(); return false; })
		    .bind('keydown', { combi: 'right', disableInInput: true }, function() { Panel.jsTree.get_right(); return false; })
		    .bind('keydown', { combi: 'return', disableInInput: true }, function() { if (Panel.jsTree.hovered) Panel.jsTree.select_branch(Panel.jsTree.hovered); return false; })
		    .bind('keydown', { combi: 'f2', disableInInput: true }, function() { Panel.jsTree.rename(); return false; })
		    .bind('keydown', { combi: 'del', disableInInput: true }, function() { if (Panel.jsTree.selected) Panel.jsTree.remove(); return false; })
		    .bind('keydown', { combi: 'Ctrl+l', disableInInput: true }, function() { if (Panel.jsTree.selected) Panel.jsTree.create(); return false; })
		    .bind('keydown', { combi: 'Ctrl+b', disableInInput: true }, function() { if (Panel.jsTree.selected) Panel.jsTree.create(false, false, "before"); return false; })
		    .bind('keydown', { combi: 'insert', disableInInput: true }, function() { if (Panel.jsTree.selected) Panel.jsTree.create(false, false, "after"); return false; })
		    .bind('keydown', { combi: 'f5', disableInInput: true }, function() { Panel.jsTree.refresh(); return false; })
		    .bind('keydown', { combi: 'f4', disableInInput: true }, function() { if (Panel.jsTree.selected) doc('/?server&type=types&id=' + Panel.jsTree.selected.attr('id')); return false; })
		    .bind('keydown', { combi: 'ctrl+v', disableInInput: true }, function() { Panel.jsTree.paste(false, "after"); return false; })
		    .bind('keydown', { combi: 'ctrl+c', disableInInput: true }, function() { Panel.jsTree.copy(); return false; })
            .bind('keydown', { combi: 'ctrl+x', disableInInput: true }, function() { Panel.jsTree.cut(); return false; })

        // Interface hooks
        $("#tree-panel .menu")
		.find("a").not(".lang")
			.bind("click", function(event) {
			    try { Panel[$(this).attr("rel")](); } catch (err) { }
			    $(this).parents(".cmenu").removeClass("hover");
			    this.blur();
			    event.preventDefault();
			    event.stopPropagation();
			    return false;
			})
			.end().end()
		.children(".cmenu")
			.hover(function() { if (!$(this).hasClass("disabled")) $(this).addClass("hover"); }, function() { $(this).removeClass("hover") })
        $("#tree-panel .menu a.lang")
				.live("click", function(event) {
				    $("#easyTooltip").remove();
				    if (Panel.jsTree.selected && !Panel.tinyMCE.isHidden()) {
				        Panel.tinyMCE.setProgressState(1);
				        $.ajax({ type: 'POST', async: false, url: GetElementsHandler("SetDescription") + "&ID=" + Panel.id + "&elementID=" + Panel.jsTree.selected.attr("id") + "&language=" + Panel.language,
				            data: { description: Panel.tinyMCE.getContent() },
				            dataType: 'json'
				        });
				        setTimeout(function() { Panel.tinyMCE.setProgressState(0) }, 500);
				    }
				    var newLanguage = $(this).attr("href").replace(/.*?#/ig, "").toUpperCase();
				    if (newLanguage != Panel.language) {
				        Panel.language = newLanguage;
				        Panel.lang_change = true;
				        Panel.jsTree.refresh();
				        $(this).clone().prependTo($(this).parent());
				        $(this).parent().removeClass("hover")
				        $(this).remove();
				    }
				    event.preventDefault();
				    event.stopPropagation();
				    return false;
				});
    }

});


function replaceNewLine(text, replacement) {
    return text.replace(/\n/g, replacement);
}

function pausecomp(millis) {
    var date = new Date();
    var curDate = null;

    do { curDate = new Date(); }
    while (curDate - date < millis);
}


var vnGridView = {
    deleteItem: function(objectTypeName, objectID, deleteToRecycleBin, objectName) {
        if (confirm(labels.confirmDeleteItem)) {
            $.getJSON(baseURL + "ValentNet/Views/Shared/Handlers/DeleteHandler.ashx", {
                "action": "Delete",
                "objectTypeName": "Octavalent.ValentNet.Models.DomainObjects." + objectTypeName + ", Octavalent.ValentNet.Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
                "objectID": objectID,
                "deleteToRecycleBin": deleteToRecycleBin,
                "objectName": objectName,
                "pageUrl": document.location.href
            }
        );

            var row = $("tr[id$='_" + objectID + "']");

            row.find('td').fadeOut(1250, function() {
                var table = row.parent();
                row.remove();

                // zebra rows
                var rows = table.children();
                for (var i = 0; i < rows.length; i++) {
                    var rowId = rows[i].id;
                    if (!rowId) continue;

                    if (i % 2) {
                        $(rows[i]).removeClass("rowOdd");
                        $(rows[i]).addClass("rowEven");
                        $(rows[i]).mouseout(function() { this.className = 'rowEven'; });
                    } else {
                        $(rows[i]).removeClass("rowEven");
                        $(rows[i]).addClass("rowOdd");
                        $(rows[i]).mouseout(function() { this.className = 'rowOdd'; });
                    }
                }
            });

        }
    }
}
function sleep(ms) {
    var dt = new Date();
    dt.setTime(dt.getTime() + ms);
    while (new Date().getTime() < dt.getTime());
}
