var g_inet_btn_class = "inet_btn";
var g_inet_ms_btn_class = "inet_ms_btn";

function inet_ms_initialize(aNames) {
    for (var iName=0; iName < aNames.length; iName++) {
        var name = aNames[iName];
        var hidSel = inet_ms_getHidSel(name);
        var srcSel = inet_ms_getSrcSel(name);
        var tgtSel = inet_ms_getTgtSel(name);

        // populate source and target lists from hidden select control
        srcSel.options.length = 0;
        tgtSel.options.length = 0;
        for (var i=0; i<hidSel.options.length; i++) {
            var optTxt = hidSel.options[i].text;
            var optVal = hidSel.options[i].value;
            if ( hidSel.options[i].selected ) {
                tgtSel.options.add( new Option(optTxt, optVal) );
            } else {
                srcSel.options.add( new Option(optTxt, optVal) );
            }
        }
        // set widths of source and target select controls
        var width = hidSel.clientWidth + 20;
        if ( srcSel.style.width == "" ) {
            srcSel.style.width = width + "px";
        }
        if ( tgtSel.style.width == "" ) {
            tgtSel.style.width = width + "px";
        }

        inet_ms_updateSelButtonStates(name);

        // show customized controls and hide fall-back controls
        document.getElementById("inet_ms_hide_" + name).style.display = "none";
        document.getElementById("inet_ms_show_" + name).style.display = "block";

    }

}

function inet_ms_updateHiddenControl(name) {
    var hidSel = inet_ms_getHidSel(name);
    var tgtSel = inet_ms_getTgtSel(name);
    for (var i=0; i<hidSel.options.length; i++) {
        var bSelected = false;
        for (var j=0; j<tgtSel.options.length; j++) {
            if ( hidSel.options[i].value == tgtSel.options[j].value ) {
                bSelected = true;
                continue;
            }
        }
        if ( bSelected ) {
            hidSel.options[i].selected = true;
        } else {
            hidSel.options[i].selected = false;
        }
    }
}

function inet_ms_getHidSel(name) {
    return ( document.getElementById(name) );
}

function inet_ms_getSrcSel(name) {
    return ( document.getElementById("inet_ms_src_" + name) );
}

function inet_ms_getTgtSel(name) {
    return ( document.getElementById("inet_ms_tgt_" + name) );
}

function inet_ms_moveToTarget(name, bAll) {
    if ( bAll == null ) bAll = false;
    var srcSel = inet_ms_getSrcSel(name);
    var tgtSel = inet_ms_getTgtSel(name);

    for (var i=0; i<srcSel.options.length; i++) {
        if ( bAll || srcSel.options[i].selected ) {
            inet_ms_moveOption(name, srcSel, i, tgtSel, true);
            inet_ms_updateSelButtonStates(name);
            --i;
        }
    }
    inet_ms_updateHiddenControl(name);
}

function inet_ms_moveToSource(name, bAll) {
    if ( bAll == null ) bAll = false;
    var srcSel = inet_ms_getSrcSel(name);
    var tgtSel = inet_ms_getTgtSel(name);

    for (var i=0; i<tgtSel.options.length; i++) {
        if ( bAll || tgtSel.options[i].selected ) {
            inet_ms_moveOption(name, tgtSel, i, srcSel, true);
            inet_ms_updateSelButtonStates(name);
            --i;
        }
    }
    inet_ms_updateHiddenControl(name);
}

function inet_ms_moveOption(name, fromSel, fromIdx, toSel, bRemoveFrom) {
    var optValue = fromSel.options[fromIdx].value;
    var optText = fromSel.options[fromIdx].text;
    var optPosition = inet_ms_findDestPosition(name, optValue, toSel);
    toSel.options.add( new Option(optText, optValue), optPosition );
    if ( bRemoveFrom ) fromSel.options[fromIdx] = null;
}

