﻿
function SetHandler(obj,evt,fnc)
{
if(obj.addEventListener) obj.addEventListener(evt,fnc,false);
else obj.attachEvent("on"+evt,fnc);
}
function CreateDelegate(func,scope,args)
{
    return function(){func.apply(scope,args||arguments)}
}

/***********************************
SCROLL SCRIPT
***********************************/
function ScrollNow(scrolled,isUp)
{
    scrolled.scrollTop=scrolled.scrollTop+(isUp?-10:10);
}
function BeginScrollNow(scrolled,isUp)
{
    if(scrolled.timer)return;
    ScrollNow(scrolled,isUp);
    scrolled.timer=window.setInterval(CreateDelegate(ScrollNow,this,[scrolled,isUp]),50);
}

function StopScroll(scrolled)
{
    if(!scrolled.timer)return;
    window.clearInterval(scrolled.timer);
    scrolled.timer=null;
}
function SetScroller(scrolled,up,down)
{
    SetHandler(up,"mousedown",CreateDelegate(BeginScrollNow,this,[scrolled,true]));
    SetHandler(down,"mousedown",CreateDelegate(BeginScrollNow,this,[scrolled,false]));
    var stopScroll=CreateDelegate(StopScroll,this,[scrolled]);
    SetHandler(up,"mouseup",stopScroll);
    SetHandler(down,"mouseup",stopScroll);
    SetHandler(document.body,"mouseup",stopScroll);
}



/***********************************
DROP DOWN SCRIPT
***********************************/
function Unselectable(dom) {
    dom.unselectable = "on";
    AddClass(dom, "unselectable");
}


var Shadow = function(dom, doNotChangeParent) {
    var parent = dom.parentElement || dom.parentNode;
    if (!doNotChangeParent) {
        parent.style.visibility = "hidden";
        parent.style.display = "block";
    }
    var sh = document.createElement("div");
    sh.className = "shadow";
    var iIc = ['xst', 'xsc', 'xsb'], jIc = ['l', 'c', 'r'];
    this.widthers = [];
    this.heighters = [];
    var inc, inc2;
    for (var iI = 0; iI < iIc.length; iI++) {
        inc = document.createElement("div");
        sh.appendChild(inc);
        inc.className = iIc[iI];
        if (inc.className == "xsc") {
            inc.style.height = Math.max(0, (parent.clientHeight || dom.clientHeight) - 12) + "px";
            this.heighters.push(inc);
        }
        for (var jI = 0; jI < jIc.length; jI++) {
            inc2 = document.createElement("div");
            inc2.className = inc.className + jIc[jI];
            inc.appendChild(inc2);
            if (jIc[jI] == 'c') { inc2.style.width = dom.clientWidth + "px"; this.widthers.push(inc2) }
        }
    }
    sh.style.width = (dom.clientWidth + 12) + "px";
    sh.style.height = (parent.clientHeight || dom.clientHeight) + "px";
    this.sh = sh;
    parent.insertBefore(sh, dom);
    if (!doNotChangeParent) {
        parent.style.display = "none";
        parent.style.visibility = "visible";
    }
}
Shadow.prototype =
{
    widthers: null, heighters: null,
    SetSize: function(width, height) {
        this.sh.style.width = (width + 12) + "px";
        this.sh.style.height = height + "px";
        for (var wI = 0; wI < this.widthers.length; wI++) this.widthers[wI].style.width = width + "px";
        for (var wI = 0; wI < this.heighters.length; wI++) this.heighters[wI].style.height = (height - 12) + "px";
    }
}


var closeControlsHandlers = [];
function CloseControls() {
    for (var fnI = 0; fnI < closeControlsHandlers.length; fnI++) closeControlsHandlers[fnI]();
}


function DropdownInformation(rootId, newwidth, data) {
    var list = document.getElementById(rootId + "List");
    var options = document.getElementById(rootId + "Options");
    if (!options) return;
    if (newwidth != null)
        options.style.width = newwidth + "px";


    optionItem = document.createElement("div");
    optionItem.className = "info";
    var option = document.createElement("div");
    optionItem.appendChild(option);
    var dataElement = data;
    option.innerHTML = dataElement;

    options.appendChild(optionItem);


    var parent = options.parentElement || options.parentNode;
    for (var ci = 0; ci < parent.childNodes.length; ci++) {
        var ch = parent.childNodes[ci];
        if (ch.className == "shadow") {
            ch.style.display = "none";
            break;
        }
    }
    new Shadow(options);
}


