


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.onServerCall = prms.onServerCall;
    self.onServerRes = prms.onServerRes;
    self.onDataLoaded = prms.onDataLoaded;

    self.tipColumn = (prms.tipColumn ? prms.tipColumn : "tip");

    //data
    self.DataChangeNotifyList = prms.DataChangeNotifyList;

    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.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.selList.innerHTML = "";
        }
        self.SetupButtons();
    }

    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.hidden = new Object();
        self.selList.hidden = new Object();
        
        self.stable = new Object();

        self.allList.innerHTML = "";
        self.selList.innerHTML = "";
        if(AllTable.rows != null)
        {
    	    for (var i = 0; i < AllTable.rows.length; ++i)
	        {
	            var row = AllTable.rows[i];
	            var o = new Option(row[AllTable.columns[1].name], row[AllTable.columns[0].name]);
	            o.title = (row[self.tipColumn] ? row[self.tipColumn]: row[AllTable.columns[1].name]);
	            if (row.color) o.style.backgroundColor = row.color.toString();
	            if (row.hidden && row.hidden.toString() == "1") self.allList.hidden[o.value] = true;
	            if (row.stable && row.stable.toString() == "1") self.stable[o.value] = true;

	            if(selopts[o.value] == null && self.allList.hidden[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[SelTable.columns[1].name], row[SelTable.columns[0].name]);
    	            o.title = (row[self.tipColumn] ? row[self.tipColumn]: row[SelTable.columns[1].name]);
	                if (row.color) o.style.backgroundColor = row.color.toString();
    	            if (row.hidden && row.hidden.toString() == "1") self.selList.hidden[o.value] = true;

	                if(self.selList.hidden[o.value] == null)
                        self.selList.options.add(o); 
	            }
	        }
        }           
        self.SetupButtons();
    }
    self.onSelect = function(args, opts) {
        var o = new Array();
        for(var i = 0; i < opts.length; ++i)
            if(self.selList.hidden[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.hidden[opts[i].value] == null)
                listTo.options.add(opts[i]);
        }
    }
    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() {
        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);
                self.selList.options.add(opt,i-1);
            }
        }

        if (self.onReorder != null) self.onReorder(AddHash(self.args, "dir", "up"), arr);
        self.SetupButtons();
    }
    var _dn = function() {
        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);
                self.selList.options.add(opt,i+1);
            }
        }

        if (self.onReorder != null) self.onReorder(AddHash(self.args, "dir", "down"), arr);
        self.SetupButtons();
    }

    //all list
    self.allList.getSelectedOpts = _getSelectedOpts;
    self.allList.getAllOpts = _getAllOpts;
    AddHandler(self.allList, "change", _onChangeAllList);
    AddHandler(self.allList, "dblclick", _select);

    //sel list
    self.selList.getSelectedOpts = _getSelectedOpts;
    self.selList.getAllOpts = _getAllOpts;
    AddHandler(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);
}
