﻿var isOpera = navigator.userAgent.indexOf("Opera") > -1;
var isIE = navigator.userAgent.indexOf("MSIE") > 1 && !isOpera;
var isMoz = navigator.userAgent.indexOf("Mozilla/5.") == 0 && !isOpera;

//classic combo part
function MultiSelectComboBox_Click(MultiSelectComboBoxId_prefix, keyboardSelect) {
    var valuesDiv = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues');
    var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue'); 
    var twoLevels = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel').value.toLowerCase() == "true";
    ShowHideDiv(valuesDiv, MultiSelectComboBoxId_prefix);
    if (valuesDiv.style.display == '') {        
        var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
        lastTexts = textBox.value;
        lastValues = selectedValueHidden.value;
        textBox.focus();
        if (keyboardSelect.toLowerCase() == "true") {
            textBox.select();
        }
        AClosePopUp_Click(MultiSelectComboBoxId_prefix);
        InitPopulateComboBox(valuesDiv, selectedValueHidden.value, MultiSelectComboBoxId_prefix);
        var ul = valuesDiv.getElementsByTagName("ul")[0];
        var li = ul.getElementsByTagName("li");
        if (li != undefined && li != null && li.length > 0) {
            var selectedValueIndex = GetSelectedValueIndex(li);
            if (selectedValueIndex == -1) {
                selectedValueIndex = GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, li);
                SetSelectedClassToSelectedItemByValue(Trim(li[selectedValueIndex].attributes["itemvalue"].value), valuesDiv, twoLevels);
            }
            if (GetBottomBound(document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues')) < GetBottomBound(li[selectedValueIndex])) {
                ScrollDivContent(valuesDiv, li[selectedValueIndex]);
            }
        }
        var cascade = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldCascadeEmptyMessage').value;
        if (cascade != undefined && cascade != null && cascade != "") {
            if (li.length == 0) {
                ShowHideDiv(valuesDiv, MultiSelectComboBoxId_prefix);
                alert(cascade);
            }
        }
    }
    else {
        var multiSelectComboBoxOnChange = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldOnChange').value;
        if (lastValues != selectedValueHidden.value && multiSelectComboBoxOnChange != "") {
            MultiSelectComboBoxChange(MultiSelectComboBoxId_prefix);
        }
    }
    if (openCombo != undefined && openCombo != null && openCombo != "" && openCombo != MultiSelectComboBoxId_prefix + 'DivComboValues') {
        HideDiv($get(openCombo));
    }
    openCombo = MultiSelectComboBoxId_prefix + 'DivComboValues';
    userOpen = true;
}

function MultiSelectComboBoxItem_Click(value, text, MultiSelectComboBoxId_prefix) {
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var valuesDiv = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues');
    var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue');
    var multiSelectComboBoxOnChange = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldOnChange').value;
    var twoLevels = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel').value.toLowerCase() == "true";
    textBox.value = text;
    selectedValueHidden.value = value;
    SetSelectedClassToSelectedItemByValue(value, valuesDiv, twoLevels);
    valuesDiv.style.display = "none";
    ComboValueChange(value, MultiSelectComboBoxId_prefix);
    if (lastValues != selectedValueHidden.value && multiSelectComboBoxOnChange != "") {
        MultiSelectComboBoxChange(MultiSelectComboBoxId_prefix);
    }
}

function SetSelectedClassToSelectedItemByValue(selectedValue, div, twoLevels) {
    var ul = div.getElementsByTagName("ul");
    var li = ul[0].getElementsByTagName("li");
    for (i = 0; i < li.length; i++) {
        var itemvalue = Trim(li[i].attributes["itemvalue"].value);
        if (!IsFirstLevelItem(itemvalue)) {
            if (itemvalue == selectedValue) {
                li[i].className = "selected";
            }
            else {
                li[i].className = "unselected";                
            }
            li[i].className += twoLevels ? " secondLevel" : "";
        }
        else {
            li[i].className = "firstLevel";
        }
    }
}

function SetSelectedClassToSelectedItemByIndex(newIndex, oldIndex, items, cssClassPostFix) {
    items[oldIndex].className = "unselected" + cssClassPostFix;
    items[newIndex].className = "selected" + cssClassPostFix;
}

