﻿document.onclick = function (e) {
    e = window.event || e;
    var lluSourceElem = e.target || e.srcElement;
    var dropDownClicked = false;
    var datePickerClicked = false;
    if (lluSourceElem.className) {
        if (lluSourceElem.className.indexOf("lluDropDown") > -1 || lluSourceElem.className.indexOf("lluScroll") > -1) {
            dropDownClicked = true;
        }
        if (lluSourceElem.className.indexOf("datePicker") > -1) {
            datePickerClicked = true;
        }
    }
    if (lluSourceElem.id) {
        if (lluSourceElem.id.indexOf("datePicker") > -1) {
            datePickerClicked = true;
        }
    }
    if (!dropDownClicked) {
        for (var lluDD = 0; lluDD < dropDownArray.length; lluDD++) {
            var tempLluDropDown = dropDownArray[lluDD];
            tempLluDropDown.hideLLUDropDown();
        }
    }
    if (!datePickerClicked) {
        if (lluSourceElem.tagName.toLowerCase() != "input") {
            for (var lluDD2 = 0; lluDD2 < datePickerArray.length; lluDD2++) {
                var tempLluDatePicker = datePickerArray[lluDD2];
                tempLluDatePicker.hideDatePickerPanel();
            }
        }
    }
};

/* #region Drop Down Combo Box */

var dropDownArray = new Array();

function DropDownBox(panelToAddTo, defaultText, dropDownWidth, resultPanelWidth, resultPanelHeight, resultPanelOffset, isInput, autoFill, callBackFunction, mouseOverCallBack, mouseOutCallBack, themeColour) {
    var newDropDown = new Object();
    if (typeof panelToAddTo == "string") {
        newDropDown.parentPanel = document.getElementById(panelToAddTo);
    }
    else {
        newDropDown.parentPanel = panelToAddTo;
    }
    newDropDown.dropDownPanelHeight = resultPanelHeight;
    newDropDown.selectedIndex = -1;
    newDropDown.itemCount = 0;
    newDropDown.autoFill = autoFill;
    newDropDown.arrayIndex = dropDownArray.length;
    newDropDown.isInput = isInput;
    newDropDown.isMultiSelect = false;
    newDropDown.defaultText = defaultText;
    newDropDown.ajaxCallFunction = "";
    newDropDown.countBeforeCall = 0;
    newDropDown.lastTextVal = "";
    newDropDown.callBackFunction = callBackFunction;
    newDropDown.enabled = true;
    newDropDown.showSampleText = false;
    newDropDown.listDirection = "down";
    newDropDown.themeColour = "";
    newDropDown.sampleTextArray = new Array();
    if (mouseOverCallBack) {
        if (mouseOverCallBack != "") {
            newDropDown.mouseOverCallBack = mouseOverCallBack;
            newDropDown.mouseOutCallBack = mouseOutCallBack;
        }
    }
    if (themeColour) {
        newDropDown.themeColour = themeColour;
    }

    newDropDown.lluDropDownMain = document.createElement("div");
    newDropDown.lluDropDownMain.className = "lluDropDownMain" + newDropDown.themeColour;

    if (!newDropDown.isInput) {
        newDropDown.lluDropDownMain.style.width = dropDownWidth + 6 + "px";
    }
    else {
        newDropDown.lluDropDownMain.style.width = dropDownWidth + "px";
    }
    newDropDown.parentPanel.appendChild(newDropDown.lluDropDownMain);

    newDropDown.lluDropDownLeftPanel = document.createElement("div");
    newDropDown.lluDropDownLeftPanel.className = "lluDropDownLeftPanel" + newDropDown.themeColour;
    newDropDown.lluDropDownMain.appendChild(newDropDown.lluDropDownLeftPanel);

    newDropDown.lluDropDownSampleTextPanel = document.createElement("div");
    newDropDown.lluDropDownSampleTextPanel.id = "lluDropDownSampleTextPanel" + newDropDown.themeColour;
    newDropDown.lluDropDownSampleTextPanel.style.display = "none";
    newDropDown.lluDropDownSampleTextPanel.style.left = resultPanelWidth + "px";
    newDropDown.lluDropDownSampleTextPanel.innerHTML = "Aa";
    newDropDown.lluDropDownMain.appendChild(newDropDown.lluDropDownSampleTextPanel);

    if (newDropDown.isInput) {
        newDropDown.lluDropDownCentrePanel = document.createElement("input");
        newDropDown.lluDropDownCentrePanel.setAttribute("type", "text");
        newDropDown.lluDropDownCentrePanel.onclick = function () { setDropDownDefaultText('set', newDropDown.arrayIndex); };
        newDropDown.lluDropDownCentrePanel.onblur = function () { setDropDownDefaultText('clear', newDropDown.arrayIndex); };
        newDropDown.lluDropDownCentrePanel.onkeyup = function () { checkDropDownText(newDropDown.arrayIndex); };
        newDropDown.lluDropDownCentrePanel.style.width = (dropDownWidth - 6) + "px";
        newDropDown.lluDropDownCentrePanel.value = newDropDown.defaultText;
    }
    else {
        newDropDown.lluDropDownCentrePanel = document.createElement("div");
        newDropDown.lluDropDownCentrePanel.innerHTML = newDropDown.defaultText;
        newDropDown.lluDropDownCentrePanel.style.width = (dropDownWidth - 6) + "px";
        newDropDown.lluDropDownCentrePanel.onclick = function () { showLLUDropDown(newDropDown.arrayIndex); };
    }
    newDropDown.lluDropDownCentrePanel.onkeydown = function (e) { e = window.event || e; setDropDownKeyDown(e, newDropDown.arrayIndex); };
    newDropDown.lluDropDownCentrePanel.className = "lluDropDownCentrePanel" + newDropDown.themeColour;
    newDropDown.lluDropDownMain.appendChild(newDropDown.lluDropDownCentrePanel);

    newDropDown.lluDropDownRightPanel = document.createElement("div");
    newDropDown.lluDropDownRightPanel.className = "lluDropDownRightPanel" + newDropDown.themeColour;
    newDropDown.lluDropDownMain.appendChild(newDropDown.lluDropDownRightPanel);

    if (!newDropDown.isInput) {
        newDropDown.lluDropDownArrow = document.createElement("div");
        newDropDown.lluDropDownArrow.className = "lluDropDownArrow" + newDropDown.themeColour;
        newDropDown.lluDropDownArrow.onclick = function () { showLLUDropDown(newDropDown.arrayIndex); };
        newDropDown.lluDropDownMain.appendChild(newDropDown.lluDropDownArrow);
    }

    newDropDown.lluDropDownListAnimatePanel = document.createElement("div");
    newDropDown.lluDropDownListAnimatePanel.className = "lluDropDownListAnimatePanel" + newDropDown.themeColour;
    newDropDown.lluDropDownListAnimatePanel.style.width = resultPanelWidth + "px";
    newDropDown.lluDropDownListAnimatePanel.style.marginLeft = resultPanelOffset + "px";
    newDropDown.lluDropDownListAnimatePanel.style.height = "0px";
    newDropDown.lluDropDownMain.appendChild(newDropDown.lluDropDownListAnimatePanel);

    newDropDown.lluDropDownListPanel = document.createElement("div");
    newDropDown.lluDropDownListPanel.className = "lluDropDownListPanel" + newDropDown.themeColour;
    newDropDown.lluDropDownListPanel.style.width = resultPanelWidth + "px";
    newDropDown.lluDropDownListPanel.style.height = resultPanelHeight + "px";
    newDropDown.lluDropDownListPanel.style.zIndex = "1";
    newDropDown.lluDropDownListAnimatePanel.appendChild(newDropDown.lluDropDownListPanel);

    newDropDown.lluDropDownList = document.createElement("div");
    newDropDown.lluDropDownList.className = "lluDropDownList" + newDropDown.themeColour;
    newDropDown.lluDropDownList.style.width = (resultPanelWidth - 20) + "px";
    newDropDown.lluDropDownListPanel.appendChild(newDropDown.lluDropDownList);

    newDropDown.lluDropDownList.onkeydown = function (e) { e = window.event || e; setDropDownKeyDown(e, newDropDown.arrayIndex); };

    newDropDown.lluScroller = new Scroller(newDropDown.lluDropDownListPanel, newDropDown.lluDropDownList, -20, newDropDown.themeColour);
    newDropDown.lluScroller.setScrollVisible("none");
    newDropDown.lluScroller.scrollPanel.style.zIndex = "2";

    newDropDown.setAjaxCallFunction = function (functionName, countBeforeCall) {
        newDropDown.ajaxCallFunction = functionName + "();";
        newDropDown.countBeforeCall = countBeforeCall;
    }

    newDropDown.setDropDownDirection = function (direction) {
        newDropDown.listDirection = direction;
    }

    newDropDown.setMultiSelect = function (onOff) {
        newDropDown.isMultiSelect = onOff;
    }

    newDropDown.setScrollList = function (content) {
        newDropDown.lluDropDownList.innerHTML = "";
        newDropDown.lluDropDownListPanel.style.top = "0px";
        var dataArray = content.split("^^");
        newDropDown.itemCount = dataArray.length;
        var scrollListText = "";
        for (var iTemp = 0; iTemp < dataArray.length; iTemp++) {
            var loopArray = dataArray[iTemp];
            var tagValue = loopArray.split("**")[0];
            var textValue = loopArray.split("**")[2];
            var textValueEncoded = escape(loopArray.split("**")[2]);
            var dropDownFunctions = "";
            if (newDropDown.autoFill == true && !newDropDown.isMultiSelect) {
                dropDownFunctions += "setDropDownText('" + textValueEncoded + "', '" + newDropDown.arrayIndex + "');";
                if (iTemp == 0) {
                    if (!newDropDown.isInput) {
                        newDropDown.lluDropDownCentrePanel.innerHTML = loopArray.split("**")[2];
                    }
                }
            }
            dropDownFunctions += " setDropDownSelectedindex('" + iTemp + "', '" + newDropDown.arrayIndex + "');";
            if (!newDropDown.isMultiSelect) {
                dropDownFunctions += newDropDown.callBackFunction + "('" + tagValue + "," + textValueEncoded + "');";
            }
            var newItem = "<div id=\"lluDropDownItem" + iTemp + "\" class=\"lluDropDownItem" + newDropDown.themeColour + "\" onclick=\"" + dropDownFunctions + "\"";
            if (newDropDown.mouseOverCallBack) {
                newItem += " onmouseover=\"" + newDropDown.mouseOverCallBack + "('" + tagValue + "," + textValueEncoded + "');\"";
            }
            if (newDropDown.mouseOverCallBack) {
                newItem += " onmouseout=\"" + newDropDown.mouseOutCallBack + "();\"";
            }
            newItem += " style=\"width:" + (resultPanelWidth - 24) + "px;\">" +
                            loopArray.split("**")[2];

            if (newDropDown.isMultiSelect) {
                if (iTemp == 0) {
                    newItem += "<div class=\"lluDropDownCheckOn\" onclick=\"toggleDropDownCheckBox(this, '" + tagValue + "," + textValueEncoded + "', '" + newDropDown.arrayIndex + "');\"></div>";
                    newDropDown.lluDropDownCentrePanel.innerHTML = "Select Options";
                }
                else {
                    newItem += "<div class=\"lluDropDownCheckOff\" onclick=\"toggleDropDownCheckBox(this, '" + tagValue + "," + textValueEncoded + "', '" + newDropDown.arrayIndex + "');\"></div>";
                }
            }

            newItem += "</div>";
            scrollListText += newItem;
        }
        newDropDown.lluDropDownList.innerHTML = scrollListText;
        if (newDropDown.lluDropDownList.offsetHeight > newDropDown.lluDropDownListPanel.offsetHeight) {
            newDropDown.lluScroller.setScrollVisible("inline");
            newDropDown.lluScroller.setScrollHeight();
        }
        else {
            newDropDown.lluScroller.setScrollVisible("none");
        }
        if (newDropDown.isInput) {
            showLLUDropDown(newDropDown.arrayIndex);
        }
    }

    newDropDown.hideLLUDropDown = function () {
        newDropDown.lluDropDownSampleTextPanel.style.display = "none";
        $(newDropDown.lluDropDownListAnimatePanel).animate({ height: "0px" }, 250);
        newDropDown.lluScroller.mouseOver = false;
    }

    newDropDown.showLLUDropDown = function () {
        showLLUDropDown(newDropDown.arrayIndex);
    }

    newDropDown.showSamplePanel = function (status, text) {
        newDropDown.showSampleText = status;
        newDropDown.sampleTextArray = text.split("^^");
        newDropDown.lluDropDownSampleTextPanel.className = newDropDown.sampleTextArray[0];
    }

    newDropDown.setEnabled = function (status) {
        newDropDown.enabled = status;
    }

    dropDownArray[dropDownArray.length] = newDropDown;
    return newDropDown;
}

