﻿//Checking Browser - comments add by Juliano
var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;


// CONTENT SCRIPT
function ContentScript(instanceName) {
    this.InstanceName = instanceName;
    this.CallBack;
    this.inputHidden;

    this.init = function() {
        this.CallBack = document.getElementById(this.inputHidden).value;
        if (this.CallBack != "null") {
            //window[this.CallBack];
            eval(this.CallBack);
        }
    }
}


// SLIDER
function Slider(instanceName) {
    this.InstanceName = instanceName;
    this.controlID;
    this.handlerDiv;
    this.handleDiffX = 0;
    this.handleDiffY = 0;
    this.initialValue = 0;
    this.minValue = 0;
    this.maxValue = 100;
    this.StateInput;
    this.onDrop;
    this.onDrag;
    this.ajaxServerSideTrigger;


    this.init = function() {
        this.setInitialHandlerPosition();
    }

    this.setInitialHandlerPosition = function() {
        var slider = document.getElementById(this.controlID);
        var handler = document.getElementById(this.handlerDiv);
        var hiddenInput = document.getElementById(this.StateInput);
        handler.style.position = "absolute";

        if (hiddenInput.value != "" && hiddenInput.value != this.minValue) {
            var percent = (100 * hiddenInput.value) / Math.abs(this.minValue - this.maxValue);
            var handlerPos = ((slider.offsetWidth - handler.offsetWidth) * percent) / 100;
            $(handler).css("left", Math.round(slider.offsetLeft + handlerPos));
        } else {
            if(this.initialValue){
                var percent = (100 * this.initialValue) / Math.abs(this.minValue - this.maxValue);
                var handlerPos = ((slider.offsetWidth - handler.offsetWidth) * percent) / 100;
                $(handler).css("left", Math.round(slider.offsetLeft + handlerPos));
                hiddenInput.value = this.initialValue;
            }else{
                $(handler).css("left", slider.offsetLeft);
                $(handler).css("top", slider.offsetTop);
            }
        }
    }

    this.handlerOnMouseDown = function(e) {
        var handler = document.getElementById(this.handlerDiv);
        if (!e) e = window.event;
        if (e) {
            mouseX = isIE ? (e.clientX + document.body.scrollLeft) : e.pageX;
            mouseY = isIE ? (e.clientY + document.body.scrollTop) : e.pageY;
        }
        this.handleDiffX = mouseX - handler.offsetLeft;

        var originInstance = this;
        $(document).mousemove(function(event) {
            this.originInstance = originInstance;
            this.originInstance.onMouseMoveHandler(event);
        });

        $(document).mouseup(function(event) {
            this.originInstance = originInstance;
            this.originInstance.handlerOnMouseUp(event);
        });
    }

    this.onMouseMoveHandler = function(e) {
        var slider = document.getElementById(this.controlID);
        var handler = document.getElementById(this.handlerDiv);
        var hiddenInput = document.getElementById(this.StateInput);
        document.onselectstart = function() { return false; }
        
        if (!e) e = window.event;
        if (e) {
            mouseX = isIE ? (e.clientX + document.body.scrollLeft) : e.pageX;
            mouseY = isIE ? (e.clientY + document.body.scrollTop) : e.pageY;
        }

        if (handler.offsetLeft >= slider.offsetLeft && handler.offsetLeft <= (slider.offsetLeft + slider.offsetWidth - handler.offsetWidth)) {
            var clickPos = mouseX - slider.offsetLeft - (handler.offsetWidth / 2);
            var percent = (clickPos * 100) / (slider.offsetWidth - handler.offsetWidth);
            if (percent > 100) {
                percent = 100;
                clickPos = slider.offsetWidth - handler.offsetWidth;
            } else if (percent < 0) {
                percent = 0;
                clickPos = 0;
            }
            var handlerPosValue = (percent * (Math.abs(this.minValue - this.maxValue)) / 100);
            handlerPosValue = Math.round(handlerPosValue + this.minValue);
            $(handler).css("left", slider.offsetLeft + clickPos);
            hiddenInput.value = handlerPosValue;
            this.onDrag(handlerPosValue);
        }
    }

    this.sliderOnMouseUp = function(e) {
        var slider = document.getElementById(this.controlID);
        var handler = document.getElementById(this.handlerDiv);
        var hiddenInput = document.getElementById(this.StateInput);
        if (!e) e = window.event;
        if (e) {
            mouseX = isIE ? (e.clientX + document.body.scrollLeft) : e.pageX;
            mouseY = isIE ? (e.clientY + document.body.scrollTop) : e.pageY;
        }
        var clickPos = mouseX - slider.offsetLeft - (handler.offsetWidth / 2);
        var percent = (clickPos * 100) / (slider.offsetWidth - handler.offsetWidth);
        if (percent > 100) {
            percent = 100;
            clickPos = slider.offsetWidth - handler.offsetWidth;
        } else if (percent < 0) {
            percent = 0;
            clickPos = 0;
        }
        var handlerPosValue = (percent * (Math.abs(this.minValue - this.maxValue)) / 100);
        handlerPosValue = Math.round(handlerPosValue + this.minValue);
        $(handler).css("left", slider.offsetLeft + clickPos);
        hiddenInput.value = handlerPosValue;
        this.onDrop(handlerPosValue);
        var param = "dropped;" + handlerPosValue;
        this.ajaxServerSideTrigger(param);
    }

    this.handlerOnMouseUp = function(e) {
        $(document).unbind("mousemove");
        $(document).unbind("mouseup");
        document.onselectstart = null;
        if (!e) { e = window.event; }
        e.cancelBubble = true;
        var slider = document.getElementById(this.controlID);
        var handler = document.getElementById(this.handlerDiv);
        var hiddenInput = document.getElementById(this.StateInput);
        var sliderPos = handler.offsetLeft - slider.offsetLeft;
        var percent = (sliderPos * 100) / (slider.offsetWidth - handler.offsetWidth);
        var handlerPosValue = (percent * (Math.abs(this.minValue - this.maxValue)) / 100);
        handlerPosValue = Math.round(handlerPosValue + this.minValue);
        hiddenInput.value = handlerPosValue;
        this.onDrop(handlerPosValue);
        var param = "dropped;" + handlerPosValue;
        this.ajaxServerSideTrigger(param);
    }

    this.getValue = function() {
        var slider = document.getElementById(this.controlID);
        var handler = document.getElementById(this.handlerDiv);
        var sliderPos = handler.offsetLeft - slider.offsetLeft;
        var percent = (sliderPos * 100) / (slider.offsetWidth - handler.offsetWidth);
        var handlerPosValue = (percent * (Math.abs(this.minValue - this.maxValue)) / 100);
        handlerPosValue = Math.round(handlerPosValue + this.minValue);
        return handlerPosValue;
    }
}


// SPLITTER
function Splitter(instanceName) {
    this.InstanceName = instanceName;
    this.controlID;
    this.Direction;
    this.ClientIdPanelBefore;
    this.ClientIdPanelAfter;
    this.CssClass;
    this.CssClassOver;
    this.CssClassDown;
    this.ClientIdBackGround;
    this.inputHiddenDiff;
    this.divSplitter;
    this.divBefore;
    this.divAfter;
    this.divSplitterDefaultPosition;
    this.divSplitterLastPosition;
    this.isDragging = false;
    this.dragMargin = 2;
    this.panelBorder = 2;

    this.init = function() {
        this.divSplitter = document.getElementById(this.controlID);
        this.divBefore = document.getElementById(this.ClientIdPanelBefore);
        this.divAfter = document.getElementById(this.ClientIdPanelAfter);
        this.setSplitterPosition();
        this.divSplitterDefaultPosition = (this.Direction == "horizontal") ? this.divSplitter.offsetLeft : this.divSplitter.offsetTop;
        this.divSplitterLastPosition = this.divSplitterDefaultPosition;
        this.setBackgroundState("hidden");
    }

    this.setSplitterPosition = function() {
        if (this.Direction == "horizontal") {
            var divBeforeLeft = this.divBefore.offsetLeft;
            var divBeforeWidth = this.divBefore.offsetWidth;
            var divBeforeHeight = this.divBefore.offsetHeight;
            this.divSplitter.style.left = divBeforeLeft + divBeforeWidth;
            this.divSplitter.style.height = divBeforeHeight;
            this.divSplitter.style.position = "absolute";
        } else {
            var divBeforeTop = this.divBefore.offsetTop;
            var divBeforeHeight = this.divBefore.offsetHeight;
            var divBeforeWidth = this.divBefore.offsetWidth;
            this.divSplitter.style.top = divBeforeTop + divBeforeHeight;
            this.divSplitter.style.width = "100%";
            this.divSplitter.style.position = "absolute";
        }
    }

    this.onSplitterUp = function(e) {
        this.isDragging = false;
        this.setBackgroundState("hidden");
        this.divSplitter.className = this.CssClassOver;
        if (this.Direction == "horizontal") {
            var diff = this.divSplitter.offsetLeft - this.divSplitterLastPosition;
            this.divSplitterLastPosition = this.divSplitter.offsetLeft;
            if (diff < 0) {
                this.divBefore.style.width = this.divBefore.offsetWidth + diff;
                this.divAfter.style.width = this.divAfter.offsetWidth - diff;
                this.divAfter.style.left = this.divAfter.offsetLeft + diff;
            } else {
                this.divBefore.style.width = this.divBefore.offsetWidth + diff;
                this.divAfter.style.width = this.divAfter.offsetWidth - diff;
                this.divAfter.style.left = this.divAfter.offsetLeft + diff;
            }
        } else {
            var diff = this.divSplitter.offsetTop - this.divSplitterLastPosition;
            this.divSplitterLastPosition = this.divSplitter.offsetTop;
            if (diff < 0) {
                if (((this.divBefore.offsetHeight - this.panelBorder) + diff) < 0) {
                    this.panelBorder = 0;
                }
                this.divBefore.style.height = (this.divBefore.offsetHeight - this.panelBorder) + diff;
                this.divAfter.style.height = (this.divAfter.offsetHeight - this.panelBorder) - diff;
                this.divAfter.style.top = (this.divAfter.offsetTop) + diff;
            } else {
                if (((this.divAfter.offsetHeight - this.panelBorder) - diff) < 0) {
                    this.panelBorder = 0;
                }
                this.divBefore.style.height = (this.divBefore.offsetHeight - this.panelBorder) + diff;
                this.divAfter.style.height = (this.divAfter.offsetHeight - this.panelBorder) - diff;
                this.divAfter.style.top = (this.divAfter.offsetTop) + diff;
            }
        }
        document.getElementById(this.inputHiddenDiff).value = diff;
    }
    
    this.onSplitterDown = function(e) {
        this.isDragging = true;
        this.divSplitter.className = this.CssClassDown;
        this.diffX = e.clientX - this.divSplitter.offsetLeft;
        this.diffY = e.clientY - this.divSplitter.offsetTop;
        $(this.divSplitter).css("z-index", 9999);
        this.setBackgroundState("visible");
        // remove select event to improve drag n drop feature
        this.divSplitter.onselectstart = function() { return false; }
    }

    this.onSplitterOver = function(e) {
        this.divSplitter.className = this.CssClassOver;

        var originInstance = this;
        $(this.divSplitter).mouseout(function() {
            originInstance.divSplitter.className = originInstance.CssClass;
        });
    }

    this.onSplitterMove = function(e) {
        if (this.isDragging) {
            if (this.Direction == "horizontal") {
                var maxLeft = this.divBefore.offsetLeft + this.dragMargin;
                var maxRight = this.divAfter.offsetLeft + this.divAfter.offsetWidth - this.divSplitter.offsetWidth - this.dragMargin;
                var splitterPos = e.clientX - this.diffX;
                if (splitterPos > maxLeft && splitterPos < maxRight) {
                    this.divSplitter.style.left = splitterPos;
                }
            } else {
                var maxTop = this.divBefore.offsetTop + this.dragMargin + this.panelBorder;
                var maxBottom = this.divAfter.offsetTop + this.divAfter.offsetHeight - this.divSplitter.offsetHeight - this.dragMargin - this.panelBorder;
                var splitterPos = e.clientY - this.diffY;
                if (splitterPos > maxTop && splitterPos < maxBottom) {
                    this.divSplitter.style.top = splitterPos;
                }
            }
        }
    }

    this.setBackgroundState = function(state) {
        if (state == "visible") {
            document.getElementById(this.ClientIdBackGround).style.display = "block";
            document.getElementById(this.ClientIdBackGround).style.visibility = "visible";
        } else {
            document.getElementById(this.ClientIdBackGround).style.display = "none";
            document.getElementById(this.ClientIdBackGround).style.visibility = "hidden";
        }
    }
}


// FLOATING FORM
function FloatingForm(instanceName) {
    this.InstanceName = instanceName;
    this.controlID;
    this.MarkerAlign;
    this.MarkerPosition;
    this.VisibleInput;
    this.StateInput;
    this.CssClassMarker;
    this.floatingLeftMargin = 20;
    this.floatingRightMargin = 20;
    this.floatingTopMargin = 25;
    this.floatingBottomMargin = 25;

    this.init = function() {
        var startVisible = (document.getElementById(this.VisibleInput).value == "true") ? true : false;
        if (startVisible) {
            var position = document.getElementById(this.StateInput).value;
            position = position.split(";");
            var posx = (position[0] == undefined) ? "" : position[0];
            var posy = (position[1] == undefined) ? "" : position[1];
            if (position[2] || position[3]) {
                this.showFloatingForm(posx, posy, position[2], position[3])
            } else {
                this.showFloatingForm(posx, posy)
            }
        }else {
            this.hideFloatingForm();
        }
    }

    this.showFloatingForm = function(x, y, markerAlign, markerPosition) {
        var floatingForm = document.getElementById(this.controlID);
        var stateInput = document.getElementById(this.StateInput);
        var inputHiddenValue = x + ";" + y;

        // set float position
        if(x == "" || x == undefined) { 
            var wrapperWidth = document.getElementById("wrapper").offsetWidth;
            var wrapperLeft = document.getElementById("wrapper").offsetLeft;
            x = (wrapperLeft  + (wrapperWidth / 2)) - (($(floatingForm).css("width").replace("px","")) / 2);
            $(floatingForm).css("left", x); 
        } else {  
            $(floatingForm).css("left", x); 
        }
        if(y == "" || y == undefined) { 
            $(floatingForm).css("top", 230); 
        } else {  
            $(floatingForm).css("top", y); 
        }
        $(floatingForm).css("display", "block");
        $(floatingForm).css("visibility", "visible");
        
        this.setVisible(true);

        // set marker
        if (markerAlign || markerPosition) {
            inputHiddenValue = inputHiddenValue + ";" + markerAlign + ";" + markerPosition;
            this.MarkerAlign = markerAlign;
            this.MarkerPosition = markerPosition;
            this.setMarker();
        } else {
            this.hideMarker();
        }

        // save float state
        stateInput.value = inputHiddenValue;
    }

    this.hideFloatingForm = function() {
        var floatingForm = document.getElementById(this.controlID);
        this.setVisible(false);
        floatingForm.style.display = "none";
        floatingForm.style.visibility = "hidden";
        $('#'+this.controlID).css("display", "none");
        $('#'+this.controlID).css("visibility", "hidden");
    }

    this.setVisible = function(state) {
        document.getElementById(this.VisibleInput).value = state;
    }

    this.getVisible = function() {
        return document.getElementById(this.VisibleInput).value;
    }

    this.hideMarker = function() {
        var markerContainer = "#" + this.controlID + " .marker";
        $(markerContainer).css("display", "none");
        $(markerContainer).css("visibility", "hidden");
    }

    this.setMarker = function() {
        var marker = "#" + this.controlID + " .marker div";
        var markerContainer = "#" + this.controlID + " .marker";
        var floatingFormHeight = $("#" + this.controlID).height();
        var floatingFormWidth = $("#" + this.controlID).width();
        var markerWidth = $(marker).width();
        var vertDiff = floatingFormHeight - (this.floatingTopMargin + this.floatingBottomMargin);
        var horizDiff = floatingFormWidth - (this.floatingLeftMargin + this.floatingRightMargin);
        $(marker).removeClass();
        $(markerContainer).css("display", "block");
        $(markerContainer).css("visibility", "visible");
        switch (this.MarkerAlign) {
            case "left":
                var markerHeight = 32;
                vertDiff = vertDiff - markerHeight;
                var markerY = Math.round((this.MarkerPosition * vertDiff) / 100);
                markerY = markerY + this.floatingTopMargin;
                $(marker).addClass('left');
                $(markerContainer).css("top", markerY);
                $(markerContainer).css("left", -7);
                $(markerContainer).css("right", "");
                break;
            case "rigth":
                var markerHeight = 32;
                vertDiff = vertDiff - markerHeight
                var markerY = Math.round((this.MarkerPosition * vertDiff) / 100);
                markerY = markerY + this.floatingTopMargin;
                $(marker).addClass('right');
                $(markerContainer).css("top", markerY);
                $(markerContainer).css("left", "");
                $(markerContainer).css("right", -7);
                break;
            case "top":
                var markerWidth = 39;
                horizDiff = horizDiff - markerWidth;
                var markerX = Math.round((this.MarkerPosition * horizDiff) / 100);
                markerX = markerX + this.floatingLeftMargin;
                $(marker).addClass('top');
                $(markerContainer).css("top", -19);
                $(markerContainer).css("left", markerX);
                break;
            case "bottom":
                var markerWidth = 39;
                horizDiff = horizDiff - markerWidth;
                var markerX = Math.round((this.MarkerPosition * horizDiff) / 100);
                markerX = markerX + this.floatingLeftMargin;
                $(marker).addClass('bottom');
                $(markerContainer).css("bottom", -19);
                $(markerContainer).css("left", markerX);
                break;
        }

    }
}