function DivComboValues_KeyDown(evt, MultiSelectComboBoxId_prefix, keyboardSelect) {
    var valuesDiv = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues');
    var ul = valuesDiv.getElementsByTagName("ul");
    var li = ul[0].getElementsByTagName("li");
    var keyCode = evt.which ? evt.which : evt.keyCode;
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue');
    var multiSelectComboBoxOnChange = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldOnChange').value;
    var twoLevels = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel').value.toLowerCase() == "true";
    
    switch (keyCode) {
        case 8: //backspace
            evt.cancelBubble = true;
            evt.returnValue = false;
            ShowDiv(valuesDiv, MultiSelectComboBoxId_prefix);
            DeleteLetter(valuesDiv, -1, MultiSelectComboBoxId_prefix);

            return false;
        case 46: //delete
            DeleteLetter(valuesDiv, 1, MultiSelectComboBoxId_prefix);

            return false;
        case 40: //arrows
        case 38: ArrowKeyDown(keyCode, GetSelectedValueIndex(li), li, valuesDiv, MultiSelectComboBoxId_prefix, keyboardSelect);
            break;
        case 27: //escape
            HideDiv(valuesDiv);
            textBox.value = lastTexts;
            SetSelectedClassToSelectedItemByValue(selectedValueHidden.value, valuesDiv, twoLevels);
            break;
        case 13: //enter
            ShowHideDiv(valuesDiv, MultiSelectComboBoxId_prefix);
            lastTexts = textBox.value;
            lastValues = selectedValueHidden.value;
            if (li != undefined && li != null && li.length > 0) {
                var selectedValueIndex = GetSelectedValueIndex(li);
                if (selectedValueIndex == -1) {
                    SetSelectedClassToSelectedItemByValue(Trim(li[GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, li)].innerHTML), valuesDiv, twoLevels);
                }
                selectedValueHidden.value = Trim(li[GetSelectedValueIndex(li)].attributes["itemvalue"].value);
                InitPopulateComboBox(valuesDiv, selectedValueHidden.value, MultiSelectComboBoxId_prefix);
                ScrollDivContent(valuesDiv, li[GetSelectedValueIndex(li)]);
                ComboValueChange(selectedValueHidden.value, MultiSelectComboBoxId_prefix);
                if (textBox.value == "") {
                    textBox.value = Trim(li[GetSelectedValueIndex(li)].innerHTML);
                }
                if (lastValues != selectedValueHidden.value && multiSelectComboBoxOnChange != "") {
                    MultiSelectComboBoxChange(MultiSelectComboBoxId_prefix);

                    return false;
                } 
            }
            break;
        default: //other
            if (keyboardSelect.toLowerCase() == "true") {
                if (!evt.ctrlKey) {
                    if ((keyCode > 47) && (keyCode < 91)) {
                        ShowDiv(valuesDiv, MultiSelectComboBoxId_prefix);
                        return MultiSelectComboBox_Change(String.fromCharCode(keyCode), valuesDiv, MultiSelectComboBoxId_prefix);
                    }
                    else if (keyCode > 95 && keyCode < 106) {
                        ShowDiv(valuesDiv, MultiSelectComboBoxId_prefix);
                        return MultiSelectComboBox_Change(GetNumPadValueFromKeyCode(keyCode), valuesDiv, MultiSelectComboBoxId_prefix);
                    }
                    else {
                        return true;
                    }
                } 
            }
    }

    return false;
}

function GetSelectedValueIndex(items) {
    for (i = 0; i < items.length; i++) {
    var indexOf = items[i].className.toLowerCase().indexOf("unselected");
    if (indexOf == -1 && items[i].className.toLowerCase() != "firstlevel") {
            return i;
        }
    }

    return -1;
}

function ArrowKeyDown(keyCode, index, items, valuesDiv, MultiSelectComboBoxId_prefix, keyboardSelect) {
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue');
    var twoLevels = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel').value.toLowerCase() == "true";
    var moveIndex = 0;
    if (keyCode == 40) {
        if (index + 1 < items.length) {
            if (!IsFirstLevelItem(items[index + 1].attributes["itemvalue"].value)) {
                moveIndex = index + 1;
            }
            else {
                if (index + 2 < items.length) {
                    moveIndex = index + 2;
                }
                else {
                    moveIndex = index;
                }
            }
        }
        else {
            moveIndex = index;
            //textBox.value = Trim(items[index].innerHTML);
        }
    }
    else if (keyCode == 38) {
        if (index - 1 >= 0) {
            if (!IsFirstLevelItem(items[index - 1].attributes["itemvalue"].value)) {
                moveIndex = index - 1;
            }
            else {
                if (index - 2 >= 0) {
                    moveIndex = index - 2;
                }
                else {
                    moveIndex = index;
                }
            }
        }
        else {
            moveIndex = index;
            //textBox.value = Trim(items[index].innerHTML);
        }
    }
    SetSelectedClassToSelectedItemByIndex(moveIndex, index, items, twoLevels ? " secondLevel" : "");
    textBox.value = Trim(items[moveIndex].innerHTML);
    if (GetBottomBound(document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues')) < GetBottomBound(items[moveIndex])) {
        ScrollDivContent(valuesDiv, items[moveIndex]);
    }
    else if (GetTopBound(document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues')) > GetTopBound(items[moveIndex])) {
        ScrollDivContent(valuesDiv, items[moveIndex]);
    }
    if (keyboardSelect.toLowerCase() == "true") {
        textBox.select();
    }
}

function MultiSelectComboBox_Change(letter, div, MultiSelectComboBoxId_prefix) {
    var returnValue = false;
    var ul = div.getElementsByTagName("ul");
    var liElemetns = ul[0].getElementsByTagName("li");
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var hiddenLiValues = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldLiValues');
    textBox.value = textBox.value.replace(GetSelectedText(textBox), "");
    if (hiddenLiValues.value == '') {
        GetComboBoxValues(liElemetns, MultiSelectComboBoxId_prefix);
    }
    else {
        GetComboBoxValuesFromHidden(MultiSelectComboBoxId_prefix);
    }

    if (ContainsValue(liTexts, liValues, textBox.value + letter)) {
        InitPopulateComboBox(div, "", MultiSelectComboBoxId_prefix);
        liElemetns = ul[0].getElementsByTagName("li");
        RemoveLiElements(liElemetns, textBox.value + letter, ul[0], MultiSelectComboBoxId_prefix);
        SelectNonUserText(textBox, Trim(liElemetns[GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, liElemetns)].innerHTML));
    }
    else {
        SelectText(textBox, textBox.value.length, textBox.value.length);
        InitPopulateComboBox(div, "", MultiSelectComboBoxId_prefix);
        liElemetns = ul[0].getElementsByTagName("li");
        returnValue = true;
    }

    if (GetSelectedValueIndex(liElemetns) == -1) {
        liElemetns[GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, liElemetns)].className = "selected";
    }
    ScrollDivContent(div, liElemetns[GetSelectedValueIndex(liElemetns)]);

    return returnValue;
}

