
function ListInit(name, args, prms)
{
    return PatObj_Init(PatObjType.List, name, args, prms);
}

function ListRefresh(name, args)
{
    if(objList[name]) objList[name].Refresh(args);
}

function ListDisable(name, dis, clear)
{
    if(objList[name]) objList[name].Disable(dis, clear);
}

function IsBtnDisabled(name, btn)
{
    var res = false;
    
    if (objList[name])  
        res = objList[name].IsBtnDisabled(btn);
    
    return res;
}

/*ListsEditorMediator type
Description:
    Mediator that sync lists and buttons
Functions:
    free() - free all resources
*/
function ListsEditor(name, args, prms)// DataChangeNotifyList, isDisabled, , onMoved)
{
    var self = objList[name];
    if(self == null) return OnErr({obj: self, msg: "Can't init object", val: name});

    self.name = name;
    
    self.tipColumn = (prms.tipColumn ? prms.tipColumn : "tip");

    self.disabled = false;
    self.args = args;
    self.allList = $get(name + "_AllList");
    self.selList = $get(name + "_SelList");
    
        
    if(self.allList == null || self.selList == null) return;
    
    self.allTable = self.allList.getAttribute("dbAdapter");
    self.selTable = self.selList.getAttribute("dbAdapter");

    self.all_colID   = self.allList.getAttribute("colID");
    self.all_colName = self.allList.getAttribute("colName");

    self.sel_colID   = self.selList.getAttribute("colID");
    self.sel_colName = self.selList.getAttribute("colName");
    
    self.selButton = $get(name + "_SelButton");
    self.unselButton = $get(name + "_UnButton");
    self.selAllButton = $get(name + "_AllButton");
    self.unselAllButton = $get(name + "_UnAllButton") ;
    self.upButton = $get(name + "_UpButton") ;
    self.dnButton = $get(name + "_DnButton") ; 
    //functions

    self.IsBtnDisabled = function (btn)
        {
            var res = false;
            
            if (btn == 'Sel')
                res = (self.disabled || self.allList.getSelectedOpts().length == 0);
            else if (btn == 'Un' || btn == 'Up' || btn == 'Dn')
                res = (self.disabled || self.selList.getSelectedOpts().length == 0);
            else if (btn == 'All')
                res = (self.disabled || self.allList.getAllOpts().length == 0);
            else if (btn == 'UnAll')
                res = (self.disabled || self.selList.getAllOpts().length == 0);   
            
            return res;                            
        }
    
    self.OnDataChangeNotification = function (params) 
        { 
            self.LoadData();
        }

    self.OnRowChangeNotification = function (params) 
        { 
            if(params != null && params["rowId"] != null && params["rowidname"] != null)
                self.args = AddHash(self.args, params["rowidname"], params["rowId"]);

            self.Disable(params["rowId"] == "-1");
            if (params["rowId"] != "-1") self.LoadData();
        }


    self.OnServiceRes = function (res)
    {
        switch(res["cmdCode"])
        {
            case "GetListTables": self.OnGetListTablesRes(res); break;
            case "OptionsIns": case "OptionsDel": case "OptionMove":
                if (res["errCode"] != null) { self.Refresh(); return OnErr({obj: self, msg: res["errCode"]}); } break;
        }
    }

    self.Refresh = function(args) {
        if(args) self.args = AddHash(self.args, args);
        self.LoadData();
    }
    self.Disable = function(dis, clear) {
        self.disabled = dis;
        disableCtrl(self.allTable, dis);
        disableCtrl(self.selTable, dis);
        if(clear != false)
        {
            self.allList.innerHTML = "";
            $(self.allList).change();
            self.selList.innerHTML = "";
            $(self.selList).change();
        }
    }

    self.LoadData = function() {
        ServerCall("GetListTables", self, {args: self.args, AllTable: self.allTable, SelTable: self.selTable});
    }

    self.OnGetListTablesRes = function(res) {
        if (res["errCode"] != null) return OnErr({obj: self, msg: res["errCode"]});
        var SelTable = res["SelTable"];
        var AllTable = res["AllTable"];

	    var selopts = new Object();
        if(SelTable.rows != null)
    	    for (var i = 0; i < SelTable.rows.length; ++i)
	            selopts[SelTable.rows[i][SelTable.columns[0].name]] = true;

        self.allList.hiddenVals = new Object();
        self.selList.hiddenVals = new Object();
        
        self.stable = new Object();

        self.allList.innerHTML = "";
        $(self.allList).change();
        self.selList.innerHTML = "";
        $(self.selList).change();
        if(AllTable.rows != null)
        {
    	    for (var i = 0; i < AllTable.rows.length; ++i)
	        {
	            var row = AllTable.rows[i];
	            var o = new Option(row[self.all_colName ? self.all_colName : AllTable.columns[1].name], row[self.all_colID ? self.all_colID : AllTable.columns[0].name]);
	            o.title = (row[self.tipColumn] ? row[self.tipColumn]: row[self.all_colName ? self.all_colName : AllTable.columns[1].name]);
	            if (row.color) o.style.backgroundColor = row.color.toString();
	            if (row.hidden && row.hidden.toString() == "1") self.allList.hiddenVals[o.value] = true;
	            if (row.stable && row.stable.toString() == "1") self.stable[o.value] = true;

	            if(selopts[o.value] == null && self.allList.hiddenVals[o.value] == null)
                    self.allList.options.add(o);
	        }

	        if(SelTable.rows != null)
	        {
    	        for (var i = 0; i < SelTable.rows.length; ++i)
	            {
	                var row = SelTable.rows[i];
	                var o = new Option(row[self.sel_colName ? self.sel_colName : SelTable.columns[1].name], row[self.sel_colID ? self.sel_colID : SelTable.columns[0].name]);
    	            o.title = (row[self.tipColumn] ? row[self.tipColumn]: row[self.sel_colName ? self.sel_colName : SelTable.columns[1].name]);
	                if (row.color) o.style.backgroundColor = row.color.toString();
    	            if (row.hidden && row.hidden.toString() == "1") self.selList.hiddenVals[o.value] = true;

	                if(self.selList.hiddenVals[o.value] == null)
                        self.selList.options.add(o); 
	            }
	        }
        }           
        $(self.allList).change();
        $(self.selList).change();
    }
    self.onSelect = function(args, opts) {
        var o = new Array();
        for(var i = 0; i < opts.length; ++i)
            if(self.selList.hiddenVals[opts[i].value] == null)
                o.push(opts[i].value);
        ServerCall("OptionsIns", self, {opts: o, args: args, SelTable: self.selTable});
        DataChangeNotify(self.DataChangeNotifyList, {act: "list_select"});
    }
    self.onUnselect = function(args, opts) {
        var o = new Array();
        for(var i = 0; i < opts.length; ++i)
            o.push(opts[i].value);
        ServerCall("OptionsDel", self, {opts: o, args: args, SelTable: self.selTable});
        DataChangeNotify(self.DataChangeNotifyList, {act: "list_unselect"});
    }
    self.onReorder  = function(args, opts) {
        ServerCall("OptionMove", self, {opts: opts, args: args, SelTable: self.selTable});
        DataChangeNotify(self.DataChangeNotifyList, {act: "list_reorder"});
    }


    var _getSelectedOpts = function() {
        var ret = new Array();
        var list = this;
        for(var i = 0; i < list.options.length; ++i)
            if(list.options[i].selected && self.stable[list.options[i].value] == null) 
                ret.push(list.options[i]);
        return ret;    
    }
    var _getAllOpts = function() {
        var ret = new Array();
        var list = this;
        for(var i = 0; i < list.options.length; ++i)
            if(self.stable[list.options[i].value] == null) 
                ret.push(list.options[i]);
        return ret;
    }
    var _moveOptions = function(listFrom, opts, listTo) 
    {
        for(var i = 0; i < opts.length; ++i) {
            listFrom.remove(opts[i].index);
            if(listTo.hiddenVals[opts[i].value] == null)
                listTo.options.add(opts[i]);
        }
        $(self.allList).change();
        $(self.selList).change();
    }
    self.SetupButtons = function() {
        disableCtrl(self.selButton, self.disabled || self.allList.getSelectedOpts().length == 0);
        disableCtrl(self.unselButton, self.disabled || self.selList.getSelectedOpts().length == 0);
        disableCtrl(self.selAllButton, self.disabled || self.allList.getAllOpts().length == 0);
        disableCtrl(self.unselAllButton, self.disabled || self.selList.getAllOpts().length == 0);

        if(self.upButton != null) disableCtrl(self.upButton, self.unselButton.disabled);
        if(self.dnButton != null) disableCtrl(self.dnButton, self.unselButton.disabled);
    }
    var _onChangeAllList = function() {
        self.SetupButtons();
    }
    var _onChangeSelList = function() {
        self.SetupButtons();
    }
    var _select = function() {
        var opts = self.allList.getSelectedOpts();
        if(opts.length == 0) return;
        if(self.onSelect != null) self.onSelect(self.args, opts);
        _moveOptions(self.allList, opts, self.selList);
        self.SetupButtons();
    }
    var _selectAll = function() {
        var opts = self.allList.getAllOpts();
        if(opts.length == 0) return;
        if(self.onSelect != null) self.onSelect(self.args, opts);
        _moveOptions(self.allList, opts, self.selList);
        self.SetupButtons();
    }
    var _unselect = function() {
        var opts = self.selList.getSelectedOpts();
        if(opts.length == 0) return;
        if(self.onUnselect != null)self.onUnselect(self.args, opts);
        _moveOptions(self.selList, opts, self.allList);
        self.SetupButtons();
    }
    var _unselectAll = function() {
        var opts = self.selList.getAllOpts();
        if(opts.length == 0) return;
        if(self.onUnselect != null) self.onUnselect(self.args, opts);
        _moveOptions(self.selList, opts, self.allList);
        self.SetupButtons();
    }
    var _up = function() {
        if(self.selList.options[0].selected) return;
        var arr = new Array();
        for(var i = 1; i < self.selList.options.length; ++i) {
            var opt = self.selList.options[i];
            if(opt.selected) {
                arr.push(opt.value);
                self.selList.remove(i);
                try {
                    self.selList.add(opt,self.selList.options[i-1]);
                } catch(ex) {
                    self.selList.add(opt,i-1);
                }
            }
        }
        $(self.allList).change();
        $(self.selList).change();
        if (self.onReorder != null) self.onReorder(AddHash(self.args, "dir", "up"), arr);
        self.SetupButtons();
    }
    var _dn = function() {
        if(self.selList.options[self.selList.options.length-1].selected) return;
        var arr = new Array();
        for(var i = self.selList.options.length-2; i >= 0 ; --i) {
            var opt = self.selList.options[i];
            if(opt.selected) {
                arr.push(opt.value);
                self.selList.remove(i);
                if(i+1 < self.selList.options.length) {
                    try {
                        self.selList.add(opt,self.selList.options[i+1]);
                    } catch(ex) {
                        self.selList.add(opt,i+1);
                    }
                } else {
                    try {
                        self.selList.add(opt, null);
                    } catch(ex) {
                        self.selList.add(opt);
                    }
                }
            }
        }
        $(self.allList).change();
        $(self.selList).change();
        if (self.onReorder != null) self.onReorder(AddHash(self.args, "dir", "down"), arr);
        self.SetupButtons();
    }

    //all list
    self.allList.getSelectedOpts = _getSelectedOpts;
    self.allList.getAllOpts = _getAllOpts;
    $(self.allList).change(_onChangeAllList);
    AddHandler(self.allList, "dblclick", _select);

    //sel list
    self.selList.getSelectedOpts = _getSelectedOpts;
    self.selList.getAllOpts = _getAllOpts;
    $(self.selList).change(_onChangeSelList);
    AddHandler(self.selList, "dblclick", _unselect);

    //sel button
    AddHandler(self.selButton, "click", _select);
    //unsel button
    AddHandler(self.unselButton, "click", _unselect);

    //selAll button
    AddHandler(self.selAllButton, "click", _selectAll);

    //unselAll button
    AddHandler(self.unselAllButton, "click", _unselectAll);

    //up button
    if (self.upButton != null) AddHandler(self.upButton, "click", _up);
    //dn button
    if (self.dnButton != null) AddHandler(self.dnButton, "click", _dn);
    
	self.LoadData();
    self.Disable(prms.disabled, false);
    iPadPATLists(name);
}