function toggleDropDownCheckBox(elem, tagVal, dropDownIndex) {
    var currDropDown = dropDownArray[dropDownIndex];
    var ddFuncts = "";
    if (elem.className == "lluDropDownCheckOff") {
        elem.className = "lluDropDownCheckOn";
        ddFuncts = currDropDown.callBackFunction + "('" + tagVal + ",on')";
    }
    else {
        elem.className = "lluDropDownCheckOff";
        ddFuncts = currDropDown.callBackFunction + "('" + tagVal + ",off')";
    }
    eval(ddFuncts);
}

function setSampleText(index, dropDownIndex) {
    var currDropDown = dropDownArray[dropDownIndex];
    currDropDown.lluDropDownSampleTextPanel.className = currDropDown.sampleTextArray[index];
}

function evaluateDropDownFunctions(functs) {
    eval(functs);
}

function setDropDownDefaultText(type, dropDownIndex) {
    var currDropDown = dropDownArray[dropDownIndex];
    if (type == "set") {
        currDropDown.lluDropDownCentrePanel.value = "";
    }
    else {
        if (currDropDown.lluDropDownCentrePanel.value == "") {
            currDropDown.lluDropDownCentrePanel.value = currDropDown.defaultText;
        }
    }
}

function checkDropDownText(dropDownIndex) {
    var currDropDown = dropDownArray[dropDownIndex];
    if (currDropDown.ajaxCallFunction != "") {
        var currDropDownText = currDropDown.lluDropDownCentrePanel.value;
        if (currDropDownText != currDropDown.defaultText) {
            if (currDropDownText.length > currDropDown.countBeforeCall) {
                if (currDropDownText != currDropDown.lastTextVal) {
                    eval(currDropDown.ajaxCallFunction);
                    currDropDown.lastTextVal = currDropDownText;
                }
            }
        }
    }
}

function setDropDownText(selectedText, dropDownIndex) {
    var currDropDown = dropDownArray[dropDownIndex];
    if (currDropDown.isInput) {
        currDropDown.lluDropDownCentrePanel.value = unescape(selectedText);
    }
    else {
        currDropDown.lluDropDownCentrePanel.innerHTML = unescape(selectedText);
    }
}

function setDropDownSelectedindex(elemIndex, dropDownIndex) {
    var currDropDown = dropDownArray[dropDownIndex];
    try {
        currDropDown.lluDropDownList.childNodes[currDropDown.selectedIndex].style.borderStyle = "solid";
    }
    catch (err) { }
    currDropDown.selectedIndex = elemIndex;
    var currElement = currDropDown.lluDropDownList.childNodes[elemIndex];
    currElement.style.borderStyle = "dashed";
    if (!currDropDown.isMultiSelect) {
        currDropDown.hideLLUDropDown();
    }
}

function setDropDownKeyDown(event, index) {
    var elem2;
    if (event.srcElement) {
        elem2 = event.srcElement;
    }
    if (event.target) {
        elem2 = event.target;
    }
    var currDropDown = dropDownArray[index];
    var actioned = false;
    if (elem2.className.indexOf("lluDropDownCentrePanel") == 0) {
        if (event.keyCode == 9) {
            var firstElement = currDropDown.lluDropDownList.firstChild;
            if (firstElement) {
                firstElement.focus();
                firstElement.style.borderStyle = "dashed";
                currDropDown.selectedIndex = 0;
            }
            actioned = true;
        }
    }
    else {
        if (currDropDown.selectedIndex > -1) {
            if (event.keyCode == 32) {
                var selectedElement2 = currDropDown.lluDropDownList.childNodes[currDropDown.selectedIndex];
                setDropDownSelectedindex(currDropDown.selectedIndex, index);
                setDropDownText(selectedElement2.innerHTML, index);
                var temp = selectedElement2.getAttribute("onclick").split(";")[0] + ";";
                eval(temp);
                actioned = true;
            }
            else {
                var selectedElement = currDropDown.lluDropDownList.childNodes[currDropDown.selectedIndex];
                var selectedElementTop = selectedElement.offsetTop;
                var selectedElementHeight = selectedElement.offsetHeight;
                var selectedElementBottom = selectedElementTop + selectedElementHeight;
                var contentTop = selectedElement.parentNode.offsetTop;
                var contentHeight = selectedElement.parentNode.offsetHeight;
                var contentBottom = contentTop + contentHeight;
                var containerHeight = currDropDown.dropDownPanelHeight;
                var moveBy = 0;
                var multiplier = 0;
                if (event.keyCode == 40) {
                    if (contentBottom > containerHeight && selectedElementBottom >= containerHeight) {
                        multiplier = (contentHeight - selectedElementBottom) / 22;
                        if ((contentHeight - selectedElementBottom) % 22 == 0) {
                            moveBy = -22;
                        }
                        else {
                            moveBy = ((contentBottom - selectedElementBottom) % 22) * -1;
                        }
                        currDropDown.lluScroller.scrollToElement(moveBy, multiplier);
                    }
                    if (currDropDown.selectedIndex < (currDropDown.itemCount - 1)) {
                        try {
                            selectedElement.nextSibling.style.borderStyle = "dashed";
                        }
                        catch (err) { }
                        selectedElement.style.borderStyle = "solid";
                        currDropDown.selectedIndex++;
                    }
                    actioned = true;
                }
                else if (event.keyCode == 38) {
                    if (contentTop < 0 && selectedElementTop <= (contentTop * -1)) {
                        multiplier = selectedElementTop / 22;
                        if (contentTop + selectedElementTop == 0) {
                            moveBy = 22;
                        }
                        else {
                            moveBy = (contentTop + selectedElementTop) * -1;
                        }
                        currDropDown.lluScroller.scrollToElement(moveBy, multiplier);
                    }
                    if (currDropDown.selectedIndex > 0) {
                        try {
                            selectedElement.previousSibling.style.borderStyle = "dashed";
                        }
                        catch (err) { }
                        selectedElement.style.borderStyle = "solid";
                        currDropDown.selectedIndex--;
                    }
                    actioned = true;
                }
            }
        }
    }
    if (actioned) {
        if (event.preventDefault) event.preventDefault();
        if (event.stopPropagation) event.stopPropagation();
        if (event.returnValue) event.returnValue = false;
        return false;
    }
}

function showLLUDropDown(index) {
    var currDropDown = dropDownArray[index];
    if (currDropDown.enabled) {
        if (currDropDown.lluDropDownListAnimatePanel.offsetHeight == 0) {
            var newDropDownListActualHeight = currDropDown.lluDropDownList.offsetHeight;
            var newDropDownListHeight = newDropDownListActualHeight + "px";
            if (newDropDownListActualHeight > currDropDown.dropDownPanelHeight) {
                newDropDownListHeight = currDropDown.dropDownPanelHeight + "px";
            }

            if (currDropDown.listDirection == "down") {
                currDropDown.lluDropDownListAnimatePanel.style.top = "24px";
                currDropDown.lluDropDownListAnimatePanel.style.bottom = "";
            }
            else {
                currDropDown.lluDropDownListAnimatePanel.style.top = "";
                currDropDown.lluDropDownListAnimatePanel.style.bottom = "24px";
            }
            $(currDropDown.lluDropDownListAnimatePanel).animate({ height: newDropDownListHeight }, 250);
            if (currDropDown.showSampleText) {
                currDropDown.lluDropDownSampleTextPanel.style.display = "inline";
            }
        }
        else {
            currDropDown.hideLLUDropDown();
        }
    }
}

/* #endregion */

/* #region Scroller */

var scrollerArray = new Array();

