﻿var Penki_ExpandlastExpandedObject = new Object();


function Penki_CheckInputNumber(e, control, autoSubimt) {
    var keynum
    var keychar
    var numcheck;
    if (window.event) // IE
    {
        keynum = e.keyCode;
    }
    else if (e.which) // Netscape/Firefox/Opera
    {
        keynum = e.which;
    }
    numcheck = /\d/;
    if (keynum == 13) {
        if (e.preventDefault) {
            e.preventDefault(); // Mozilla and Opera
        }
        else {
            e.cancelBubble = true; // IE and Opera
            e.returnValue = false; // IE and Opera
        }

        if (autoSubimt) {
            if (numcheck.test(control.value)) {
                control.form.submit();
            }
        }
    }

    if (keynum > 32) {
        keychar = String.fromCharCode(keynum);
    }

    if (keychar && !numcheck.test(keychar)) {

        if (e.preventDefault) {
            e.preventDefault(); // Mozilla and Opera
        }
        else {
            e.cancelBubble = true; // IE and Opera
            e.returnValue = false; // IE and Opera
        }
    }

    return false;
}


function Penki_UpInputNumber(controlID, maxValue) {
    var control = document.getElementById(controlID)
    if (control) {
        var value = parseInt(control.value);
        control.value = maxValue;
        if (value >= Number.MIN_VALUE) {
            if (value < maxValue) {
                control.value = '' + (value + 1);
                Penki_FireEvent(control, "change");
            }
        }
    }
}
function Penki_DownInputNumber(controlID, minValue) {
    var control = document.getElementById(controlID)
    if (control) {
        var value = parseInt(control.value);
        control.value = minValue;
        if (value >= Number.MIN_VALUE) {
            if (value > minValue) {
                control.value = '' + (value - 1);
                Penki_FireEvent(control, "change");
            }
        }
    }
}