function DeleteLetter(div, shift, MultiSelectComboBoxId_prefix) {
    var ul = div.getElementsByTagName("ul");
    var liElemetns = ul[0].getElementsByTagName("li");
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var start = GetCaretPosition(textBox, true);
    var end = GetCaretPosition(textBox, false);
    if (start == end) {
        start = shift < 0 ? start + shift : start;
        end = shift > 0 ? end + shift : end;
    }
    var textAfterDelete = "";
    for (j = 0; j < textBox.value.length; j++) {
        if (j < start || j >= end) {
            textAfterDelete += textBox.value[j];
        }
    }
    textBox.value = textAfterDelete;
    SetCaretPosition(textBox, textAfterDelete.length);
    if (ContainsValue(liTexts, liValues, textAfterDelete)) {
        InitPopulateComboBox(div, "", MultiSelectComboBoxId_prefix);
        liElemetns = ul[0].getElementsByTagName("li");
        RemoveLiElements(liElemetns, textAfterDelete, ul[0], MultiSelectComboBoxId_prefix);
    }
    else {
        returnValue = true;
        InitPopulateComboBox(div, "", MultiSelectComboBoxId_prefix);
        liElemetns = ul[0].getElementsByTagName("li");
    }

    if (GetSelectedValueIndex(liElemetns) == -1) {
        liElemetns[GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, liElemetns)].className = "selected";
        ScrollDivContent(div, liElemetns[GetSelectedValueIndex(liElemetns)]);
    }
}

function GetComboBoxValues(liElements, MultiSelectComboBoxId_prefix) {
    var hiddenValues = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldLiValues');
    var hiddenText = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldLiTexts');
    hiddenText.value = "";
    hiddenValues.value = "";
    liTexts = new Array();
    liValues = new Array();
    var i = 0;
    for (i = 0; i < liElements.length; i++) {
        liTexts[liTexts.length] = Trim(liElements[i].innerHTML);
        hiddenText.value += Trim(liElements[i].innerHTML) + '@';
        hiddenValues.value += Trim(liElements[i].attributes["itemvalue"].value) + '@';
        liValues[liValues.length] = Trim(liElements[i].attributes["itemvalue"].value);
    }
    hiddenText.value = hiddenText.value.substring(0, hiddenText.value.length - 1);
    hiddenValues.value = hiddenValues.value.substring(0, hiddenValues.value.length - 1);
}

function GetComboBoxValuesFromHidden(MultiSelectComboBoxId_prefix) {
    var hiddenValues = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldLiValues');
    var hiddenText = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldLiTexts');
    liTexts = new Array();
    liValues = new Array();
    if (hiddenValues.value != "") {
        var values = hiddenValues.value.split('@');
        var texts = hiddenText.value.split('@');
        var i = 0;
        for (i = 0; i < values.length; i++) {
            liTexts[liTexts.length] = texts[i];
            liValues[liValues.length] = values[i];
        } 
    }
}

function ContainsValue(texts, values, userValue) {
    for (i = 0; i < values.length; i++) {
        if (texts[i].toLowerCase().startsWith(userValue.toLowerCase()) && !IsFirstLevelItem(values[i])) {
            return true;
        }
    }

    return false;
}