function Scroller(S1, S2, offset, themeColour) {
    var newScroller = new Object();
    if (S1.tagName != null) {
        newScroller.container = S1;
        newScroller.content = S2;
    }
    else {
        newScroller.container = document.getElementById(S1);
        newScroller.content = document.getElementById(S2);
    }
    newScroller.contentOver = newScroller.container.offsetHeight - newScroller.content.offsetHeight;
    newScroller.scrollOver = 0;
    newScroller.scrollDiff = 0.0;
    newScroller.scrollTop = 0.0;
    newScroller.overPercent = 0.0;
    newScroller.mouseDown = false;
    newScroller.mouseOver = false;
    newScroller.arrayIndex = scrollerArray.length;
    newScroller.themeColour = "";
    if (themeColour) {
        newScroller.themeColour = themeColour;
    }

    if (window.attachEvent) {
        document.attachEvent("onmousewheel", scrollerMouseWheel);
    }
    else if (window.addEventListener) {
        /** DOMMouseScroll is for mozilla. */
        document.addEventListener("DOMMouseScroll", scrollerMouseWheel, false);
    }
    else {
        /** IE/Opera. */
        window.onmousewheel = document.onmousewheel = scrollerMouseWheel;
    }

    newScroller.content.onmouseover = function () { setScrollerMouseOver(newScroller.arrayIndex, true); };
    newScroller.content.onmouseout = function (e) { e = window.event || e; scrollerFixOnMouseOut(this, e, newScroller.arrayIndex); };

    newScroller.scrollPanel = document.createElement("div");
    newScroller.scrollPanel.id = "scroller" + newScroller.arrayIndex;
    newScroller.scrollPanel.className = "lluScrollPanel" + newScroller.themeColour;

    newScroller.scrollPanelTop = document.createElement("div");
    newScroller.scrollPanelTop.className = "lluScrollPanelTop" + newScroller.themeColour;
    newScroller.scrollPanelTop.onmousedown = function () { setScrollerMouseDown(newScroller.arrayIndex, true, 'up'); };
    newScroller.scrollPanelTop.onmouseout = function () { setScrollerMouseDown(newScroller.arrayIndex, false, ''); };

    newScroller.scrollPanelMid = document.createElement("div");
    newScroller.scrollPanelMid.className = "lluScrollPanelSlice" + newScroller.themeColour;

    newScroller.scrollPanelBot = document.createElement("div");
    newScroller.scrollPanelBot.className = "lluScrollPanelBot" + newScroller.themeColour;
    newScroller.scrollPanelBot.onmousedown = function () { setScrollerMouseDown(newScroller.arrayIndex, true, 'down'); };
    newScroller.scrollPanelBot.onmouseout = function () { setScrollerMouseDown(newScroller.arrayIndex, false, ''); };

    newScroller.scroller = document.createElement("div");
    newScroller.scroller.className = "lluScroller" + newScroller.themeColour;
    newScroller.scroller.style.top = "0px";
    newScroller.scroller.onmouseover = function () { setScrollerRollOver(this, 'over', newScroller.arrayIndex); };
    newScroller.scroller.onmouseout = function () { setScrollerRollOver(this, 'out', newScroller.arrayIndex); };

    newScroller.scrollerTop = document.createElement("div");
    newScroller.scrollerTop.className = "lluScrollerTop" + newScroller.themeColour;

    newScroller.scrollerMid = document.createElement("div");
    newScroller.scrollerMid.className = "lluScrollerSliceOff" + newScroller.themeColour;

    newScroller.scrollerBot = document.createElement("div");
    newScroller.scrollerBot.className = "lluScrollerBot" + newScroller.themeColour;

    newScroller.scrollPanel.appendChild(newScroller.scrollPanelTop);
    newScroller.scrollPanel.appendChild(newScroller.scrollPanelMid);
    newScroller.scrollPanel.appendChild(newScroller.scrollPanelBot);
    newScroller.scroller.appendChild(newScroller.scrollerTop);
    newScroller.scroller.appendChild(newScroller.scrollerMid);
    newScroller.scroller.appendChild(newScroller.scrollerBot);

    newScroller.scrollPanel.appendChild(newScroller.scroller);

    newScroller.container.parentNode.appendChild(newScroller.scrollPanel);
    newScroller.setScrollerDraggable = function () {
        var currScroller = newScroller;
        $(newScroller.scroller).draggable({ containment: newScroller.scrollPanel,
            drag: function () {
                if (this.offsetTop > 0) {
                    newScroller.scrollTop = this.offsetTop;
                    if (this.offsetTop > this.parentNode.offsetHeight - this.offsetHeight) {
                        currScroller.content.style.top = (this.parentNode.offsetHeight - this.offsetHeight) + "px";
                    }
                    else {
                        currScroller.content.style.top = (currScroller.contentOver * (this.offsetTop / currScroller.scrollOver)) + "px";
                    }
                }
                else {
                    newScroller.scrollTop = 0.0;
                    currScroller.content.style.top = "0px";
                }
            }
        });
    }
    newScroller.scrollToElement = function (scrollBy, multi) {
        var top = parseInt(newScroller.scroller.style.top.replace("px", ""), 10);
        var difference = 0;
        if (scrollBy < 0) {
            difference = newScroller.scrollPanel.offsetHeight - (newScroller.scroller.offsetTop + newScroller.scroller.offsetHeight);
        }
        else {
            difference = newScroller.scroller.offsetTop;
        }
        if (difference != 0) {
            if (scrollBy < 0) {
                newScroller.scroller.style.top = (top + parseInt(difference / multi, 10)) + "px";
            }
            else {
                newScroller.scroller.style.top = (top - parseInt(difference / multi, 10)) + "px";
            }
        }
        newScroller.content.style.top = (newScroller.content.offsetTop + scrollBy) + "px";
    }
    newScroller.setScrollVisible = function (hideShow) {
        newScroller.scrollPanel.style.display = hideShow;
        newScroller.mouseDown = false;
        newScroller.mouseOver = false;
    }
    newScroller.setScrollFullHeight = function () {
        newScroller.scroller.style.top = "0px";
        if (newScroller.container.offsetHeight > 24) {
            newScroller.scrollPanel.style.top = newScroller.container.offsetTop + "px";
            newScroller.scrollPanel.style.left = ((newScroller.container.offsetLeft + newScroller.container.offsetWidth) + offset) + "px";
            newScroller.scrollPanel.style.height = newScroller.content.offsetHeight + "px";
            newScroller.scrollPanelMid.style.height = newScroller.content.offsetHeight + "px";
            if (newScroller.content.offsetHeight > 27) {
                newScroller.scrollerMid.style.height = (newScroller.content.offsetHeight - 28) + "px";
            }
            else {
                newScroller.scrollerMid.style.height = newScroller.content.offsetHeight + "px";
            }
        }
    }
    scrollerArray[newScroller.arrayIndex] = newScroller;
    newScroller.removeScroller = function () {
        for (var iScroll = 0; iScroll < scrollerArray.length; iScroll++) {
            if (scrollerArray[iScroll] == newScroller) {
                scrollerArray.splice(iScroll, 1);
                newScroller.container.parentNode.removeChild(newScroller.scrollPanel);
            }
        }
    }
    newScroller.setScrollHeight = function (reset) {
        if (reset) {
            if (reset == "top") {
                newScroller.scroller.style.top = "0px";
            }
        }
        if (newScroller.container.offsetHeight > 24) {
            newScroller.scrollPanel.style.top = newScroller.container.offsetTop + "px";
            newScroller.scrollPanel.style.left = ((newScroller.container.offsetLeft + newScroller.container.offsetWidth) + offset) + "px";
            newScroller.scrollPanel.style.height = newScroller.container.offsetHeight + "px";
            newScroller.scrollPanelMid.style.height = (newScroller.container.offsetHeight - 24) + "px";
            newScroller.contentOver = newScroller.container.offsetHeight - newScroller.content.offsetHeight;
            if (newScroller.contentOver < 0) {
                newScroller.setScrollVisible("inline");
            }
            else {
                newScroller.setScrollVisible("none");
            }
            newScroller.overPercent = newScroller.container.offsetHeight / newScroller.content.offsetHeight;
            if (newScroller.overPercent > 1) {
                newScroller.overPercent = 1;
            }
            var tempHeight = (parseInt(newScroller.scrollPanel.offsetHeight * newScroller.overPercent, 10) - 28);
            if (tempHeight < 1) {
                tempHeight = 1;
            }
            newScroller.scroller.style.height = (tempHeight + 28) + "px";
            newScroller.scrollerMid.style.height = tempHeight + "px";
            newScroller.scrollOver = newScroller.scrollPanel.offsetHeight - newScroller.scroller.offsetHeight;
            newScroller.scrollDiff = newScroller.scrollOver / (newScroller.contentOver * -1);
        }
        if (reset) {
            if (reset == "bot") {
                newScroller.scroller.style.top = newScroller.scrollPanel.offsetHeight - newScroller.scroller.offsetHeight + "px";
            }
        }
    }
    newScroller.setScrollerDraggable();
    return newScroller;
}

function scrollerMouseWheel(event) {
    for (var iScroll = 0; iScroll < scrollerArray.length; iScroll++) {
        var currScroller = scrollerArray[iScroll];
        if (currScroller.scrollOver > 0) {
            if (currScroller.mouseOver) {
                var delta = 0;
                if (!event) /* For IE. */
                    event = window.event;
                if (event.wheelDelta) { /* IE/Opera. */
                    delta = event.wheelDelta / 120;
                    /** In Opera 9, delta differs in sign as compared to IE.
                    */
                    if (window.opera)
                        delta = -delta;
                } else if (event.detail) { /** Mozilla case. */
                    /** In Mozilla, sign of delta is different than in IE.
                    * Also, delta is multiple of 3.
                    */
                    delta = -event.detail / 3;
                }
                /** If delta is nonzero, handle it.
                * Basically, delta is now positive if wheel was scrolled up,
                * and negative, if wheel was scrolled down.
                */
                if (delta) {
                    var contTop = parseInt(currScroller.content.offsetTop, 10);
                    if (delta < 0) {
                        if (contTop > ((currScroller.content.offsetHeight - currScroller.container.offsetHeight) * -1)) {
                            currScroller.scrollTop += (10 * currScroller.scrollDiff);
                            currScroller.scroller.style.top = currScroller.scrollTop + "px";
                            currScroller.content.style.top = (contTop - 10) + "px";
                        }
                        else {
                            currScroller.content.style.top = ((currScroller.content.offsetHeight - currScroller.container.offsetHeight) * -1) + "px";
                            currScroller.scroller.style.top = (currScroller.scrollPanel.offsetHeight - currScroller.scroller.offsetHeight) + "px";
                        }
                    }
                    else {
                        if (contTop < 0) {
                            currScroller.scrollTop -= (10 * currScroller.scrollDiff);
                            currScroller.scroller.style.top = currScroller.scrollTop + "px";
                            currScroller.content.style.top = (contTop + 10) + "px";
                        }
                        else {
                            currScroller.content.style.top = "0px";
                            currScroller.scroller.style.top = "0px";
                        }
                    }
                }
                /** Prevent default actions caused by mouse wheel.
                * That might be ugly, but we handle scrolls somehow
                * anyway, so don't bother here..
                */
                if (event.preventDefault) event.preventDefault();
                if (event.stopPropagation) event.stopPropagation();
                if (event.returnValue) event.returnValue = false;
                return false;
            }
        }
    }
}

function setScrollerKeyUp(event, index) {
    var currScroller = scrollerArray[index];
    if (event.keyCode == 40 || event.keyCode == 38) {
        currScroller.keyDown = 0;
    }
    if (event.preventDefault) event.preventDefault();
    if (event.stopPropagation) event.stopPropagation();
    if (event.returnValue) event.returnValue = false;
    return false;
}