function Penki_ToggleExpandObject(control, controlOwner, quick, groupName, isPopup ) {
    //alert('element:' + element + '\ncontrolID:' + controlID + '\ncontrolOwnerID:' + controlOwnerID + '\nquick:' + quick)

    var elementToExpand = null;
    if (typeof (control) == "string")
    {
        elementToExpand = document.getElementById(control);
    }
    else
    {
        elementToExpand = control;
    }
    
    if (!elementToExpand) {
        alert('Element to expand not found');
        return;
    }

    var attribute;
    var maxSteps = 10;

    var _this = this;

    var elementOwnerToExpand = null;

    if (typeof (controlOwner) == "string")
    {
        elementOwnerToExpand = document.getElementById(controlOwner);
    }
    else
    {
        elementOwnerToExpand = controlOwner;
    }


    
    
    //alert(controlOwnerID);

    var isVirtual = true;

    if (elementOwnerToExpand) {
        var node = elementToExpand;
        while (isVirtual && node) {
            node = node.parentNode
            isVirtual = node != elementOwnerToExpand;
        }
    }

    this.Toggle = function(element) {

        var expanded;
        attribute = elementToExpand.getAttribute("Expanded");
        if (attribute) {
            expanded = attribute == 'true';
        }
        else {
            expanded = elementToExpand.style.display != 'none';
        }


        expanded = !expanded;

        if (!quick && elementOwnerToExpand) {
            var timeoutID = parseInt(elementToExpand.getAttribute("ExpandTimeoutID"));
            var startStepIndex = 0;
            if (!isVirtual) {
                if (timeoutID > 0) {
                    window.clearTimeout(timeoutID);

                    attribute = elementOwnerToExpand.getAttribute("OriginalWidth");
                    elementOwnerToExpand.style.width = attribute;
                    attribute = elementOwnerToExpand.getAttribute("OriginalHeight");
                    elementOwnerToExpand.style.height = attribute;
                    if (!expanded) {
                        elementToExpand.style.display = 'block';
                    }
                    attribute = parseInt(elementToExpand.getAttribute("StepIndex"));
                    if (attribute > -1) {
                        startStepIndex = maxSteps - attribute;
                    }
                }
                else {
                    attribute = elementOwnerToExpand.getAttribute("OriginalWidth");
                    if (!attribute) {
                        elementOwnerToExpand.setAttribute("OriginalWidth", elementOwnerToExpand.style.width);
                    }
                    attribute = elementOwnerToExpand.getAttribute("OriginalHeight");
                    if (!attribute) {
                        elementOwnerToExpand.setAttribute("OriginalHeight", elementOwnerToExpand.style.height);
                    }
                }
            }

            var setSize = false;
            if (isVirtual) {
                setSize = elementOwnerToExpand.style.display == 'none' && !expanded;
                elementOwnerToExpand.style.display = 'block';
            }

            var currentWidth = elementOwnerToExpand.offsetWidth;
            var currentHeight = elementOwnerToExpand.offsetHeight;

            var destinationWidth
            var destinationHeight


            var objectTags;
            var objectIndex;
            if (expanded) {
                objectTags = elementToExpand.getElementsByTagName('OBJECT');
                for (objectIndex = 0; objectIndex < objectTags.length; objectIndex++) {
                    objectTags[objectIndex].style.display = 'none';
                }
            }

            elementToExpand.style.display = expanded ? 'block' : 'none';
            if (isVirtual) {
                destinationWidth = elementToExpand.offsetWidth;
                destinationHeight = elementToExpand.offsetHeight;
            }
            else {
                destinationWidth = elementOwnerToExpand.offsetWidth;
                destinationHeight = elementOwnerToExpand.offsetHeight;
            }
            elementToExpand.style.display = expanded ? 'none' : 'block';
            if (expanded) {
                objectTags = elementToExpand.getElementsByTagName('OBJECT');
                for (objectIndex = 0; objectIndex < objectTags.length; objectIndex++) {
                    objectTags[objectIndex].style.display = 'block';
                }
            }
            if (isVirtual && setSize) {
                currentWidth = elementToExpand.offsetWidth;
                currentHeight = elementToExpand.offsetHeight;
            }


            if (destinationWidth == currentWidth && destinationHeight == currentHeight) {
                elementToExpand.style.display = expanded ? 'block' : 'none';
                //alert('Debug #1');
                if (isVirtual && elementOwnerToExpand) {
                    elementOwnerToExpand.style.display = 'none';
                    elementOwnerToExpand.style.width = '0px';
                    elementOwnerToExpand.style.height = '0px';
                }
            }
            else {
                //alert('Debug #2');
                if (!expanded) {
                    elementToExpand.style.display = expanded ? 'block' : 'none';
                }
                Penki_ToggleExpandObjectAnimation(controlOwner, isVirtual, control, currentWidth, currentHeight, destinationWidth, destinationHeight, startStepIndex, maxSteps);
            }
        }
        else {
            elementToExpand.style.display = expanded ? 'block' : 'none';
            if (isVirtual && elementOwnerToExpand) {
                elementOwnerToExpand.style.display = 'none';
                elementOwnerToExpand.style.width = '0px';
                elementOwnerToExpand.style.height = '0px';
            }
        }
        elementToExpand.setAttribute("Expanded", expanded ? 'true' : 'false');

        if (groupName) {
            if (!expanded) {
                Penki_ExpandlastExpandedObject[groupName] = null;
            }
            else {
                if (Penki_ExpandlastExpandedObject[groupName] && !Penki_ExpandlastExpandedObject[groupName].IsPopup) {
                    Penki_ExpandlastExpandedObject[groupName].Toggle(null);
                }
                Penki_ExpandlastExpandedObject[groupName] = this;

            }
        }

        var buttonElement = null;
        var buttonToggle = null;
        //alert('Click ' + elementToExpand.id)
        if (isPopup && expanded) {
            Penki_PopClickCount = 0;
            var obj = new Penki_PopClickInner();
            obj.ButtonElement = element;
            obj.ButtonToggle = buttonToggle;
            obj.ElementToExpand = elementToExpand;
            obj.Close = CloseInner;
            obj.ClickCount = 0;
            Penki_HookEvent(document, "click", obj.Click);
        }
    }

    function Penki_PopClickInner() {
        var _this = this;

        this.Click = function(eventObj) {
            eventObj = eventObj ? eventObj : window.event;
            Penki_PopClick(eventObj, _this);
        }
    }

    function CloseInner() {
        _this.Toggle(null);
    }

}

Penki_ToggleExpandObject.ToggleElement = function(control, controlOwner, quick, groupName, isPopup, button) {
    //if (Penki_ExpandlastExpandedObject != null && control == Penki_ExpandlastExpandedObject)
    var t = new Penki_ToggleExpandObject(control, controlOwner, quick, groupName, isPopup);
    if (t) {
        t.Toggle(button);
    }
}

var Penki_PopClickCount;
function Penki_PopClick(eventObj, callBackState) {
    //alert('Check ' + callBackState.ElementToExpand.id)
    if (callBackState.ClickCount > 0) {
        var target;
        if (eventObj.target) target = eventObj.target;
        else if (eventObj.srcElement) target = eventObj.srcElement;
        if (target.nodeType == 3) // defeat Safari bug
            target = target.parentNode;
        var currentElement = target;

        while (currentElement) {
            if (currentElement.getAttribute && currentElement.getAttribute("closeonclick") == "closeonclick") {
                break;
            }
            if (currentElement == callBackState.ElementToExpand) {
                return;
            }
            else if (currentElement == callBackState.ButtonElement) {
                Penki_UnhookEvent(document, "click", callBackState.Click);
                return;
            }
            currentElement = currentElement.parentNode;
        }
        if (callBackState.ButtonToggle) {
            callBackState.ButtonToggle();
        }
        Penki_UnhookEvent(document, "click", callBackState.Click);
        callBackState.Close();
        //lastToggleButtonObject.Element = buttonElement;
        //lastToggleButtonObject.ButtonUniqueID = buttonUniqueID;
        //lastToggleButtonObject.InitValue = initValue;
        //lastToggleButtonObject.Remember = remember;
        //lastToggleButtonObject.ValueChecked = valueChecked;
        //lastToggleButtonObject.ValueUnchecked = valueUnchecked;

    }
    else {
        callBackState.ClickCount++;
    }
}