function RemoveLiElements(liElements, userValue, ul, MultiSelectComboBoxId_prefix) {
    var index = 0;
    var selected = false;
    while (index < liElements.length) {
        var liText = Trim(liElements[index].innerHTML);
        var liValue = Trim(liElements[index].attributes["itemvalue"].value);
        var isFirstLevelItem = IsFirstLevelItem(liValue);
        var twoLevels = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel').value.toLowerCase() == "true";
        if (!liText.toLowerCase().startsWith(userValue.toLowerCase()) && !isFirstLevelItem) {
            ul.removeChild(liElements[index]);
        }
        else {
            if (!selected && !isFirstLevelItem) {
                liElements[index].className = "selected";
                selected = true;
            }
            else { 
                liElements[index].className = "unselected";
            }
            if (!isFirstLevelItem) {
                liElements[index].className += twoLevels ? " secondLevel" : "";
            }
            else {
                liElements[index].className = "firstLevel";
            }
            index++;
        }
    }
}

function CreateLiElement(text, value, selected, MultiSelectComboBoxId_prefix) {
    var li = document.createElement("li");
    var hiddenFirstLevel = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel');
    var twoLevels = hiddenFirstLevel != undefined && hiddenFirstLevel != null && hiddenFirstLevel.value.toLowerCase() == "true";
    li.innerHTML = text;
    li.className = selected ? "selected" : "unselected";
    if (!IsFirstLevelItem(value)) {
        li.setAttribute("onclick", "MultiSelectComboBoxItem_Click('" + value + "', '" + text + "', '" + MultiSelectComboBoxId_prefix + "');");
    }
    if (twoLevels) {
        if (IsFirstLevelItem(value)) {
            li.className = "firstLevel";
        }
        else {
            li.className += " secondLevel";
        }
    }
    li.setAttribute("itemvalue", value);

    return li;
}

function InitPopulateComboBox(div, selectedValue, MultiSelectComboBoxId_prefix) {
    var twoLevels = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel').value.toLowerCase() == "true";
    GetComboBoxValuesFromHidden(MultiSelectComboBoxId_prefix);
    if (liValues.length > 0) {
        var ul = div.getElementsByTagName("ul");
        ul[0].innerHTML = "";
        for (i = 0; i < liValues.length; i++) {
            ul[0].appendChild(CreateLiElement(liTexts[i], liValues[i], selectedValue == liValues[i], MultiSelectComboBoxId_prefix));
        }

        liElements = ul[0].getElementsByTagName("li");

        if (liElements != undefined && liElements != null && liElements.length > 0 && GetSelectedValueIndex(liElements) == -1) {
            if (twoLevels) {
                var j = 0;
                for (j = 0; j < liElements.length; j++) {
                    if (!IsFirstLevelItem(liElements[j].attributes["itemvalue"].value)) {
                        liElements[j].className = "selected secondLevel";
                        break;
                    }
                }
            }
            else {
                liElements[GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, liElemetns)].className = "selected";
            }
        }
    }
}

function IsFirstLevelItem(value) {
    if (value.startsWith('#')) {
        return true;
    }

    return false;
}

function GetSelectedText(textBox) {
    var selectedText;
    // IE version
    if (document.selection != undefined) {
        textBox.focus();
        var sel = document.selection.createRange();
        selectedText = sel.text;
    }
    // Mozilla version
    else if (textBox.selectionStart != undefined) {
        var startPos = textBox.selectionStart;
        var endPos = textBox.selectionEnd;
        selectedText = textBox.value.substring(startPos, endPos);
    }

    return selectedText;
}

function GetCaretPosition(ctrl, start) {
    // Initialize
    var iCaretPos = 0;
    // IE Support
    if (document.selection) {
        var selectedText = GetSelectedText(ctrl);
        // Set focus on the element
        ctrl.focus();
        // To get cursor position, get empty selection range
        var oSel = document.selection.createRange();
        // Move selection start to 0 position
        oSel.moveStart('character', -ctrl.value.length);
        // The caret position is selection length
        var oSelLength = oSel.text.length - selectedText.length;
        iCaretPos = start ? oSelLength : oSelLength + selectedText.length;
    }

    // Firefox support
    else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
        iCaretPos = start ? ctrl.selectionStart : ctrl.selectionEnd;
    }
    // Return results
    return (iCaretPos);
}

function SetCaretPosition(ctrl, pos) {
    if (ctrl.setSelectionRange) {
        ctrl.focus();
        ctrl.setSelectionRange(pos, pos);
    }
    else if (ctrl.createTextRange) {
        var range = ctrl.createTextRange();
        range.collapse(true);
        range.moveEnd('character', pos);
        range.moveStart('character', pos);
        range.select();
    }
}

function SelectNonUserText(textBox, value) {
    var startIndex = textBox.value.length + 1;
    textBox.value = value;
    SelectText(textBox, startIndex, textBox.value.length);
}