function setScrollerMouseDown(index, status, dir) {
    var currScroller = scrollerArray[index];
    currScroller.mouseDown = status;
    if (status) {
        manualScroll1(index, dir);
    }
}

function setScrollerMouseOver(index, status) {
    var currScroller = scrollerArray[index];
    currScroller.mouseOver = status;
}

function scrollerFixOnMouseOut(element, event, index) {
    var current_mouse_target = null;
    if (event.toElement) {
        current_mouse_target = event.toElement;
    } else if (event.relatedTarget) {
        current_mouse_target = event.relatedTarget;
    }
    if (!scrollerIsChildOf(element, current_mouse_target) && element != current_mouse_target) {
        setScrollerMouseOver(index, false);
    }
}

function scrollerIsChildOf(parent, child) {
    if (child != null) {
        while (child.parentNode) {
            if ((child = child.parentNode) == parent) {
                return true;
            }
        }
    }
    return false;
}

function manualScroll1(index, dir) {
    var currScroller = scrollerArray[index];
    if (currScroller.mouseDown) {
        var top = parseInt(currScroller.scroller.offsetTop, 10);
        if (dir == "up") {
            if (top > 0) {
                currScroller.scrollTop = top - 1;
                currScroller.scroller.style.top = currScroller.scrollTop + "px";
                currScroller.content.style.top = (currScroller.contentOver * (top / currScroller.scrollOver)) + "px";
                setTimeout("manualScroll1('" + index + "', 'up')", 10);
            }
            else {
                currScroller.content.style.top = "0px";
            }
        }
        if (dir == "down") {
            if (top < (currScroller.scrollPanel.offsetHeight - currScroller.scroller.offsetHeight)) {
                currScroller.scrollTop = top + 1;
                currScroller.scroller.style.top = currScroller.scrollTop + "px";
                currScroller.content.style.top = (currScroller.contentOver * (top / currScroller.scrollOver)) + "px";
                setTimeout("manualScroll1('" + index + "', 'down')", 10);
            }
            else {
                currScroller.content.style.top = (currScroller.container.offsetHeight - currScroller.content.offsetHeight) + "px";
            }
        }
    }
}

function manualScroll2(index, dir) {
    var currScroller = scrollerArray[index];
    if (currScroller.mouseOver) {
        var top = parseInt(currScroller.scroller.offsetTop, 10);
        if (dir == "up") {
            if (top > 0) {
                currScroller.scrollTop = top - 1;
                currScroller.scroller.style.top = currScroller.scrollTop + "px";
                currScroller.content.style.top = (currScroller.contentOver * (top / currScroller.scrollOver)) + "px";
                setTimeout("manualScroll1('" + index + "', 'up')", 10);
            }
            else {
                currScroller.content.style.top = "0px";
            }
        }
        if (dir == "down") {
            if (top < (currScroller.scrollPanel.offsetHeight - currScroller.scroller.offsetHeight)) {
                currScroller.scrollTop = top + 1;
                currScroller.scroller.style.top = currScroller.scrollTop + "px";
                currScroller.content.style.top = (currScroller.contentOver * (top / currScroller.scrollOver)) + "px";
                setTimeout("manualScroll1('" + index + "', 'down')", 10);
            }
            else {
                currScroller.content.style.top = (currScroller.container.offsetHeight - currScroller.content.offsetHeight) + "px";
            }
        }
    }
}

function setScrollerRollOver(element, status, index) {
    var currScroller = scrollerArray[index];
    if (status == "over") {
        for (var i = 0; i < element.childNodes.length; i++) {
            var tempElem = element.childNodes[i];
            if (tempElem.className != null) {
                if (tempElem.className.indexOf("lluScrollerTop") == 0) {
                    tempElem.style.backgroundPosition = "-126px 12px";
                }
                if (tempElem.className.indexOf("lluScrollerSlice") > -1) {
                    tempElem.className = "lluScrollerSliceOn" + currScroller.themeColour;
                }
                if (tempElem.className.indexOf("lluScrollerBot") == 0) {
                    tempElem.style.backgroundPosition = "-210px 0px";
                }
            }
        }
    }
    if (status == "out") {
        for (var i = 0; i < element.childNodes.length; i++) {
            var tempElem = element.childNodes[i];
            if (tempElem.className != null) {
                if (tempElem.className.indexOf("lluScrollerTop") == 0) {
                    tempElem.style.backgroundPosition = "-105px 12px";
                }
                if (tempElem.className.indexOf("lluScrollerSlice") > -1) {
                    tempElem.className = "lluScrollerSliceOff" + currScroller.themeColour;
                }
                if (tempElem.className.indexOf("lluScrollerBot") == 0) {
                    tempElem.style.backgroundPosition = "-189px 0px";
                }
            }
        }
    }
}

/* #endregion */

/* #region Time Picker */

var timePickerArray = new Array();

function TimePicker() {
    var newTimePicker = new Object();
    newTimePicker.selectedInputField;
    newTimePicker.offset = 0;
    newTimePicker.arrayIndex = timePickerArray.length;

    newTimePicker.TimePickerPanel = document.createElement("div");
    newTimePicker.TimePickerPanel.className = "TimePickerPanel";

    newTimePicker.TimePickerHeaderPanel = document.createElement("div");
    newTimePicker.TimePickerHeaderPanel.className = "TimePickerHeaderPanel";
    newTimePicker.TimePickerHeaderPanel.innerHTML = "Choose Time";
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerHeaderPanel);

    newTimePicker.TimePickerTimeLabel = document.createElement("div");
    newTimePicker.TimePickerTimeLabel.className = "TimePickerTimeLabel";
    newTimePicker.TimePickerTimeLabel.innerHTML = "Time";
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerTimeLabel);

    newTimePicker.TimePickerTimePanel = document.createElement("div");
    newTimePicker.TimePickerTimePanel.className = "TimePickerTimePanel";
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerTimePanel);

    newTimePicker.TimePickerTimePanelHours = document.createElement("div");
    newTimePicker.TimePickerTimePanelHours.className = "TimePickerTimePanelHours";
    newTimePicker.TimePickerTimePanel.appendChild(newTimePicker.TimePickerTimePanelHours);

    newTimePicker.TimePickerTimePanelColon = document.createElement("div");
    newTimePicker.TimePickerTimePanelColon.className = "TimePickerTimePanelColon";
    newTimePicker.TimePickerTimePanelColon.innerHTML = ":";
    newTimePicker.TimePickerTimePanel.appendChild(newTimePicker.TimePickerTimePanelColon);

    newTimePicker.TimePickerTimePanelMins = document.createElement("div");
    newTimePicker.TimePickerTimePanelMins.className = "TimePickerTimePanelMins";
    newTimePicker.TimePickerTimePanel.appendChild(newTimePicker.TimePickerTimePanelMins);

    newTimePicker.TimePickerTimePanelAmPm = document.createElement("div");
    newTimePicker.TimePickerTimePanelAmPm.className = "TimePickerTimePanelAmPm";
    newTimePicker.TimePickerTimePanel.appendChild(newTimePicker.TimePickerTimePanelAmPm);

    newTimePicker.TimePickerHoursLabel = document.createElement("div");
    newTimePicker.TimePickerHoursLabel.className = "TimePickerHoursLabel";
    newTimePicker.TimePickerHoursLabel.innerHTML = "Hour";
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerHoursLabel);

    newTimePicker.TimePickerHoursPanel = document.createElement("div");
    newTimePicker.TimePickerHoursPanel.className = "TimePickerHoursPanel";
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerHoursPanel);

    newTimePicker.TimePickerMinutesLabel = document.createElement("div");
    newTimePicker.TimePickerMinutesLabel.className = "TimePickerMinutesLabel";
    newTimePicker.TimePickerMinutesLabel.innerHTML = "Minute";
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerMinutesLabel);

    newTimePicker.TimePickerMinutesPanel = document.createElement("div");
    newTimePicker.TimePickerMinutesPanel.className = "TimePickerMinutesPanel";
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerMinutesPanel);

    newTimePicker.TimePickerDoneButton = document.createElement("div");
    newTimePicker.TimePickerDoneButton.className = "TimePickerDoneButton";
    newTimePicker.TimePickerDoneButton.innerHTML = "Done";
    newTimePicker.TimePickerDoneButton.onclick = function () { newTimePicker.hideTimePickerPanel(); };
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerDoneButton);

    newTimePicker.TimePickerNowButton = document.createElement("div");
    newTimePicker.TimePickerNowButton.className = "TimePickerNowButton";
    newTimePicker.TimePickerNowButton.innerHTML = "Now";
    newTimePicker.TimePickerNowButton.onclick = function () { newTimePicker.setTimePickerToNow(); };
    newTimePicker.TimePickerPanel.appendChild(newTimePicker.TimePickerNowButton);

    newTimePicker.hoursSlider = new Slider(newTimePicker.TimePickerHoursPanel, "hrs", "TimePickerUpdateHours", newTimePicker.arrayIndex);
    newTimePicker.minutesSlider = new Slider(newTimePicker.TimePickerMinutesPanel, "mns", "TimePickerUpdateMinutes", newTimePicker.arrayIndex);

    newTimePicker.showTimePicker = function (inputField, offset) {
        if (inputField.tagName != null) {
            newTimePicker.selectedInputField = inputField;
        }
        else {
            newTimePicker.selectedInputField = document.getElementById(inputField);
        }
        var currTime = "";
        if (newTimePicker.selectedInputField.tagName.toLowerCase() == "div") {
            currTime = newTimePicker.selectedInputField.innerHTML;
        }
        else {
            currTime = newTimePicker.selectedInputField.value;
        }
        if (currTime != "") {
            var currHour = parseInt(currTime.split(":")[0], 10);
            var currMins = parseInt(currTime.split(":")[1], 10);
            var currAmPm = "am";
            if (currTime.indexOf("am") > -1 || currTime.indexOf("pm") > -1) {
                if (currTime.indexOf("am") > -1) {
                    currAmPm = "am";
                }
                if (currTime.indexOf("pm") > -1) {
                    currAmPm = "pm";
                }
            }
            else {
                if (currHour > 12) {
                    currHour -= 12;
                    if (currHour == 12) {
                        currHour = 0;
                    }
                    else {
                        amPm = "pm";
                    }
                }
                else {
                    if (currHour == 12) {
                        amPm = "pm";
                    }
                }
                currMins = (currMins - (currMins % 5));
            }
            if (currMins < 10) {
                currMins = "0" + currMins;
            }
            if (currMins == 60) {
                currMins = "00";
            }
            newTimePicker.setTime(currHour, currMins, currAmPm);
        }
        else {
            newTimePicker.setTimePickerToNow();
        }
        newTimePicker.offset = offset;
        newTimePicker.selectedInputField.parentNode.appendChild(newTimePicker.TimePickerPanel);
        newTimePicker.TimePickerPanel.style.top = newTimePicker.selectedInputField.offsetTop + newTimePicker.selectedInputField.offsetHeight + "px";
        newTimePicker.TimePickerPanel.style.left = newTimePicker.selectedInputField.offsetLeft + newTimePicker.selectedInputField.offsetWidth - newTimePicker.offset + "px";
        newTimePicker.TimePickerPanel.style.display = "block";
    }

    newTimePicker.hideTimePickerPanel = function () {
        newTimePicker.TimePickerPanel.style.display = "none";
    }

    newTimePicker.setTime = function (hour, minutes, amPm) {
        newTimePicker.TimePickerTimePanelHours.innerHTML = hour;
        newTimePicker.TimePickerTimePanelMins.innerHTML = minutes;
        newTimePicker.TimePickerTimePanelAmPm.innerHTML = amPm;
        if (amPm == "pm") {
            hour = hour + 12;
        }
        newTimePicker.minutesSlider.setPos(parseInt(minutes, 10));
        newTimePicker.hoursSlider.setPos(parseInt(hour, 10));
    }

    newTimePicker.setTimePickerToNow = function () {
        var date = new Date();
        var amPm = "am";
        var hours = date.getHours();
        var mins = date.getMinutes();
        if (hours > 12) {
            hours -= 12;
            if (hours == 12) {
                hours = 0;
            }
            else {
                amPm = "pm";
            }
        }
        else {
            if (hours == 12) {
                amPm = "pm";
            }
        }
        mins = (mins - (mins % 5));
        if (mins < 10) {
            mins = "0" + mins;
        }
        if (mins == 60) {
            mins = "00";
        }
        newTimePicker.TimePickerTimePanelHours.innerHTML = hours;
        newTimePicker.TimePickerTimePanelMins.innerHTML = mins;
        newTimePicker.TimePickerTimePanelAmPm.innerHTML = amPm;
        var returnTime = hours + ":" + mins + amPm;
        if (newTimePicker.selectedInputField.tagName.toLowerCase() == "div") {
            newTimePicker.selectedInputField.innerHTML = returnTime;
        }
        else {
            newTimePicker.selectedInputField.value = returnTime;
        }
        newTimePicker.minutesSlider.setPos(parseInt(mins, 10));
        newTimePicker.hoursSlider.setPos(parseInt(hours, 10));
    }

    timePickerArray.push(newTimePicker);
    return newTimePicker;
}