// RADIO BUTTON COMPONENT
function OptionButton(instanceName) {
    this.InstanceName = instanceName;
    this.controlID;
    this.CssClassChecked;
    this.CssClassUnchecked;
    this.OptionCheckedInput;
    this.GroupName;

    this.init = function() {
        if (this.GroupName) {
            OptionButton.AddGroup(this);
        }
    }

    this.onOptionButtonClick = function() {
        var controlElement = document.getElementById(this.controlID);
        var hiddenElement = document.getElementById(this.OptionCheckedInput);

        if (this.getChecked()) {
            if (!this.GroupName) {
                this.setChecked(false);
            }
        } else {
            if (this.GroupName) {
                OptionButton.UnCheckGroupOptions(this);
            }
            this.setChecked(true);
        }
    }

    this.setChecked = function(state) {
        var controlElement = document.getElementById(this.controlID);
        var hiddenElement = document.getElementById(this.OptionCheckedInput);
        var CSSClass = (state == true) ? this.CssClassChecked : this.CssClassUnchecked;

        controlElement.className = CSSClass;
        hiddenElement.value = state;
    }

    this.getChecked = function() {
        var hiddenElement = document.getElementById(this.OptionCheckedInput);
        return (hiddenElement.value == "true") ? true : false;
    }
}

OptionButton.AddGroup = function(instance) {
    if (!OptionButton.groupCollection) OptionButton.groupCollection = new Object();

    if (OptionButton.groupCollection[instance.GroupName]) {
        var temp = OptionButton.groupCollection[instance.GroupName][instance.InstanceName];
        if (OptionButton.groupCollection[instance.GroupName][instance.InstanceName]) {
        } else {
            OptionButton.groupCollection[instance.GroupName][instance.InstanceName] = instance;
        }
    } else {
        var group = new Object();
        group[instance.InstanceName] = instance;
        OptionButton.groupCollection[instance.GroupName] = group;
    }
}

OptionButton.UnCheckGroupOptions = function(instance) {
    var group = OptionButton.groupCollection[instance.GroupName];
    for (x in group) {
        var option = group[x];
        if (option.getChecked()) {
            var controlElement = document.getElementById(option.controlID);
            var hiddenElement = document.getElementById(option.OptionCheckedInput);
            option.setChecked(false);
        }
    }
}


// TIMEOUT CHECK
function TimeOutCheck(instanceName) {
    this.InstanceName = instanceName;
    this.TimeOutInput;

    this.init = function() {
        var guestTimeOutValue = document.getElementById(this.TimeOutInput).value;
        switch (guestTimeOutValue) {
            case "guest":
                // hide other forms
                formLogin.hideFloatingForm();
                formForgotPassword.hideFloatingForm();
                formSkipIntro.hideFloatingForm();
                // stop update timer
                stopTimer();
                // show modal windown blocker
                showModalBlocker();
                // calculate timeout position
                var buttonId = $(".guestButton").attr("id");
                var wrapperWidth = document.getElementById("wrapper").offsetWidth;
                var wrapperLeft = document.getElementById("wrapper").offsetLeft;
                var targetButton = document.getElementById(buttonId);
                var buttonTop = targetButton.offsetTop;
                var buttonLeft = targetButton.offsetLeft;
                var buttonHeight = targetButton.offsetHeight;
                var buttonWidth = targetButton.offsetWidth;
                var formWidth = 355;
                var topPos = 95;
                var leftPos = (buttonLeft + buttonWidth) - (formWidth);
                setSkipIntroStep(0);
                formSkipIntro.showFloatingForm(leftPos, topPos, "top", 93);
                // set input hidden to false
                document.getElementById(this.TimeOutInput).value = "none";
                break;
            case "noaccess":
                // hide other forms
                formLogin.hideFloatingForm();
                formForgotPassword.hideFloatingForm();
                formSkipIntro.hideFloatingForm();
                // stop update timer
                stopTimer();
                // show modal windown blocker
                showModalBlocker();
                // calculate timeout position
                var wrapperHeight = document.getElementById("wrapper").offsetHeight;
                var wrapperWidth = document.getElementById("wrapper").offsetWidth;
                var wrapperLeft = document.getElementById("wrapper").offsetLeft;
                var formHeight = 170;
                var formWidth = 360;
                var posLeft = (wrapperWidth / 2) - (formWidth / 2) + wrapperLeft + 20;
                var posTop = (wrapperHeight / 2) - (formHeight / 2) - 50;
                timeOutPopUp.showFloatingForm(posLeft, posTop);
                // set input hidden to false
                document.getElementById(this.TimeOutInput).value = "none";
                // start countdown timer
                resetTimeOutTimer();
                setTimeout("startTimeOutTimer()", 1000);
                break;
            case "noemail":
                var buttonId = $(".guestButton").attr("id");
                var wrapperWidth = document.getElementById("wrapper").offsetWidth;
                var wrapperLeft = document.getElementById("wrapper").offsetLeft;
                var targetButton = document.getElementById(buttonId);
                var buttonTop = targetButton.offsetTop;
                var buttonLeft = targetButton.offsetLeft;
                var buttonHeight = targetButton.offsetHeight;
                var buttonWidth = targetButton.offsetWidth;
                var formWidth = 355;
                var topPos = 95;
                var leftPos = (buttonLeft + buttonWidth) - (formWidth);
                formSkipIntro.showFloatingForm(leftPos, topPos, "top", 93);
                setSkipIntroStep(1);
                // stop update timer
                stopTimer();
                showModalBlocker();
                // set input hidden to false
                document.getElementById(this.TimeOutInput).value = "none";
                break;
            case "none":
                break;
        }
    }
}

// LOGIN CHECK
function LoginCheck(instanceName) {
    this.InstanceName = instanceName;
    this.LoginErrorInput;
    this.PinPositionsInput;

    this.init = function() {
        // check for errors in past login
        if (document.getElementById(this.LoginErrorInput).value == "true") {
            // set input hidden to false
            document.getElementById(this.LoginErrorInput).value = "false";
            formLogin.hideFloatingForm();
            var wrapperWidth = document.getElementById("wrapper").offsetWidth;
            var wrapperLeft = document.getElementById("wrapper").offsetLeft;
            var buttonId = $(".loginButton").attr("id");
            var targetButton = document.getElementById(buttonId);
            var buttonTop = targetButton.offsetTop;
            var buttonLeft = targetButton.offsetLeft;
            var buttonHeight = targetButton.offsetHeight;
            var buttonWidth = targetButton.offsetWidth;
            var formWidth = 357;
            var topPos = 95;
            var leftPos = (buttonLeft + buttonWidth) - (formWidth);
            formLoginError.showFloatingForm(leftPos, topPos, "top", 93);
            showModalBlocker();
            setTimeout("stopTimer()", 2000);
        }

        // set pin position input
        setPinHiddenInput(this.PinPositionsInput);
    }
}

// MENU
function Menu(instanceName) {
    this.InstanceName = instanceName;
    this.controlID;
    this.HideItemTimeout = 3000;
    this.ShowItemTimeout = 1000;
    this.ajaxServerSideTrigger;
    this.openItens = [];
    this.rollOverDelay;
    this.itemClickAjaxEventName = "menuItemClicked";
    this.KeyShortCutCollection = new Object();
    this.HasKeyShortCut;
    this.inputHiddenHref;

    this.init = function() {
        if (this.HasKeyShortCut) {
            originInstance = this;
            EventUtil.addHandler(document, "onkeydown", function(event) {
                originInstance.onShortCut(event);
            });
        }

        // check if is one url to open
        var inputHidden = document.getElementById(this.inputHiddenHref);
        if (inputHidden.value != "") {
            this.openNewURL(inputHidden.value);
        }
    }

    this.openNewURL = function(param) {
        var inputHidden = document.getElementById(this.inputHiddenHref);
        inputHidden.value = "";
        var urlParams = param.split(";");
        window.open(urlParams[0], urlParams[1], 'toolbar=yes, location=yes, directories=no, status=yes, menubar=yes, scrollbars=yes, resizable=yes, copyhistory=yes')
    }

    this.onMenuItemOver = function(e) {
        //
    }

    this.onMenuItemClick = function(e, itemId) {
        if (!e) var e = window.event;
	    e.cancelBubble = true;
	    if (e.stopPropagation) e.stopPropagation();
        
        var elementClicked = (e.srcElement) ? e.srcElement : e.target;
        $(elementClicked).bind("contextmenu", function(e) {
            return false;
        });
        
        var mouseButton = (e.button == 2) ? "right" : "left";
        params = this.itemClickAjaxEventName + ";" + itemId + ";" + mouseButton;
        this.ajaxServerSideTrigger(params);
    }
    
    this.onMenuDummieItemClick = function(e, itemId) {
        if (!e) var e = window.event;
	    e.cancelBubble = true;
	    if (e.stopPropagation) e.stopPropagation();
    }

    this.onMenuItemOut = function(e) {
        //
    }

    this.onShortCut = function(e) {
        var shortCutString = "";
        var keyPressed = String.fromCharCode(e.keyCode);
        if (e.ctrlKey) {
            shortCutString = "CTRL";
        }
        if (e.shiftKey) {
            shortCutString += "+SHIFT";
        }
        if (e.altKey) {
            shortCutString += "+ALT";
        }
        shortCutString += "+" + keyPressed;

        if (this.KeyShortCutCollection[shortCutString]) {
            params = this.itemClickAjaxEventName + ";" + this.KeyShortCutCollection[shortCutString];
            this.ajaxServerSideTrigger(params);
        }
    }
}

function MenuKeyShortCut(key, itemId) {
    this.key = key;
    this.itemId = itemId;
}

// GRID
function Grid(instanceName) {
    this.InstanceName = instanceName;
    this.controlID;
    this.DataDiv;
    this.ajaxServerSideTrigger;
    this.CssClassRowCollapsed;
    this.CssClassRowExpanded;
    this.OnRowSelectedServerSideEnable;
    this.OnSelectedRowChangedServerSideEnable;
    this.OnRowCheckedServerSideEnable;
    this.OnRowExpandServerSideEnable;
    this.OnRowCollapseServerSideEnable;
    this.OnHeaderExpandServerSideEnable;
    this.selectedRows = new Array();

    this.SelectedRowsInput;
    this.LeftCheckedRowsInput;
    this.RightCheckedRowsInput;
    this.ExpandedRowsInput;

    this.init = function() {
        this.OnRowSelectedServerSideEnable = (this.OnRowSelectedServerSideEnable == "true") ? true : false;
        this.OnSelectedRowChangedServerSideEnable = (this.OnSelectedRowChangedServerSideEnable == "true") ? true : false;
        this.OnRowCheckedServerSideEnable = (this.OnRowCheckedServerSideEnable == "true") ? true : false;
        this.OnHeaderExpandServerSideEnable = (this.OnHeaderExpandServerSideEnable == "true") ? true : false;
        document.selection.empty();
        document.onstartselect = function() { return false; }

        this.controlID = this.InstanceName.replace("_objGrid", "");
        this.DataDiv = this.controlID + "_dataContainer";

        // set scroll position
        var scrollHeight = document.getElementById(this.DataDiv).scrollHeight;
        if (scrollHeight > 0) {
            this.setScrollPosition();
            var originInstance = this;
            $('#' + this.DataDiv).scroll(function() {
                this.originalInstance = originInstance;
                this.originalInstance.saveScrollPosition(this.originalInstance);
            });
        }
    }

    this.onRowMouseDown = function(e) {
        var elementClicked = (e.srcElement) ? e.srcElement : e.target;
        var rowClicked = this.getParentNode(elementClicked, "tr");
        var inputInitValue = document.getElementById(this.SelectedRowsInput).value;
        var isRowSelected = this.hasValue(inputInitValue, rowClicked.id);
        var isControlKeyPressed = e.ctrlKey;
        var originInstance = this;
        var controllerIdentifier = "#" + rowClicked.id;

        if (elementClicked.type == "checkbox") {
            return;
        }

        if (!e) { e = window.event; }
        // stop click propagation
        e.cancelBubble = true;

        
        $(controllerIdentifier).mouseup(function(event) {
            if (document.selection) {
                document.selection.clear();
            }
            $(controllerIdentifier).unbind("mouseup");
        });
        

        if (!isRowSelected) {
            if (isControlKeyPressed) {
                if (inputInitValue.toString() == 0) {
                    document.getElementById(this.SelectedRowsInput).value = rowClicked.id;
                } else {
                    document.getElementById(this.SelectedRowsInput).value = inputInitValue + ";" + rowClicked.id;

                }
            } else {
                document.getElementById(this.SelectedRowsInput).value = rowClicked.id;
            }
        } else {
            var newValue = this.removeInputValue(inputInitValue, rowClicked.id);
            document.getElementById(this.SelectedRowsInput).value = newValue;
        }

        if (this.OnRowSelectedServerSideEnable) {
            params = "selectedChanged";
            params = params + ";" + rowClicked.id;
            this.ajaxServerSideTrigger(params);
        }
        document.selection.empty();
        return false;
    }


    this.onRowCollapseExpand = function(e) {
        var elementClicked = (e.srcElement) ? e.srcElement : e.target;
        var elementUnderPoint = document.elementFromPoint(event.clientX, event.clientY);
        var rowClicked = this.getParentNode(elementUnderPoint, "tr");
        var childsList = document.getElementById(rowClicked.id).getElementsByTagName("table");
        if (!e) { e = window.event; }
        // stop click propagation
        e.cancelBubble = true

        var inputInitValue = document.getElementById(this.ExpandedRowsInput).value;
        var isRowExpanded = this.hasValue(inputInitValue, rowClicked.id);

        if (isRowExpanded) {
            var newValue = this.removeInputValue(inputInitValue, rowClicked.id);
            document.getElementById(this.ExpandedRowsInput).value = newValue;
        } else {
            if (inputInitValue.toString() == 0) {
                document.getElementById(this.ExpandedRowsInput).value = rowClicked.id
            } else {
                document.getElementById(this.ExpandedRowsInput).value = inputInitValue + ";" + rowClicked.id
            }
        }

        if (this.OnRowExpandServerSideEnable) {
            // dispatch ajax trigger
            params = "expandCollapse;";
            this.ajaxServerSideTrigger(params);
        }
    }


    this.onRowCheck = function(e, gridSide) {
        var elementClicked = (e.srcElement) ? e.srcElement : e.target;
        var rowClicked = this.getParentNode(elementClicked, "tr");
        var hiddenInputCheckedList = (gridSide == "left") ? this.LeftCheckedRowsInput : this.RightCheckedRowsInput;
        if (!e) { e = window.event; }
        e.cancelBubble = true;

        var inputInitValue = document.getElementById(hiddenInputCheckedList).value;
        var isRowChecked = this.hasValue(inputInitValue, rowClicked.id);
        if (!isRowChecked) {
            if (inputInitValue.toString() == 0) {
                document.getElementById(hiddenInputCheckedList).value = rowClicked.id;
            } else {
                document.getElementById(hiddenInputCheckedList).value = inputInitValue + ";" + rowClicked.id;
            }
        } else {
            var newValue = this.removeInputValue(inputInitValue, rowClicked.id);
            document.getElementById(hiddenInputCheckedList).value = newValue;
        }

        if (this.OnRowCheckedServerSideEnable) {
            params = (gridSide == "left") ? "leftCheckedChanged" : "rightCheckedChanged";
            params = params + ";" + rowClicked.id;
            this.ajaxServerSideTrigger(params);
        }
    }


    this.onHeaderCheck = function(e, gridSide) {
        var elementClicked = (e.srcElement) ? e.srcElement : e.target;
        var isChecked = (elementClicked.checked == true) ? true : false;
        if (!e) { e = window.event; }
        e.cancelBubble = true;

        if (this.OnRowCheckedServerSideEnable  ) {
            params = (gridSide == "left") ? "leftHeaderCheckedChanged" : "rightHeaderCheckedChanged";
            params = params + ";" + isChecked;
            this.ajaxServerSideTrigger(params);
        }
    }
    

    this.onHeaderCollapseExpand = function(e) {
        if (this.OnHeaderExpandServerSideEnable) {
            // dispatch ajax trigger
            params = "expandCollapseAll;";
            this.ajaxServerSideTrigger(params);
        }
    }


    this.saveScrollPosition = function(gridObj) {
        document.getElementById(gridObj.controlID + "_scrollStateInput").value = document.getElementById(gridObj.DataDiv).scrollTop;
    }

    this.setScrollPosition = function() {
        var initPos = document.getElementById(this.ScrollNodeInput).value;
        document.getElementById(this.DataDiv).scrollTop = initPos;
        var temp = document.getElementById(this.DataDiv).scrollTop;
    }

    
    this.getParentNode = function(startNode, parentNodeTag) {
        var currentNode = startNode;
        var newParentNode = startNode;
        var findNode = false;
        var element = null;

        while (findNode == false) {
            newParentNode = newParentNode.parentNode;
            if (newParentNode.tagName) {
                if (newParentNode.tagName.toLowerCase() == parentNodeTag) {
                    findNode = true;
                    element = newParentNode;
                } else if (newParentNode.tagName.toLowerCase() == "html") {
                    findNode = true; // document root
                }
            }
        }

        return element;
    }

    this.hasValue = function(cssClassList, cssClass) {
        var stringIndex = cssClassList.search(cssClass);
        return (stringIndex > -1) ? true : false;
    }


    this.removeInputValue = function(cssClassList, cssClass) {
        var newCssClassList = cssClassList;
        var stringIndex = newCssClassList.indexOf(cssClass);
        while (stringIndex > -1) {
            if (stringIndex == 0) {
                var test = newCssClassList.indexOf(";");
                if (newCssClassList.indexOf(";") > -1) {
                    newCssClassList = newCssClassList.replace(cssClass + ";", "");
                } else {
                    newCssClassList = newCssClassList.replace(cssClass, "");
                }
            } else if (stringIndex > 0) {
                newCssClassList = newCssClassList.replace(";" + cssClass, "");
            }
            stringIndex = newCssClassList.indexOf(cssClass);
        }
        return newCssClassList;
    }
    
}


