/** list handler
 * @author Horst Gaussmann
 * @version $Revision: 1.4 $
 **/


function ListHandler() {
    this.registeredLists = new Array();
    this.registeredPossibleOptLists = new Array();
    this.registeredZusResLists = new Array();
    this.registeredOberGrLists = new Array();
    this.register = ListHandler_register;
    this.prepare = ListHandler_prepare;
    this.move = ListHandler_move;
    this.move_prio = ListHandler_move_prio;
    this.del = ListHandler_del;
    this.mod_prio = ListHandler_mod_prio;
    this.find = ListHandler_find;
    this.fillZusRes = ListHandler_fillZusResult;
}

function ListHandler_register(list, possibleOptList, zusResultList, oberGruppeList) {
    //    alert("zusResultList: "+zusResultList)
    //    alert("oberGruppeList: "+oberGruppeList)
    this.registeredLists[this.registeredLists.length] = list;
    this.registeredPossibleOptLists[this.registeredPossibleOptLists.length] = possibleOptList;
    if (zusResultList != null)
        this.registeredZusResLists[this.registeredZusResLists.length] = zusResultList;
    if (oberGruppeList != null)
        this.registeredOberGrLists[this.registeredOberGrLists.length] = oberGruppeList;
}

function ListHandler_prepare() {
    //    alert("ListHandler_prepare")
    for (var i = 0; i < this.registeredLists.length; i++) {
        var list = this.registeredLists[i];
        for (var k = 0; k < list.options.length; k++) {
            list.options[k].selected = true;
            //                  alert(list.options[k].value);
        }
    }
}


function ListHandler_move(resListNr) {
    var left = this.registeredPossibleOptLists[resListNr];
    var right = this.registeredLists[resListNr];
    for (var i = 0; i < left.options.length; i++) {
        var lo = left.options[i];
        var ro = right.options;
        if (lo.selected && indexOfResult(ro, lo.value) == -1) {
            if (lo.value != "null")
                right.options[right.options.length] = new Option(lo.text.replace("--", ""), lo.value);
            //      left.options[i--] = null;
        }
    }
}


function ListHandler_del(resListNr) {
    var right = this.registeredLists[resListNr];
    var r_length = right.options.length;
    //  for(var i = 0; i < right.options.length; i++) {
    for (var i = right.options.length - 1; i >= 0; i--) {
        var ro = right.options[i];
        if (ro.selected) {
            delResult(i, right.options, r_length);
        }
    }
}

function delSelection(typ) {
    if (res_list != null) {
        var is_child;
        for (var i = res_list.length - 1; i >= 0; i--) {
            if (res_list[i].selected) {
                is_child = isChild(res_list[i].text);
                delResult(i, res_list);
                if (!is_child)
                    delChilds(i, res_list);
            }
        }
    }
}


function ListHandler_move_prio(left, right) {
    for (var i = 0; i < left.options.length; i++) {
        var parent_id;
        var lo = left.options[i];
        var ro = right.options;
        //    var prio = right.options.length + 1;
        //    var prio_str = formatPrio(prio);
        if (lo.selected && indexOfResult(ro, lo.value) < 0) {
            if (isChild(lo.text))
                parent_id = addParent(i, lo, ro);
            else
                parent_id = -1;
            addResult(ro, lo.text, lo.value, parent_id);
            lo.selected = false;
            //      right.options[right.options.length] = new Option(formatResult(prio_str, lo.text), lo.value + "," + prio);

        }
    }
}


//  function addSelection(typ) {
//    // alert("addSelection(1)");
//    var form = getHtmlForm(0);
//    var sel_list  = getSelList(form, typ);
//    var res_list  = getResList(form, typ);
//    var text;
//    var parent_id;
//    for (var i = 0; i < sel_list.length; i++) {
//      if (sel_list[i].selected) {
//        text = sel_list[i].text;
//        if (isChild(text))
//          parent_id = addParent(i, sel_list, res_list);
//        else
//          parent_id = -1;
//        addResult(res_list, text, sel_list[i].value, parent_id);
//        sel_list[i].selected = false;
//      }
//    }
//  }