function TimePickerUpdateHours(retval, index) {
    var currTimePicker = timePickerArray[index];
    currTimePicker.TimePickerTimePanelHours.innerHTML = retval.split("^")[0];
    currTimePicker.TimePickerTimePanelAmPm.innerHTML = retval.split("^")[1];
    var returnTime = currTimePicker.TimePickerTimePanelHours.innerHTML + currTimePicker.TimePickerTimePanelColon.innerHTML +
            currTimePicker.TimePickerTimePanelMins.innerHTML + currTimePicker.TimePickerTimePanelAmPm.innerHTML;
    if (currTimePicker.selectedInputField.tagName.toLowerCase() == "div") {
        currTimePicker.selectedInputField.innerHTML = returnTime;
    }
    else {
        currTimePicker.selectedInputField.value = returnTime;
    }
}

function TimePickerUpdateMinutes(retval, index) {
    var currTimePicker = timePickerArray[index];
    currTimePicker.TimePickerTimePanelMins.innerHTML = retval;
    var returnTime = currTimePicker.TimePickerTimePanelHours.innerHTML + currTimePicker.TimePickerTimePanelColon.innerHTML +
            currTimePicker.TimePickerTimePanelMins.innerHTML + currTimePicker.TimePickerTimePanelAmPm.innerHTML;
    if (currTimePicker.selectedInputField.tagName.toLowerCase() == "div") {
        currTimePicker.selectedInputField.innerHTML = returnTime;
    }
    else {
        currTimePicker.selectedInputField.value = returnTime;
    }
}

/* #endregion */

/* #region Slider */

function Slider(panel, type, callBackFunction, args) {
    var newSlider = new Object();
    newSlider.callBackFunction = callBackFunction;
    newSlider.callBackFunction.args = args;
    newSlider.increment = 15;
    newSlider.width = "198px";
    newSlider.margin = "1px 0 0 0";
    newSlider.type = type;
    if (panel.tagName != null) {
        newSlider.field = panel;
    }
    else {
        newSlider.field = document.getElementById(panel);
    }
    if (type == "hrs") {
        newSlider.increment = 7;
        newSlider.width = "186px";
        newSlider.margin = "1px 0 0 6px";
    }

    newSlider.mainPanel = document.createElement("div");
    newSlider.mainPanel.className = "lluSliderMainPanel";
    newSlider.field.appendChild(newSlider.mainPanel);

    newSlider.slidePanel = document.createElement("div");
    newSlider.slidePanel.className = "lluSlidePanel";
    newSlider.slidePanel.style.margin = newSlider.margin;
    newSlider.slidePanel.style.width = newSlider.width;
    newSlider.mainPanel.appendChild(newSlider.slidePanel);

    newSlider.sliderPanel = document.createElement("div");
    newSlider.sliderPanel.className = "lluSlider";
    newSlider.slidePanel.appendChild(newSlider.sliderPanel);

    $(newSlider.sliderPanel).draggable({ containment: newSlider.slidePanel, grid: [newSlider.increment, newSlider.increment],
        drag: function () {
            var newVal = this.offsetLeft / newSlider.increment;
            if (newSlider.type == "hrs") {
                if (newVal > 12) {
                    newVal -= 12;
                    if (newVal == 12) {
                        newVal = "0^am";
                    }
                    else {
                        newVal = newVal + "^pm";
                    }
                }
                else {
                    if (newVal == 12) {
                        newVal = newVal + "^pm";
                    }
                    else {
                        newVal = newVal + "^am";
                    }
                }
            }
            else if (newSlider.type == "mns") {
                newVal *= 5;
                if (newVal < 10) {
                    newVal = "0" + newVal;
                }
                if (newVal == 60) {
                    newVal = "00";
                }
            }
            eval(newSlider.callBackFunction + "('" + newVal + "'," + args + ");");
        }
    });

    newSlider.setPos = function (pos) {
        if (newSlider.type == "hrs") {
            pos = pos * newSlider.increment;
        }
        else {
            pos = pos * 3;
        }
        this.sliderPanel.style.left = pos;
    }
    return newSlider;
}

/* #endregion */

/* #region Menu */

function LLUMenu() {
    this.lluMenuBar = document.getElementById('menuBar');
    this.isVertical = (this.lluMenuBar.firstChild.getAttribute("orient") == "vertical");
    this.rootHeight = this.lluMenuBar.offsetHeight;
    this.rootWidth = this.lluMenuBar.offsetWidth;
    this.subLevelOneWidth = 0;
    if (this.isVertical) {
        this.lluMenuBar.firstChild.style.width = "100%";
    }
    for (var i = 0; i < this.lluMenuBar.firstChild.childNodes.length; i++) {
        var elem = this.lluMenuBar.firstChild.childNodes[i];
        if (elem.nodeType != 3) {
            if (elem.tagName.toLowerCase() == "li") {
                if (this.rootHeight == 0) {
                    if (this.isVertical) {
                        this.rootHeight = elem.parentNode.offsetHeight;
                    }
                    else {
                        this.rootWidth = elem.offsetWidth;
                    }
                }
                if (this.isVertical) {
                    elem.style.width = "100%"; ;
                    for (var k = 0; k < elem.childNodes.length; k++) {
                        if (elem.childNodes[k].nodeType != 3) {
                            if (elem.childNodes[k].tagName.toLowerCase() == "a") {
                                elem.childNodes[k].style.padding = "0px";
                                elem.childNodes[k].style.width = "100%";
                            }
                        }
                    }
                }
                if (elem.innerHTML.indexOf("lluNavGroupSub") > -1) {
                    for (var m = 0; m < elem.childNodes.length; m++) {
                        var nextLevel = elem.childNodes[m];
                        if (nextLevel.nodeType != 3) {
                            if (nextLevel.tagName.toLowerCase() == "ul") {
                                if (this.isVertical) {
                                    nextLevel.style.top = "0px";
                                    nextLevel.style.left = this.rootWidth + "px";
                                }
                                else {
                                    nextLevel.style.top = this.rootHeight + "px";
                                    nextLevel.style.left = "0px";
                                }
                                if (this.subLevelOneWidth == 0) {
                                    this.subLevelOneWidth = nextLevel.offsetWidth;
                                }
                                lluMenuBuilder(this, nextLevel);
                            }
                        }
                    }
                }
            }
        }
    }
}

function lluMenuBuilder(menu, elem) {
    var panelWidth = elem.offsetWidth + "px";
    for (var j = 0; j < elem.childNodes.length; j++) {
        var elem2 = elem.childNodes[j];
        if (elem2.nodeType != 3) {
            if (elem2.tagName.toLowerCase() == "li") {
                for (var l = 0; l < elem2.childNodes.length; l++) {
                    if (elem2.childNodes[l].nodeType != 3) {
                        if (elem2.childNodes[l].tagName.toLowerCase() == "a") {
                            elem2.childNodes[l].style.width = "100%";
                        }
                    }
                }
                if (elem2.innerHTML.indexOf("lluNavGroupSub") > -1) {
                    for (var n = 0; n < elem2.childNodes.length; n++) {
                        var nextLevel2 = elem2.childNodes[n];
                        if (nextLevel2.nodeType != 3) {
                            if (nextLevel2.tagName.toLowerCase() == "ul") {
                                nextLevel2.style.top = "0px";
                                nextLevel2.style.left = menu.subLevelOneWidth + "px";
                                lluMenuBuilder(menu, nextLevel2);
                            }
                        }
                    }
                }
            }
        }
    }
}

function showSubMenu(elem) {
    elem.style.overflow = "visible";
}

function fixOnMouseOutNav(element, event) {
    var current_mouse_target = null;
    if (event.toElement) {
        current_mouse_target = event.toElement;
    } else if (event.relatedTarget) {
        current_mouse_target = event.relatedTarget;
    }
    if (!isChildOfNav(element, current_mouse_target) && element != current_mouse_target) {
        element.style.overflow = "hidden";
    }
}

function isChildOfNav(parent, child) {
    if (child != null) {
        while (child.parentNode) {
            if ((child = child.parentNode) == parent) {
                return true;
            }
        }
    }
    return false;
}

/* #endregion */

/* #region Image Viewer */

var viewerIndex = 0;
var viewerReference;