var Dropdown = function(rootId, onclick, data) {
    var list = document.getElementById(rootId + "List");
    var options = document.getElementById(rootId + "Options");
    if (!options) {
        options = document.createElement("div");
        options.id = rootId + "Options";
        options.className = "dropdownOptions";
        (list.parentElement || list.parentNode).appendChild(options);
        options.style.width = list.style.width;
    }
    options.style.visibility = "hidden";

    var optionsAndShadow = document.createElement("div");
    var optionsParent = options.parentElement || options.parentNode;
    optionsParent.replaceChild(optionsAndShadow, options);
    optionsAndShadow.appendChild(options);
    optionsAndShadow.style.width = options.style.width;
    SetHandler(list, "click", CreateDelegate(this.Toggle, this));
    this.TextCtrl = null;
    for (var ci = 0; ci < list.childNodes.length; ci++) {
        var ch = list.childNodes[ci];
        if (ch.className == "sel") {
            this.TextCtrl = ch;
            ch.style.width = (list.clientWidth - 24) + "px";
            break;
        }
    }

    var ch;
    for (var ci = 0; ci < options.childNodes.length; ci++) {
        ch = options.childNodes[ci];
        if (ch.className == "item") {
            SetHandler(ch, "mouseover", CreateDelegate(this.OnItemOver, this, [ch]));
            SetHandler(ch, "mouseout", CreateDelegate(this.OnItemOut, this, [ch]));
            if (onclick)
                SetHandler(ch, "click", CreateDelegate(this.OnItemClick, this, [ch, onclick]));
        }
    }
    if (typeof (data) == 'object') {//An array
        var optionItem;
        for (var dI = 0; dI < data.length; dI++) {
            optionItem = document.createElement("div");
            optionItem.className = "item";
            var option = document.createElement("div");
            optionItem.appendChild(option);
            var dataElement = data[dI];
            if (typeof (dataElement) == "object") {//Sub array
                optionItem.value = dataElement[0];
                option.innerHTML = dataElement[1];
            }
            else {
                optionItem.value = dataElement;
                option.innerHTML = dataElement;
            }
            options.appendChild(optionItem);
            Unselectable(option);
            SetHandler(optionItem, "mouseover", CreateDelegate(this.OnItemOver, this, [optionItem]));
            SetHandler(optionItem, "mouseout", CreateDelegate(this.OnItemOut, this, [optionItem]));
            SetHandler(optionItem, "click", CreateDelegate(this.OnItemClick, this, [optionItem, onclick]));
        }
    }

    var closeFn = CreateDelegate(this.Close, this);
    SetHandler(document.body, "click", closeFn);
    closeControlsHandlers.push(closeFn);
    this.Options = optionsAndShadow;
    new Shadow(options);
    options.style.visibility = "visible";

}

Dropdown.prototype =
{
    Options: null, TextCtrl: null, preventClose: false,
    Toggle: function(e) {
        this.preventClose = true;
        CloseControls();
        this.preventClose = false;
        if (this.Options.style.display == "block") this.Options.style.display = "none";
        else { this.Options.style.display = "block"; }
        if (!e) e = window.event;
        e.cancelBubble = true;
        return false;
    },
    OnItemOver: function(item) {
        item.className = "item over";
    },
    OnItemOut: function(item) {
        item.className = "item";
    },
    Close: function() {
        if (this.preventClose) return;
        this.Options.style.display = "none";
    },
    OnItemClick: function(item, handler) {
        CloseControls();
        this.TextCtrl.innerHTML = item.innerHTML;
        if (!handler) return;
        if (typeof (item.value) != "undefined") { handler(item.value); return; }
        var itemAttrs = item.attributes;
        for (var j = 0; j < itemAttrs.length; j++)
            if (itemAttrs[j].name == "value") {
            handler(itemAttrs[j].value);
            return;
        }
        handler(this.TextCtrl.innerHTML);
    }
}





function AddClass(dom, cls) {
    if ((' ' + (dom.className || '') + ' ').indexOf(' ' + cls + ' ') >= 0) return;
    dom.className += ' ' + cls;
}
function RemoveClass(dom, cls) {
    var i = (' ' + (dom.className || '') + ' ').indexOf(' ' + cls + ' ');
    if (i < 0) return;
    dom.className = dom.className.substr(0, i - 1) + dom.className.substr(i + cls.length);
}
function SetButton(buttonId) {
    var button = document.getElementById(buttonId);
    SetHandler(button, "mouseover", CreateDelegate(AddClass, this, [button, "hover"]));
    SetHandler(button, "mouseout", CreateDelegate(RemoveClass, this, [button, "hover"]));
}