function SelectText(textBox, startIndex, endIndex) {
    if (isIE || isOpera) {
        var oRange = textBox.createTextRange();
        oRange.moveStart("character", startIndex);
        oRange.moveEnd("character", endIndex);
        oRange.select();
    }
    if (isMoz) {
        textBox.setSelectionRange(startIndex, endIndex);
    }
}

function GetNumPadValueFromKeyCode(keyCode) {
    return (keyCode - 96).toString();
}

function TexBoxCombo_FocusLost(MultiSelectComboBoxId_prefix) {
    var valuesDiv = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues');
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue');
    var twoLevels = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel').value.toLowerCase() == "true";
    HideDiv(valuesDiv);
    textBox.value = lastTexts;
    SetSelectedClassToSelectedItemByValue(selectedValueHidden.value, valuesDiv, twoLevels);
}

//multi select combo part
function LinkMultiSelect_Click(MultiSelectComboBoxId_prefix) {
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var div = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValues');
    if (div.style.display == "none") {
        var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue');
        lastTexts = textBox.value;
        lastValues = selectedValueHidden.value;
        var searcherWidth = $get(SearcherParentId).clientWidth;
        var searcherLeft = $get(SearcherParentId).offsetLeft;
        ShowDiv(div, MultiSelectComboBoxId_prefix);
        var maxTextWidth = GetMaxTextWidth(div);
        SetMaxTextWidth(div, maxTextWidth);
        SetMultiselectDivWidth(MultiSelectComboBoxId_prefix, maxTextWidth, div);
        if (((div.offsetLeft - searcherLeft) + div.clientWidth) > searcherWidth) {
            var comboDiv = $get(MultiSelectComboBoxId_prefix + 'DivPearComboBoxMain');
            var x = div.clientWidth - comboDiv.clientWidth;
            Sys.UI.DomElement.setLocation(div, div.offsetLeft - x, div.offsetTop);
        }
        CheckSelectedCheckBoxes(div, lastValues.split(','));
        var selectedTexts = GetAllSelectedMultiSelectValues(document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValuesContent'));
        if (selectedTexts == "") {
            var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue');
            ComboValueChange(selectedValueHidden.value, MultiSelectComboBoxId_prefix)
        }

        if (typeof (openMultiCombo) != "undefined" && openMultiCombo != null && openMultiCombo != "" && openMultiCombo != MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValues') {
            HideDiv($get(openMultiCombo));
        }
        openMultiCombo = MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValues';
        userOpen = true;
        var cascade = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldCascadeEmptyMessage').value;
        if (cascade != undefined && cascade != null && cascade != "") {
            if (GetItemsCount(div) == 0) {
                HideDiv(div);
                openMultiCombo = null;
                alert(cascade);
            }
        }
    }
    else {
        HideDiv(div);
    }
}

function ButtonOK_Click(MultiSelectComboBoxId_prefix) {
    var twoLevels = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldFirstLevel').value.toLowerCase() == "true";
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var valuesDiv = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues');
    InitPopulateComboBox(valuesDiv, "", MultiSelectComboBoxId_prefix);
    var uls = valuesDiv.getElementsByTagName("ul");
    var ul = null;
    var liElemetns = null;
    if (uls != undefined && uls != null && uls.length > 0) {
        ul = uls[0];
        liElemetns = ul.getElementsByTagName("li");
    }
    var div = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValues');
    var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue');
    if (tempValues != "") {
        selectedValueHidden.value = tempValues;
    }
    else {
        if (liElemetns != null) {
            selectedValueHidden.value = Trim(liElemetns[GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, liElemetns)].attributes["itemvalue"].value);
        }
        else {
            var HiddenFieldDefaultItem = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldDefaultItem');
            if (HiddenFieldDefaultItem != undefined && HiddenFieldDefaultItem != null) {
                var values = HiddenFieldDefaultItem.value.split('#');
                selectedValueHidden.value = values[1];
            }
        }
    }
    if (liElemetns != null) {
        SetSelectedClassToSelectedItemByValue(selectedValueHidden.value, valuesDiv, twoLevels);
        var selectedValueIndex = GetSelectedValueIndex(liElemetns);
        if (selectedValueIndex != -1) {
            ScrollDivContent(valuesDiv, liElemetns[selectedValueIndex]);
        }
        else {
            ScrollDivContent(valuesDiv, liElemetns[GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, liElemetns)]);
        } 
    }
    HideDiv(div);
    openMultiCombo = null;
    var multiSelectComboBoxOnChange = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldOnChange').value;
    if (lastValues != selectedValueHidden.value && multiSelectComboBoxOnChange != "") {
        MultiSelectComboBoxChange(MultiSelectComboBoxId_prefix);
    }
}