function Penki_HookEvent(element, eventName, callback) {
    if (typeof (element) == "string")
        element = document.getElementById(element);
    if (element == null)
        return;
    if (element.addEventListener) {
        element.addEventListener(eventName, callback, false);
    }
    else if (element.attachEvent)
        element.attachEvent("on" + eventName, callback);
}

function Penki_UnhookEvent(element, eventName, callback) {
    if (typeof (element) == "string")
        element = document.getElementById(element);
    if (element == null)
        return;
    if (element.removeEventListener)
        element.removeEventListener(eventName, callback, false);
    else if (element.detachEvent)
        element.detachEvent("on" + eventName, callback);
}
function Penki_FireEvent(fireOnThis, eventName) {
    if (document.createEvent) {
        var evObj = document.createEvent('MouseEvents');
        evObj.initEvent(eventName, true, false);
        fireOnThis.dispatchEvent(evObj);
    } else if (document.createEventObject) {
        fireOnThis.fireEvent('on' + eventName);
    }
}



function Penki_ToggleExpandObjectAnimation(controlOwner, isVirtual, control, startWidth, startHeight, destinationWidth, destinationHeight, stepIndex, maxSteps) {
    var elementOwnerToExpand = null;
    var elementToExpand = null;
    if (typeof (control) == "string") {
        elementToExpand = document.getElementById(control);
    }
    else {
        elementToExpand = control;
    }


    if (typeof (controlOwner) == "string") {
        elementOwnerToExpand = document.getElementById(controlOwner);
    }
    else {
        elementOwnerToExpand = controlOwner;
    }

    if (elementOwnerToExpand) {
        elementOwnerToExpand.style.width = Math.floor(destinationWidth - (maxSteps - stepIndex) * (destinationWidth - startWidth) / maxSteps) + 'px'; ;
        elementOwnerToExpand.style.height = Math.floor(destinationHeight - (maxSteps - stepIndex) * (destinationHeight - startHeight) / maxSteps) + 'px';
    }
    if (stepIndex < maxSteps) {
        //alert(functionTXT);
        var timeoutID = window.setTimeout(TimerCallback, 10);
        if (elementToExpand) {
            elementToExpand.setAttribute("ExpandTimeoutID", timeoutID);
            elementToExpand.setAttribute("StepIndex", stepIndex);
        }
    }
    else {
        if (elementToExpand) {
            elementToExpand.setAttribute("ExpandTimeoutID", "0");
            var attribute;
            attribute = elementToExpand.getAttribute("Expanded");
            if (attribute == 'true') {
                elementToExpand.style.display = 'block';
            }
            if (elementOwnerToExpand && !isVirtual) {
                attribute = elementOwnerToExpand.getAttribute("OriginalWidth");
                elementOwnerToExpand.style.width = attribute;
                attribute = elementOwnerToExpand.getAttribute("OriginalHeight");
                elementOwnerToExpand.style.height = attribute;
            }
            if (isVirtual && elementOwnerToExpand) {
                elementOwnerToExpand.style.display = 'none';
                elementOwnerToExpand.style.width = '0px';
                elementOwnerToExpand.style.height = '0px';
            }
        }
    }

    function TimerCallback() {
        Penki_ToggleExpandObjectAnimation(controlOwner, isVirtual, control, startWidth, startHeight, destinationWidth, destinationHeight, (++stepIndex), maxSteps);
    }
    
}