function LLUImageViewer(cont) {
    this.container = cont;
    this.imageUrls;
    this.imageName;
    this.imageDesc;
    this.imageSize;
    this.top = 0;

    if (document.body.offsetHeight > GetHeight()) {
        this.top = document.body.offsetHeight;
    }
    else {
        this.top = GetHeight();
    }

    this.modalPanel = document.createElement("div");
    this.modalPanel.setAttribute("id", "viewerModalPanel");
    this.modalPanel.style.top = "-" + (this.top + 20) + "px";
    this.modalPanel.style.height = this.top + "px";

    this.mainPanel = document.createElement("div");
    this.mainPanel.setAttribute("id", "viewerMainPanel");

    this.countPanel = document.createElement("div");
    this.countPanel.setAttribute("id", "viewerCountPanel");
    this.countPanel.innerHTML = "Image 1 of 5";
    this.mainPanel.appendChild(this.countPanel);

    this.closePanel = document.createElement("div");
    this.closePanel.setAttribute("id", "viewerClosePanel");
    this.closePanel.onclick = function () { hideViewer(); };
    this.mainPanel.appendChild(this.closePanel);

    this.imagePanel = document.createElement("img");
    this.imagePanel.setAttribute("id", "viewerImagePanel");
    this.mainPanel.appendChild(this.imagePanel);

    this.nextPanelOff = document.createElement("div");
    this.nextPanelOff.setAttribute("id", "viewerNextPanelOff");
    this.mainPanel.appendChild(this.nextPanelOff);

    this.nextHoverPanel = document.createElement("div");
    this.nextHoverPanel.onmouseout = function (e) { e = window.event || e; fixViewerMouseOut(this, e, 'next'); };
    this.nextHoverPanel.onmouseover = function () { showViewerButton('next') };
    this.nextHoverPanel.setAttribute("id", "viewerNextHoverPanel");
    this.mainPanel.appendChild(this.nextHoverPanel);

    this.nextPanel = document.createElement("div");
    this.nextPanel.setAttribute("id", "viewerNextPanel");
    this.nextPanel.onclick = function () { changeImage('up'); };
    this.nextHoverPanel.appendChild(this.nextPanel);

    this.prevPanelOff = document.createElement("div");
    this.prevPanelOff.setAttribute("id", "viewerPreviousPanelOff");
    this.mainPanel.appendChild(this.prevPanelOff);

    this.prevHoverPanel = document.createElement("div");
    this.prevHoverPanel.onmouseout = function (e) { e = window.event || e; fixViewerMouseOut(this, e, 'prev'); };
    this.prevHoverPanel.onmouseover = function () { showViewerButton('prev') };
    this.prevHoverPanel.setAttribute("id", "viewerPreviousHoverPanel");
    this.mainPanel.appendChild(this.prevHoverPanel);

    this.prevPanel = document.createElement("div");
    this.prevPanel.setAttribute("id", "viewerPreviousPanel");
    this.prevPanel.onclick = function () { changeImage('down'); };
    this.prevHoverPanel.appendChild(this.prevPanel);

    this.namePanel = document.createElement("div");
    this.namePanel.setAttribute("id", "viewerNamePanel");
    this.mainPanel.appendChild(this.namePanel);

    this.descPanel = document.createElement("div");
    this.descPanel.setAttribute("id", "viewerDescriptionPanel");
    this.mainPanel.appendChild(this.descPanel);

    this.modalPanel.appendChild(this.mainPanel);
    this.container.parentNode.appendChild(this.modalPanel);

    this.showViewer = function (id, urls, names, descr, sizes) {
        $('html, body').animate({ scrollTop: 0 }, 'slow');
        this.imageUrls = urls;
        this.imageName = names;
        this.imageDesc = descr;
        this.imageSize = sizes;
        $(this.modalPanel).animate({ top: "0px" }, 500, "linear");
        viewerIndex = parseInt(id, 10);
        changeImage("");
    }
    viewerReference = this;
}

function hideViewer() {
    var viewerHidePos = "-" + (viewerReference.top + 1000) + "px";
    $(viewerReference.modalPanel).animate({ top: viewerHidePos }, 500, "linear");
}

function isChildOf(parent, child) {
    if (child != null) {
        while (child.parentNode) {
            if ((child = child.parentNode) == parent) {
                return true;
            }
        }
    }
    return false;
}

function fixViewerMouseOut(element, event, id) {

    var current_mouse_target = null;
    if (event.toElement) {
        current_mouse_target = event.toElement;
    } else if (event.relatedTarget) {
        current_mouse_target = event.relatedTarget;
    }
    if (!isChildOf(element, current_mouse_target) && element != current_mouse_target) {
        if (id == "next") {
            viewerReference.nextPanel.style.display = "none";
        }
        else {
            viewerReference.prevPanel.style.display = "none";
        }
    }
}

function showViewerButton(id) {
    if (id == "next") {
        if (viewerIndex < viewerReference.imageUrls.length - 1) {
            viewerReference.nextPanel.style.display = "inline";
        }
    }
    else {
        if (viewerIndex > 0) {
            viewerReference.prevPanel.style.display = "inline";
        }
    }
}

function changeImage(dir) {
    if (dir == "up") {
        if (viewerIndex != viewerReference.imageUrls.length - 1) {
            viewerIndex++;
        }
    }
    if (dir == "down") {
        if (viewerIndex != 0) {
            viewerIndex--;
        }
    }
    if (viewerIndex == 0) {
        viewerReference.prevPanelOff.style.display = "none";
    }
    else {
        viewerReference.prevPanelOff.style.display = "inline";
    }
    if (viewerIndex == viewerReference.imageUrls.length - 1) {
        viewerReference.nextPanelOff.style.display = "none";
    }
    else {
        viewerReference.nextPanelOff.style.display = "inline";
    }
    if (document.body.offsetHeight > GetHeight()) {
        viewerReference.top = document.body.offsetHeight;
    }
    else {
        viewerReference.top = GetHeight();
    }
    viewerReference.modalPanel.style.height = viewerReference.top + "px";
    var imgWidth = parseInt(viewerReference.imageSize[viewerIndex].split("~~")[0], 10);
    var imgHeight = parseInt(viewerReference.imageSize[viewerIndex].split("~~")[1], 10);
    if (imgWidth == 0) {
        imgWidth = 400;
        imgHeight = 300;
    }
    viewerReference.nextHoverPanel.style.height = imgHeight + "px";
    viewerReference.prevHoverPanel.style.height = imgHeight + "px";
    $(viewerReference.mainPanel).animate({ top: "10px",
        width: (imgWidth + 60) + "px", height: (imgHeight + 120) + "px",
        left: ((document.body.offsetWidth - (imgWidth + 60)) / 2) + "px"
    }, 500, "linear");
    $(viewerReference.nextPanel).animate({ top: ((imgHeight - 45) / 2) + "px" }, 500, "linear");
    $(viewerReference.prevPanel).animate({ top: ((imgHeight - 45) / 2) + "px" }, 500, "linear");
    $(viewerReference.nextPanelOff).animate({ top: (((imgHeight - 45) / 2) + 30) + "px" }, 500, "linear");
    $(viewerReference.prevPanelOff).animate({ top: (((imgHeight - 45) / 2) + 30) + "px" }, 500, "linear");
    viewerReference.countPanel.innerHTML = "Image " + parseInt(viewerIndex + 1, 10) + " of " + viewerReference.imageUrls.length;
    viewerReference.namePanel.innerHTML = viewerReference.imageName[viewerIndex];
    $(viewerReference.namePanel).animate({ width: imgWidth + "px" }, 500, "linear");
    viewerReference.descPanel.innerHTML = viewerReference.imageDesc[viewerIndex];
    viewerReference.imagePanel.style.display = 'none';
    viewerReference.imagePanel.src = viewerReference.imageUrls[viewerIndex];
    viewerReference.imagePanel.alt = viewerReference.imageDesc[viewerIndex];
    $(viewerReference.descPanel).animate({ width: imgWidth + "px" }, 500, "linear", function () {
        viewerReference.imagePanel.style.display = "block";
    });
}

function GetHeight() {
    var y = 0;
    if (self.innerHeight) {
        y = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight) {
        y = document.documentElement.clientHeight;
    }
    else if (document.body) {
        y = document.body.clientHeight;
    }
    return y;
}

/* #endregion */

/* #region Basic Scroller */

var basicScrollerArray = new Array();