// TABSET PANEL
function TabSet(instanceName) {
    this.InstanceName = instanceName;
    this.TabsPerPage;
    this.FixedTabs;
    this.EnableTabsAutoSize;
    this.CssClassContetTabs;
    this.CssClassTabHidden;
    this.CssClassContentHidden;
    this.SelectedTabInput;
    this.ajaxServerSideTrigger;
    this.selectedTabId = null;
    this.OnTabClickServerSideEnable = true;
    this.OnTabNavigationClickServerSideEnable = true;

    this.init = function() {
        this.OnTabClickServerSideEnable = (this.OnTabClickServerSideEnable == "true") ? true : false;
        this.OnTabNavigationClickServerSideEnable = (this.OnTabNavigationClickServerSideEnable == "true") ? true : false;
    }

    this.onTabClick = function(e) {
        if (this.OnTabClickServerSideEnable) {
            var clickedElement = (e.srcElement) ? e.srcElement : e.target;
            if (clickedElement.tagName.toLowerCase() == "div") {
                var liElement = clickedElement.parentNode;
                if (this.selectedTabId != liElement.id) {
                    this.selectedTabId = liElement.id;
                    document.getElementById(this.SelectedTabInput).value = liElement.id;
                    this.ajaxServerSideTrigger("tabClicked;" + document.getElementById(this.SelectedTabInput).value);
                }
            }
        }
    }

    this.onTabNavigationClick = function(navigateTo) {
    if (this.OnTabNavigationClickServerSideEnable) {
            switch (navigateTo) {
                case "previous":
                    this.ajaxServerSideTrigger("previousButtonClicked");
                    break;
                case "next":
                    this.ajaxServerSideTrigger("nextButtonClicked");
                    break;
            }
        }
    }
    
}