function Penki_CheckBoxesControl(checkBoxesOwnerID, toggleCheckBoxID, toggleCheckBoxIndex) {
    var _this = this;
    var checkBoxesOwner = document.getElementById(checkBoxesOwnerID);
    var toggleCheckBox = document.getElementById(toggleCheckBoxID);
    var checkBoxes = new Array();
    if (checkBoxesOwner) {
        var inputs = checkBoxesOwner.getElementsByTagName('INPUT');
        var i;
        var boxIndex = 0;
        for (i = 0; i < inputs.length; i++) {
            if (inputs[i].type == "checkbox") {
                if (!toggleCheckBox && boxIndex == toggleCheckBoxIndex) {
                    toggleCheckBox = inputs[i];
                }
                else if (inputs[i] != toggleCheckBox) {
                    checkBoxes.push(inputs[i]);
                    Penki_HookEvent(inputs[i], "click", ItemClick);
                }
                boxIndex ++;
            }
        }
    }

    if (toggleCheckBox) {
        Penki_HookEvent(toggleCheckBox, "click", ToggleClick);
    }

    function ToggleClick() {
        if (toggleCheckBox) {
            _this.SetChecked(toggleCheckBox.checked);
        }
    }

    function ItemClick() {
        if (toggleCheckBox) {
            toggleCheckBox.checked = _this.AllChecked();
        }
    }

    this.CheckedCount = function() {
        var count = 0;
        var i;
        for (i = 0; i < checkBoxes.length; i++) {
            if (checkBoxes[i].checked) {
                count++;
            }
        }
        return count;
    }

    this.AllChecked = function() {
    return checkBoxes.length > 0 && this.CheckedCount() == checkBoxes.length;
    }

    this.SetChecked = function(value) {
        for (i = 0; i < checkBoxes.length; i++) {
            checkBoxes[i].checked = value;
        }
    }

    this.CheckBoxes = checkBoxes;
    this.ToggleCheckBox = toggleCheckBox;
}

function Penki_CheckBoxesControlWithErrorMessage(checkBoxesOwnerID, toggleCheckBoxID, toggleCheckBoxIndex, errorMessageID, minimumCheck) {
    var checkBoxes = new Penki_CheckBoxesControl(checkBoxesOwnerID, toggleCheckBoxID, toggleCheckBoxIndex);
    var errorMessage = document.getElementById(errorMessageID);

    var i;
    var boxes = checkBoxes.CheckBoxes;
    for (i = 0; i < boxes.length; i++) {
        Penki_HookEvent(boxes[i], "click", ItemClick);
    }
    if (checkBoxes.ToggleCheckBox) {
        Penki_HookEvent(checkBoxes.ToggleCheckBox, "click", ItemClick);
    }
    function ItemClick() {
        if (errorMessage) {
            errorMessage.style.display = 'none';
        }
    }
    
    this.CheckedCount = function() {
        return checkBoxes.CheckedCount();
    }
    this.AllChecked = function() {
        return checkBoxes.AllChecked();
    }
    this.SetChecked = function(value) {
        return checkBoxes.SetChecked(value);
    }

    this.CheckSubmit = function() {
        if (checkBoxes.CheckedCount() < minimumCheck) {
            if (errorMessage) {
                errorMessage.style.display = 'block';
            }
            return false;
        }
        return true;
    }
}

function Penki_TabDisplay(parent) {
    var items = new Array();
    if (typeof (parent) == "string") {
        parent = document.getElementById(parent);
    }
    var itemIndex = -1;
    if (parent != null) {
        var nodes = parent.childNodes;
        var i;
        for (i = 0; i < nodes.length; i++) {
            if (nodes[i].nodeType == 1) {
                items.push(nodes[i]);
                if (nodes[i].style.display != 'none') {
                    itemIndex = items.length-1;
                }
            }
        }
    }

    this.ShowTab = function(index) {
        if (index > -1) {
            if (index < items.length) {
                if (itemIndex > -1) {
                    items[itemIndex].style.display = 'none';
                }
                itemIndex = index;
                items[itemIndex].style.display = 'block';
            }
        }
    }    
    
}

function Penki_SctiptLoader(owner, scriptUrl, onLoad, tagValue, autoDispose) {
    var disposed;
    var endDate;
    var loaded;
    var items = new Array();
    var _this = this;
    var tag = tagValue;
    if (!owner) {
        owner = document.body;
    }
    this.getTag = function() {
        return tag;
    }
    var startDate = new Date();
    function onScriptLoad() {
        if (!loaded) {
            endDate = new Date();
            //alert("loaded '" + tag + "' in " + (endDate - startDate));
            if (onLoad) {
                onLoad(_this);
            }
            if (autoDispose) {
                doDispose();
            }
        }
    }
    this.GetDuration = function() {
        return endDate.getTime() - startDate.getTime();
    }
    var scriptTag = createScriptTag(scriptUrl);
    
    function createScriptTag(src) {
        var newScript = document.createElement("script");
        newScript.onreadystatechange = function() {
            if (this.readyState == "complete" || this.readyState == "loaded") {
                if (this.src) {
                    onScriptLoad();
                }
            }
        }
        Penki_HookEvent(newScript, "load", onScriptLoad);
        newScript.setAttribute("type", "text/javascript")

        if (src) {
            newScript.setAttribute("src", src)
        }
        owner.appendChild(newScript);
    }

    this.load = function(scriptUrl) {
        if (!scriptTag) {
            scriptTag = createScriptTag(scriptUrl);
        }
        else {
            startDate = new Date();
            scriptTag.setAttribute("src", scriptUrl)
        }
    }

    function doDispose() {
        if (!disposed && scriptTag) {
            disposed = true;
            Penki_UnhookEvent(scriptTag, "load", onScriptLoad);
            if (scriptTag.onreadystatechange) {
                scriptTag.onreadystatechange = null;
            }
            scriptTag.parentNode.removeChild(newScript);
            scriptTag = null;
        }
    }

    this.Dispose = function() {
        doDispose();
    }
}