function BasicScroller(S1, S2, offset) {
    var newBasicScroller = new Object();
    if (S1.tagName != null) {
        newBasicScroller.container = S1;
        newBasicScroller.content = S2;
    }
    else {
        newBasicScroller.container = document.getElementById(S1);
        newBasicScroller.content = document.getElementById(S2);
    }
    newBasicScroller.contentOver = newBasicScroller.container.offsetHeight - newBasicScroller.content.offsetHeight;
    newBasicScroller.basicScrollOver = 0;
    newBasicScroller.overPercent = 0.0;
    newBasicScroller.mouseDown = false;
    newBasicScroller.mouseOver = false;
    newBasicScroller.scrolling = false;
    newBasicScroller.arrayIndex = basicScrollerArray.length;

    if (window.addEventListener) {
        /** DOMMouseScroll is for mozilla. */
        window.addEventListener('DOMMouseScroll', basicScrollerMouseWheel, false);
    }
    else {
        /** IE/Opera. */
        window.onmousewheel = document.onmousewheel = basicScrollerMouseWheel;
    }

    newBasicScroller.content.onmouseover = function () { setBasicScrollerMouseOver(newBasicScroller.arrayIndex, true); };
    newBasicScroller.content.onmouseout = function (e) { e = window.event || e; basicScrollerFixOnMouseOut(this, e, newBasicScroller.arrayIndex); };

    newBasicScroller.basicScrollPanel = document.createElement("div");
    newBasicScroller.basicScrollPanel.id = "basicScroller" + newBasicScroller.arrayIndex;
    newBasicScroller.basicScrollPanel.className = "lluBasicScrollPanel";

    newBasicScroller.basicScrollPanelTop = document.createElement("div");
    newBasicScroller.basicScrollPanelTop.className = "lluBasicScrollPanelTop";
    newBasicScroller.basicScrollPanelTop.onmousedown = function () { setBasicScrollerMouseDown(newBasicScroller.arrayIndex, true, 'up'); };
    newBasicScroller.basicScrollPanelTop.onmouseup = function () { setBasicScrollerMouseDown(newBasicScroller.arrayIndex, false, ''); };

    newBasicScroller.basicScrollPanelBot = document.createElement("div");
    newBasicScroller.basicScrollPanelBot.className = "lluBasicScrollPanelBot";
    newBasicScroller.basicScrollPanelBot.onmousedown = function () { setBasicScrollerMouseDown(newBasicScroller.arrayIndex, true, 'down'); };
    newBasicScroller.basicScrollPanelBot.onmouseup = function () { setBasicScrollerMouseDown(newBasicScroller.arrayIndex, false, ''); };

    newBasicScroller.basicScroller = document.createElement("div");
    newBasicScroller.basicScroller.className = "lluBasicScroller";
    newBasicScroller.basicScroller.onmousedown = function () { setBasicScrollerScrolling(newBasicScroller.arrayIndex, true, 'down'); };
    newBasicScroller.basicScroller.onmouseup = function () { setBasicScrollerScrolling(newBasicScroller.arrayIndex, false, ''); };
    newBasicScroller.basicScroller.style.top = "0px";

    newBasicScroller.basicScrollPanel.appendChild(newBasicScroller.basicScrollPanelTop);
    newBasicScroller.basicScrollPanel.appendChild(newBasicScroller.basicScrollPanelBot);
    newBasicScroller.basicScrollPanel.appendChild(newBasicScroller.basicScroller);

    newBasicScroller.container.appendChild(newBasicScroller.basicScrollPanel);
    newBasicScroller.setBasicScrollerDraggable = function () {
        var currBasicScroller = newBasicScroller;
        $(newBasicScroller.basicScroller).draggable({ containment: newBasicScroller.basicScrollPanel,
            drag: function () {
                if (this.offsetTop > 0) {
                    currBasicScroller.content.style.top = (currBasicScroller.contentOver * (this.offsetTop / currBasicScroller.basicScrollOver)) + "px";
                }
                else {
                    currBasicScroller.content.style.top = "0px";
                }
                if (this.offsetTop == (currBasicScroller.basicScrollPanel.offsetHeight - currBasicScroller.basicScroller.offsetHeight)) {
                    currBasicScroller.content.style.top = (currBasicScroller.container.offsetHeight - currBasicScroller.content.offsetHeight) + "px";
                }
            }
        });
    }
    newBasicScroller.basicScrollToElement = function (basicScrollBy, multi) {
        var top = parseInt(newBasicScroller.basicScroller.style.top.replace("px", ""), 10);
        var difference = 0;
        if (basicScrollBy < 0) {
            difference = newBasicScroller.basicScrollPanel.offsetHeight - (newBasicScroller.basicScroller.offsetTop + newBasicScroller.basicScroller.offsetHeight);
        }
        else {
            difference = newBasicScroller.basicScroller.offsetTop;
        }
        if (difference != 0) {
            if (basicScrollBy < 0) {
                newBasicScroller.basicScroller.style.top = (top + parseInt(difference / multi, 10)) + "px";
            }
            else {
                newBasicScroller.basicScroller.style.top = (top - parseInt(difference / multi, 10)) + "px";
            }
        }
        newBasicScroller.content.style.top = (newBasicScroller.content.offsetTop + basicScrollBy) + "px";
    }
    newBasicScroller.setScrollVisible = function (hideShow) {
        newBasicScroller.basicScrollPanel.style.display = hideShow;
        newBasicScroller.mouseDown = false;
        newBasicScroller.mouseOver = false;
    }
    newBasicScroller.setScrollHeight = function () {
        newBasicScroller.basicScroller.style.top = "0px";
        if (newBasicScroller.container.offsetHeight > 24) {
            newBasicScroller.basicScrollPanel.style.left = ((newBasicScroller.content.offsetLeft + newBasicScroller.content.offsetWidth) + offset) + "px";
            newBasicScroller.basicScrollPanel.style.height = newBasicScroller.container.offsetHeight + "px";
            newBasicScroller.contentOver = newBasicScroller.container.offsetHeight - newBasicScroller.content.offsetHeight;
            if (newBasicScroller.contentOver < 0) {
                newBasicScroller.setScrollVisible("inline");
            }
            else {
                newBasicScroller.setScrollVisible("none");
            }
            newBasicScroller.overPercent = newBasicScroller.container.offsetHeight / newBasicScroller.content.offsetHeight;
            if (newBasicScroller.overPercent > 1) {
                newBasicScroller.overPercent = 1;
            }
            newBasicScroller.basicScroller.style.height = parseInt(newBasicScroller.basicScrollPanel.offsetHeight * newBasicScroller.overPercent, 10) + "px";
            var tempHeight = (parseInt(newBasicScroller.basicScrollPanel.offsetHeight * newBasicScroller.overPercent, 10) - 28);
            if (tempHeight < 1) {
                tempHeight = 1;
            }
            newBasicScroller.basicScrollOver = newBasicScroller.basicScrollPanel.offsetHeight - newBasicScroller.basicScroller.offsetHeight;
        }
    }
    basicScrollerArray[newBasicScroller.arrayIndex] = newBasicScroller;
    newBasicScroller.removeBasicScroller = function () {
        for (var iScroll = 0; iScroll < basicScrollerArray.length; iScroll++) {
            if (basicScrollerArray[iScroll] == newBasicScroller) {
                basicScrollerArray.splice(iScroll, 1);
                newBasicScroller.container.parentNode.removeChild(newBasicScroller.basicScrollPanel);
            }
        }
    }
    newBasicScroller.setBasicScrollerDraggable();
    return newBasicScroller;
}

function setBasicScrollerKeyUp(event, index) {
    var currBasicScroller = basicScrollerArray[index];
    if (event.keyCode == 40 || event.keyCode == 38) {
        currScroller.keyDown = 0;
    }
    if (event.preventDefault) event.preventDefault();
    if (event.stopPropagation) event.stopPropagation();
    if (event.returnValue) event.returnValue = false;
    return false;
}

function setBasicScrollerMouseDown(index, status, dir) {
    var currBasicScroller = basicScrollerArray[index];
    currBasicScroller.mouseDown = status;
    if (status) {
        manualBasicScroll1(index, dir);
    }
}

function setBasicScrollerScrolling(index, status, dir) {
    var currBasicScroller = basicScrollerArray[index];
    currBasicScroller.scrolling = status;
}

function setBasicScrollerMouseOver(index, status) {
    var currBasicScroller = basicScrollerArray[index];
    currBasicScroller.mouseOver = status;
}

function basicScrollerFixOnMouseOut(element, event, index) {
    var current_mouse_target = null;
    if (event.toElement) {
        current_mouse_target = event.toElement;
    } else if (event.relatedTarget) {
        current_mouse_target = event.relatedTarget;
    }
    if (!basicScrollerIsChildOf(element, current_mouse_target) && element != current_mouse_target) {
        setBasicScrollerMouseOver(index, false);
    }
}

function basicScrollerIsChildOf(parent, child) {
    if (child != null) {
        while (child.parentNode) {
            if ((child = child.parentNode) == parent) {
                return true;
            }
        }
    }
    return false;
}

function basicScrollerMouseWheel(event) {
    for (var iScroll = 0; iScroll < basicScrollerArray.length; iScroll++) {
        var currBasicScroller = basicScrollerArray[iScroll];
        if (currBasicScroller.basicScrollPanel.style.display == "inline") {
            if (currBasicScroller.mouseOver) {
                var delta = 0;
                if (!event) /* For IE. */
                    event = window.event;
                if (event.wheelDelta) { /* IE/Opera. */
                    delta = event.wheelDelta / 120;
                    if (window.opera)
                        delta = -delta;
                } else if (event.detail) { /** Mozilla case. */
                    delta = -event.detail / 3;
                }
                if (delta)
                    var top = parseInt(currBasicScroller.basicScroller.offsetTop, 10);
                if (delta > 0) {
                    if (top > 0) {
                        currBasicScroller.basicScroller.style.top = (top - 11) + "px";
                        currBasicScroller.content.style.top = (currBasicScroller.contentOver * (top / currBasicScroller.basicScrollOver)) + "px";
                    }
                    else {
                        currBasicScroller.content.style.top = "0px";
                    }
                }
                else {
                    if (top < (currBasicScroller.basicScrollPanel.offsetHeight - currBasicScroller.basicScroller.offsetHeight)) {
                        currBasicScroller.basicScroller.style.top = (top + 11) + "px";
                        currBasicScroller.content.style.top = (currBasicScroller.contentOver * (top / currBasicScroller.basicScrollOver)) + "px";
                    }
                    else {
                        currBasicScroller.content.style.top = (currBasicScroller.container.offsetHeight - currBasicScroller.content.offsetHeight) + "px";
                    }
                }
                if (event.preventDefault) event.preventDefault();
                if (event.stopPropagation) event.stopPropagation();
                if (event.returnValue) event.returnValue = false;
                return false;
            }
        }
    }
}

function manualBasicScroll1(index, dir) {
    var currBasicScroller = basicScrollerArray[index];
    if (currBasicScroller.mouseDown) {
        var top = parseInt(currBasicScroller.basicScroller.offsetTop, 10);
        if (dir == "up") {
            if (top > 0) {
                currBasicScroller.basicScroller.style.top = (top - 1) + "px";
                currBasicScroller.content.style.top = (currBasicScroller.contentOver * (top / currBasicScroller.basicScrollOver)) + "px";
                setTimeout("manualBasicScroll1('" + index + "', 'up')", 10);
            }
            else {
                currBasicScroller.content.style.top = "0px";
            }
        }
        if (dir == "down") {
            if (top < (currBasicScroller.basicScrollPanel.offsetHeight - currBasicScroller.basicScroller.offsetHeight)) {
                currBasicScroller.basicScroller.style.top = (top + 1) + "px";
                currBasicScroller.content.style.top = (currBasicScroller.contentOver * (top / currBasicScroller.basicScrollOver)) + "px";
                setTimeout("manualBasicScroll1('" + index + "', 'down')", 10);
            }
            else {
                currBasicScroller.content.style.top = (currBasicScroller.container.offsetHeight - currBasicScroller.content.offsetHeight) + "px";
            }
        }
    }
}

function manualBasicScroll2(index, dir) {
    var currBasicScroller = basicScrollerArray[index];
    if (currBasicScroller.mouseOver) {
        var top = parseInt(currBasicScroller.basicScroller.offsetTop, 10);
        if (dir == "up") {
            if (top > 0) {
                currBasicScroller.basicScroller.style.top = (top - 1) + "px";
                currBasicScroller.content.style.top = (currBasicScroller.contentOver * (top / currBasicScroller.basicScrollOver)) + "px";
                setTimeout("manualBasicScroll1('" + index + "', 'up')", 10);
            }
            else {
                currBasicScroller.content.style.top = "0px";
            }
        }
        if (dir == "down") {
            if (top < (currBasicScroller.basicScrollPanel.offsetHeight - currBasicScroller.basicScroller.offsetHeight)) {
                currBasicScroller.basicScroller.style.top = (top + 1) + "px";
                currBasicScroller.content.style.top = (currBasicScroller.contentOver * (top / currBasicScroller.basicScrollOver)) + "px";
                setTimeout("manualBasicScroll1('" + index + "', 'down')", 10);
            }
            else {
                currBasicScroller.content.style.top = (currBasicScroller.container.offsetHeight - currBasicScroller.content.offsetHeight) + "px";
            }
        }
    }
}