// TREEVIEW
function TreeView(instanceName) {
    this.InstanceName = instanceName;
    this.controlID;
    this.ContextMenuDiv;
    this.CssClassContextMenu;
    this.CssClassNodeCollapsed;
    this.CssClassNodeExpanded;
    this.CssClassNodeMouseOver;
    this.CssClassNodeMouseDown;
    this.CssClassNodeSelected;
    this.CssClassNodeDragged;
    this.CssClassButtonExpanded;
    this.CssClassButtonCollapsed;
    this.CssClassChildTopCorner;
    this.CssClassChildBottomCorner;
    this.CssClassNodeContent;
    this.SelectedNodeInput;
    this.ScrollNodeInput;
    this.VisibleNodeInput;
    this.ExpandedInput;
    this.CollapsedInput;
    this.ajaxServerSideTrigger;
    this.DragAndDropEnable = true;
    this.ContextMenuEnable = true;
    this.ContextMenuInput; // showmenu
    this.EditOnClickEnable;
    this.AnimtationEnable;

    var dragging = null;
    var replaceContext = false;
    var mouseOverContext = false;
    this.isContextMenuVisible = false;
    this.isAddEditingNode = false;
    this.isEnableToEdit = false;
    this.itemGapOrder = 4;
    this.rootNodeList = new Array;
    this.nodeList = new Array;
    this.orderElementID;
    this.enableOrderFeedBack = false;
    this.scrollBarWidth = getScrollerWidth();
    this.nodeMinWidth = 253;
    this.contextMenuDiffWidth = 25;


    this.init = function() {
        this.createRootNodeList();
        this.createNodeList();
        this.createOrderElement();
        
        this.EditOnClickEnable = (this.EditOnClickEnable == "false") ? false : true;
        this.AnimtationEnable = (this.AnimtationEnable == "false") ? false : true;
        
        // set scroll position
        this.setScrollPosition();
        $('#' + this.controlID).scroll(function() {
            this.originalInstance = originInstance;
            this.originalInstance.saveScrollPosition(this.originalInstance);
        });
        
        
        // show context menu if needed
        this.showContextMenu();
        // register treeview mouseup
        var control = document.getElementById(this.controlID);
        var originInstance = this;
        EventUtil.addHandler(control, "onmouseup", function(e) { originInstance.onRootMouseUp(e, control); return false; });
        
        this.updateTreeViewScrollBar();
    }
    
    
    this.showContextMenu = function() {
        var contextState = document.getElementById(this.ContextMenuInput);
        var contextMenu = document.getElementById(this.ContextMenuDiv);
        var stateParse = contextState.value.split(";");
        var source = document.getElementById(this.SelectedNodeInput);
        
        $(source).bind("contextmenu", function(e) {
            return false;
        });
        
        if(stateParse.length > 0){   
            if(stateParse[0] == "showmenu"){
                $(contextMenu).css("visibility", "visible");
                $(contextMenu).css("display", "block"); 
                $(contextMenu).css("left", stateParse[1]+"px"); 
                $(contextMenu).css("top", stateParse[2]+"px"); 

                                
                var firstLiElement = contextMenu.getElementsByTagName("li")[0];
                $(contextMenu).css("width", (firstLiElement.offsetWidth + this.contextMenuDiffWidth));
            
                // if ESC is pressed remove context menu
                var originInstance = this;
                $(document).keypress(function(e) {
                    this.originInstance = originInstance;
                    switch (e.keyCode) {
                        case 27: // esc
                            e.preventDefault();
                            if (!e) { e = window.event; }
                            e.cancelBubble = true;
                            this.originInstance.removeContextMenu();
                            $(document).unbind("keypress");
                            break;
                    }
                });
                
                $(document).click(function(e) {
                    this.originInstance = originInstance;
                    e.preventDefault();
                    if (!e) { e = window.event; }
                    e.cancelBubble = true;
                    this.originInstance.removeContextMenu();
                    $(document).unbind("click");
                });
            
                contextState.value = "";
            }
        }
    }
    
    
    this.updateTreeViewScrollBar = function() {
        var inputHidden = document.getElementById(this.VisibleNodeInput);
        var treeWidth = this.nodeMinWidth;
        if(inputHidden.value != ""){
            var listNodeId = inputHidden.value.split(";");
            var listLength = listNodeId.length;
            for(var i = 0; i < listNodeId.length; i ++){
                var node = document.getElementById(listNodeId[i]);
                var nodeWidth = 0;
                if(node){
                    var divContainer = node.getElementsByTagName("div")[0];
                    var divTabulation = divContainer.children[0];
                    var divButton = divContainer.children[1];
                    var spanCheckbox = divContainer.children[2];
                    var pLabel = divContainer.children[4];
                    if($(pLabel).text() == "Avar Proposition Proving these @ Zero Costs"){
                        var tett = 1;
                    }
                    nodeWidth = divTabulation.offsetWidth + divButton.offsetWidth + spanCheckbox.offsetWidth + pLabel.offsetWidth;
                    if(nodeWidth > treeWidth) {
                        treeWidth = nodeWidth + this.scrollBarWidth;
                    }
                }
            }
        }
        var treeView = document.getElementById(this.controlID);
        var ulElement = treeView.getElementsByTagName("ul")[0];
        $(ulElement).width(treeWidth)
        $(treeView).css({'overflow-y': 'hidden'});
        $(treeView).css({'overflow-y': 'scroll'});
        if(treeWidth > this.nodeMinWidth){
            $(treeView).css({'overflow-x': 'scroll'});
        }else{
            $(treeView).css({'overflow-x': 'hidden'});
        }
    }
    
    this.addChildsInVisibleList = function (parentLi) {
        var childsList = parentLi.getElementsByTagName("ul")[0];
        var inputHidden = document.getElementById(this.VisibleNodeInput);
        var listNodeId = inputHidden.value.split(";");
        var listLength = listNodeId.length;
        
        for(var i = 0; i < childsList.children.length; i++){
            var tag = childsList.children[i].tagName.toLowerCase();
            if(childsList.children[i].tagName.toLowerCase() == 'li'){
                var list = inputHidden.value;
                var id = childsList.children[i].id;
                if(inputHidden.value.indexOf(childsList.children[i].id) == -1){
                    inputHidden.value += childsList.children[i].id+';';
                }
            }
        }
    }
    
    
    this.removeContextMenu = function() {
        var contextMenu = document.getElementById(this.ContextMenuDiv);
        
        $(contextMenu).css("visibility", "hidden");
        $(contextMenu).css("display", "none"); 
    }
    
    this.createOrderElement = function(){
        this.orderElementID = this.controlID + "-order";
        var html = "<div id='"+ this.orderElementID +"' class='orderDiv'></div>";
        var controllerDiv = document.getElementById(this.controlID);
        $(controllerDiv).append(html);
    }
    
    this.onRightClick = function(e, source) {
        var control = document.getElementById(this.controlID);
        $(source).bind("contextmenu", function(e) {
            return false;
        });
        
        if (!e) e = window.event;
        if (e) {
            mouseX = isIE ? (e.clientX + control.scrollLeft) : e.pageX;
            mouseY = isIE ? (e.clientY + control.scrollTop) : e.pageY;
        }
        
        
        sourceID = (source.id == this.controlID) ? 0 : source.id;
        if(sourceID != 0){
            document.getElementById(this.SelectedNodeInput).value = source.id;
        }
        var param = "showContextMenu;" + sourceID + ";" + mouseX + ";" + mouseY;
        this.ajaxServerSideTrigger(param);
    }

    this.saveScrollPosition = function(treeObj) {
        var temp = treeObj.ScrollNodeInput + " - " + treeObj.controlID;
        document.getElementById(treeObj.ScrollNodeInput).value = document.getElementById(treeObj.controlID).scrollTop;
    }

    this.setScrollPosition = function() {
        var initPos = document.getElementById(this.ScrollNodeInput).value;
        document.getElementById(this.controlID).scrollTop = initPos;
    }

    this.onRootMouseUp = function(e, sender) {
        if(e.button == 2){
	        if (!e) var e = window.event;
	        e.cancelBubble = true;
	        if (e.stopPropagation) e.stopPropagation();
	    
            // disabled default context menu
            if (this.ContextMenuEnable == "true") {
                $(sender).bind("contextmenu", function(e) {
                    return false;
                });
            }
            this.onRightClick(e, sender);
        }
    }
    
    this.onNodeMouseUp = function(e, sender) {
	    if(e.button == 2){
	        if (!e) var e = window.event;
	        e.cancelBubble = true;
	        if (e.stopPropagation) e.stopPropagation();
	    
            // disabled default context menu
            if (this.ContextMenuEnable == "true") {
                $(sender).bind("contextmenu", function(e) {
                    return false;
                });
            }
            this.onRightClick(e, sender);
        }
    }


    this.onNodeMouseOver = function(e, sender) {
        if(!this.enableOrderFeedBack) { return; }
        if (!e) var e = window.event;
	    e.cancelBubble = true;
	    if (e.stopPropagation) e.stopPropagation();
	    
	    var originInstance = this;
	    var control = document.getElementById(this.controlID);
	    var orderLineWidth = control.offsetWidth - this.scrollBarWidth;
	    
        $(sender).mousemove(function(event) {
            this.originInstance = originInstance;
            var mouseX = 0;
            var mouseY = 0;
            var nodeX = sender.offsetLeft;
            var nodeY = sender.offsetTop;
            var nodeWidth = sender.offsetWidth;
            var nodeHeight = 24;
            
            if (!e) e = window.event;
            if (e) {
                mouseX = isIE ? (event.clientX + control.scrollLeft) : event.pageX;
                mouseY = isIE ? (event.clientY + control.scrollTop) : event.pageY;
            }
            
            if (nodeX < mouseX && (nodeX + nodeWidth) > mouseX) {
                // adjust dashed line acoording to treeview width (with or without scroll bar)
                if(parseInt($("#"+this.originInstance.orderElementID).css("width")) > orderLineWidth && control.scrollHeight > control.offsetHeight){
                    $("#"+this.originInstance.orderElementID).css("width", orderLineWidth);
                }
                var orderDivHeight = parseInt($("#"+this.originInstance.orderElementID).css("height").replace("px", ""));
                if((mouseY > nodeY && mouseY < (nodeY + 4))){
                    if($("#"+this.orderElementID).css("visibility") == "visible") { return; }
                    $("#"+this.originInstance.orderElementID).css("visibility", "visible");
                    $("#"+this.originInstance.orderElementID).css("display", "block");    
                    $("#"+this.originInstance.orderElementID).css("top", (nodeY - control.scrollTop - (orderDivHeight / 2)));    
                    $("#"+this.originInstance.orderElementID).css("left", nodeX);
                    $(sender).unbind("mousemove");
                    $(sender).unbind("mouseenter");
                    $("#"+this.originInstance.orderElementID).mouseout(function(e) {
                        var orderElement = (e.srcElement) ? e.srcElement : e.target;
                        $("#"+orderElement.id).css("visibility", "hidden");
                        $("#"+orderElement.id).css("display", "none");
                        $("#"+orderElement.id).unbind("mouseout");
                    });
                    $("#"+this.originInstance.orderElementID).mouseup(function(e) {
                        var orderElement = (e.srcElement) ? e.srcElement : e.target;
                        $("#"+orderElement.id).css("visibility", "hidden");
                        $("#"+orderElement.id).css("display", "none");
                        $("#"+orderElement.id).unbind("mouseup");
                    });
                } else if(mouseY > (nodeY + nodeHeight - 4) && mouseY <= (nodeY + nodeHeight)) {
                    if($("#"+this.orderElementID).css("visibility") == "visible") { return; }
                    $("#"+this.originInstance.orderElementID).css("visibility", "visible");
                    $("#"+this.originInstance.orderElementID).css("display", "block");    
                    $("#"+this.originInstance.orderElementID).css("top", (nodeY + nodeHeight - control.scrollTop - (orderDivHeight / 2)));    
                    $("#"+this.originInstance.orderElementID).css("left", nodeX);
                    $(sender).unbind("mousemove");
                    $(sender).unbind("mouseenter");
                    $("#"+this.originInstance.orderElementID).mouseout(function(e) {
                        var orderElement = (e.srcElement) ? e.srcElement : e.target;
                        $("#"+orderElement.id).css("visibility", "hidden");
                        $("#"+orderElement.id).css("display", "none");
                        $("#"+orderElement.id).unbind("mouseout");
                    });
                    $("#"+this.originInstance.orderElementID).mouseup(function(e) {
                        var orderElement = (e.srcElement) ? e.srcElement : e.target;
                        $("#"+orderElement.id).css("visibility", "hidden");
                        $("#"+orderElement.id).css("display", "none");
                        $("#"+orderElement.id).unbind("mouseup");
                    });
                } else {
                    $("#"+this.originInstance.orderElementID).css("visibility", "hidden");
                    $("#"+this.originInstance.orderElementID).css("display", "none");
                    $("#"+this.originInstance.orderElementID).unbind("mouseout");
                    $("#"+this.originInstance.orderElementID).unbind("mouseup");
                }
            }
        });
    }


    this.onNodeMouseOut = function(e, sender) {
        $(sender).unbind("mousemove");
        $(sender).unbind("mouseenter");
        
        if (!e) var e = window.event;
	    e.cancelBubble = true;
	    if (e.stopPropagation) e.stopPropagation();
    }


    this.onExpanderClick = function(e, sender) {
        if (!e) var e = window.event;
	    e.cancelBubble = true;
	    if (e.stopPropagation) e.stopPropagation();
	    var liElement = sender.parentNode.parentNode;
	    var expandedInput = document.getElementById(this.ExpandedInput);
	    var collapsedInput = document.getElementById(this.CollapsedInput);
	    var treeView = document.getElementById(this.controlID);
        var isRoot = (liElement.parentNode.className == "treeView") ? true : false;
        
	    if($(liElement).hasClass(this.CssClassNodeCollapsed) || $(liElement).hasClass(this.CssClassNodeExpanded)){
            var param = ($(liElement).hasClass(this.CssClassNodeCollapsed)) ? "nodeExpanded" : "nodeCollapsed";
            
            if(param == "nodeExpanded"){
                $(liElement).removeClass(this.CssClassNodeCollapsed);
                $(liElement).addClass(this.CssClassNodeExpanded);
                expandedInput.value = expandedInput.value + ";" + liElement.id;
                collapsedInput.value = collapsedInput.value.replace(liElement.id, "");
                $(sender).addClass((isRoot) ? "nodeRootButtonExpanded" : this.CssClassButtonExpanded);
                $(sender).removeClass((isRoot) ? "nodeRootButtonCollapsed" : this.CssClassButtonCollapsed);
            }else{
                if(!this.AnimtationEnable){
                    $(liElement).removeClass(this.CssClassNodeExpanded);
                    $(liElement).addClass(this.CssClassNodeCollapsed);
                }
                collapsedInput.value = collapsedInput.value + ";" + liElement.id;
                expandedInput.value = expandedInput.value.replace(liElement.id, "");
                $(sender).addClass((isRoot) ? "nodeRootButtonCollapsed" : this.CssClassButtonCollapsed);
                $(sender).removeClass((isRoot) ? "nodeRootButtonExpanded" : this.CssClassButtonExpanded);
            }
            
            if(this.AnimtationEnable){
                var ulChild = liElement.getElementsByTagName("ul")[0];
                var listLiElements = [];
                var nodeHeight = 24;
                for(var i = 0; i < ulChild.children.length; i ++){
                    if(ulChild.children[i].tagName.toLowerCase() == "li"){
                        listLiElements[listLiElements.length] = ulChild.children[i];
                        nodeHeight = nodeHeight + $(ulChild.children[i]).innerHeight();
                    }
                }
                nodeHeight = (param == "nodeCollapsed") ? 24 : nodeHeight;
                if(param == "nodeCollapsed"){
                    var originInstance = this;
                    setTimeout(function(){
                        $(liElement).removeClass(originInstance.CssClassNodeExpanded);
                        $(liElement).addClass(originInstance.CssClassNodeCollapsed);
                        }, 350);
                }else{
                    setTimeout(function(){
                        $(liElement).css("height","auto")
                        }, 350);
                }
                $(liElement).animate({
                    height:nodeHeight
                    }, 300, "linear");
            }
        }
        
        this.addChildsInVisibleList(liElement);
        this.updateTreeViewScrollBar();
    }
    

    this.onNodeMouseDown = function(e, sender) {
        // disabled default context menu
        if (this.ContextMenuEnable == "true") {
            $(sender).bind("contextmenu", function(e) {
                return false;
            });
        }
        
        if (!e) var e = window.event;
	    e.cancelBubble = true;
	    if (e.stopPropagation) e.stopPropagation();
	    
	    var clickedElement = (e.srcElement) ? e.srcElement : e.target;
	    
	    if(clickedElement.className == this.CssClassButtonExpanded || clickedElement.className == this.CssClassButtonCollapsed) { return; }

        // click/mousedown handle
        if (e.button == "1" || e.button == "0") {
            var clickedElementTagName = clickedElement.tagName.toLowerCase();
            var clickedElementTabMargin = $(clickedElement).css("margin-left");
            clickedElementTabMargin = clickedElementTabMargin.replace("px", "");
            var clickOffsetX = (isIE) ? e.offsetX : (e.layerX - clickedElementTabMargin);
            
            if (clickedElementTagName == "input") {
                var liElement = (e.srcElement) ? e.srcElement.parentNode.parentNode.parentNode : e.target.parentNode.parentNode.parentNode;
                // ajax trigger
                if (liElement.id != "" && this.isAddEditingNode == false) {
                    var cbStatus = (clickedElement.checked) ? false : true;
                    this.ajaxServerSideTrigger("checkedChanged;" + cbStatus + ";" + liElement.id);
                }
            } else {
                var selectedNodeInput = document.getElementById(this.SelectedNodeInput);
                this.clickOnSelected = false;

                if (selectedNodeInput.value == sender.id) {
                    this.clickOnSelected = true;
                }

                if (this.clickOnSelected == true) {
                    //this.editTreeViewNode();
                    this.isEnableToEdit = true;
                    //return;
                }

                if (this.isAddEditingNode == true) {
                    return;
                }

                // remove selected style in current selected
                if (selectedNodeInput.value != "") {
                    var selectedLi = document.getElementById(selectedNodeInput.value);
                    if (selectedLi) {
                        var selectedNodeCssClass = selectedLi.className;
                        document.getElementById(selectedNodeInput.value).className = this.removeCssClass(selectedNodeCssClass, this.CssClassNodeSelected);
                    }
                }

                // set selected style in new node selected
                sender.className = sender.className + " " + this.CssClassNodeSelected;
                selectedNodeInput.value = sender.id;

                this.clickedX = e.clientX;
                this.clickedY = e.clientY;
                this.clickedElement = clickedElement;

                document.getElementById(this.controlID).onselectstart = function() { return false; }
                var controllerIdentifier = "#" + this.controlID;
                var originInstance = this;

                $(document).mousemove(function(event) {
                    this.originInstance = originInstance;
                    var diffX = Math.abs(event.clientX - this.originInstance.clickedX);
                    var diffY = Math.abs(event.clientY - this.originInstance.clickedY);

                    if (this.originInstance.isAddEditingNode == true) {
                        return;
                    }

                    if (diffX < 4 || diffY < 4) {
                        return;
                    }
                    
                    if (this.originInstance.DragAndDropEnable == "true") {
                        if (!this.dragging) {
                            var sourceElement = this.originInstance.clickedElement;
                            if (sourceElement.tagName.toLowerCase() == "p") {
                                this.draggedSource = sourceElement.parentNode;
                            } else {
                                this.draggedSource = sourceElement;
                            }
                        
                            this.dragging = this.draggedSource;
                            // define dragged style
                            var liElement = this.dragging.parentNode;
                            this.draggedElementId = "#" + liElement.id + "_draggedNode";
                            var hasChildren = this.originInstance.nodeHasChildren(liElement);
                            var CSSDragedState = "";
                            if (hasChildren) {
                                var isCollapsed = this.originInstance.hasCssClass(liElement.className, "collapsed");
                                if (isCollapsed) {
                                    var CSSDragedState = " collapsed";  // TODO: make CSSDragedState a Class property
                                } else {
                                    var CSSDragedState = " expanded";
                                }
                            }
                            // create drag html element
                            var boxDragged = "<div id='" + liElement.id + "_draggedNode'";
                            boxDragged += "class='" + this.originInstance.CssClassNodeDragged + "' style='position: absolute; visibility: visible;'>";
                            boxDragged += "<div class='left'></div>";
                            boxDragged += "<div class='middle'>" + this.draggedSource.innerText + "</div>";
                            boxDragged += "<div class='right'></div></div>";
                            this.diffX = event.clientX - this.dragging.offsetLeft;
                            this.diffY = event.clientY - this.dragging.offsetTop;
                            var posLeft = event.clientX - this.diffX;
                            var posTop = event.clientY - this.diffY;
                            $(this.draggedElementId).css("left", posLeft);
                            $(this.draggedElementId).css("top", posTop);
                            $(this.draggedElementId).css("visibility", "visible");
                            $(controllerIdentifier).append(boxDragged);
                            

                            // if ESC pressed cancel dragg
                            $(document).keypress(function(e) {
                                this.originInstance = originInstance;
                                switch (e.keyCode) {
                                    case 27: // esc
                                        e.preventDefault();
                                        if (!e) { e = window.event; }
                                        e.cancelBubble = true;
                                        $(this.draggedElementId).remove();
                                        this.originInstance.enableOrderFeedBack = false;
                                        $("#"+this.originInstance.orderElementID).css("visibility", "hidden");
                                        $("#"+this.originInstance.orderElementID).css("display", "none");
                                        this.draggedSource = null;
                                        this.dragging = null;
                                        $(document).unbind("keypress");
                                        $(document).unbind("mouseup");
                                        $(document).unbind("mousemove");
                                        break;
                                }
                            });

                        } else {
                            var control = document.getElementById(this.originInstance.controlID);
                            this.originInstance.enableOrderFeedBack = true;
                            var treeViewBoxScrollTop = 0;
                            treeViewBoxScrollTop = control.scrollTop;

                            var posLeft = event.clientX + 10;
                            var posTop = event.clientY + 15;
                            $(this.draggedElementId).css("left", posLeft);
                            $(this.draggedElementId).css("top", posTop);
                        }
                    }
                });


                $(document).mouseup(function(event) {
                    this.originInstance = originInstance;
                    this.originInstance.enableOrderFeedBack = false;
                    
                    // node dropped
                    if (this.dragging != null) {
                        var draggedNodeId = this.draggedElementId.replace("_draggedNode", "");
                        var control = document.getElementById(this.originInstance.controlID);
                        draggedNodeId = draggedNodeId.replace("#", "");
                        $(this.draggedElementId).remove();

                        var scrollGap = 0;
                        scrollGap = control.scrollTop;
                        
                        var listElements = this.originInstance.getElementsUnderPoint(event.clientX, event.clientY);
                        var isOverTreeView = this.originInstance.checkIsOverElement(listElements, this.originInstance.controlID);
                        control.scrollTop = scrollGap; // checkIsOverElement reset scroll

                        if (isOverTreeView) {
                            // get target of dropped node
                            var targetNode = null;
                            var underPointElement = listElements[0];
                            if (underPointElement.id == this.originInstance.controlID) {
                                targetNode = 0;
                            } else if (underPointElement.tagName.toLowerCase() == "li") {
                                targetNode = underPointElement;
                            } else {
                                targetNode = this.originInstance.getParentNode(underPointElement, "li");
                            }

                            
                            if (draggedNodeId != targetNode.id) {
                                var oldParent = this.originInstance.getParentNode(document.getElementById(draggedNodeId), "li");

                                // remove style from old parent
                                if (oldParent) {
                                    var parentChildren = oldParent.getElementsByTagName("li");
                                    var isExpanded = $("#" + oldParent.id).hasClass(this.originInstance.CssClassNodeExpanded);
                                    var currentState = (isExpanded) ? this.originInstance.CssClassNodeExpanded : this.originInstance.CssClassNodeCollapsed;
                                }

                                // check if adding or ordering nodes
                                var listIds = null;
                                var paramParentNodeId = 0;
                                var droppedPosY = (event.clientY + scrollGap) - targetNode.offsetTop;
                                if (targetNode != 0) {
                                    var newParent = null;
                                    var isExpanded = this.originInstance.hasCssClass(document.getElementById(targetNode.id).className, this.originInstance.CssClassNodeExpanded);
                                    if (isExpanded && droppedPosY >= (22 - this.originInstance.itemGapOrder)) {
                                        newParent = targetNode;
                                    } else {
                                        var newParent = this.originInstance.getParentNode(document.getElementById(targetNode.id), "li");
                                    }

                                    if (newParent == null) {
                                        paramParentNodeId = 0;
                                    } else {
                                        paramParentNodeId = newParent.id;
                                    }

                                    if (newParent == null) {
                                        newParent = document.getElementById(this.originInstance.controlID);
                                    }
                                }

                                // is ordening nodes
                                if (droppedPosY <= this.originInstance.itemGapOrder || droppedPosY >= (22 - this.originInstance.itemGapOrder)) {
                                    listIds = this.originInstance.createListOfChildNodes(newParent);
                                    var strTarget = targetNode.id + ";";
                                    var strDragged = draggedNodeId + ";";
                                    listIds = listIds.replace(strDragged, "");
                                    var strPos = listIds.lastIndexOf(strTarget);
                                    strPos = (strPos >= 0) ? strPos : 0;
                                    var strTemp = "";
                                    if (droppedPosY <= this.originInstance.itemGapOrder) {
                                        strTemp = listIds.slice(0, strPos);
                                        strTemp = strTemp + "" + strDragged;
                                        strTemp = strTemp + "" + listIds.slice(strPos, listIds.length);
                                    } else if (droppedPosY >= (22 - this.originInstance.itemGapOrder) && !isExpanded) {
                                        strTemp = listIds.slice(0, (strPos + strTarget.length));
                                        strTemp = strTemp + "" + strDragged;
                                        strTemp = strTemp + "" + listIds.slice((strPos + strTarget.length), listIds.length);
                                    }
                                    else if (droppedPosY >= (22 - this.originInstance.itemGapOrder) && isExpanded) {
                                        strTemp = strDragged + "" + listIds;
                                    }
                                    listIds = strTemp;
                                } else { // is moving node to another parent
                                    var rootNode = (targetNode == 0) ? document.getElementById(this.originInstance.controlID) : targetNode;
                                    listIds = this.originInstance.createListOfChildNodes(rootNode);
                                    listIds = draggedNodeId + ";" + listIds;

                                    paramParentNodeId = (targetNode == 0) ? 0 : targetNode.id;
                                }
                                if (listIds.slice((listIds.length - 1), listIds.length) == ";") {
                                    listIds = listIds.slice(0, (listIds.length - 1));
                                }

                                // dispatch ajax trigger
                                var param = "nodeDropped;" + draggedNodeId + ";" + paramParentNodeId + ";" + listIds;
                                this.originInstance.ajaxServerSideTrigger(param)
                            }
                        }

                        this.dragging = null;
                        $("body").css("cursor", "auto");
                    } else { // mouse up, no draging
                        if (this.originInstance.isEnableToEdit && this.originInstance.EditOnClickEnable) {
                            this.originInstance.isEnableToEdit = false;
                            this.originInstance.editTreeViewNode();
                            return;
                        }

                        var clickedElement = document.elementFromPoint(event.clientX, event.clientY);
                        var liElement = null;
                        if (clickedElement.tagName.toLowerCase() == "li") {
                            liElement = clickedElement;
                        } else if (clickedElement.tagName.toLowerCase() == "p") {
                            liElement = clickedElement.parentNode.parentNode;
                        } else {
                            liElement = clickedElement.parentNode;
                        }
                        /* Cristiano was here - fix the bug in double post when select a node
                        if (liElement.id != "" && this.originInstance.isAddEditingNode == false) {
                            this.originInstance.ajaxServerSideTrigger("nodeClicked;" + liElement.id);
                        }*/
                        if (liElement.id != "" && this.originInstance.clickOnSelected == false && this.originInstance.isAddEditingNode == false) {
                            this.originInstance.ajaxServerSideTrigger("selectedChanged;" + liElement.id);
                        }
                    }

                    if (this.draggedSource) {
                        this.draggedSource = null;
                    }
                    $(document).unbind("keypress"); // remove listener for ESC when dragging
                    $(document).unbind("mouseup");
                    $(document).unbind("mousemove");
                });
            }

            // right click handle (context menu)
        }
    }


    this.getNodeLevel = function(node, startIndex) {
        var levelIndex = 0;
        var levelNode = node;
        var levelParentNode = node;
        var isRoot = false;

        while (isRoot == false) {
            levelParentNode = levelParentNode.parentNode.parentNode;
            if (levelParentNode.tagName.toLowerCase() == "ul") {
                levelIndex++;
            } else {
                isRoot = true;
            }
        }

        return levelIndex;
    }


    this.getParentNode = function(startNode, parentNodeTag) {
        var currentNode = startNode;
        var newParentNode = startNode;
        var findNode = false;
        var element = null;

        while (findNode == false) {
            newParentNode = newParentNode.parentNode;
            if (newParentNode.tagName) {
                if (newParentNode.tagName.toLowerCase() == parentNodeTag) {
                    findNode = true;
                    element = newParentNode;
                } else if (newParentNode.tagName.toLowerCase() == "html") {
                    findNode = true; // document root
                }
            }
        }
        return element;
    }
    
    
    this.addTreeViewNode = function(e) {
        var elementID;
        var tempID = getUniqueId();
        this.removeContextMenu();
        var selectedNodeInput = document.getElementById(this.SelectedNodeInput);
        var liElement = document.getElementById(selectedNodeInput.value);
        var childrenList = liElement.getElementsByTagName("li");
        
        var liCssClass = "";
        if (childrenList.length > 0) {
            liCssClass = this.CssClassNodeCollapsed + " bottomCorner";
        }else{
            liCssClass = this.CssClassNodeCollapsed + " bottomCorner";
        }
        
        var divsTab = liElement.getElementsByTagName("div")[1].innerHTML;
        if(this.hasCssClass(liElement.className, this.CssClassChildBottomCorner)){
            divsTab = divsTab + "<div class='nodeTabLastParent'></div>";
        }else{
            divsTab = divsTab + "<div class='nodeTabNextToLastParent'></div>";
        }

        var nodeNameInput = "nodeNameInput" + tempID;
        var divTabulation = liElement.getElementsByTagName("div")[1];
        var divTabulationWidth = $(divTabulation).css("width").replace("px", "");
        var htmlNode = "<li id='tempInput" + tempID + "' class='"+ liCssClass +"'> ";
        htmlNode += "<div class='nodeContentContainer'>";
        htmlNode += "<div class='nodeTabulation' style='width:"+ (parseInt(divTabulationWidth) + 12) +"px;'>"+divsTab+"</div>";
        htmlNode += "<div class='nodeButtonNoChildren'></div>";
        htmlNode += "<p></p>";
        htmlNode += "<input id='" + nodeNameInput + "' type='text' /></div>";
        htmlNode += "</li>";
        elementID = "tempInput" + tempID;
        this.isAddEditingNode = true;

        var underPointElement = document.elementFromPoint(event.clientX, event.clientY);
        var parentNodeId = 0;
        if (this.rootClicked) {
            // search for brother className
            var CSSClass = "treeView";
            var controllerDiv = document.getElementById(this.controlID);
            var rootLevel = controllerDiv.getElementsByTagName("ul")[0];
            for (var i = 0; i < underPointElement.children.length; i++) {
                if (underPointElement.children[i].tagName.toLowerCase() == "ul") {
                    CSSClass = underPointElement.children[i].className;
                    break;
                }
            }
            htmlNode = "<ul class='" + CSSClass + "' id='" + elementID + "List'>" + htmlNode + "</ul>";
            $("#" + rootLevel.id).append(htmlNode);
            this.rootClicked = false;
        } else {
            parentNodeId = liElement.id
            
            if (childrenList.length > 0) {
                var ulElement = liElement.getElementsByTagName("ul")[0];
                $(ulElement).append(htmlNode);
                var currentParentStyle = document.getElementById(parentNodeId).className;
                currentParentStyle = this.removeCssClass(currentParentStyle, this.CssClassNodeCollapsed);
                document.getElementById(parentNodeId).className = currentParentStyle + " " + this.CssClassNodeExpanded;
                // remove bottomCorner from last but one li child
                var lastLiElement = childrenList[childrenList.length - 2];
                lastLiElement.className = this.removeCssClass(lastLiElement.className, this.CssClassChildBottomCorner);
            } else {
                elementID = elementID + "List";
                var ulElement = liElement.getElementsByTagName("ul")[0];
                var divElementsList = liElement.getElementsByTagName("div");
                var buttonElement = divElementsList[divElementsList.length - 1];
                buttonElement.className = "nodeButtonExpanded";
                var currentParentStyle = liElement.className;
                currentParentStyle = this.removeCssClass(currentParentStyle, this.CssClassNodeCollapsed);
                liElement.className = currentParentStyle + " " + this.CssClassNodeExpanded;
                $(ulElement).append(htmlNode);
            }
        }


        document.getElementById(nodeNameInput).focus();

        var originInstance = this;
        $("#" + nodeNameInput).keypress(function(e) {
            this.originInstance = originInstance;
            switch (e.keyCode) {
                case 13: // enter
                    e.preventDefault();
                    if (!e) { e = window.event; }
                    e.cancelBubble = true;

                        var nodeText = document.getElementById(nodeNameInput).value
                        var param = "nodeAdded;" + parentNodeId + ";" + nodeText;
                        this.originInstance.ajaxServerSideTrigger(param);
                    
                    this.originInstance.isAddEditingNode = false;
                    $(this).unbind("keypress");
                    $(this).unbind("blur");
                    break;
                case 27: // esc
                    e.preventDefault();
                    if (!e) { e = window.event; }
                    e.cancelBubble = true;
                    $("#tempInput" + tempID).remove();
                    if (parentNodeId != 0) {
                        var liElement = document.getElementById(parentNodeId);
                        if (childrenList.length == 0) {
                            // remove expanded css class from li
                            liElement.className = this.originInstance.removeCssClass(liElement.className, this.CssClassNodeExpanded); 
                            // remove expanded css class from button
                            var divElementsList = liElement.getElementsByTagName("div");
                            var buttonElement = divElementsList[divElementsList.length - 1];
                            buttonElement.className = "nodeButtonNoChildren";
                        } else {
                            // add back bottoCorner style to last li element
                            var liElementsList = liElement.getElementsByTagName("li");
                            var lastLiElement = liElementsList[liElementsList.length - 1];
                            lastLiElement.className = lastLiElement.className + " " + this.originInstance.CssClassChildBottomCorner;
                        }
                    }
                    this.originInstance.isAddEditingNode = false;
                    $(this).unbind("keypress");
                    $(this).unbind("blur");
                    break;
            }
        });

        $("#" + nodeNameInput).blur(function(e) {
            this.originInstance = originInstance;
            var nodeText = document.getElementById(nodeNameInput).value;
            
            if (nodeText == "") {
                $("#tempInput" + tempID).remove();
                if (parentNodeId != 0) {
                    var liElement = document.getElementById(parentNodeId);
                    if (childrenList.length == 0) {
                        // remove expanded css class from li
                        liElement.className = this.originInstance.removeCssClass(liElement.className, this.CssClassNodeExpanded); 
                        // remove expanded css class from button
                        var divElementsList = liElement.getElementsByTagName("div");
                        var buttonElement = divElementsList[divElementsList.length - 1];
                        buttonElement.className = "nodeButtonNoChildren";
                    } else {
                        // add back bottoCorner style to last li element
                        var liElementsList = liElement.getElementsByTagName("li");
                        var lastLiElement = liElementsList[liElementsList.length - 1];
                        lastLiElement.className = lastLiElement.className + " " + this.originInstance.CssClassChildBottomCorner;
                    }
                }
            }
            
            if (nodeText != "") {
                var param = "nodeAdded;" + parentNodeId + ";" + nodeText;
                this.originInstance.ajaxServerSideTrigger(param);
            }
            
            this.originInstance.isAddEditingNode = false;
            $(this).unbind("blur");
            $(this).unbind("keypress");
        });
    }



    this.editTreeViewNode = function(e) {
        this.removeContextMenu();

        var selectedNodeInput = document.getElementById(this.SelectedNodeInput);
        var liElement = document.getElementById(selectedNodeInput.value);
        var divElement = liElement.getElementsByTagName("div")[1];
        var pElement = liElement.getElementsByTagName("p")[1];
        var initialNodeText = pElement.innerHTML;
        var margin = $(divElement).css("width");
        this.isAddEditingNode = true;
        $(document).unbind("mousemove");

        var tempID = getUniqueId();
        var nodeNameInput = "nodeNameInput" + tempID;
        var htmlNode = "<input id='" + nodeNameInput + "' type='text' value='" + initialNodeText + "' />";

        $(pElement).replaceWith(htmlNode);
        var inputElement = document.getElementById(nodeNameInput);
        inputElement.focus();
        $("#" + nodeNameInput).focus();

        // position caret at the end of text
        // ie
        if (document.selection) {
            var oSel = document.selection.createRange();
            oSel.moveStart('character', -inputElement.value.length);
            oSel.moveStart('character', inputElement.value.length);
            oSel.moveEnd('character', 0);
            oSel.select();
            // firefox
        } else if (inputElement.selectionStart || inputElement.selectionStart == '0') {
            inputElement.selectionStart = inputElement.value.length;
            inputElement.selectionEnd = inputElement.value.length;
            inputElement.focus();
        }

        var originInstance = this;
        $("#" + nodeNameInput).keypress(function(e) {
            this.originInstance = originInstance;
            switch (e.keyCode) {
                case 13: // enter
                    e.preventDefault();
                    this.originInstance.isAddEditingNode = false;
                    var nodeText = document.getElementById(nodeNameInput).value;
                    if (nodeText != initialNodeText) {
                        var param = "nodeUpdated;" + liElement.id + ";" + nodeText;
                        this.originInstance.ajaxServerSideTrigger(param);
                    } else {
                        $("#"+nodeNameInput).replaceWith(pElement.outerHTML);
                    }
                    $(this).unbind("keypress");
                    $(this).unbind("blur");
                    break;
                case 27: // esc
                    e.preventDefault();
                    this.originInstance.isAddEditingNode = false;
                    $("#"+nodeNameInput).replaceWith(pElement.outerHTML);
                    $(this).unbind("keypress");
                    $(this).unbind("blur");
                    break;
            }
        });

        $("#" + nodeNameInput).blur(function(e) {
            var nodeText = document.getElementById(nodeNameInput).value

            var clickedInBrower = true;
            if (e.clientX > document.body.offsetWidth || e.clientY > document.body.offsetHeight) clickedInBrower = false;

            // change node text for improve feedback
            if (nodeText != initialNodeText) {
                var p = liElement.getElementsByTagName("p")[0];
                $(p).text(nodeText);
            }
            
            var newText = $("#"+nodeNameInput).val();
            $("#"+nodeNameInput).replaceWith(pElement.outerHTML);
            $(pElement).text(newText);
            

            this.originInstance = originInstance;
            this.originInstance.isAddEditingNode = false;

            if (clickedInBrower) {
                if (nodeText != initialNodeText) {
                    var param = "nodeUpdated;" + liElement.id + ";" + nodeText;
                    this.originInstance.ajaxServerSideTrigger(param);
                }
            }
            $(this).unbind("blur");
            $(this).unbind("keypress");
        });
    }


    this.nodeHasChildren = function(liElement) {
        var hasChildren = false;
        var ulList = liElement.getElementsByTagName("ul")[0];
        if (ulList != null) {
            hasChildren = (liElement.getElementsByTagName("li").length > 0) ? true : false;
        }
        return hasChildren;
    }

    
    this.createRootNodeList = function() {
        var treeElement = document.getElementById(this.controlID);
        var treeViewList = treeElement.getElementsByTagName("ul")[0];
        var arr = treeViewList.getElementsByTagName("li");
        for (var i = 0; i < arr.length; i++) {
            if (arr[i].id != "") {
                this.rootNodeList.push(arr[i]);
            }
        }
    }

    this.createNodeList = function() {
        var treeElement = document.getElementById(this.controlID);
        var treeViewList = treeElement.getElementsByTagName("ul");
        for(var x = 0; x < treeViewList.length; x++){
            var arr = treeViewList[x].getElementsByTagName("li");
            for (var i = 0; i < arr.length; i++) {
                if (arr[i].id != "") {
                    this.nodeList.push(arr[i]);
                }
            }
        }
    }

    this.createListOfChildNodes = function(rootNode) {
        var listIds = "";
        for (var i = 0; i < rootNode.children.length; i++) {
            if (rootNode.children[i].tagName.toLowerCase() == "ul") {
                var ulList = rootNode.children[i];
                for (var x = 0; x < ulList.children.length; x++) {
                    if (ulList.children[x].tagName.toLowerCase() == "li") {
                        listIds = listIds + "" + ulList.children[x].id + ";";
                    }
                }
            }
        }
        return listIds;
    }


    this.getElementsUnderPoint = function(x, y) {
        var a = new Array;
        var obj = null;
        if ('elementFromPoint' in document) {
            do {
                obj = document.elementFromPoint(x, y);
                if (obj == document.body || obj == null) { break; }
                a.push(obj);
                obj.style.display = 'none';
            } while (true);
            for (var i = 0; i < a.length; ++i) {
                a[i].style.display = '';
            }
            return a;
        }
    }


    this.checkIsOverElement = function(list, underElementID) {
        var isOverElement = false;
        for (var i = 0; i < list.length; i++) {
            var tempElementID = list[i].id
            var matchName = tempElementID.indexOf(underElementID);
            if (matchName > -1) {
                isOverElement = true;
                break;
            }
        }
        return isOverElement;
    }


    this.hasCssClass = function(cssClassList, cssClass) {
        var stringIndex = cssClassList.search(cssClass);
        return (stringIndex > -1) ? true : false;
    }


    this.removeCssClass = function(cssClassList, cssClass) {
        var newCssClassList = cssClassList;
        var stringIndex = newCssClassList.indexOf(cssClass);
        while (stringIndex > -1) {
            if (stringIndex == 0) {
                var test = newCssClassList.indexOf(" ");
                if (newCssClassList.indexOf(" ") > -1) {
                    newCssClassList = newCssClassList.replace(cssClass + " ", "");
                } else {
                    newCssClassList = newCssClassList.replace(cssClass, "");
                }
            } else if (stringIndex > 0) {
                newCssClassList = newCssClassList.replace(" " + cssClass, "");
            }
            stringIndex = newCssClassList.indexOf(cssClass);
        }
        return newCssClassList;
    }


}