function Penki_AutoCompleteTextBox(inputID,boxID, scriptURL, autoSubmit, submitURL) {
    var input = document.getElementById(inputID);
    var box = document.getElementById(boxID);
    var boxVisible = false;
    var boxItemIndex = -1;
    var boxItems = new Array();
    var boxNodes = new Array();
    var changeTimeout = 300;
    var changeTimeoutID = -1;

    var value;
    var autoCompleteLoader;
    var cssBase = "";
    var events = new Object();
    var hasInputFocus = false;
    var boxOver = false;

    if (box && input) {
        Penki_HookEvent(input, "keypress", onKeyPress);
        if (scriptURL) {
            Penki_HookEvent(input, "keydown", onKeyDown);
            Penki_HookEvent(input, "keyup", onKeyUp);
            Penki_HookEvent(input, "blur", onBlur);
            Penki_HookEvent(input, "focus", onFocus);
            Penki_HookEvent(box, "mouseover", onBoxOver);
            Penki_HookEvent(box, "mouseout", onBoxOut);
            value = input.value;
            if (input.className) {
                cssBase = input.className;
            }
            else {
                cssBase = "InputText"
            }
            box.className = cssBase + '_autoComplete_Box';
        }
    }

    function onBoxOver() {
        boxOver = true;
    }

    function onBoxOut() {
        boxOver = false;
    }
    

    this.addEvent = function(name, callBack) {
        if (!events[name]) {
            var array = new Array();
            events[name] = array;
            array.push(callBack);
        }
        else {
            this.events[name].push(callBack);
        }
    }

    this.removeEvent = function(name, callBack) {
        if (events[name]) {
            var array = events[name];
            var i = 0;
            for (i = 0; i < array.length; i++) {
                if (array[i] == callBack) {
                    break;
                }
            }
            if (i < array.length) {
                array.splice(i, 1);
                if (array.length == 0) {
                    events[name] = null;
                    delete events[name];
                }
            }
        }
    }
    function raiseEvent(name) {
        var array = events[name];
        var v = true;
        if (array) {
            var i;
            for (i = 0; i < array.length; i++) {
                try {
                    var ev = array[i]();
                    if (ev == false) {
                        v = false;
                    }
                }
                catch (e) { }
            }
        }
        return v;
    }

    this.getValue = function() {
        return input.value.Trim()+ '';
    }

    this.clearValue = function() {
        blurCurrentItem();
        input.value = '';
        fillBoxItems(new Array());
        value = '';
        hideBox()
    }

    function onSubmit() {
        return raiseEvent('submit');
    }


    function onFocus() {
        hasInputFocus = true;
        if (boxItems.length > 0) {
            box.style.display = 'block';
            boxVisible = true;
        }
    }

    function onBlur() {
        hasInputFocus = false;
        if (!boxOver) {
            hideBox();
        }
    }


    function onKeyPress(e) {
        if (e && e.keyCode) {
            switch (e.keyCode) {
                case 13:
                    if (autoSubmit) {
                        if ((submitURL + '') != '') {
                            if (onSubmit()) {
                                input.form.action = submitURL;
                                input.form.submit();
                            }
                            cancelEvent(e);
                        }
                        else {
                            if (!onSubmit()) {
                                cancelEvent(e);
                            }
                        }
                    }
                    else {
                        onSubmit()
                        cancelEvent(e);
                    }
                    break;
                default:
                    break;    
            }
        }
    }


    function onKeyUp(e) {
        if (e && e.keyCode) {
            switch (e.keyCode) {
                case 38:
                    break;
                case 40:
                    break;
                default:
                    var newValue = input.value.Trim();
                    if ((newValue + '') != (value + '')) {
                        valueChanged(newValue)
                    }
                    break;
            }
        }
    }

    function onKeyDown(e) {
        if (e && e.keyCode) {
            switch (e.keyCode) {
                case 38:
                    goUP();
                    break;
                case 40:
                    goDOWN();
                    break;
            }
        }
    }

    function goUP() {
        if (boxVisible && boxItems.length > 0) {
            var i = boxItemIndex;
            blurCurrentItem();
            if (i == 0) {
                boxItemIndex = -1;
                input.value = value;
            }
            else {
                if (i == -1) {
                    boxItemIndex = boxItems.length - 1;
                }
                else {
                    boxItemIndex = i-1;
                }
                input.value = boxItems[boxItemIndex].Value;
                focusCurrentItem();
            }
        }
    }

    function goDOWN() {
        if (boxVisible && boxItems.length > 0) {
            var i = boxItemIndex;
            blurCurrentItem();
            if (i == boxItems.length - 1) {
                boxItemIndex = -1;
                input.value = value;
            }
            else {
                boxItemIndex = i + 1;
                input.value = boxItems[boxItemIndex].Value;
                focusCurrentItem();
            }
        }
    }
    

    function blurCurrentItem() {
        if (boxItemIndex > -1) {
            if (cssBase) {
                boxNodes[boxItemIndex].className = cssBase + '_autoComplete_item';
            }
            else {
                boxNodes[boxItemIndex].style.fontWeight = 'normal';
            }
            boxItemIndex = -1;
        }
    }
    function focusCurrentItem() {
        if (boxItemIndex > -1) {
            if (cssBase) {
                boxNodes[boxItemIndex].className = cssBase + '_autoComplete_item_over';
            }
            else {
                boxNodes[boxItemIndex].style.fontWeight = 'bold';
            }
        }
    }
    
    function valueChanged(newValue) {
        if ((newValue + '') != (value + '') && (scriptURL + '') != null) {
            //alert("new: [" + newValue + "]\nold: [" + value + "]" )
            value = newValue;
            hideBox();
            cancelLoad();
            clearChangedTimeout();
            changeTimeoutID = window.setTimeout(valueChangedTimeout, changeTimeout)
        }
    }
    function valueChangedTimeout(){
        changeTimeoutID = -1;
        cancelLoad();
        if (value == "") {
            hideBox()
        }
        else {
            autoCompleteLoader = new Penki_SctiptLoader(input.parentNode, scriptURL + (scriptURL.indexOf('?')>0 ? "&" : "?" ) +"value=" + escape(value) + "&naming=" + escape(input.id) + "_Items", onScriptLoad, value, true);
        }
    }

    function onScriptLoad(loader) {
        boxItemIndex = -1;
        if (loader.getTag() == value)
        {
            var items = null;
            try {
                items = window[input.id + "_Items"];
            }
            catch (e)
                { items = new Array(); }
            if (!items) {
                items = new Array();
            }
            
            //alert("loaded '" + value + "' in " + (endDate - startDate));            

            //items.push(new AutoCompleteItem("loaded '" + value + "' in", loader.GetDuration()));
            
            fillBoxItems(items);
            if (boxItems.length > 0) {
                if (hasInputFocus) {
                    box.style.display = 'block';
                    boxVisible = true;
                }
                var i;
                var handler;
                for (i = 0; i < boxNodes.length; i++) {
                    handler = new itemHandler(i);
                    Penki_HookEvent(boxNodes[i], "mouseover", handler.Over);
                    Penki_HookEvent(boxNodes[i], "click", handler.Click);
                }
            }
            else {
                hideBox();
            }
        }
        else
        {
            hideBox();
        }


        function itemHandler(i) {
            this.Over = function() { ItemOver(i) };
            this.Click = function() { ItemClick(i) };
        }
    }

    function ItemOver(index) {
        if (index > -1) {
            blurCurrentItem();
            boxItemIndex = index;
            focusCurrentItem();
        }

    }

    function ItemClick(index) {
        if (index > -1) {
            input.value = boxItems[index].Value
            boxOver = false;
            if (onSubmit() && autoSubmit) {
                input.form.submit();
            }
            hideBox();
        }
    }


    function fillBoxItems(items) {
        delete boxItems;
        boxItems = new Array();
        delete boxNodes;
        boxNodes = new Array();
        
        while (box.firstChild) {
            box.removeChild(box.firstChild);
        }
        var div;
        var table;
        var tbody;
        var tr;
        var td;
        var textNode;
        var i;
        for (i = 0; i < items.length; i++) {
            if (items[i].Value ) {
                div = document.createElement("div")
                box.appendChild(div);
                table = document.createElement("table")
                table.cellPadding = "4";
                table.cellSpacing = "0";
                table.width = "100%";
                div.appendChild(table);
                tbody = document.createElement("tbody")
                table.appendChild(tbody);
                tr = document.createElement("tr");
                tbody.appendChild(tr);
                td = document.createElement("td");
                tr.appendChild(td);
                textNode = document.createTextNode(items[i].Value + '');
                td.appendChild(textNode);

                td = document.createElement("td");
                tr.appendChild(td);
                td.align = "right";
                if (items[i].Count) {
                    textNode = document.createTextNode(items[i].Count + '');
                    td.appendChild(textNode);
                }
                if (cssBase) {
                    div.className = cssBase + '_autoComplete_item';
                }
                div.style.cursor = 'pointer';
                
                boxNodes.push(div);
                boxItems.push(items[i]);
            }
        }
    }
    
    function clearChangedTimeout() {
        if (changeTimeoutID > -1) {
            window.clearTimeout(changeTimeoutID);
        }
        changeTimeoutID = -1;
    }
    function hideBox() {
        if (boxVisible) {
            blurCurrentItem();
            boxVisible = false;
            boxOver = false;
            box.style.display = 'none';
        }
    }
    function cancelEvent(e) {
        if (e) {
            if (e.preventDefault) {
                e.preventDefault(); // Mozilla and Opera
            }
            else {
                e.cancelBubble = true; // IE and Opera
                e.returnValue = false; // IE and Opera
            }
        }
    }
    function cancelLoad() {
        if (autoCompleteLoader) {
            autoCompleteLoader.Dispose();
            delete autoCompleteLoader;
        }
    }
}