function addResult(res_list, text, value, parent_id) {
    alert("addResult: parent_id=" + parent_id);
    if (indexOfResult(res_list, value) < 0) { // Falls Element noch nicht in Liste
        pos = getPosResult(res_list, parent_id);
        // falls Position nicht am Ende: Rest nach hinten schieben
        for (var i = res_list.length; i > pos; i--)
            res_list[i] = new Option(res_list[i - 1].text, res_list[i - 1].value);
        // an Position pos einfügen
        var prio = getMaxPrio(res_list) + 1;
        var prio_str = formatPrio(prio);
        //       alert("prio='" + prio + "'");
        res_list[pos] = new Option(formatResult(prio_str, text), value + "," + prio);
    }
}

function saveList(list_name) {
    for (var i = list_name.length - 1; i >= 0; i--)
        list_name[i].selected = true;
}

function unhighlightList(list_name) {
    for (var i = list_name.length - 1; i >= 0; i--)
        list_name[i].selected = false;
}


function getPrioFromResult(res) {
    var prio = -1;
    if (res != null && res.length >= 3) {
        var prio_text = res.substring(0, 3);
        var val = parseInt(prio_text, 10);
        if (!isNaN(val))
            prio = val;
    }
    //     alert("getPrioFromResult(" + res + ")->" + prio);
    return prio;
}

function getMaxPrio(res_list) {
    var max_val = 0;
    var text;
    if (res_list != null) {
        for (var i = 0; i < res_list.length; i++) {
            prio = getPrioFromResult(res_list[i].text);
            if (prio > max_val)
                max_val = prio;
        }
    }
    // alert("getMaxPrio()->" + max_val);
    return max_val;
}

function formatPrio(prio) {
    if (prio < 10)
        return "00" + prio;
    else if (prio < 100)
        return "0" + prio;
    else
        return prio;
}

function formatResult(prio, text) {
    return (prio + ", " + text);
}

function getIdFromListId(list_id) {

    if (list_id != null) {
        var pos = list_id.indexOf(",");
        if (pos > 0)
            id = list_id.substring(0, pos);
        else
            id = list_id;
    }
    // alert("getIdFromListId(" + list_id + ")=" + id);
    return id;
}

function indexOfResult(list, value) {
    //     alert("indexOfResult: value=" + value);
    var index = -1;
    var id;
    for (var i = 0; index < 0 && i < list.length; i++) {
        // alert("list[i].value=" + list[i].value);
        id = getIdFromListId(list[i].value);
        if (value == id)
            index = i;
    }
    //     alert("indexOfResult->" + index);
    return index;
}

function getPosResult(res_list, parent_id) {
    var pos = res_list.length;
    var found = false;

    p_res_idx = indexOfResult(res_list, parent_id);
    // alert("p_res_idx=" + p_res_idx);
    if (p_res_idx >= 0) {
        // suche nächsten Eintrag der nicht mit '-' beginnt
        for (var i = p_res_idx + 1; !found && i < res_list.length; i++) {
            text = res_list[i].text;
            if (!isChild(text)) {
                pos = i;
                found = true;
            }
        }
    }
    return pos;
}


function addParent(pos, sel_list, res_list) {
    //  alert("addParent: pos=" + pos);
    var parent_id = -1;
    var text;
    var found = false;
    for (var j = pos; parent_id < 0 && j > 0; j--) {
        text = sel_list[j].text;
        if (!isChild(text)) {
            parent_id = sel_list[j].value;
            addResult(res_list, text, parent_id, -1);
        }
    }
    return parent_id;
}


function isChild(text) {
    return (text != null && text.length > 0 &&
            (text.charAt(0) == '-' || text.charAt(5) == '-'));
}

function delResult(pos, res_list, len) {
    //       alert("delResult(" + pos + ";len="+len+")");
    if (res_list != null && pos < len) {
        //    var prio = getPrioFromResult(res_list[pos].text);
        res_list[pos] = null;
        // für alle Einträge mit größerer Priorität als prio: reduziere die P. um 1
        var t_prio;
        for (var i = 0; i < len - 1; i++) {
            //              alert(res_list[i].value);
            //      if (res_list[i] != null) {
            //        t_prio = getPrioFromResult(res_list[i].text);
            //        if (t_prio > prio)
            //          res_list[i] = setPrio(t_prio - 1, res_list[i]);
            //      }
        }
    }
}