function inet_ms_findDestPosition(name, val, desSel) {
    var ordPos = inet_ms_getOrdinalPos(name, val);
    if ( ordPos != null ) {
        for (var i=0; i<desSel.options.length; i++) {
            if ( inet_ms_getOrdinalPos(name, desSel.options[i].value) > ordPos ) {
                return (i);
            }
        }
    }
    return ( desSel.options.length );
}

function inet_ms_getOrdinalPos(name, val) {
    var hidSel = inet_ms_getHidSel(name);
    for (var i=0; i<hidSel.options.length; i++) {
        if ( val == hidSel.options[i].value ) return (i);
    }
    return (null);
}

function inet_ms_updateSelButtonStates(name) {
    var srcSel = inet_ms_getSrcSel(name);
    var tgtSel = inet_ms_getTgtSel(name);
    var btnTgtAll = document.getElementById("inet_ms_btn_tgt_all_" + name);
    var btnTgt = document.getElementById("inet_ms_btn_tgt_" + name);
    var btnSrc = document.getElementById("inet_ms_btn_src_" + name);
    var btnSrcAll = document.getElementById("inet_ms_btn_src_all_" + name);
    var numSrcSelected = 0;
    var numTgtSelected = 0;
    for (var i=0; i<srcSel.options.length; i++) if ( srcSel.options[i].selected ) ++numSrcSelected;
    for (var i=0; i<tgtSel.options.length; i++) if ( tgtSel.options[i].selected ) ++numTgtSelected;
    if ( srcSel.options.length > 0 ) {
        btnTgtAll.disabled = false;
        btnTgtAll.title = "Include All options.";
        inet_del_class(btnTgtAll, "disabled");
    } else {
        btnTgtAll.disabled = true;
        btnTgtAll.title = "";
        inet_add_class(btnTgtAll, "disabled");
    }
    if ( tgtSel.options.length > 0 ) {
        btnSrcAll.disabled = false;
        btnSrcAll.title = "Exclude All options.";
        inet_del_class(btnSrcAll, "disabled");
    } else {
        btnSrcAll.disabled = true;
        btnSrcAll.title = "";
        inet_add_class(btnSrcAll, "disabled");
    }
    if ( numSrcSelected > 0 ) {
        btnTgt.disabled = false;
        btnTgt.title = "Include highlighted options.";
        inet_del_class(btnTgt, "disabled");
    } else {
        btnTgt.disabled = true;
        btnTgt.title = "";
        inet_add_class(btnTgt, "disabled");
    }
    if ( numTgtSelected > 0 ) {
        btnSrc.disabled = false;
        btnSrc.title = "Exclude highlighted options.";
        inet_del_class(btnSrc, "disabled");
    } else {
        btnSrc.disabled = true;
        btnSrc.title = "";
        inet_add_class(btnSrc, "disabled");
    }
}

function inet_ms_btn_over(obj) {
    if ( ! obj.disabled ) obj.className = g_inet_ms_btn_class + " " + g_inet_ms_btn_class + "_over";
}

function inet_ms_btn_out(obj) {
    if ( ! obj.disabled ) obj.className = g_inet_ms_btn_class;
}

function inet_ms_btn_up(obj) {
    if ( ! obj.disabled ) obj.className = g_inet_ms_btn_class;
}


function inet_btn_over(obj) {
    if ( ! obj.disabled ) obj.className = g_inet_btn_class + " " + g_inet_btn_class + "_over";
}

function inet_btn_out(obj) {
    if ( ! obj.disabled ) obj.className = g_inet_btn_class;
}

function inet_btn_up(obj) {
    if ( ! obj.disabled ) obj.className = g_inet_btn_class;
}

function inet_add_class(obj, cName) {
    var re = new RegExp(" *" + cName, "ig");
    if ( ! re.test(obj.className) ) obj.className = obj.className + " " + cName;
}

function inet_del_class(obj, cName) {
    var re = new RegExp(" *" + cName, "ig");
    obj.className = obj.className.replace(re, "");
}