//DropDownBox
function DropDownListItem(item_id, item_value) {
    this.item_id = item_id;
    this.item_value = item_value;
}

function DropDownBox(instanceName) {
    this.canHideList = 1;
    this.listing = new Array();
    this.currentItem = -1;
    this.items = new Array();

    this.InstanceName = instanceName;
    this.controlID;
    this.divList;
    this.divHelp;
    this.divCaption;
    this.listItemOver;
    this.listItem;
    this.textBox;
    this.textBoxHidden;
    this.textBoxHiddenState;
    this.caption;
    this.offTextColour;
    this.onClickItem;
    this.dropDownGoesUp

    this.nextFocus;
    this.buttonToPress;



    this.PopulateList = function(e, sender) {
        var isIE = document.all;
        if (!e) e = window.event;

        if (e.keyCode != 40 && e.keyCode != 38 && e.keyCode != 13) {
            //		alert(e.keyCode);
            var word = sender.value;
            var divReturn = "";
            var j = 0;
            this.items = new Array();
            this.currentItem = -1;
            for (var i = 0; i < this.listing.length; i++) {
                if (this.listing[i].item_value.toLowerCase().indexOf(word.toLowerCase()) >= 0) {
                    divReturn += "<div id='" + this.controlID + "_divListItem-_" + this.listing[i].item_id + "'";
                    divReturn += " onmouseout='javascript: " + this.InstanceName + ".HigthLightOff(this);' onmousemove='javascript: " + this.InstanceName + ".ListItemByMouse(this);' onclick='javascript: " + this.InstanceName + ".SelectItem(this);" + this.onClickItem + ";'>";
                    divReturn += this.listing[i].item_value + "</div>";
                    this.items[j] = this.controlID + "_divListItem-_" + this.listing[i].item_id;
                    j += 1;
                }
            }
            document.getElementById(this.divList).innerHTML = divReturn;
        }
    }


    this.PopulateListAll = function() {
        var divReturn = "";
        this.items = new Array();
        for (var i = 0; i < this.listing.length; i++) {
            divReturn += "<div  id='" + this.controlID + "_divListItem-_" + this.listing[i].item_id + "'";
            divReturn += " onmouseout='javascript: " + this.InstanceName + ".HigthLightOff(this);' onmousemove='javascript: " + this.InstanceName + ".ListItemByMouse(this);' onclick='javascript: " + this.InstanceName + ".SelectItem(this);" + this.onClickItem + ";'>";
            divReturn += this.listing[i].item_value + "</div>";
            this.items[i] = this.controlID + "_divListItem-_" + this.listing[i].item_id;
        }

        document.getElementById(this.divList).innerHTML = divReturn;
    }


    this.ShowList = function(e, sender) {
        var isIE = document.all;
        var top;
        var left;
        var h = 0;
        h += sender.offsetHeight + 1;
        var listH = this.listing.length * 14;
        var currentLeft = $('#'+sender.id).position().left;
        var currentTop = $('#'+sender.id).position().top;
        //var listH = document.getElementById(this.divList).style.height;
        //var listH = getProperty(document.getElementById(this.divList), "height", "height");

        //var listH = document.getElementById(this.divList).offsetParent.clientHeight

        var txtTop = screen.availHeight - currentTop;
        if (isIE) {
            left = currentLeft;
            if (this.dropDownGoesUp) {
                top = currentTop - listH;
                //top = -2210;
            }
            else {
                top = currentTop + h;
            }
        } else {
            left = currentLeft + 'px';
            if (this.dropDownGoesUp) {
                top = currentTop - listH + 'px';
                //top = -2210 + 'px';
            }
            else {
                top = currentTop + h + 'px';
            }

        }
        

        var txtTop = screen.availHeight - top;
        var listScroll = (this.listing.length >= 15) ? "scroll" : "auto";

        if (this.listing.length * 20 >= txtTop) {
            document.getElementById(this.divList).style.top = -2210;
        } else {
            document.getElementById(this.divList).style.top = top;
        }

        if (listScroll == "auto") {
            var scrollBarWidth = 0;
            var listWidth = $(document.getElementById(sender.id)).innerWidth();
            var paddingWidth = (isIE) ? 4 : -2;
            $(document.getElementById(this.divList)).css("min-width", (listWidth + scrollBarWidth - paddingWidth));//
        }

        document.getElementById(this.divList).style.left = left;
        document.getElementById(this.divList).style.top = top;
        $(document.getElementById(this.divList)).css("overflow-y", listScroll);
        document.getElementById(this.divList).style.visibility = 'visible';
        document.getElementById(this.divList).style.display = '';
        listItemOff = 0;

        if (e.keyCode == 40) {
            if (this.currentItem > -1 && this.currentItem < this.items.length - 1) {
                this.HigthLightOff(document.getElementById(this.items[this.currentItem]));
                this.currentItem++;
            }
            else if (this.currentItem == -1 || this.currentItem == this.items.length - 1) {
                this.HigthLightOff(document.getElementById(this.items[this.items.length - 1]));
                this.currentItem = 0;
            }
            this.HigthLight(document.getElementById(this.items[this.currentItem]));
        }
        else if (e.keyCode == 38) {
            if (this.currentItem > 0 && this.currentItem <= this.items.length - 1) {
                this.HigthLightOff(document.getElementById(this.items[this.currentItem]));
                this.currentItem--;
            }
            else if (this.currentItem == -1 || this.currentItem == 0) {
                this.HigthLightOff(document.getElementById(this.items[0]));
                this.currentItem = this.items.length - 1;
            }

            this.HigthLight(document.getElementById(this.items[this.currentItem]));
        }
        else if (e.keyCode == 13 && this.currentItem > -1) {
            this.SelectItem(document.getElementById(this.items[this.currentItem]));
        }
    }


    this.HigthLight = function(sender) {
        sender.className = this.listItemOver;
    }


    this.HigthLightOff = function(sender) {
        sender.className = this.listItem;
    }


    this.MouseCursorOut = function() {
        document.body.style.cursor = 'default';
    }


    this.MouseCursor = function() {
        document.body.style.cursor = 'default';
        this.canHideList = 0;
    }


    this.SelectItem = function(sender) {
        document.getElementById(this.textBox).value = document.getElementById(sender.id).innerHTML;
        this.HigthLightOff(document.getElementById(this.items[this.currentItem]));
        document.getElementById(this.divList).style.visibility = "hidden";
        document.getElementById(this.divList).style.display = 'none';
        document.getElementById(this.textBox).style.color = '';
        document.getElementById(this.textBoxHidden).value = this.listing[this.currentItem].item_id;

        this.currentItem = -1;
    }


    this.MouseOffList = function() {
        this.canHideList = 1;
    }

    this.ShowCaption = function(sender) {
        var isIE = document.all;
        var x;
        var y;
        var captionHeight = 22;
        var borderSize = 1;
        var paddingTop = 3;
        var paddingBottom = 2;
        var paddingLeftRight = 5;
        var senderWidth;
        var paddingLeft;
        var h = 0;
        h = captionHeight - 1;

        if (isIE) {
            var currentLeft = getElementPosition(sender.id).left; // $('#'+sender.id).position().left;
            var currentTop = getElementPosition(sender.id).top; // $('#'+sender.id).position().top;
            x = currentLeft;
            y = currentTop - h;
            senderWidth = sender.offsetWidth;

            document.getElementById(this.divCaption).style.paddingTop = paddingTop;
            document.getElementById(this.divCaption).style.paddingBottom = paddingBottom;
            document.getElementById(this.divCaption).style.width = senderWidth;
        }
        else {
            h = h + 5;
            x = getElementPosition(sender.id).left + 'px';
            y = getElementPosition(sender.id).top - h + 'px';
        }

        document.getElementById(this.divCaption).style.left = x;
        document.getElementById(this.divCaption).style.top = y;
        document.getElementById(this.divCaption).style.visibility = 'visible';
        document.getElementById(this.divCaption).style.display = '';
        if (sender.value == this.caption) {
            sender.value = '';
            sender.style.color = '';
        }
    }
    
    this.HideCaption = function(sender) {
        document.getElementById(this.divCaption).style.visibility = "hidden";
        document.getElementById(this.divCaption).style.display = 'none';
        if (this.canHideList == 1) {
            document.getElementById(this.divList).style.visibility = "hidden";
            document.getElementById(this.divList).style.display = 'none';
        }
        if (sender.value == '') {
            sender.style.color = this.offTextColour;
            sender.value = this.caption;
        }
    }


    this.ListItemByMouse = function(sender) {
        if (this.currentItem != -1) this.HigthLightOff(document.getElementById(this.items[this.currentItem]));

        this.HigthLight(sender);
        for (var i = 0; i < this.items.length; i++) {
            if (this.items[i] == sender.id) {
                this.currentItem = i;
            }
        }
    }


    this.ShowHelp = function(e) {
        var isIE = document.all;
        var mouseX = 0;
        var mouseY = 0;
        if (!e) e = window.event;
        if (e) {
            mouseX = isIE ? (e.clientX + document.body.scrollLeft) : e.pageX;
            mouseY = isIE ? (e.clientY + document.body.scrollTop) : e.pageY;
        }
        document.getElementById(this.divHelp).style.visibility = "visible";
        document.getElementById(this.divHelp).style.left = mouseX + 8 + 'px';
        document.getElementById(this.divHelp).style.top = mouseY + 8 + 'px';
    }

    this.HideHelp = function() {
        document.getElementById(this.divHelp).style.visibility = "hidden";
        document.getElementById(this.divHelp).style.display = "none";
    }

    this.LoadFromHidden = function() {

        arg = document.getElementById(this.textBoxHiddenState).value;
        this.listing = new Array();
        items = arg.split(";");
        var item;
        var i = 0;
        for (i = 0; i <= items.length - 2; i++) {
            pitem = items[i].split(",");
            this.listing[i] = new DropDownListItem(pitem[0], pitem[1]);

        }
        this.PopulateListAll();

    }

    this.SelectNext = function(e) {

        var key;
        if (window.event)
            key = window.event.keyCode;     //IE
        else
            key = e.which;     //firefox

        if (key == 13) {
            document.getElementById(this.nextFocus).onkeypress();
            return false;

        }

    }

    this.PressButton = function(e) {

        var key;
        if (window.event)
            key = window.event.keyCode;     //IE
        else
            key = e.which;     //firefox

        if (key == 13) {

            if (this.buttonToPress != "")
                document.getElementById(this.buttonToPress).click();

            return false;
        }

    }
    this.SetFocus = function() {
        document.getElementById(this.controlID + "_textBox").focus();
    }


}