function AClosePopUp_Click(MultiSelectComboBoxId_prefix) {
    var selectedValueHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldSelectedValue');
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var valuesDiv = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues');
    var div = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValues');
    RemoveAllCheck_Click(false, MultiSelectComboBoxId_prefix);
    textBox.value = lastTexts;
    HideDiv(div);
    openMultiCombo = null;
}

function MultiSelectItem_Click(id, MultiSelectComboBoxId_prefix) {
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var checkBoxDiv = document.getElementById(id);
    checkBoxDiv.className = checkBoxDiv.className == "Div_checkBoxDivUnselected" ? "Div_checkBoxDivSelected" : "Div_checkBoxDivUnselected";
    var selectedTexts = GetAllSelectedMultiSelectValues(document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValuesContent'));
    if (selectedTexts == "") {
        SelectFirstItem(MultiSelectComboBoxId_prefix);
    }
    else {
        GetSelecetdValuesForTextBox(selectedTexts, textBox);
    }
}

function ComboValueChange(value, MultiSelectComboBoxId_prefix) {
    RemoveAllCheck_Click(false, MultiSelectComboBoxId_prefix);

    var div = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValuesContent');
    var divs = div.getElementsByTagName("div");
    var i = 0;
    for (i = 0; i < divs.length; i++) {
        if (divs[i].attributes["itemvalue"] != undefined && divs[i].attributes["itemvalue"] != null && divs[i].attributes["itemvalue"].value == value) {
            divs[i].className = "Div_checkBoxDivSelected";
            break;
        }
    }
}

function RemoveAllCheck_Click(selectFirst, MultiSelectComboBoxId_prefix) {
    tempValues = "";
    var div = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValuesContent');
    var divs = div.getElementsByTagName("div");
    var i = 0;
    for (i = 0; i < divs.length; i++) {
        if (divs[i].className == "Div_checkBoxDivSelected") {
            divs[i].className = "Div_checkBoxDivUnselected";
        }
    }

    if (selectFirst) {
        SelectFirstItem(MultiSelectComboBoxId_prefix);
    }
}

function AllCheck_Click(MultiSelectComboBoxId_prefix) {
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var div = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValuesContent');
    var divs = div.getElementsByTagName("div");
    var i = 0;
    for (i = 0; i < divs.length; i++) {
        if (divs[i].className == "Div_checkBoxDivUnselected") {
            divs[i].className = "Div_checkBoxDivSelected";
        }
    }
    var selectedTexts = GetAllSelectedMultiSelectValues(document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboMultiSelectValuesContent')); 
    GetSelecetdValuesForTextBox(selectedTexts, textBox);
}

function SelectFirstItem(MultiSelectComboBoxId_prefix) {
    var valuesDiv = document.getElementById(MultiSelectComboBoxId_prefix + 'DivComboValues');
    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
    var ul = valuesDiv.getElementsByTagName("ul");
    if (ul != undefined && ul != null && ul.length > 0) {
        var liElemetns = ul[0].getElementsByTagName("li");

        textBox.value = Trim(liElemetns[GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, liElemetns)].innerHTML);
    }
    else {
        var defaultTextHidden = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldDefaultItem');
        if (defaultTextHidden != undefined && defaultTextHidden != null) {
            var values = defaultTextHidden.value.split('#');
            textBox.value = Trim(values[0]);
        }
    }
}

function CheckSelectedCheckBoxes(div, selectedValues) {
    var i = 0;
    var j = 0;
    var divs = div.getElementsByTagName("div");
    for (i = 0; i < selectedValues.length; i++) {
        for (j = 0; j < divs.length; j++) {
            var checkBoxDiv = divs[j];
            if (checkBoxDiv.className == "Div_checkBoxDivSelected" || checkBoxDiv.className == "Div_checkBoxDivUnselected") {
                if (checkBoxDiv.attributes["itemvalue"].value == selectedValues[i]) {
                    checkBoxDiv.className = "Div_checkBoxDivSelected";
                }
            }
        }
    }
}

function GetAllSelectedMultiSelectValues(div) {
    var divs = div.getElementsByTagName("div");
    var i = 0;
    var values = "";
    tempValues = "";
    for (i = 0; i < divs.length; i++) {
        if (divs[i].className == "Div_checkBoxDivSelected") {
//            for (var j = 0; j < divs[i].attributes.length; j++) {
//                alert(divs[i].attributes[j].nodeName);
//            }
            values += Trim(document.getElementById(divs[i].attributes["textID"].value).innerHTML) + ",";
            tempValues += divs[i].attributes["itemvalue"].value + ",";
        }
    }
    tempValues = tempValues.substring(0, tempValues.length - 1);

    return values.substring(0, values.length - 1);
}

function GetItemsCount(div) { 
    var divs = div.getElementsByTagName("div");
    var i = 0;
    var itemsCount = 0;
    for (i = 0; i < divs.length; i++) {
        if (divs[i].id.indexOf('checkBoxDiv') != -1) {
            itemsCount++;
        }
    }

    return itemsCount;
}

function GetSelecetdValuesForTextBox(allItems, textBox) {
    var ruler = document.getElementById('ruler');
    ruler.innerHTML = allItems;

    if (ruler.offsetWidth <= textBox.offsetWidth) {
        textBox.value = allItems;
    }
    else {
        ruler.innerHTML = "";
        var index = 0;
        while (ruler.offsetWidth < textBox.offsetWidth) {
            ruler.innerHTML += allItems.substring(index, index + 1);
            index++;
        }
        textBox.value = ruler.innerHTML.substring(0, ruler.innerHTML.length - 3) + "...";
        textBox.title = allItems;
    }
}

function GetMaxTextWidth(div) {
    var spans = div.getElementsByTagName("span");
    var i = 0;
    var maxWidth = 0;
    for (i = 0; i < spans.length; i++) {
        if (spans[i].offsetWidth > maxWidth) {
            maxWidth = spans[i].offsetWidth;
        }
    }

    return maxWidth;
}

function SetMaxTextWidth(div, maxWidth) {
    spans = div.getElementsByTagName("span");
    var i = 0;
    for (i = 0; i < spans.length; i++) {
        spans[i].style.width = (maxWidth) + 'px';
    }
}

function SetMultiselectDivWidth(prefixID, maxTextWidth, div) {
    var divs = div.getElementsByTagName('div');
    var containerDiv = null;
    for (var i = 0; i < divs.length; i++) { 
        if (typeof(divs[i].attributes["divtype"]) != "undefined" && divs[i].attributes["divtype"] != null && divs[i].attributes["divtype"].value != ""){
            if (divs[i].attributes["divtype"].value == "valuesContainer") {
                containerDiv = divs[i];
                break;
            }
        }
    }
    if (containerDiv != null) {
        var colums = $get(prefixID + 'HiddenFieldColumsCount').value;
        if (colums != "") {
            colums = parseInt(colums);
            containerDiv.style.width = ((colums * maxTextWidth) + (colums * 15) + (colums * 3)) + 'px';
        } 
    }
}

//general part
function GetElementTop(elem) {
    var yPos = elem.offsetTop;

    return yPos;
}

function GetElementLeft(elem) {
    var xPos = elem.offsetLeft;

    return xPos;
}

function GetTopBound(element) {
    return Sys.UI.DomElement.getLocation(element).y;
}

function GetBottomBound(element) {
    return Sys.UI.DomElement.getLocation(element).y + element.clientHeight;
}

function GetLeftBound(element) {
    return Sys.UI.DomElement.getLocation(element).x;
}

function GetRightBound(element) {
    return Sys.UI.DomElement.getLocation(element).x + element.clientWidth;
}

function ShowHideDiv(div, MultiSelectComboBoxId_prefix) {
    if (div.style.display != 'none') {
        HideDiv(div);
    }
    else {
        ShowDiv(div, MultiSelectComboBoxId_prefix);
    }
}

function HideDiv(div) {
    div.style.display = "none";
    div.style.zIndex = "0";
}

function ShowDiv(div, MultiSelectComboBoxId_prefix) {
    div.style.display = "";
    div.style.position = "absolute";
    div.style.zIndex = "999999";
//    var textBox = document.getElementById(MultiSelectComboBoxId_prefix + 'TextBoxComboSelectedValue');
//    Sys.UI.DomElement.setLocation(div, div.offsetLeft, div.offsetTop);
}

function GetFirstLiElementIndex(MultiSelectComboBoxId_prefix, items) {var i = 0;
    for (i = 0; i < items.length; i++) {
        if (!IsFirstLevelItem(items[i].attributes["itemvalue"].value)) {
            return i;
        }
    }

    return 0;
}

function MultiSelectComboBoxChange(MultiSelectComboBoxId_prefix) {
    var targetID = $get(MultiSelectComboBoxId_prefix + 'HiddenFieldCascadeTargetID').value;
    if (targetID != "") {
        CascadeChange(SearcherId_prefix, targetID);
    }
    var multiSelectComboBoxOnChange = document.getElementById(MultiSelectComboBoxId_prefix + 'HiddenFieldOnChange').value;
    if (multiSelectComboBoxOnChange != "") {
        var params = multiSelectComboBoxOnChange.substring(multiSelectComboBoxOnChange.indexOf('(') + 1, multiSelectComboBoxOnChange.indexOf(')'));
        if (params != "") {
            params = PrepareParams(params.split(','));
            window[multiSelectComboBoxOnChange.substring(0, multiSelectComboBoxOnChange.indexOf('('))].apply(this, params);
        }
        else {
            window[multiSelectComboBoxOnChange.substring(0, multiSelectComboBoxOnChange.indexOf('('))]();
        } 
    }
}

function PrepareParams(params) {
    var i = 0;
    for (i = 0; i < params.length; i++) {
        params[i] = Trim(params[i]);
        if (params[i].startsWith('\'') && params[i].endsWith('\'') && params[i].length > 2) {
            params[i] = params[i].substring(1, params[i].length - 1);
        }
    }

    return params;
}

function CascadeChange(parentPrefixID, targetID) {
    var targetTextBox = $get(parentPrefixID + targetID + '_' + 'TextBoxComboSelectedValue');
    if (targetTextBox == undefined || targetTextBox == null) {
        targetTextBox = $get(targetID + '_' + 'TextBoxComboSelectedValue');
    }

    if (targetTextBox != undefined && targetTextBox != null) {
        targetTextBox.value = "Nahrávám ...";

        var targetValuesDiv = $get(parentPrefixID + targetID + '_' + 'DivComboValues');
        if (targetValuesDiv == undefined || targetValuesDiv == null) {
            targetValuesDiv = $get(targetID + '_' + 'DivComboValues');
        }
        if (targetValuesDiv != undefined && targetValuesDiv != null) {
            var uls = targetValuesDiv.getElementsByTagName("ul");
            if (uls != undefined && uls != null && uls.length > 0) {
                var ul = uls[0];
                ul.innerHTML = "";
            }

            var nextTarget = $get(parentPrefixID + targetID + '_' + 'HiddenFieldCascadeTargetID');
            if (nextTarget == undefined || nextTarget == null) {
                nextTarget = $get(targetID + '_' + 'HiddenFieldCascadeTargetID');
            }
            if (nextTarget != undefined || nextTarget != null) {
                if (nextTarget.value != "") {
                    CascadeChange(parentPrefixID, nextTarget.value);
                } 
            }
        }
    } 
}

function CreateCombo(comboID, keyboardSelect) {
    
}

function CreateMultiSelectCombo() {

}

function ComboClick() {
    if (openCombo != undefined && openCombo != null && openCombo != "") {
        var comboDiv = $get(openCombo);
        if (!userOpen) {            
            if (comboDiv != undefined && comboDiv != null) {
                comboDiv.style.display = "none";
            }
        }
        else {
            var textBox = comboDiv.parentNode.getElementsByTagName('input');
            var i = 0;
            for (i = 0; i < textBox.length; i++) {
                if (textBox[i].type == 'text') {
                    textBox[i].select();
                }
            }
            userOpen = false;
        }
    }
}

function CreatePearImageComboBox(comboID) {
    var containerDiv = CreateComboBoxElement('div', comboID + '_DivMultiSelectComboClass', '', '', '');
    var mainDiv = CreateComboBoxElement('div', comboID + '_DivPearComboBoxMain', '', '', 'Div_PearComboBox');
    var resultSpan = CreateComboBoxElement('span', comboID + '_TextBoxComboSelectedValue', "MultiSelectComboBox_Click('" + comboID + "_', 'false');",
        "return DivComboValues_KeyDown(event, '" + comboID + "_', 'false');", 'InputText_SelectedValue');
    resultSpan.innerHTML = "&nbsp;";
    var imageDiv = CreateComboBoxElement('div', comboID + '_DivOpenImage', "MultiSelectComboBox_Click('" + comboID + "_', 'false');", "", "Div_OpenImage");
    var valuesDiv = CreateComboBoxElement('div', comboID + '_DivComboValues', "", "DivComboValues_KeyDown(this, event);", 'Div_ComboValues');
    valuesDiv.style.display = 'none';
    valuesDiv.style.height = '170px';
    valuesDiv.style.overflow = 'auto';
    var ul = CreateComboBoxElement('ul', '', '', '', '');
    valuesDiv.appendChild(ul);
    mainDiv.appendChild(resultSpan);
    mainDiv.appendChild(imageDiv);
    mainDiv.appendChild(valuesDiv);
    containerDiv.appendChild(mainDiv);

    return containerDiv;
}

function CreateComboBoxElement(tagName, elementID, onClickCall, onKeyDownCall, cssClass) {
    var comboElement = document.createElement(tagName);
    comboElement.id = elementID;
    comboElement.className = cssClass;
    if (onClickCall != "") {
        if (comboElement.attachEvent) {
            comboElement.onclick = new Function("someFunctionName('input" + 1 + "')");
        }
        else {
            comboElement.setAttribute("onclick", onClickCall + "; return false;");
        }
    }
    if (onKeyDownCall != "") {
        if (comboElement.attachEvent) {
            comboElement.onclick = new Function(onKeyDownCall);
        }
        else {
            comboElement.setAttribute("onclick", onKeyDownCall + "; return false;");
        }
    }

    return comboElement;
}

function AddOptionToPearComboBox(combo, comboID, text, value, selected) {
    var ul = combo.getElementsByTagName('ul');
    var li = CreateLiElement(text, value, selected, combo.id);
    ul[0].appendChild(li);
}
