/* 
        MINIMA ATK Linkers control elements
        By Vit Absens after Andrew Brainin
*/

        var atkLinkers = new Array();

        if (! atkMsgAdd) atkMsgAdd = 'add';
        

        //-----------------------------------------------------
        // atkItem object constructor. Item has value and title
        //-----------------------------------------------------
        function atkItem(value, title)
        {
                this.value = value;
                this.title = title;
        }

        
        //-----------------------------------------------------
        // registers object as linker
        //-----------------------------------------------------
        function atkRegisterLinker(obj)
        {
                var i = atkLinkers.length;
                if (i == 0) i++;
                atkLinkers[i] = obj;
                return i;
        }

        
        //-----------------------------------------------------
        // gets registered linker object
        //-----------------------------------------------------
        function atkLinker(id)
        {
                return atkLinkers[id];
        }


        //-----------------------------------------------------
        // atkSLinker object
        //-----------------------------------------------------

        //-----------------------------------------------------
        // atkSLinker (single-item linker) constructor
        //-----------------------------------------------------
        function atkSLinker(field, selectorUrl)
        {
                this.selectorUrl = selectorUrl;
                this.selectorUrl += (selectorUrl.indexOf('?') == -1) ? "?" : "&";
                this.selectorUrl += 'js_autoclose=1';

                this.field = field;

                this.emptyItem = new atkItem('','N/A');
                this.item = this.emptyItem;

                this.makeHTML = atkSlMakeHTML;
                this.setItem = atkSlSetItem;
                this.showSelector = atkSlShowSelector;

                // control interface
                this.receive = atkSlReceive;
                this.reset = atkSlReset;
                this.setValue = atkSlSetValue;
                this.setTitle = atkSlSetTitle;

                this.id = atkRegisterLinker(this);
                
                this.domId = "control" + this.id;
                this.bindedFieldId = "bindedField" + this.id;
                this.bindedTitleId = "bindedTitle" + this.id;
        }

        //-----------------------------------------------------
        // atkSLinker method: return HTML code for the control
        //-----------------------------------------------------
        function atkSlMakeHTML()
        {
                var code = '<div id="'+ this.domId +'">\n';
                code += '<input id="' + this.bindedFieldId + '" type="hidden" name="' + this.field + '" value="'+ this.item.value +'">\n';
                code += '<table><tr>\n';
                code += '<td><span id="' + this.bindedTitleId +'">' + this.item.title + '</span>&nbsp;&nbsp;&nbsp;</td>';
                code += '<td><a href="#" onClick="atkLinker(' + this.id + ').showSelector(); return false;" title="select"><img src="/jvm-supl-tk/admin/img/jslinker/select.gif" align=right vspace=0 hspace=0 border="0" alt="select"></a></td>';
                code += '<td><a href="#" onClick="atkLinker(' + this.id + ').reset(); return false;" title="delete"><img src="/jvm-supl-tk/admin/img/jslinker/clean.gif" align=right vspace=0 hspace=0 border="0" alt="delete"></a></td>';
                code += '</tr></table></div>\n';
                document.writeln(code);
        }

        //-----------------------------------------------------
        // atkSLinker method: set item
        //-----------------------------------------------------
        function atkSlSetItem(item)
        {
                if (this.item.value != item.value)
                {
                        this.setValue(item.value);
                        this.setTitle(item.title);
                }
                this.item = item;
        }

        //-----------------------------------------------------
        // atkSLinker method: show external selector window
        //-----------------------------------------------------
        function atkSlShowSelector() 
        {
                var eurl;
                eval ("eurl='" + this.selectorUrl + "';"); // на случай если в URL встроен JavaScript
                eurl += (eurl.indexOf('?') == -1) ? "?" : "&";
                eurl += 'js_receiver=' + this.id;

                var wnd = window.open(eurl, 'Selector' + this.id,'menubar=no,resizable=yes,toolbar=no,location=no,scrollbars=yes,status=yes,width=600,height=400');
                wnd.focus();
                return false;
        }

        //-----------------------------------------------------
        // atkSLinker method: implements receiver interface
        //-----------------------------------------------------
        function atkSlReceive(value, title)
        {
                this.setItem(new atkItem(value, title));
        }

        //-----------------------------------------------------
        // atkSLinker method: reset control binded field
        //-----------------------------------------------------
        function atkSlReset()
        {
                this.setItem(this.emptyItem);
        }

        //-----------------------------------------------------
        // atkSLinker method: set value to control binded field
        //-----------------------------------------------------
        function atkSlSetValue(value)
        {
                var bindedField = document.getElementById(this.bindedFieldId);
                bindedField.value = value;
        }

        //-----------------------------------------------------
        // atkSLinker method: set title to control binded title
        //-----------------------------------------------------
        function atkSlSetTitle(title)
        {
                var bindedTitle = document.getElementById(this.bindedTitleId);
                bindedTitle.innerHTML = title;

        }


        //-----------------------------------------------------
        // atkMLinker (multi-item linker) constructor
        //-----------------------------------------------------
        function atkMLinker(field, selectorUrl)
        {
                this.selectorUrl = selectorUrl;

                this.field = field;
                this.items = new Array();

                this.makeHTML = atkMlMakeHTML;
                this.makeItem = atkMlMakeItem;
                this.makeAdder = atkMlMakeAdder;
                this.existsItem = atkMlExistsItem;
                this.receive = atkMlReceive;
                this.appendItem = atkMlAppendItem;
                this.appendAdder = atkMlAppendAdder;
                this.removeItem = atkMlRemoveItem;
                this.removeAdder = atkMlRemoveAdder;
                this.rebuildValue = atkMlRebuildValue;
                // inherited from SLinker:
                this.showSelector = atkSlShowSelector;
                this.setValue = atkSlSetValue;  

                this.id = atkRegisterLinker(this);

                this.domId = "control" + this.id;
                this.bindedFieldId = "bindedField" + this.id;
        }

        //-----------------------------------------------------
        // MLinker method: returns HTML code for empty control 
        //-----------------------------------------------------
        function atkMlMakeHTML()  // функция рисует пустышку-заготовку html; потом ее надо наполинть вызовами receive()
        {
                var code = '<div id="' + this.domId + '"><input type="hidden"  id="' + this.bindedFieldId + '" name="'+ this.field + '" value=""></div>\n';
                document.writeln(code);
                this.appendAdder();
        }

        //-----------------------------------------------------
        // MLinker method: returns HTML code for an item view by its index
        //-----------------------------------------------------
        function atkMlMakeItem(i)
        {
                return '<table border=0 cellpadding=2 cellspacing=0><tr><td><a href="#" onClick="atkLinker('+ this.id +').removeItem('+ i +'); return false;" title="delete"><img src="/jvm-supl-tk/admin/img/jslinker/clean.gif" border="0"></a></td><td>&nbsp;' + this.items[i].title +'&nbsp;(' + this.items[i].value  + ')</td></tr></table>';
        }

        //-----------------------------------------------------
        // MLinker method: returns HTML code for adder
        //-----------------------------------------------------
        function atkMlMakeAdder()
        {
                return '<table border=0 cellpadding=2 cellspacing=0><tr><td><a href="#" onClick="atkLinker('+ this.id +').showSelector(); return false;" title="select"><img src="/jvm-supl-tk/admin/img/jslinker/add.gif" border="0" alt="add"></a></td><td>&nbsp;<a href="#" onClick="atkLinker('+ this.id +').showSelector(); return false;">' + atkMsgAdd + '</a></td></tr></table>';
        }

        //-----------------------------------------------------
        // MLinker method: checks if item presents in the items list
        //-----------------------------------------------------
        function atkMlExistsItem(item)
        {
                for (i = 0; i < this.items.length; i++) {
                        if (this.items[i].value == item.value) return true;
                }
                return false;
        }

        //-----------------------------------------------------
        // MLinker method: alias for atkMlAppendItem
        //-----------------------------------------------------
        function atkMlReceive(value, title)
        {
                return this.appendItem(new atkItem(value, title));
        }

        //-----------------------------------------------------
        // MLinker method: appends item to the end of the items list
        //-----------------------------------------------------
        function atkMlAppendItem(item)
        {
                if ( this.existsItem(item) ) return false;

                var pos = this.items.length;
                this.items.length++;
                this.items[pos] = item;

                this.removeAdder();

                var items = document.getElementById(this.domId);
                var newItem = document.createElement("div");
                newItem.id = this.domId + 'Item' + pos;
                newItem.innerHTML = this.makeItem(pos);
                items.appendChild(newItem);

                this.appendAdder();

                this.rebuildValue();
                return false;
        }

        //-----------------------------------------------------
        // MLinker method: appends adder to the end of the items list
        //-----------------------------------------------------
        function atkMlAppendAdder(item)
        {
                var items = document.getElementById(this.domId);
                var adder = document.createElement("div");
                adder.id = this.domId + 'Adder';
                adder.innerHTML = this.makeAdder();
                items.appendChild(adder);
        }

        //-----------------------------------------------------
        // MLinker method: removes item from the items list
        //-----------------------------------------------------
        function atkMlRemoveItem(i)
        {
                var items = document.getElementById(this.domId);
                var item = document.getElementById(this.domId + 'Item' + i);
                items.removeChild(item);

                for (k = i; k < this.items.length - 1; k++)
                {
                        this.items[k] = this.items[k + 1];
                }

                this.items.length--;
                this.rebuildValue();
        }

        //-----------------------------------------------------
        // MLinker method: removes adder
        //-----------------------------------------------------
        function atkMlRemoveAdder()
        {
                var items = document.getElementById(this.domId);
                var adder = document.getElementById(this.domId + 'Adder');
                items.removeChild(adder);
        }

        //-----------------------------------------------------
        // MLinker method: rebulds summary value
        //-----------------------------------------------------
        function atkMlRebuildValue()
        {
                var value = new String();
                for (i = 0; i < this.items.length; i++)
                {
                        if ( i != 0 ) value += ",";
                        value += this.items[i].value;
                }
                this.setValue(value);
        }