//InputBox

function InputBox(instanceName) {

    this.InstanceName = instanceName;
    this.controlID;
    this.divHelp;
    this.divCaption;
    this.textBox;
    this.caption;
    this.offTextColour
    //this.nextFocus;
    //this.buttonToPress;
    this.CaptionLeftCorrection;
    this.HelpLeftCorrection;
    this.SampleText = "";
    this.Text = this.caption;
    this.OnReturnKeyUp;

    this.ShowCaption = function(sender) {

        var isIE = document.all;
        var x;
        var y;
        var paddingTop = 3;
        var paddingBottom = 2;
        var paddingLeftRight = 5;
        var captionHeight = 22;
        var captionName = "#" + this.divCaption;
        var senderWidth;
        var borderSize = 1;
        var paddingLeft;
        var h = 0;
        h = captionHeight - 1;

        if (isIE) {
            x = getElementPosition(sender.id).left;
            y = getElementPosition(sender.id).top;
            y = getElementPosition(sender.id).top - h;
        } else {
            x = getElementPosition(sender.id).left;
            y = (getElementPosition(sender.id).top - h - (paddingTop + paddingBottom));
        }

        senderWidth = sender.offsetWidth;
        document.getElementById(this.divCaption).style.paddingTop = paddingTop;
        document.getElementById(this.divCaption).style.paddingBottom = paddingBottom;
        // set caption width
        document.getElementById(this.divCaption).style.width = "auto";
        var textWidth = document.getElementById(this.divCaption).offsetWidth;
        if (textWidth < senderWidth) {
            var newWidth = senderWidth;
            $(captionName).width(newWidth);
        }

        var divCaptionWidth = document.getElementById(this.divCaption).offsetWidth;
        var windowWidth = (typeof (window.innerWidth) == 'number') ? window.innerWidth : document.documentElement.clientWidth;

        if (((x + divCaptionWidth) > windowWidth) && (textWidth > senderWidth)) {
            document.getElementById(this.divCaption).style.left = x - (textWidth - senderWidth);
            document.getElementById(this.divCaption).style.top = y;
        } else {
            $(captionName).css("left", x);
            $(captionName).css("top", y);
        }
        document.getElementById(this.divCaption).style.visibility = 'visible';

        // set color if no text was entered in inputbox
        if (sender.value == this.caption) {
            sender.value = '';
            sender.style.color = '';
        }

        var textBox = document.getElementById(this.textBox);
        if (textBox.value == this.SampleText) {
            textBox.value = "";
        }
        //this.SetFocus();
    }

    this.ShowHelp = function(e) {
        var isIE = document.all;
        var mouseX = 0;
        var mouseY = 0;
        if (!e) e = window.event;
        if (e) {
            mouseX = isIE ? (e.clientX + document.body.scrollLeft) : e.pageX;
            mouseY = isIE ? (e.clientY + document.body.scrollTop) : e.pageY;
        }
        var posX = mouseX + this.HelpLeftCorrection + 8;
        var divHelpWidth = document.getElementById(this.divHelp).offsetWidth;
        var textBoxLeft = document.getElementById(this.textBox).offsetLeft;
        var windowWidth = (typeof(window.innerWidth) == 'number') ? window.innerWidth : document.documentElement.clientWidth;

        if ((mouseX + divHelpWidth + 8) > windowWidth) {
            document.getElementById(this.divHelp).style.left = posX - divHelpWidth - 8;
            document.getElementById(this.divHelp).style.top = mouseY + 8 + 'px';
        } else {
            document.getElementById(this.divHelp).style.left = posX + 'px';
            document.getElementById(this.divHelp).style.top = mouseY + 8 + 'px';
        }
        document.getElementById(this.divHelp).style.visibility = "visible";
    }

    this.HideHelp = function() {
        document.getElementById(this.divHelp).style.visibility = "hidden";
    }

    this.HideCaption = function(sender) {
        document.getElementById(this.divCaption).style.visibility = "hidden";
        if (sender.value == '') {
            sender.style.color = this.offTextColour;
            if (this.SampleText != "") {
                sender.value = this.SampleText;
            } else {
                sender.value = this.caption;
            }
        }
        else {
            if (sender.value != this.caption) {
                sender.style.color = '';
                this.Text = sender.value;
            }
        }
    }

    this.SelectNext = function(e) {
        var key;
        if (window.event)
            key = window.event.keyCode;     //IE
        else
            key = e.which;     //firefox

        if (key == 13) {
            document.getElementById(this.nextFocus).onkeypress();
            return false;
        }
    }

    this.PressButton = function(e) {
        var key;
        if (window.event)
            key = window.event.keyCode;     //IE
        else
            key = e.which;     //firefox

        if (key == 13) {
            if (this.buttonToPress != "")
                document.getElementById(this.buttonToPress).click();
            return false;
        }
    }
    
    this.handlerOnReturnKeyUp = function(e) {
        var key;
        if (window.event)
            key = window.event.keyCode;     //IE
        else
            key = e.which;     //firefox
        
        if (key == 13) {
            if(this.OnReturnKeyUp){
                 this.OnReturnKeyUp();
            }
        }
    }
    
    this.SetFocus = function() {
        document.getElementById(this.controlID + "_textBox").focus();
    }
    
    this.GetText = function() {
        var textInput = document.getElementById(this.textBox);
        var text = textInput.value;
        if(text == this.caption){
            return "";
        }
        return text;
    }
    
    this.SetText = function(text) {
        var textInput = document.getElementById(this.textBox);
        if(textInput.value != this.caption){
            if(text == ""){
                textInput.style.color = this.offTextColour;
                textInput.value = this.caption;
            }else{
                textInput.value = text;
            }
            this.Text = "";
        }
    }

}

//DateInputBox

function getAnchorPosition(anchorname) {
    var useWindow = false;
    var coordinates = new Object();
    var x = 0, y = 0;
    var use_gebi = false, use_css = false, use_layers = false;
    if (document.getElementById) { use_gebi = true; }
    else if (document.all) { use_css = true; }
    else if (document.layers) { use_layers = true; }
    if (use_gebi && document.all) {
        x = AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
        y = AnchorPosition_getPageOffsetTop(document.all[anchorname]);
    }
    else if (use_gebi) {
        var o = document.getElementById(anchorname);
        x = AnchorPosition_getPageOffsetLeft(o);
        y = AnchorPosition_getPageOffsetTop(o);
    }
    else if (use_css) {
        x = AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
        y = AnchorPosition_getPageOffsetTop(document.all[anchorname]);
    }
    else if (use_layers) {
        var found = 0;
        for (var i = 0; i < document.anchors.length; i++) {
            if (document.anchors[i].name == anchorname) { found = 1; break; }
        }
        if (found == 0) {
            coordinates.x = 0; coordinates.y = 0; return coordinates;
        }
        x = document.anchors[i].x;
        y = document.anchors[i].y;
    }
    else {
        coordinates.x = 0; coordinates.y = 0; return coordinates;
    }
    coordinates.x = x;
    coordinates.y = y;
    return coordinates;
}

function getAnchorWindowPosition(anchorname) {
    var coordinates = getAnchorPosition(anchorname);
    var x = 0;
    var y = 0;
    if (document.getElementById) {
        if (isNaN(window.screenX)) {
            x = coordinates.x - document.body.scrollLeft + window.screenLeft;
            y = coordinates.y - document.body.scrollTop + window.screenTop;
        }
        else {
            x = coordinates.x + window.screenX + (window.outerWidth - window.innerWidth) - window.pageXOffset;
            y = coordinates.y + window.screenY + (window.outerHeight - 24 - window.innerHeight) - window.pageYOffset;
        }
    }
    else if (document.all) {
        x = coordinates.x - document.body.scrollLeft + window.screenLeft;
        y = coordinates.y - document.body.scrollTop + window.screenTop;
    }
    else if (document.layers) {
        x = coordinates.x + window.screenX + (window.outerWidth - window.innerWidth) - window.pageXOffset;
        y = coordinates.y + window.screenY + (window.outerHeight - 24 - window.innerHeight) - window.pageYOffset;
    }
    coordinates.x = x;
    coordinates.y = y;
    return coordinates;
}

function AnchorPosition_getPageOffsetLeft(el) {
    var ol = el.offsetLeft;
    while ((el = el.offsetParent) != null) { ol += el.offsetLeft; }
    return ol;
}
function AnchorPosition_getWindowOffsetLeft(el) {
    return AnchorPosition_getPageOffsetLeft(el) - document.body.scrollLeft;
}
function AnchorPosition_getPageOffsetTop(el) {
    var ot = el.offsetTop;
    while ((el = el.offsetParent) != null) { ot += el.offsetTop; }
    return ot;
}
function AnchorPosition_getWindowOffsetTop(el) {
    return AnchorPosition_getPageOffsetTop(el) - document.body.scrollTop;
}
var MONTH_NAMES = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
var DAY_NAMES = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
function LZ(x) { return (x < 0 || x > 9 ? "" : "0") + x }
function isDate(val, format) {
    var date = getDateFromFormat(val, format);
    if (date == 0) { return false; }
    return true;
}
function compareDates(date1, dateformat1, date2, dateformat2) {
    var d1 = getDateFromFormat(date1, dateformat1);
    var d2 = getDateFromFormat(date2, dateformat2);
    if (d1 == 0 || d2 == 0) {
        return -1;
    }
    else if (d1 > d2) {
        return 1;
    }
    return 0;
}
function formatDate(date, format) {
    format = format + "";
    var result = "";
    var i_format = 0;
    var c = "";
    var token = "";
    var y = date.getYear() + "";
    var M = date.getMonth() + 1;
    var d = date.getDate();
    var E = date.getDay();
    var H = date.getHours();
    var m = date.getMinutes();
    var s = date.getSeconds();
    var yyyy, yy, MMM, MM, dd, hh, h, mm, ss, ampm, HH, H, KK, K, kk, k;
    var value = new Object();
    if (y.length < 4) { y = "" + (y - 0 + 1900); }
    value["y"] = "" + y;
    value["yyyy"] = y;
    value["yy"] = y.substring(2, 4);
    value["M"] = M;
    value["MM"] = LZ(M);
    value["MMM"] = MONTH_NAMES[M - 1];
    value["NNN"] = MONTH_NAMES[M + 11];
    value["d"] = d;
    value["dd"] = LZ(d);
    value["E"] = DAY_NAMES[E + 7];
    value["EE"] = DAY_NAMES[E];
    value["H"] = H;
    value["HH"] = LZ(H);
    if (H == 0) { value["h"] = 12; }
    else if (H > 12) { value["h"] = H - 12; }
    else { value["h"] = H; }
    value["hh"] = LZ(value["h"]);
    if (H > 11) { value["K"] = H - 12; } else { value["K"] = H; }
    value["k"] = H + 1;
    value["KK"] = LZ(value["K"]);
    value["kk"] = LZ(value["k"]);
    if (H > 11) { value["a"] = "PM"; }
    else { value["a"] = "AM"; }
    value["m"] = m;
    value["mm"] = LZ(m);
    value["s"] = s;
    value["ss"] = LZ(s);
    while (i_format < format.length) {
        c = format.charAt(i_format);
        token = "";
        while ((format.charAt(i_format) == c) && (i_format < format.length)) {
            token += format.charAt(i_format++);
        }
        if (value[token] != null) { result = result + value[token]; }
        else { result = result + token; }
    }
    return result;
}
function _isInteger(val) {
    var digits = "1234567890";
    for (var i = 0; i < val.length; i++) {
        if (digits.indexOf(val.charAt(i)) == -1) { return false; }
    }
    return true;
}
function _getInt(str, i, minlength, maxlength) {
    for (var x = maxlength; x >= minlength; x--) {
        var token = str.substring(i, i + x);
        if (token.length < minlength) { return null; }
        if (_isInteger(token)) { return token; }
    }
    return null;
}
function getDateFromFormat(val, format) {
    val = val + "";
    format = format + "";
    var i_val = 0;
    var i_format = 0;
    var c = "";
    var token = "";
    var token2 = "";
    var x, y;
    var now = new Date();
    var year = now.getYear();
    var month = now.getMonth() + 1;
    var date = 1;
    var hh = now.getHours();
    var mm = now.getMinutes();
    var ss = now.getSeconds();
    var ampm = "";

    while (i_format < format.length) {
        c = format.charAt(i_format);
        token = "";
        while ((format.charAt(i_format) == c) && (i_format < format.length)) {
            token += format.charAt(i_format++);
        }
        if (token == "yyyy" || token == "yy" || token == "y") {
            if (token == "yyyy") { x = 4; y = 4; }
            if (token == "yy") { x = 2; y = 2; }
            if (token == "y") { x = 2; y = 4; }
            year = _getInt(val, i_val, x, y);
            if (year == null) { return 0; }
            i_val += year.length;
            if (year.length == 2) {
                if (year > 70) { year = 1900 + (year - 0); }
                else { year = 2000 + (year - 0); }
            }
        }
        else if (token == "MMM" || token == "NNN") {
            month = 0;
            for (var i = 0; i < MONTH_NAMES.length; i++) {
                var month_name = MONTH_NAMES[i];
                if (val.substring(i_val, i_val + month_name.length).toLowerCase() == month_name.toLowerCase()) {
                    if (token == "MMM" || (token == "NNN" && i > 11)) {
                        month = i + 1;
                        if (month > 12) { month -= 12; }
                        i_val += month_name.length;
                        break;
                    }
                }
            }
            if ((month < 1) || (month > 12)) { return 0; }
        }
        else if (token == "EE" || token == "E") {
            for (var i = 0; i < DAY_NAMES.length; i++) {
                var day_name = DAY_NAMES[i];
                if (val.substring(i_val, i_val + day_name.length).toLowerCase() == day_name.toLowerCase()) {
                    i_val += day_name.length;
                    break;
                }
            }
        }
        else if (token == "MM" || token == "M") {
            month = _getInt(val, i_val, token.length, 2);
            if (month == null || (month < 1) || (month > 12)) { return 0; }
            i_val += month.length;
        }
        else if (token == "dd" || token == "d") {
            date = _getInt(val, i_val, token.length, 2);
            if (date == null || (date < 1) || (date > 31)) { return 0; }
            i_val += date.length;
        }
        else if (token == "hh" || token == "h") {
            hh = _getInt(val, i_val, token.length, 2);
            if (hh == null || (hh < 1) || (hh > 12)) { return 0; }
            i_val += hh.length;
        }
        else if (token == "HH" || token == "H") {
            hh = _getInt(val, i_val, token.length, 2);
            if (hh == null || (hh < 0) || (hh > 23)) { return 0; }
            i_val += hh.length;
        }
        else if (token == "KK" || token == "K") {
            hh = _getInt(val, i_val, token.length, 2);
            if (hh == null || (hh < 0) || (hh > 11)) { return 0; }
            i_val += hh.length;
        }
        else if (token == "kk" || token == "k") {
            hh = _getInt(val, i_val, token.length, 2);
            if (hh == null || (hh < 1) || (hh > 24)) { return 0; }
            i_val += hh.length; hh--;
        }
        else if (token == "mm" || token == "m") {
            mm = _getInt(val, i_val, token.length, 2);
            if (mm == null || (mm < 0) || (mm > 59)) { return 0; }
            i_val += mm.length;
        }
        else if (token == "ss" || token == "s") {
            ss = _getInt(val, i_val, token.length, 2);
            if (ss == null || (ss < 0) || (ss > 59)) { return 0; }
            i_val += ss.length;
        }
        else if (token == "a") {
            if (val.substring(i_val, i_val + 2).toLowerCase() == "am") { ampm = "AM"; }
            else if (val.substring(i_val, i_val + 2).toLowerCase() == "pm") { ampm = "PM"; }
            else { return 0; }
            i_val += 2;
        }
        else {
            if (val.substring(i_val, i_val + token.length) != token) { return 0; }
            else { i_val += token.length; }
        }
    }
    if (i_val != val.length) { return 0; }
    if (month == 2) {
        if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) { // leap year
            if (date > 29) { return 0; }
        }
        else { if (date > 28) { return 0; } }
    }
    if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
        if (date > 30) { return 0; }
    }
    if (hh < 12 && ampm == "PM") { hh = hh - 0 + 12; }
    else if (hh > 11 && ampm == "AM") { hh -= 12; }
    var newdate = new Date(year, month - 1, date, hh, mm, ss);
    return newdate.getTime();
}