function delChilds(start_idx, res_list) {
    if (res_list != null || res_list.length >= 0) {
        var found = false;
        // Suche nächsten Nicht-Child-Eintrag
        var pos = res_list.length;
        for (var i = start_idx; !found && i < res_list.length; i++) {
            if (!isChild(res_list[i].text)) {
                found = true;
                pos = i;
            }
        }

        for (var i = pos - 1; i >= start_idx; i--)
            delResult(i, res_list);
    }
}


function findPrio(prio, res_list) {
    var pos = -1;
    var t_prio;
    for (var i = 0; pos < 0 && i < res_list.length; i++) {
        t_prio = getPrioFromResult(res_list[i].text);
        if (t_prio == prio)
            pos = i;
    }

    return pos;
}

function setPrio(prio, entry) {
    if (prio != null && entry != null) {
        var prio_text = formatPrio(prio);
        var value = entry.value;
        var pos = 0;
        if (value != null)
            pos = value.indexOf(",");
        entry = new Option(prio_text + entry.text.substring(3, entry.text.length),
                value.substr(0, pos) + "," + prio);
    }
    return entry;
}

function ListHandler_mod_prio(list, inc) {
    var res_list = list.options;
    if (res_list != null) {
        var prio;
        var pos;
        var max_prio = getMaxPrio(res_list);
        for (var i = 0; i < res_list.length; i++) {
            if (res_list[i].selected) {
                prio = getPrioFromResult(res_list[i].text);
                if ((inc < 0 && prio > 1) || (inc > 0 && prio < max_prio)) {
                    pos = findPrio(prio + inc, res_list);
                    res_list[i] = setPrio(prio + inc, res_list[i]);
                    if (pos >= 0)
                        res_list[pos] = setPrio(prio, res_list[pos]);
                }
                res_list[i].selected = true;
            }
        }
    }
}

function ListHandler_find(resListNr, list_temp, tmp) {
    var list = this.registeredPossibleOptLists[resListNr];
    // alert(tmp);
    if (tmp == "-1") {               //if (tmp == "-1") {
        tmp = ".*"
    }
    //alert("tmp="+tmp);
    var find = eval("/^" + tmp + "/i");


    if (document.all) {


        if (list.hasChildNodes()) {
            while (list.childNodes.length >= 1) {
                list.removeChild(list.firstChild);
            }
        }


        for (var i = 0; i < list_temp.length; i++) {
            var text = list_temp[i].innerText;


            if (text.match(find) != null) {
                var o = document.createElement('option');
                o.value = list_temp[i].value;
                o.text = text;//.substring(5,text.length);
                o.title = text;
                list.add(o);
            }
        }
    }
    else {


        for (i = 0; i < list.length; i++) {
            text = list[i].textContent;


            list[i].style.display = "block";
            if (text.match(find) == null) {
                list[i].style.display = "none";
            }
        }
    }
}


function ListHandler_fillZusResult(resListNr) {
    var resultList = this.registeredLists[resListNr];
    var zusResultList = this.registeredZusResLists[resListNr];
    var oberGruppeList = this.registeredOberGrLists[resListNr];

    if (zusResultList.hasChildNodes()) {
        while (zusResultList.childNodes.length >= 1) {
            zusResultList.removeChild(zusResultList.firstChild);
        }
    }
    for (var i = 0; i < resultList.length; i++) {
        for (var j = 0; j < oberGruppeList.length; j++) {
            if (resultList[i].value.substr(0, 2) == oberGruppeList[j].value.substr(0, 2)) {
                if (document.all)
                    var text = oberGruppeList[j].innerText;
                else
                    text = oberGruppeList[j].textContent;
                var o = document.createElement('option');
                o.value = oberGruppeList[j].value;
                o.text = text;
                o.title = text;
                var isDoppelt = false;
                for (var k = 0; k < zusResultList.length; k++) {
                    if (zusResultList[k].value == o.value)
                        isDoppelt = true;
                }
                if (!isDoppelt) {
                    if (document.all)
                        zusResultList.add(o);
                    else
                        zusResultList.appendChild(o);
                }
            }
        }
    }
}