function Penki_OptionsKeeper(boxID,fieldID,valuesFieldID, inputBox, addID ,scriptURL) {
    var box = document.getElementById(boxID);
    var field = document.getElementById(fieldID);
    var valuesField = document.getElementById(valuesFieldID);
    var addBtn = document.getElementById(addID);

    var ids = new Array();
    var values = new Array();
    var map = new Object();
    var tableBody;
    var itemsCount = 0;
    var autoPrefix = Math.random() + '';
    Penki_HookEvent(window, "load", initalize);
    if (addBtn) {
        Penki_HookEvent(addBtn, "click", onInputSubmit);
    }

    inputBox.addEvent('submit', onInputSubmit);

    function onInputSubmit() {
        var value = inputBox.getValue();
        AddValue(value);
        inputBox.clearValue();
    }
    
    function initalize() {
        var initialIDS = field.value.split('\r\n');
        var initialValues = valuesField.value.split('\r\n');
        field.value = '';
        valuesField.value = '';
        if (initialIDS.length == initialValues.length) {
            var i;
            for (i = 0; i < initialIDS.length; i++) {
                AddItem(initialIDS[i], initialValues[i]);
            }
        }
    }

    function getTableBody() {
        if (tableBody == null) {
            var table = document.createElement("table")
            table.cellPadding = "4";
            table.cellSpacing = "0";
            table.width = "100%";
            box.appendChild(table);
            tableBody = document.createElement("tbody")
            table.appendChild(tableBody);
        }
        return tableBody;
    }


    function AddValue(value) {
        if ((scriptURL + '') != '') {
            var url = scriptURL + (scriptURL.indexOf('?') > 0 ? "&" : "?") + "value=" + escape(value) + "&naming=" + escape(box.id) + "_Items";
            var loader = new Penki_SctiptLoader(box, url , onScriptLoad, value, true);
        }
        else {
            if ((value + '') != '') {
                itemsCount++;
                AddItem(autoPrefix + itemsCount, value + '');
            }
        }
    }

    function onScriptLoad(loader) {
        var items = null;
        try {
            items = window[box.id + "_Items"];
        }
        catch (e)
                { items = new Array(); }
        if (!items) {
            items = new Array();
        }
        //alert("loaded '" + value + "' in " + (endDate - startDate));        
        var i;
        for (i = 0; i < items.length; i++) {
            //alert("id: " + items[i].ID + '\nValue: ' + items[i].Value)
            AddItem(items[i].ID, items[i].Value)
        }
    }

    function AddItem(id, text) {
        id = id + '';
        text = text + '';
        if (id != '' && text != '') {
            if (!map[id]) {
                ids.push(id);
                values.push(text);
                map[id] = text;

                field.value += field.value == '' ? id : '\r\n' + id;
                valuesField.value += valuesField.value == '' ? text : '\r\n' + text;

                var tbd = getTableBody();

                var tr = document.createElement("tr");
                tbd.appendChild(tr);
                var td = document.createElement("td");
                tr.appendChild(td);
                var textNode = document.createTextNode(text + '');
                td.appendChild(textNode);

                td = document.createElement("td");
                tr.appendChild(td);
                td.align = "right";
                td.style.cursor = 'pointer';
                textNode = document.createTextNode('[X]');
                td.appendChild(textNode);
                Penki_HookEvent(td, "click", removeCurrentItem);
            }
        }
        function removeCurrentItem() {
            if (map[id]) {
                var index=-1;
                var i;
                for (i = 0; i < ids.length; i++) {
                    if ((ids[i] + '') == (id + '')) {
                        index = i;
                        break;
                    }
                }
                if (index > -1) {
                    ids.splice(index, 1);
                    values.splice(index, 1);
                    field.value = ids.join('\r\n');
                    valuesField.value = values.join('\r\n');
                    var tbd = getTableBody();
                    tbd.removeChild(tbd.childNodes[index]);
                    map[id] = null;
                    delete map[id];
                }
            }
        }
    }
}
function Penki_OpenPopup(popLocation, popName, popWidth, popHeigth, popOptions) {
    var x=0;
    var y=0;
    if (window.screen) {
        if (screen.availWidth && screen.availHeight) {
            x = (screen.availWidth - popWidth) * 0.5;
            y = (screen.availHeight - popHeigth) * 0.5;
        }
        else if (screen.width && screen.heght) {
            x = (screen.width - popWidth) * 0.5;
            y = (screen.heght - popHeigth) * 0.5;
        }
    }
    var popupw;
    var options = 'width=' + popWidth + ',height=' + popHeigth + ',left=' + x + ',top='+  y
    if (popOptions != '') {
        options = options + ',' + popOptions
    }

    popupw = window.open(popLocation, popName, options, true);
    if (popupw) {
        popupw.moveTo(x,y);
        popupw.focus();
    }
    return popupw


}