function parseDate(val) {
    var preferEuro = (arguments.length == 2) ? arguments[1] : false;
    generalFormats = new Array('y-M-d', 'MMM d, y', 'MMM d,y', 'y-MMM-d', 'd-MMM-y', 'MMM d');
    monthFirst = new Array('M/d/y', 'M-d-y', 'M.d.y', 'MMM-d', 'M/d', 'M-d');
    dateFirst = new Array('d/M/y', 'd-M-y', 'd.M.y', 'd-MMM', 'd/M', 'd-M');
    var checkList = new Array('generalFormats', preferEuro ? 'dateFirst' : 'monthFirst', preferEuro ? 'monthFirst' : 'dateFirst');
    var d = null;
    for (var i = 0; i < checkList.length; i++) {
        var l = window[checkList[i]];
        for (var j = 0; j < l.length; j++) {
            d = getDateFromFormat(val, l[j]);
            if (d != 0) { return new Date(d); }
        }
    }
    return null;
}

function PopupWindow_getXYPosition(anchorname) {
    var coordinates;
    if (this.type == "WINDOW") {
        coordinates = getAnchorWindowPosition(anchorname);
    }
    else {
        coordinates = getAnchorPosition(anchorname);
    }
    this.x = coordinates.x;
    this.y = coordinates.y;
}
function PopupWindow_setSize(width, height) {
    this.width = width;
    this.height = height;
}
function PopupWindow_populate(contents) {
    this.contents = contents;
    this.populated = false;
}
function PopupWindow_setUrl(url) {
    this.url = url;
}
function PopupWindow_setWindowProperties(props) {
    this.windowProperties = props;
}
function PopupWindow_refresh() {
    if (this.divName != null) {
        if (this.use_gebi) {
            document.getElementById(this.divName).innerHTML = this.contents;
        }
        else if (this.use_css) {
            document.all[this.divName].innerHTML = this.contents;
        }
        else if (this.use_layers) {
            var d = document.layers[this.divName];
            d.document.open();
            d.document.writeln(this.contents);
            d.document.close();
        }
    }
    else {
        if (this.popupWindow != null && !this.popupWindow.closed) {
            if (this.url != "") {
                this.popupWindow.location.href = this.url;
            }
            else {
                this.popupWindow.document.open();
                this.popupWindow.document.writeln(this.contents);
                this.popupWindow.document.close();
            }
            this.popupWindow.focus();
        }
    }
}
function PopupWindow_showPopup(anchorname) {
    this.getXYPosition(anchorname);
    //    this.x += this.offsetX;
    //    this.y += this.offsetY;
    //    this.x = this.offsetX;
    //    this.y = this.offsetY;
    this.x = getElementPosition(anchorname).left;
    this.y = getElementPosition(anchorname).top - 7;
    //alert(this.x + " - " + this.y + " | " + getElementPosition(anchorname).top + " - " + getElementPosition(anchorname).left);
    if (!this.populated && (this.contents != "")) {
        this.populated = true;
        this.refresh();
    }
    if (this.divName != null) {
        if (this.use_gebi) {
            document.getElementById(this.divName).style.left = this.x + "px";
            document.getElementById(this.divName).style.top = this.y + "px";
            document.getElementById(this.divName).style.visibility = "visible";
        }
        else if (this.use_css) {
            document.all[this.divName].style.left = this.x;
            document.all[this.divName].style.top = this.y;
            document.all[this.divName].style.visibility = "visible";
        }
        else if (this.use_layers) {
            document.layers[this.divName].left = this.x;
            document.layers[this.divName].top = this.y;
            document.layers[this.divName].visibility = "visible";
        }
    }
    else {
        if (this.popupWindow == null || this.popupWindow.closed) {
            if (this.x < 0) { this.x = 0; }
            if (this.y < 0) { this.y = 0; }
            if (screen && screen.availHeight) {
                if ((this.y + this.height) > screen.availHeight) {
                    this.y = screen.availHeight - this.height;
                }
            }
            if (screen && screen.availWidth) {
                if ((this.x + this.width) > screen.availWidth) {
                    this.x = screen.availWidth - this.width;
                }
            }
            var avoidAboutBlank = window.opera || (document.layers && !navigator.mimeTypes['*']) || navigator.vendor == 'KDE' || (document.childNodes && !document.all && !navigator.taintEnabled);
            this.popupWindow = window.open(avoidAboutBlank ? "" : "about:blank", "window_" + anchorname, this.windowProperties + ",width=" + this.width + ",height=" + this.height + ",screenX=" + this.x + ",left=" + this.x + ",screenY=" + this.y + ",top=" + this.y + "");
        }
        this.refresh();
    }
}
function PopupWindow_hidePopup() {
    if (this.divName != null) {
        if (this.use_gebi) {
            document.getElementById(this.divName).style.visibility = "hidden";
        }
        else if (this.use_css) {
            document.all[this.divName].style.visibility = "hidden";
        }
        else if (this.use_layers) {
            document.layers[this.divName].visibility = "hidden";
        }
    }
    else {
        if (this.popupWindow && !this.popupWindow.closed) {
            this.popupWindow.close();
            this.popupWindow = null;
        }
    }
}
function PopupWindow_isClicked(e) {
    if (this.divName != null) {
        if (this.use_layers) {
            var clickX = e.pageX;
            var clickY = e.pageY;
            var t = document.layers[this.divName];
            if ((clickX > t.left) && (clickX < t.left + t.clip.width) && (clickY > t.top) && (clickY < t.top + t.clip.height)) {
                return true;
            }
            else { return false; }
        }
        else if (window.event != null) { // Need to hard-code this to trap IE for error-handling
            var t = window.event.srcElement;
            while (t.parentElement != null) {
                if (t.id == this.divName) {
                    return true;
                }
                t = t.parentElement;
            }
            return false;
        }
        else if (this.use_gebi && e) {
            var t = e.originalTarget;
            while (t.parentNode != null) {
                if (t.id == this.divName) {
                    return true;
                }
                t = t.parentNode;
            }
            return false;
        }
        return false;
    }
    return false;
}
function PopupWindow_hideIfNotClicked(e) {
    if (this.autoHideEnabled && !this.isClicked(e)) {
        this.hidePopup();
    }
}
function PopupWindow_autoHide() {
    this.autoHideEnabled = true;
}
function PopupWindow_hidePopupWindows(e) {
    for (var i = 0; i < popupWindowObjects.length; i++) {
        if (popupWindowObjects[i] != null) {
            var p = popupWindowObjects[i];
            p.hideIfNotClicked(e);
        }
    }
}
function PopupWindow_attachListener() {
    if (document.layers) {
        document.captureEvents(Event.MOUSEUP);
    }
    window.popupWindowOldEventListener = document.onmouseup;
    if (window.popupWindowOldEventListener != null) {
        document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");
    }
    else {
        document.onmouseup = PopupWindow_hidePopupWindows;
    }
}
function PopupWindow() {
    if (!window.popupWindowIndex) { window.popupWindowIndex = 0; }
    if (!window.popupWindowObjects) { window.popupWindowObjects = new Array(); }
    if (!window.listenerAttached) {
        window.listenerAttached = true;
        PopupWindow_attachListener();
    }
    this.index = popupWindowIndex++;
    popupWindowObjects[this.index] = this;
    this.divName = null;
    this.popupWindow = null;
    this.width = 0;
    this.height = 0;
    this.populated = false;
    this.visible = false;
    this.autoHideEnabled = false;

    this.contents = "";
    this.url = "";
    this.windowProperties = "toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no";
    if (arguments.length > 0) {
        this.type = "DIV";
        this.divName = arguments[0];
    }
    else {
        this.type = "WINDOW";
    }
    this.use_gebi = false;
    this.use_css = false;
    this.use_layers = false;
    if (document.getElementById) { this.use_gebi = true; }
    else if (document.all) { this.use_css = true; }
    else if (document.layers) { this.use_layers = true; }
    else { this.type = "WINDOW"; }
    this.offsetX = 0;
    this.offsetY = 0;
    this.getXYPosition = PopupWindow_getXYPosition;
    this.populate = PopupWindow_populate;
    this.setUrl = PopupWindow_setUrl;
    this.setWindowProperties = PopupWindow_setWindowProperties;
    this.refresh = PopupWindow_refresh;
    this.showPopup = PopupWindow_showPopup;
    this.hidePopup = PopupWindow_hidePopup;
    this.setSize = PopupWindow_setSize;
    this.isClicked = PopupWindow_isClicked;
    this.autoHide = PopupWindow_autoHide;
    this.hideIfNotClicked = PopupWindow_hideIfNotClicked;
}
function CalendarPopup() {
    var c;
    if (arguments.length > 0) {
        c = new PopupWindow(arguments[0]);
    }
    else {
        c = new PopupWindow();
        c.setSize(150, 175);
    }
    c.offsetX = -152;
    c.offsetY = 25;
    c.autoHide();
    c.monthNames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
    c.monthAbbreviations = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
    c.dayHeaders = new Array("S", "M", "T", "W", "T", "F", "S");
    c.returnFunction = "CP_tmpReturnFunction";
    c.returnMonthFunction = "CP_tmpReturnMonthFunction";
    c.returnQuarterFunction = "CP_tmpReturnQuarterFunction";
    c.returnYearFunction = "CP_tmpReturnYearFunction";
    c.weekStartDay = 0;
    c.isShowYearNavigation = false;
    c.displayType = "date";
    c.disabledWeekDays = new Object();
    c.disabledDatesExpression = "";
    c.yearSelectStartOffset = 2;
    c.currentDate = null;
    c.todayText = "Today";
    c.cssPrefix = "";
    c.isShowNavigationDropdowns = false;
    c.isShowYearNavigationInput = false;
    window.CP_calendarObject = null;
    window.CP_targetInput = null;
    window.CP_dateFormat = "MM/dd/yyyy";
    // Method mappings
    c.copyMonthNamesToWindow = CP_copyMonthNamesToWindow;
    c.setReturnFunction = CP_setReturnFunction;
    c.setReturnMonthFunction = CP_setReturnMonthFunction;
    c.setReturnQuarterFunction = CP_setReturnQuarterFunction;
    c.setReturnYearFunction = CP_setReturnYearFunction;
    c.setMonthNames = CP_setMonthNames;
    c.setMonthAbbreviations = CP_setMonthAbbreviations;
    c.setDayHeaders = CP_setDayHeaders;
    c.setWeekStartDay = CP_setWeekStartDay;
    c.setDisplayType = CP_setDisplayType;
    c.setDisabledWeekDays = CP_setDisabledWeekDays;
    c.addDisabledDates = CP_addDisabledDates;
    c.setYearSelectStartOffset = CP_setYearSelectStartOffset;
    c.setTodayText = CP_setTodayText;
    c.showYearNavigation = CP_showYearNavigation;
    c.showCalendar = CP_showCalendar;
    c.hideCalendar = CP_hideCalendar;
    c.getStyles = getCalendarStyles;
    c.refreshCalendar = CP_refreshCalendar;
    c.getCalendar = CP_getCalendar;
    c.select = CP_select;
    c.setCssPrefix = CP_setCssPrefix;
    c.showNavigationDropdowns = CP_showNavigationDropdowns;
    c.showYearNavigationInput = CP_showYearNavigationInput;
    c.copyMonthNamesToWindow();
    return c;
}
function CP_copyMonthNamesToWindow() {
    if (typeof (window.MONTH_NAMES) != "undefined" && window.MONTH_NAMES != null) {
        window.MONTH_NAMES = new Array();
        for (var i = 0; i < this.monthNames.length; i++) {
            window.MONTH_NAMES[window.MONTH_NAMES.length] = this.monthNames[i];
        }
        for (var i = 0; i < this.monthAbbreviations.length; i++) {
            window.MONTH_NAMES[window.MONTH_NAMES.length] = this.monthAbbreviations[i];
        }
    }
}
function CP_tmpReturnFunction(y, m, d) {
    if (window.CP_targetInput != null) {
        var dt = new Date(y, m - 1, d, 0, 0, 0);
        if (window.CP_calendarObject != null) { window.CP_calendarObject.copyMonthNamesToWindow(); }
        window.CP_targetInput.value = formatDate(dt, window.CP_dateFormat);
        window.CP_targetInput.style.color = '';
    }
    else {
        alert('Use setReturnFunction() to define which function will get the clicked results!');
    }
}
function CP_tmpReturnMonthFunction(y, m) {
    alert('Use setReturnMonthFunction() to define which function will get the clicked results!\nYou clicked: year=' + y + ' , month=' + m);
}
function CP_tmpReturnQuarterFunction(y, q) {
    alert('Use setReturnQuarterFunction() to define which function will get the clicked results!\nYou clicked: year=' + y + ' , quarter=' + q);
}
function CP_tmpReturnYearFunction(y) {
    alert('Use setReturnYearFunction() to define which function will get the clicked results!\nYou clicked: year=' + y);
}
function CP_setReturnFunction(name) { this.returnFunction = name; }
function CP_setReturnMonthFunction(name) { this.returnMonthFunction = name; }
function CP_setReturnQuarterFunction(name) { this.returnQuarterFunction = name; }
function CP_setReturnYearFunction(name) { this.returnYearFunction = name; }
function CP_setMonthNames() {
    for (var i = 0; i < arguments.length; i++) { this.monthNames[i] = arguments[i]; }
    this.copyMonthNamesToWindow();
}
function CP_setMonthAbbreviations() {
    for (var i = 0; i < arguments.length; i++) { this.monthAbbreviations[i] = arguments[i]; }
    this.copyMonthNamesToWindow();
}
function CP_setDayHeaders() {
    for (var i = 0; i < arguments.length; i++) { this.dayHeaders[i] = arguments[i]; }
}
function CP_setWeekStartDay(day) {
    this.weekStartDay = day;
}
function CP_showYearNavigation() {
    this.isShowYearNavigation = (arguments.length > 0) ? arguments[0] : true;
}
function CP_setDisplayType(type) {
    if (type != "date" && type != "week-end" && type != "month" && type != "quarter" && type != "year") { alert("Invalid display type! Must be one of: date,week-end,month,quarter,year"); return false; }
    this.displayType = type;
}
function CP_setYearSelectStartOffset(num) {
    this.yearSelectStartOffset = num;
}
function CP_setDisabledWeekDays() {
    this.disabledWeekDays = new Object();
    for (var i = 0; i < arguments.length; i++) { this.disabledWeekDays[arguments[i]] = true; }
}
function CP_addDisabledDates(start, end) {
    if (arguments.length == 1) { end = start; }
    if (start == null && end == null) { return; }
    if (this.disabledDatesExpression != "") { this.disabledDatesExpression += "||"; }
    if (start != null) { start = parseDate(start); start = "" + start.getFullYear() + LZ(start.getMonth() + 1) + LZ(start.getDate()); }
    if (end != null) { end = parseDate(end); end = "" + end.getFullYear() + LZ(end.getMonth() + 1) + LZ(end.getDate()); }
    if (start == null) { this.disabledDatesExpression += "(ds<=" + end + ")"; }
    else if (end == null) { this.disabledDatesExpression += "(ds>=" + start + ")"; }
    else { this.disabledDatesExpression += "(ds>=" + start + "&&ds<=" + end + ")"; }
}
function CP_setTodayText(text) {
    this.todayText = text;
}
function CP_setCssPrefix(val) {
    this.cssPrefix = val;
}
function CP_showNavigationDropdowns() {
    this.isShowNavigationDropdowns = (arguments.length > 0) ? arguments[0] : true;
}
function CP_showYearNavigationInput() {
    this.isShowYearNavigationInput = (arguments.length > 0) ? arguments[0] : true;
}
function CP_hideCalendar() {
    if (arguments.length > 0) { window.popupWindowObjects[arguments[0]].hidePopup(); }
    else { this.hidePopup(); }
}
function CP_refreshCalendar(index) {
    var calObject = window.popupWindowObjects[index];
    if (arguments.length > 1) {
        calObject.populate(calObject.getCalendar(arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]));
    }
    else {
        calObject.populate(calObject.getCalendar());
    }
    calObject.refresh();
}
function CP_showCalendar(anchorname) {
    if (arguments.length > 1) {
        if (arguments[1] == null || arguments[1] == "") {
            this.currentDate = new Date();
        }
        else {
            this.currentDate = new Date(parseDate(arguments[1]));
        }
    }
    this.populate(this.getCalendar());
    this.showPopup(anchorname);
}
function CP_select(inputobj, linkname, format) {
    var selectedDate = (arguments.length > 3) ? arguments[3] : null;
    if (!window.getDateFromFormat) {
        alert("calendar.select: To use this method you must also include 'date.js' for date formatting");
        return;
    }
    if (this.displayType != "date" && this.displayType != "week-end") {
        alert("calendar.select: This function can only be used with displayType 'date' or 'week-end'");
        return;
    }
    if (inputobj.type != "text" && inputobj.type != "hidden" && inputobj.type != "textarea") {
        alert("calendar.select: Input object passed is not a valid form input object");
        window.CP_targetInput = null;
        return;
    }
    if (inputobj.disabled) { return; } // Can't use calendar input on disabled form input!
    window.CP_targetInput = inputobj;
    window.CP_calendarObject = this;
    this.currentDate = null;
    var time = 0;
    if (selectedDate != null) {
        time = getDateFromFormat(selectedDate, format)
    }
    else if (inputobj.value != "") {
        time = getDateFromFormat(inputobj.value, format);
    }
    if (selectedDate != null || inputobj.value != "") {
        if (time == 0) { this.currentDate = null; }
        else { this.currentDate = new Date(time); }
    }
    window.CP_dateFormat = format;
    this.showCalendar(linkname);
}
function getCalendarStyles() {
    var result = "";
    var p = "";
    if (this != null && typeof (this.cssPrefix) != "undefined" && this.cssPrefix != null && this.cssPrefix != "") { p = this.cssPrefix; }
    result += "<STYLE>\n";
    result += "." + p + "cpYearNavigation,." + p + "cpMonthNavigation { background-color:#FFF35A; text-align:center; vertical-align:center; text-decoration:none; color:#29459C; font-weight:bold; }\n";
    result += "." + p + "cpDayColumnHeader, ." + p + "cpYearNavigation,." + p + "cpMonthNavigation,." + p + "cpCurrentMonthDate,." + p + "cpCurrentMonthDateDisabled,." + p + "cpOtherMonthDate,." + p + "cpOtherMonthDateDisabled,." + p + "cpCurrentDate,." + p + "cpCurrentDateDisabled,." + p + "cpTodayText,." + p + "cpTodayTextDisabled,." + p + "cpText { font-family:arial; font-size:8pt; }\n";
    result += "TD." + p + "cpDayColumnHeader { text-align:right; border:solid thin #C0C0C0;border-width:0px 0px 1px 0px; }\n";
    result += "." + p + "cpCurrentMonthDate, ." + p + "cpOtherMonthDate, ." + p + "cpCurrentDate  { text-align:right; text-decoration:none; }\n";
    result += "." + p + "cpCurrentMonthDateDisabled, ." + p + "cpOtherMonthDateDisabled, ." + p + "cpCurrentDateDisabled { color:#D0D0D0; text-align:right; text-decoration:line-through; }\n";
    result += "." + p + "cpCurrentMonthDate, .cpCurrentDate { color:#000000; }\n";
    result += "." + p + "cpOtherMonthDate { color:#808080; }\n";
    result += "TD." + p + "cpCurrentDate { color:white; background-color: #C0C0C0; border-width:1px; border:solid thin #800000; }\n";
    result += "TD." + p + "cpCurrentDateDisabled { border-width:1px; border:solid thin #FFAAAA; }\n";
    result += "TD." + p + "cpTodayText, TD." + p + "cpTodayTextDisabled { border:solid thin #C0C0C0; border-width:1px 0px 0px 0px;}\n";
    result += "A." + p + "cpTodayText, SPAN." + p + "cpTodayTextDisabled { height:20px; }\n";
    result += "A." + p + "cpTodayText { color:1861E7; }\n";
    result += "." + p + "cpTodayTextDisabled { color:#D0D0D0; }\n";
    result += "." + p + "cpBorder { border:solid thin #808080; }\n";
    result += "</STYLE>\n";
    return result;
}
function CP_getCalendar() {
    var now = new Date();
    if (this.type == "WINDOW") { var windowref = "window.opener."; }
    else { var windowref = ""; }
    var result = "";
    if (this.type == "WINDOW") {
        result += "<HTML><HEAD><TITLE>Calendar</TITLE>" + this.getStyles() + "</HEAD><BODY MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 RIGHTMARGIN=0 LEFTMARGIN=0>\n";
        result += '<CENTER><TABLE WIDTH=100% BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
    }
    else {
        result += '<TABLE CLASS="' + this.cssPrefix + 'cpBorder" WIDTH=144 BORDER=1 BORDERWIDTH=1 CELLSPACING=0 CELLPADDING=1>\n';
        result += '<TR><TD ALIGN=CENTER>\n';
        result += '<CENTER>\n';
    }
    if (this.displayType == "date" || this.displayType == "week-end") {
        if (this.currentDate == null) { this.currentDate = now; }
        if (arguments.length > 0) { var month = arguments[0]; }
        else { var month = this.currentDate.getMonth() + 1; }
        if (arguments.length > 1 && arguments[1] > 0 && arguments[1] - 0 == arguments[1]) { var year = arguments[1]; }
        else { var year = this.currentDate.getFullYear(); }
        var daysinmonth = new Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
            daysinmonth[2] = 29;
        }
        var current_month = new Date(year, month - 1, 1);
        var display_year = year;
        var display_month = month;
        var display_date = 1;
        var weekday = current_month.getDay();
        var offset = 0;

        offset = (weekday >= this.weekStartDay) ? weekday - this.weekStartDay : 7 - this.weekStartDay + weekday;
        if (offset > 0) {
            display_month--;
            if (display_month < 1) { display_month = 12; display_year--; }
            display_date = daysinmonth[display_month] - offset + 1;
        }
        var next_month = month + 1;
        var next_month_year = year;
        if (next_month > 12) { next_month = 1; next_month_year++; }
        var last_month = month - 1;
        var last_month_year = year;
        if (last_month < 1) { last_month = 12; last_month_year--; }
        var date_class;
        if (this.type != "WINDOW") {
            result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
        }
        result += '<TR>\n';
        var refresh = windowref + 'CP_refreshCalendar';
        var refreshLink = 'javascript:' + refresh;
        if (this.isShowNavigationDropdowns) {
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="78" COLSPAN="3"><select CLASS="' + this.cssPrefix + 'cpMonthNavigation" name="cpMonth" onChange="' + refresh + '(' + this.index + ',this.options[this.selectedIndex].value-0,' + (year - 0) + ');">';
            for (var monthCounter = 1; monthCounter <= 12; monthCounter++) {
                var selected = (monthCounter == month) ? 'SELECTED' : '';
                result += '<option value="' + monthCounter + '" ' + selected + '>' + this.monthNames[monthCounter - 1] + '</option>';
            }
            result += '</select></TD>';
            result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';

            result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="56" COLSPAN="3"><select CLASS="' + this.cssPrefix + 'cpYearNavigation" name="cpYear" onChange="' + refresh + '(' + this.index + ',' + month + ',this.options[this.selectedIndex].value-0);">';
            for (var yearCounter = year - this.yearSelectStartOffset; yearCounter <= year + this.yearSelectStartOffset; yearCounter++) {
                var selected = (yearCounter == year) ? 'SELECTED' : '';
                result += '<option value="' + yearCounter + '" ' + selected + '>' + yearCounter + '</option>';
            }
            result += '</select></TD>';
        }
        else {
            if (this.isShowYearNavigation) {
                result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="10"><A CLASS="' + this.cssPrefix + 'cpMonthNavigation" HREF="' + refreshLink + '(' + this.index + ',' + last_month + ',' + last_month_year + ');">&lt;</A></TD>';
                result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="58"><SPAN CLASS="' + this.cssPrefix + 'cpMonthNavigation">' + this.monthNames[month - 1] + '</SPAN></TD>';
                result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="10"><A CLASS="' + this.cssPrefix + 'cpMonthNavigation" HREF="' + refreshLink + '(' + this.index + ',' + next_month + ',' + next_month_year + ');">&gt;</A></TD>';
                result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';

                result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="10"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="' + refreshLink + '(' + this.index + ',' + month + ',' + (year - 1) + ');">&lt;</A></TD>';
                if (this.isShowYearNavigationInput) {
                    result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="36"><INPUT NAME="cpYear" CLASS="' + this.cssPrefix + 'cpYearNavigation" SIZE="4" MAXLENGTH="4" VALUE="' + year + '" onBlur="' + refresh + '(' + this.index + ',' + month + ',this.value-0);"></TD>';
                }
                else {
                    result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="36"><SPAN CLASS="' + this.cssPrefix + 'cpYearNavigation">' + year + '</SPAN></TD>';
                }
                result += '<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="10"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="' + refreshLink + '(' + this.index + ',' + month + ',' + (year + 1) + ');">&gt;</A></TD>';
            }
            else {
                result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="22"><A CLASS="' + this.cssPrefix + 'cpMonthNavigation" HREF="' + refreshLink + '(' + this.index + ',' + last_month + ',' + last_month_year + ');">&lt;&lt;</A></TD>\n';
                result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="100"><SPAN CLASS="' + this.cssPrefix + 'cpMonthNavigation">' + this.monthNames[month - 1] + ' ' + year + '</SPAN></TD>\n';
                result += '<TD CLASS="' + this.cssPrefix + 'cpMonthNavigation" WIDTH="22"><A CLASS="' + this.cssPrefix + 'cpMonthNavigation" HREF="' + refreshLink + '(' + this.index + ',' + next_month + ',' + next_month_year + ');">&gt;&gt;</A></TD>\n';
            }
        }
        result += '</TR></TABLE>\n';
        result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=0 CELLPADDING=1 ALIGN=CENTER>\n';
        result += '<TR>\n';
        for (var j = 0; j < 7; j++) {

            result += '<TD CLASS="' + this.cssPrefix + 'cpDayColumnHeader" WIDTH="14%"><SPAN CLASS="' + this.cssPrefix + 'cpDayColumnHeader">' + this.dayHeaders[(this.weekStartDay + j) % 7] + '</TD>\n';
        }
        result += '</TR>\n';
        for (var row = 1; row <= 6; row++) {
            result += '<TR>\n';
            for (var col = 1; col <= 7; col++) {
                var disabled = false;
                if (this.disabledDatesExpression != "") {
                    var ds = "" + display_year + LZ(display_month) + LZ(display_date);
                    eval("disabled=(" + this.disabledDatesExpression + ")");
                }
                var dateClass = "";
                if ((display_month == this.currentDate.getMonth() + 1) && (display_date == this.currentDate.getDate()) && (display_year == this.currentDate.getFullYear())) {
                    dateClass = "cpCurrentDate";
                }
                else if (display_month == month) {
                    dateClass = "cpCurrentMonthDate";
                }
                else {
                    dateClass = "cpOtherMonthDate";
                }
                if (disabled || this.disabledWeekDays[col - 1]) {
                    result += '	<TD CLASS="' + this.cssPrefix + dateClass + '"><SPAN CLASS="' + this.cssPrefix + dateClass + 'Disabled">' + display_date + '</SPAN></TD>\n';
                }
                else {
                    var selected_date = display_date;
                    var selected_month = display_month;
                    var selected_year = display_year;
                    if (this.displayType == "week-end") {
                        var d = new Date(selected_year, selected_month - 1, selected_date, 0, 0, 0, 0);
                        d.setDate(d.getDate() + (7 - col));
                        selected_year = d.getYear();
                        if (selected_year < 1000) { selected_year += 1900; }
                        selected_month = d.getMonth() + 1;
                        selected_date = d.getDate();
                    }
                    result += '	<TD CLASS="' + this.cssPrefix + dateClass + '"><A HREF="javascript:' + windowref + this.returnFunction + '(' + selected_year + ',' + selected_month + ',' + selected_date + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');" CLASS="' + this.cssPrefix + dateClass + '">' + display_date + '</A></TD>\n';
                }
                display_date++;
                if (display_date > daysinmonth[display_month]) {
                    display_date = 1;
                    display_month++;
                }
                if (display_month > 12) {
                    display_month = 1;
                    display_year++;
                }
            }
            result += '</TR>';
        }
        var current_weekday = now.getDay() - this.weekStartDay;
        if (current_weekday < 0) {
            current_weekday += 7;
        }
        result += '<TR>\n';
        result += '	<TD COLSPAN=7 ALIGN=CENTER CLASS="' + this.cssPrefix + 'cpTodayText">\n';
        if (this.disabledDatesExpression != "") {
            var ds = "" + now.getFullYear() + LZ(now.getMonth() + 1) + LZ(now.getDate());
            eval("disabled=(" + this.disabledDatesExpression + ")");
        }
        if (disabled || this.disabledWeekDays[current_weekday + 1]) {
            result += '		<SPAN CLASS="' + this.cssPrefix + 'cpTodayTextDisabled">' + this.todayText + '</SPAN>\n';
        }
        else {
            result += '		<A CLASS="' + this.cssPrefix + 'cpTodayText" HREF="javascript:' + windowref + this.returnFunction + '(\'' + now.getFullYear() + '\',\'' + (now.getMonth() + 1) + '\',\'' + now.getDate() + '\');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');">' + this.todayText + '</A>\n';
        }
        result += '		<BR>\n';
        result += '	</TD></TR></TABLE></CENTER></TD></TR></TABLE>\n';
    }
    if (this.displayType == "month" || this.displayType == "quarter" || this.displayType == "year") {
        if (arguments.length > 0) { var year = arguments[0]; }
        else {
            if (this.displayType == "year") { var year = now.getFullYear() - this.yearSelectStartOffset; }
            else { var year = now.getFullYear(); }
        }
        if (this.displayType != "year" && this.isShowYearNavigation) {
            result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
            result += '<TR>\n';
            result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="22"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="javascript:' + windowref + 'CP_refreshCalendar(' + this.index + ',' + (year - 1) + ');">&lt;&lt;</A></TD>\n';
            result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="100">' + year + '</TD>\n';
            result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="22"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="javascript:' + windowref + 'CP_refreshCalendar(' + this.index + ',' + (year + 1) + ');">&gt;&gt;</A></TD>\n';
            result += '</TR></TABLE>\n';
        }
    }
    if (this.displayType == "month") {
        result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
        for (var i = 0; i < 4; i++) {
            result += '<TR>';
            for (var j = 0; j < 3; j++) {
                var monthindex = ((i * 3) + j);
                result += '<TD WIDTH=33% ALIGN=CENTER><A CLASS="' + this.cssPrefix + 'cpText" HREF="javascript:' + windowref + this.returnMonthFunction + '(' + year + ',' + (monthindex + 1) + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');" CLASS="' + date_class + '">' + this.monthAbbreviations[monthindex] + '</A></TD>';
            }
            result += '</TR>';
        }
        result += '</TABLE></CENTER></TD></TR></TABLE>\n';
    }
    if (this.displayType == "quarter") {
        result += '<BR><TABLE WIDTH=120 BORDER=1 CELLSPACING=0 CELLPADDING=0 ALIGN=CENTER>\n';
        for (var i = 0; i < 2; i++) {
            result += '<TR>';
            for (var j = 0; j < 2; j++) {
                var quarter = ((i * 2) + j + 1);
                result += '<TD WIDTH=50% ALIGN=CENTER><BR><A CLASS="' + this.cssPrefix + 'cpText" HREF="javascript:' + windowref + this.returnQuarterFunction + '(' + year + ',' + quarter + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');" CLASS="' + date_class + '">Q' + quarter + '</A><BR><BR></TD>';
            }
            result += '</TR>';
        }
        result += '</TABLE></CENTER></TD></TR></TABLE>\n';
    }
    if (this.displayType == "year") {
        var yearColumnSize = 4;
        result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
        result += '<TR>\n';
        result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="50%"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="javascript:' + windowref + 'CP_refreshCalendar(' + this.index + ',' + (year - (yearColumnSize * 2)) + ');">&lt;&lt;</A></TD>\n';
        result += '	<TD CLASS="' + this.cssPrefix + 'cpYearNavigation" WIDTH="50%"><A CLASS="' + this.cssPrefix + 'cpYearNavigation" HREF="javascript:' + windowref + 'CP_refreshCalendar(' + this.index + ',' + (year + (yearColumnSize * 2)) + ');">&gt;&gt;</A></TD>\n';
        result += '</TR></TABLE>\n';
        result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
        for (var i = 0; i < yearColumnSize; i++) {
            for (var j = 0; j < 2; j++) {
                var currentyear = year + (j * yearColumnSize) + i;
                result += '<TD WIDTH=50% ALIGN=CENTER><A CLASS="' + this.cssPrefix + 'cpText" HREF="javascript:' + windowref + this.returnYearFunction + '(' + currentyear + ');' + windowref + 'CP_hideCalendar(\'' + this.index + '\');" CLASS="' + date_class + '">' + currentyear + '</A></TD>';
            }
            result += '</TR>';
        }
        result += '</TABLE></CENTER></TD></TR></TABLE>\n';
    }
    if (this.type == "WINDOW") {
        result += "</BODY></HTML>\n";
    }
    return result;
}