/* #endregion */

/* #region DatePicker */

var datePickerArray = new Array();

function DatePicker(format) {
    var newDatePicker = new Object();
    newDatePicker.shortDayArray = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
    newDatePicker.shortMonthArray = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    newDatePicker.monthArray = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    newDatePicker.selectedInputField;
    newDatePicker.selectedDate = new Date();
    newDatePicker.arrayIndex = datePickerArray.length;
    newDatePicker.format = "";
    newDatePicker.callback = "";
    if (format) {
        newDatePicker.format = format;
    }

    newDatePicker.DatePickerPanel = document.createElement("div");
    newDatePicker.DatePickerPanel.setAttribute("id", "datePickerPanel");

    newDatePicker.DatePickerMonthPanel = document.createElement("div");
    newDatePicker.DatePickerMonthPanel.setAttribute("id", "datePickerMonthPanel");
    newDatePicker.DatePickerPanel.appendChild(newDatePicker.DatePickerMonthPanel);

    newDatePicker.DatePickerLeftMonthPanel = document.createElement("div");
    newDatePicker.DatePickerLeftMonthPanel.setAttribute("id", "datePickerLeftMonthPanel");
    newDatePicker.DatePickerLeftMonthPanel.onclick = function () { setDatePickerMonth('down', newDatePicker.arrayIndex); };
    newDatePicker.DatePickerMonthPanel.appendChild(newDatePicker.DatePickerLeftMonthPanel);

    newDatePicker.DatePickerMonthTextPanel = document.createElement("div");
    newDatePicker.DatePickerMonthTextPanel.setAttribute("id", "datePickerMonthTextPanel");
    newDatePicker.DatePickerMonthPanel.appendChild(newDatePicker.DatePickerMonthTextPanel);

    newDatePicker.DatePickerRightMonthPanel = document.createElement("div");
    newDatePicker.DatePickerRightMonthPanel.setAttribute("id", "datePickerRightMonthPanel");
    newDatePicker.DatePickerRightMonthPanel.onclick = function () { setDatePickerMonth('up', newDatePicker.arrayIndex); };
    newDatePicker.DatePickerMonthPanel.appendChild(newDatePicker.DatePickerRightMonthPanel);

    newDatePicker.DatePickerDayPanel = document.createElement("div");
    newDatePicker.DatePickerDayPanel.setAttribute("id", "datePickerDayPanel");
    newDatePicker.DatePickerPanel.appendChild(newDatePicker.DatePickerDayPanel);

    for (var i = 0; i < 7; i++) {
        newDatePicker.DatePickerDay = document.createElement("div");
        newDatePicker.DatePickerDay.setAttribute("class", "datePickerDay");
        newDatePicker.DatePickerDay.innerHTML = newDatePicker.shortDayArray[i];
        newDatePicker.DatePickerDayPanel.appendChild(newDatePicker.DatePickerDay);
    }

    newDatePicker.DatePickerDatePanel = document.createElement("div");
    newDatePicker.DatePickerDatePanel.setAttribute("id", "datePickerDatePanel");
    newDatePicker.DatePickerPanel.appendChild(newDatePicker.DatePickerDatePanel);

    newDatePicker.daysInMonth = function (month, year) {
        var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        if (month != 2) return m[month - 1];
        if (year % 4 != 0) return m[1];
        if (year % 100 == 0 && year % 400 != 0) return m[1];
        return m[1] + 1;
    }

    newDatePicker.setMonth = function () {
        newDatePicker.DatePickerDatePanel.innerHTML = "";
        var dayCount = newDatePicker.daysInMonth(newDatePicker.selectedDate.getMonth() + 1, newDatePicker.selectedDate.getYear());
        newDatePicker.selectedDate.setDate(1);
        var dayOfWeek = newDatePicker.selectedDate.getDay();
        var dayCounter = 1;
        for (var j = 0; j < 42; j++) {
            newDatePicker.DatePickerDate = document.createElement("div");
            if (j >= dayOfWeek && dayCounter <= dayCount) {
                newDatePicker.DatePickerDate.setAttribute("class", "datePickerDate2");
                newDatePicker.DatePickerDate.onclick = function () { setDatePickerDate(this, newDatePicker.arrayIndex); };
                newDatePicker.DatePickerDate.innerHTML = dayCounter;
                dayCounter++;
            }
            else {
                newDatePicker.DatePickerDate.setAttribute("class", "datePickerDate1");
            }
            newDatePicker.DatePickerDatePanel.appendChild(newDatePicker.DatePickerDate);
        }
        newDatePicker.DatePickerMonthTextPanel.innerHTML = newDatePicker.monthArray[newDatePicker.selectedDate.getMonth()] + " " + newDatePicker.selectedDate.getFullYear();
    }

    newDatePicker.showDatePicker = function (elem, format2) {
        if (format2) {
            newDatePicker.format = format2;
        }
        newDatePicker.selectedInputField = elem;
        elem.parentNode.appendChild(newDatePicker.DatePickerPanel);
        newDatePicker.DatePickerPanel.style.top = elem.offsetTop + elem.offsetHeight + "px";
        newDatePicker.DatePickerPanel.style.left = elem.offsetLeft + elem.offsetWidth - 182 + "px";
        newDatePicker.DatePickerPanel.style.display = "inline";
    }

    newDatePicker.hideDatePickerPanel = function () {
        newDatePicker.DatePickerPanel.style.display = "none";
    }

    newDatePicker.setMonth();

    newDatePicker.setCallback = function (call) {
        newDatePicker.callback = call;
    }

    datePickerArray.push(newDatePicker);
    return newDatePicker;
}

function setDatePickerDate(elem, index) {
    var currentDatePicker = datePickerArray[index];
    currentDatePicker.selectedDate.setDate(elem.innerHTML);
    var newDateString = "";
    if (currentDatePicker.format != "") {
        newDateString = currentDatePicker.selectedDate.format(currentDatePicker.format);
    }
    else {
        newDateString = currentDatePicker.selectedDate.getDate() + "/" +
                        (currentDatePicker.selectedDate.getMonth() + 1) + "/" +
                        currentDatePicker.selectedDate.getFullYear();
    }
    if (currentDatePicker.selectedInputField.tagName.toLowerCase() == "input") {
        currentDatePicker.selectedInputField.value = newDateString;
    }
    else {
        currentDatePicker.selectedInputField.innerHTML = newDateString;
    }
    currentDatePicker.hideDatePickerPanel();
    if (currentDatePicker.callback != "") {
        var fnctns = currentDatePicker.callback + "('" + newDateString + "');";
        if (currentDatePicker.selectedInputField.id) {
            fnctns = currentDatePicker.callback + "('" + newDateString + "', '" + currentDatePicker.selectedInputField.id + "');";
        }
        eval(fnctns);
    }
}

function setDatePickerMonth(dir, index) {
    var currentDatePicker = datePickerArray[index];
    var currMonthValue = currentDatePicker.selectedDate.getMonth();
    if (dir == "up") {
        currMonthValue++;
    }
    else {
        currMonthValue--;
    }
    currentDatePicker.selectedDate.setMonth(currMonthValue);
    currentDatePicker.setMonth();
}

// Simulates PHP's date function 
Date.prototype.format = function (format) {
    var returnStr = '';
    var replace = Date.replaceChars;
    for (var i = 0; i < format.length; i++) {
        var curChar = format.charAt(i); if (i - 1 >= 0 && format.charAt(i - 1) == "\\") {
            returnStr += curChar;
        }
        else if (replace[curChar]) {
            returnStr += replace[curChar].call(this);
        } else if (curChar != "\\") {
            returnStr += curChar;
        }
    }
    return returnStr;
};

Date.replaceChars = {
    shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],

    // Day
    d: function () { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
    D: function () { return Date.replaceChars.shortDays[this.getDay()]; },
    j: function () { return this.getDate(); },
    l: function () { return Date.replaceChars.longDays[this.getDay()]; },
    N: function () { return this.getDay() + 1; },
    S: function () { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
    w: function () { return this.getDay(); },
    z: function () { var d = new Date(this.getFullYear(), 0, 1); return Math.ceil((this - d) / 86400000); }, // Fixed now 
    // Week 
    W: function () { var d = new Date(this.getFullYear(), 0, 1); return Math.ceil((((this - d) / 86400000) + d.getDay() + 1) / 7); }, // Fixed now 
    // Month 
    F: function () { return Date.replaceChars.longMonths[this.getMonth()]; },
    m: function () { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); },
    M: function () { return Date.replaceChars.shortMonths[this.getMonth()]; },
    n: function () { return this.getMonth() + 1; },
    t: function () { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), 0).getDate() }, // Fixed now, gets #days of date 
    // Year 
    L: function () { var year = this.getFullYear(); return (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)); },   // Fixed now 
    o: function () { var d = new Date(this.valueOf()); d.setDate(d.getDate() - ((this.getDay() + 6) % 7) + 3); return d.getFullYear(); }, //Fixed now 
    Y: function () { return this.getFullYear(); },
    y: function () { return ('' + this.getFullYear()).substr(2); },
    // Time 
    a: function () { return this.getHours() < 12 ? 'am' : 'pm'; },
    A: function () { return this.getHours() < 12 ? 'AM' : 'PM'; },
    B: function () { return Math.floor((((this.getUTCHours() + 1) % 24) + this.getUTCMinutes() / 60 + this.getUTCSeconds() / 3600) * 1000 / 24); }, // Fixed now 
    g: function () { return this.getHours() % 12 || 12; },
    G: function () { return this.getHours(); },
    h: function () { return ((this.getHours() % 12 || 12) < 10 ? '0' : '') + (this.getHours() % 12 || 12); },
    H: function () { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
    i: function () { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
    s: function () { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
    u: function () {
        var m = this.getMilliseconds(); return (m < 10 ? '00' : (m < 100 ?
'0' : '')) + m;
    },
    // Timezone 
    e: function () { return "Not Yet Supported"; },
    I: function () { return "Not Yet Supported"; },
    O: function () { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + '00'; },
    P: function () { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + ':00'; }, // Fixed now 
    T: function () { var m = this.getMonth(); this.setMonth(0); var result = this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/, '$1'); this.setMonth(m); return result; },
    Z: function () { return -this.getTimezoneOffset() * 60; },
    // Full Date/Time 
    c: function () { return this.format("Y-m-d\\TH:i:sP"); }, // Fixed now 
    r: function () { return this.toString(); },
    U: function () { return this.getTime() / 1000; }
};

/* #endregion */
