function MSLMultiselectBox( mainlist ) {
    if( mainlist ) {
        this.initMultiSelectbox( mainlist );
    }
}
MSLMultiselectBox.prototype.initMultiSelectbox = mslMultiselectBox_initMultiSelectbox;
MSLMultiselectBox.prototype.add                                = mslMultiselectBox_add;
MSLMultiselectBox.prototype.select                         = mslMultiselectBox_select;
MSLMultiselectBox.prototype.unselect                     = mslMultiselectBox_unselect;
MSLMultiselectBox.prototype.filter                 = mslMultiselectBox_filter;
MSLMultiselectBox.prototype.eliminate             = mslMultiselectBox_eliminate;
MSLMultiselectBox.prototype.initLists                 = mslMultiselectBox_InitLists;
MSLMultiselectBox.prototype.parentAdd                 = mslMultiselectBox_parentAdd;
MSLMultiselectBox.prototype.getName                     = mslMultiselectBox_getName;
MSLMultiselectBox.prototype.getSelVal    = mslMultiselectBox_getSelVal;
MSLMultiselectBox.prototype.getSelText = mslMultiselectBox_getSelText;
MSLMultiselectBox.prototype.getSelIdx    = mslMultiselectBox_getSelIdx;
MSLMultiselectBox.prototype.setBoxAction = mslMultiselectBox_setBoxAction;
function mslMultiselectBox_initMultiSelectbox( mainlist ) {
    var activeItems = [];
    var i, nl = mainlist.length;
    for( i=0; i<nl; i++ ) {
        activeItems[i] = true;
    }
    this.mainlist = mainlist;
    this.selectBoxes = [];
    this.activeItems = activeItems;
    this.selected = 0;
    this.selFilter = "true";
    this.aktBoxID = -1;
    this.boxAction = null;
    this.filterList = [];
}
function mslMultiselectBox_setBoxAction(action) {
    this.boxAction = action;
}
function mslMultiselectBox_parentAdd( list, mainlistindex, selIdx, hasAllOption ) {
    var n = this.selectBoxes.length;
    var box = new Object();
    box.list = list;
    box.mli = mainlistindex;
    var activeItems = new Array();
    var revIdx = new Object()
    var i, nl = list.length;
    for( i=0; i<nl; i++ ) {
        activeItems[i] = false;
        revIdx[list[i][0]] = i;
    }
    box.activeItems = activeItems;
    box.revIdx = revIdx;
    box.selectedIndex = selIdx;
    box.hasAllOption = hasAllOption;
    this.selectBoxes[n] = box;
    return n;
}
function mslMultiselectBox_select( boxID, selectedIndex ) {
    var box = this.selectBoxes[boxID];
    box.selectedIndex = selectedIndex;
    this.aktBoxID = boxID;
}
function mslMultiselectBox_unselect( boxID ) {
    var box = this.selectBoxes[boxID];
    box.selectedIndex = 0;
    this.aktBoxID = -1;
}
function mslMultiselectBox_eliminate() {
    var i, rec, idx, il = this.mainlist.length;
    var j, n, k, jl;
    var box;
    n = this.selectBoxes.length;
    for( j=0; j<n; j++ ) {
        box = this.selectBoxes[j];
        jl = box.list.length;
        for( i=0; i<jl; i++ ) {
            box.activeItems[i] = false;
        }
        for( i=0; i<il; i++ ) {
            if( this.activeItems[i] ) {
                rec = this.mainlist[i];
                idx = box.revIdx[rec[box.mli]];
                        box.activeItems[idx] = true;
            }
        }
        var tmp = new Array()
        var lst = box.list;
        k = 0;
        for( i=0; i<jl; i++ ) {
            if( box.activeItems[i] ) {
                tmp[k] = lst[i];
                k++;
            }
            else {
                box.activeItems[i] = true;
            }
        }
        var revIdx = new Object()
                for( i=0; i<k; i++ ) {
                    revIdx[tmp[i][0]] = i;
                }
        box.revIdx = revIdx;
        box.list = tmp;
    }
}
function mslMultiselectBox_filter( boxID ) {
    var i, nl, box, s = "";
    nl = this.selectBoxes.length;
    for( i=0; i<nl; i++ ) {
        if( i != boxID ) {
                        box = this.selectBoxes[i];
                        if( box.selectedIndex > 0 ) {
                                idx = box.list[box.revIdx[box.selectedIndex]][0]
                                if( s ) s += " && ";
                                s += "(rec[" + box.mli + "]==" + idx + ")";
                        }
                }
        }
        fl = this.filterList.length;
        for (i=0;i<fl; i++){
                filter = this.filterList[i];
                if (filter[1]!=""){
                        if (s) s+= " && ";
                        s+= "(rec[" + filter[0] + "].indexOf(\"" + filter[1] + "\")!=-1)";
                }
        }
    if( !s ) s = "true" ;
    box = this.selectBoxes[boxID];
    nl = box.list.length;
    for( i=0; i<nl; i++ ) {
        box.activeItems[i] = false;
    }
    var rec, nl = this.mainlist.length;
    for( i=0; i<nl; i++ ) {
        rec = this.mainlist[i];
        idx = box.revIdx[rec[box.mli]];
        if( eval( s ) ) {
                        box.activeItems[idx] = true;
                }
    }
    if (box.hasAllOption) {
        box.activeItems[0] = true;
    }
    return box;
}
function mslMultiselectBox_getName( boxID ) {
    return this.selectBoxes[boxID].name;
}
function mslMultiselectBox_InitLists() {
    this.eliminate();
    var n = this.selectBoxes.length;
    for(var j=0;j<n;j++) {
        this.filter(j);
    }
}
// parameters:
// list: array of key-value-pairs (id,value)
// mli: number of selectbox
// sbname: name of selectbox (dont know what for)
// selIdx: selected item-index
// hasAllOption: ?
function mslMultiselectBox_add( list, mli, sbname, selIdx, hasAllOption ) {
     selIdx = selIdx    || 0;
     var boxID = this.parentAdd( list, mli, selIdx, hasAllOption );
     this.selectBoxes[boxID].name = sbname;
     this.boxes[sbname] = boxID;
}
function mslMultiselectBox_getSelVal( sbname )    {
    var box = this.selectBoxes[this.boxes[sbname]];
    var lst = box.list;
    index = parseInt( box.selectedIndex );
    index = isNaN(index) ? 0 : index;
    return(index);
}
function mslMultiselectBox_getSelText( sbname )    {
    var box = this.selectBoxes[this.boxes[sbname]];
    var lst = box.list;
    index = parseInt( box.selectedIndex );
    return(lst[box.revIdx[index]][1]);
}
function mslMultiselectBox_getSelIdx( sbname )    {
    var box = this.selectBoxes[this.boxes[sbname]];
    var lst = box.list;
    index = parseInt( box.selectedIndex );
    return(lst[box.revIdx[index]][0]);
}
function MSLDisplayMultiselectBox( mainlist, sbName, formName, objName ) {
    this.initMultiSelectbox( mainlist );
    this.boxes = new Object();
    this.objName_ = objName;
    this.sbn    = sbName;
    this.doc_ = document;
    this.divID = "divAngebote";
    this.divPopupID = "divPopup1";
    this.divSelectedID = "divSelectedID";
    this.activBox="";
}
MSLDisplayMultiselectBox.prototype                        = new MSLMultiselectBox();
MSLDisplayMultiselectBox.prototype.open             = mslDisplayMultiselectBox_open;
MSLDisplayMultiselectBox.prototype.close            = mslDisplayMultiselectBox_close;
MSLDisplayMultiselectBox.prototype.write            = mslDisplayMultiselectBox_write;
MSLDisplayMultiselectBox.prototype.writeForInternalVacanies            = mslDisplayMultiselectBox_writeForInternalVacanies;
MSLDisplayMultiselectBox.prototype.popup            = mslDisplayMultiselectBox_popup;
MSLDisplayMultiselectBox.prototype.setDefaultText            = mslDisplayMultiselectBox_setDefaultText;
MSLDisplayMultiselectBox.prototype.setText            = mslDisplayMultiselectBox_setText;
MSLDisplayMultiselectBox.prototype.selectionChanged = mslDisplayMultiselectBox_selectionChanged;
MSLDisplayMultiselectBox.prototype.popupClick            = mslDisplayMultiselectBox_popupClick;
MSLDisplayMultiselectBox.prototype.setFilter            = mslDisplayMultiselectBox_setFilter;
function mslDisplayMultiselectBox_open() {
    //alert('Die Funktion <<mslDisplayMultiselectBox_open()>> ist veraltet und soll nicht mehr verwendet werden.');
}
function mslDisplayMultiselectBox_close() {
    //alert('Die Funktion <<mslDisplayMultiselectBox_close()>> ist veraltet und soll nicht mehr verwendet werden.');
}
function mslDisplayMultiselectBox_write(text, sbname, isFirst, doNotShow){
        var s="";
        var box = this.selectBoxes[this.boxes[sbname]];
        var selectID = this.divSelectedID + box.mli;
        var cssClass = "formline";
        if(isFirst == true){
            cssClass += " first";
        }
        var inlineStyle = "";
        if(doNotShow == true){
            inlineStyle = " style=\"display:none\"";
        }
        s += "<div class=\""+cssClass+"\""+inlineStyle+"><label for=\""+selectID+"\">"+text+"</label>";
        s += "<select id=\""+selectID+"\" onchange=\"" + this.objName_+ ".selectionChanged(this,'"+ sbname + "','" + selectID + "');return false;\">"
        var box = this.selectBoxes[this.boxes[sbname]];
        var lst = box.list;
        var ail = box.activeItems;
        var i, nl = lst.length;
        var selIdx = 0;
        for(i = 0; i< nl; i++ )
        {
                if( ail[i] )
                {
                        s += "<option    value=\""+lst[i][0]+"\">"+lst[i][1]+"</option>";
                }
        }
        s += "</select>";
        s += "</div>";
        this.doc_.write(s);
}
function mslDisplayMultiselectBox_writeForInternalVacanies( text, sbname ){
    //alert('Die Funktion <<mslDisplayMultiselectBox_writehidden(text, sbname)>> ist veraltet und soll nicht mehr verwendet werden.');
}
function mslDisplayMultiselectBox_setDefaultText( sbname ) {
    var box = this.selectBoxes[this.boxes[sbname]];
    var selectID = this.divSelectedID + box.mli;
    this.setText(this.getSelVal(sbname), selectID)
}
function mslDisplayMultiselectBox_setText(value, selectID){
    var selectTag = document.getElementById(selectID);
        for(var i=0;i<selectTag.options.length;i++){
                        if (selectTag.options[i].value == value){
                                selectTag.selectedIndex = i;
                        }
                }
}
function mslDisplayMultiselectBox_selectionChanged(node,sbname,selectID){
        var selectBox = document.getElementById(selectID);
        var selectedIndex = selectBox.selectedIndex;
        var selectedValue =selectBox.options[selectedIndex].value;
        var selectedText = selectBox.options[selectedIndex].text;
        this.activeBox=sbname;
        this.popupClick(sbname,selectedValue,selectedText,selectID);
        var j;
        for (j=0;j<this.selectBoxes.length;j++) {
                if (this.selectBoxes[j].name != sbname) {
                        this.popup(node,this.selectBoxes[j].name,(this.divSelectedID + this.selectBoxes[j].mli));
                }
        }
}
function mslDisplayMultiselectBox_setFilter(id,mainlistindex,text){
        this.filterList[id] = [mainlistindex,text];
        var box;
     for (var j=0; j<this.selectBoxes.length; j++) {
         box = this.filter(j);
     }
        var j;
        for (j=0;j<this.selectBoxes.length;j++) {
                        this.popup('',this.selectBoxes[j].name,(this.divSelectedID + this.selectBoxes[j].mli));
        }
}
function mslDisplayMultiselectBox_popup(node, sbname, selectID ) {
        var selectBox = document.getElementById(selectID);
        var selectedValue = this.getSelVal(sbname);
        selectBox.options.length=0;
        var box = this.selectBoxes[this.boxes[sbname]];
        var lst = box.list;
        var ail = box.activeItems;
        var i, j, nl = lst.length;
        var j=0;
        var foundSelected = false;
        for(i = 0; i< nl; i++ )
        {
                if( ail[i] )
                {
						selectBox[j] = new Option(html_entity_decode(lst[i][1].toString()), html_entity_decode(lst[i][0].toString()));
                        if (lst[i][0]==selectedValue) {
                                selectBox[j].selected=true;
                                foundSelected=true;
                        }
                        j++;
            }
    }
        if (foundSelected==false){
                         box.selectedIndex = 0;
                }
}
function mslDisplayMultiselectBox_popupClick(sbname, index, text, selectID ) {
     var boxID = this.boxes[sbname];
     if (index > 0) {
         this.select( boxID, index );
     } else {
            this.unselect( boxID );
     }
     var box;
     for (var j=0; j<this.selectBoxes.length; j++) {
         box = this.filter(j);
     }
    if (this.boxAction) {
        this.boxAction.listener(this, box, sbname, index);
    }
}