function iPadPATLists(name) {
    if (iPad)
    {
        var sellist = $("#" + name + "_SelList");
        iPadList(sellist);
        var alllist = $("#" + name + "_AllList");
        iPadList(alllist);
    }
}
function iPadList(list) {
    var div = $("<div></div>").insertAfter(list);
    var divH = (list.attr("size") - 0) * 16.2;
    divH = parseInt(divH == 0 ? list.css("height") : divH);
    div.css({
        "border": "1px solid #999999",
        "background-color": "#ffffff",
        "width": list.css("width"),
        "height": divH,
        "overflow-y": "auto",
        "overflow-x": "hidden"
    });
    list.hide();
    var lastindex = 0;
    div.click(function(event) {
        event = event || window.event;
        if (event.target.option) {
            if (event.shiftKey) {
                var begindex = Math.min(lastindex, event.target.option.index);
                var endindex = Math.max(lastindex, event.target.option.index);
                for (var i = 0; i < list[0].options.length; ++i) {
                    var o = list[0].options[i];
                    if (o) o.selected = (begindex <= i && i <= endindex);
                }
            } else if (event.ctrlKey)
                event.target.option.selected = !event.target.option.selected;
            else list[0].selectedIndex = event.target.option.index;
            if (!event.shiftKey) lastindex = event.target.option.index;
            list.change();
        }
    });
    list.change(function(e) {
        var scroll = div.scrollTop();
        div.empty();
        var table = $("<table border='0' cellpadding='0' cellspacing='0' width='100%' onmousedown='return false;' onselectstart='return false;'><tbody></tbody></table>").appendTo(div);
        var tbody = $("tbody", table);
        for (var i = 0; i < list[0].options.length; ++i) {
            var tr = $("<tr></tr>").appendTo(tbody);
            var td = $("<td></td>").appendTo(tr);
            var o = list[0].options[i];
            td[0].option = o;
            if (o.selected) {
                td[0].style.backgroundColor = '#88AACC';
                td[0].style.color = '#ffffff';
            } else {
                td[0].style.backgroundColor = o.style.backgroundColor;
                td[0].style.color = o.style.color;
            }
            td[0].style.cursor = "pointer";
            td[0].style.whiteSpace = "nowrap";
            td.text(list[0].options[i].text);
        }
        div.scrollTop(scroll);
    });
    list.change();
}