function Penki_LiveChannelUpdater(id, getURL, closeURL,nameTag, descriptionTag) {
    var channelID = id;
    var loder;

    var unloader;

    var descriptionElement;
    if (typeof (descriptionTag) == "string") {
        descriptionElement = document.getElementById(descriptionTag);
    }
    else {
        descriptionElement = descriptionTag;
    }

    var nameElement;

    if (typeof (nameTag) == "string") {
        nameElement = document.getElementById(nameTag);
    }
    else {
        nameElement = nameTag;
    }
    

    var description = '';

    Penki_HookEvent(window, "load", windowLoad);
    Penki_HookEvent(window, "unload", windowUnload);
    
    function windowLoad() {
        if (channelID != '') {
            doUpdate();
            
        }
        unloader = new Penki_SctiptLoader(document.body, null, onCloseLoad, channelID, false);
        window.setInterval(doUpdate, 60 * 1000);
    }

    function windowUnload() {
        //alert('closing: ' + closeURL + (closeURL.indexOf('?') > 0 ? "&" : "?") + 'ChannelID=' + channelID);
        //loder = new Penki_SctiptLoader(document.body, closeURL + (closeURL.indexOf('?') > 0 ? "&" : "?") + 'ChannelID=' + channelID, onCloseLoad, channelID, true);
        if (unloader) {
            unloader.load(closeURL + (closeURL.indexOf('?') > 0 ? "&" : "?") + 'ChannelID=' + channelID);
        }
    }

    function doUpdate() {
        //alert('updating: ' + getURL + (getURL.indexOf('?') > 0 ? "&" : "?") + 'ChannelID=' + channelID);
        loder = new Penki_SctiptLoader(document.body, getURL + (getURL.indexOf('?') > 0 ? "&" : "?") + 'naming=' + escape(descriptionElement.id) + '&ChannelID=' + channelID, onLoad, channelID, true);
    }

    function onLoad() {

        var info = window[descriptionElement.id + '_TVShow'];

        if (info.Description + '' != description) {
            description = info.Description + '';
            descriptionElement.innerHTML = description;
        }

        nameElement.innerHTML = info.Title;
        
        //alert('update loaded');
    }

    function onCloseLoad() {
        //alert('close loaded');
    }
    
    //Penki_FireEvent(control, "change");
}