function dateFormat(sender) {
    sender.value = fieldFilter(sender);
    vr = sender.value;
    size = vr.length;

    if (size > 2 && size < 5)
        sender.value = vr.substr(0, size - 2) + '/' + vr.substr(size - 2, size);
    if (size >= 5 && size <= 10)
        sender.value = vr.substr(0, 2) + '/' + vr.substr(2, 2) + '/' + vr.substr(4, 4);

}

function fieldFilter(sender) {
    var s = "";
    var cp = "";
    vr = sender.value;
    size = vr.length;
    for (i = 0; i < size; i++) {
        if (vr.substring(i, i + 1) != "/" && vr.substring(i, i + 1) != "-" && vr.substring(i, i + 1) != "." && vr.substring(i, i + 1) != ",") {
            s = s + vr.substring(i, i + 1);
        }
    }
    sender.value = s;
    return cp = sender.value
}


function addressBoxItemShow(prefix, wich, howMany) {

    var i = 1;
    for (i = 1; i <= howMany; i++) {
        if (wich != i) {
            document.getElementById(prefix + i).style.visibility = 'hidden';
            document.getElementById(prefix + i).style.display = 'none';

        } else {
            document.getElementById(prefix + i).style.visibility = 'visible';
            document.getElementById(prefix + i).style.display = '';
        }
    }
}

function getProperty(el, cssproperty, csspropertyNS) {
    if (el.currentStyle)
        return el.currentStyle[cssproperty];
    else if (window.getComputedStyle) {
        var elstyle = window.getComputedStyle(el, "")
        return elstyle.getPropertyValue(csspropertyNS);
    }
}