function Penki_Menu(menuTag) {

    var nodeElement;
    if (typeof (menuTag) == "string") {
        nodeElement = document.getElementById(menuTag);
    }
    else {
        nodeElement = menuTag;
    }

    var childrenElements = nodeElement.childNodes;

    var items = new Array();
    
    var i;
    for (i = 0; i < childrenElements.length; i++) {
        if (childrenElements[i].nodeName == 'LI') {
            items.push(new menuItem(childrenElements[i], nodeElement, null, 1));
        }
    }


    function menuItem(itemNode, menuNode, parentItem, level) {
    
        var childrenElements = itemNode.childNodes;
        var subItemsNode;
        var subItems = new Array();

        var outTimetoutID = -1;

        var i;
        for (i = 0; i < childrenElements.length; i++) {
            if (childrenElements[i].nodeName == 'UL') {
                subItemsNode = childrenElements[i];
                break;
            }
        }
        if (subItemsNode) {
            childrenElements = subItemsNode.childNodes;
            for (i = 0; i < childrenElements.length; i++) {
                if (childrenElements[i].nodeName == 'LI') {
                    subItems.push(new menuItem(childrenElements[i], subItemsNode, this, level + 1));
                }
            }
        }

        if (itemNode) {
            Penki_HookEvent(itemNode, "mouseover", onItemOver);
            Penki_HookEvent(itemNode, "mouseout", onItemOut);
        }

        function onItemOver() {
            if (outTimetoutID > -1) {
                window.clearTimeout(outTimetoutID);
                outTimetoutID = -1;
            }
            if (subItemsNode) {
                subItemsNode.style.display = 'block';
            }
        }

        function onItemOut() {
            if (outTimetoutID > -1) {
                window.clearTimeout(outTimetoutID);
                outTimetoutID = -1;
            }
            outTimetoutID = window.setTimeout(itemOutCallback, 100);
        }

        function itemOutCallback() {
            hideChildren(false)
        }

        function hideChildren(recursive) {
            if (subItemsNode) {
                subItemsNode.style.display = 'none';
            }
        }
    }
}