if (!window.console) {
    window.console = {};
}
if (!window.console.log) {
    window.console.log = function (msg) { };
}
function decodeValue(str, equal, delimiters) {
    //alert(str.split('?')[1]);
    var start = 0;
    var end = 0;
    //var t = 'name';
    var value = {};
    //p[t] = '1111';
    var name;
    while ((end = str.indexOf(equal, start)) > 0) {
        name = str.substring(start, end);
        start = end + 1;
        end = str.indexOf(delimiters, start);
        if (end != -1) {
            value[name] = str.substring(start, end);
            start = end + 1;
        }
        else {
            value[name] = str.substring(start);
            break;
        }
    }
    return value;
}

function checkinteger(value) {
    return (value.match(/^-?[0-9]+$/) != null);
}

function checkname(value) {
    return (value.match(/^[a-zA-Z0-9_\-]+$/) != null);
}

function checkip(value) {

    if (value == '0.0.0.0' || value == '255.255.255.255' || value == '127.0.0.1') {
        return false;
    }
    if (value.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(\/(\S+))?$/)) {
        return (RegExp.$1 > 0) && (RegExp.$1 <= 255) &&
            (RegExp.$2 >= 0) && (RegExp.$2 <= 255) &&
            (RegExp.$3 >= 0) && (RegExp.$3 <= 255) &&
            (RegExp.$4 >= 0) && (RegExp.$4 <= 255)
            ;
    }
    return false;
}

function checkip_no_network(value){
    if (value == '0.0.0.0' || value == '255.255.255.255' || value == '127.0.0.1') {
        return false;
    }
    if (value.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(\/(\S+))?$/)) {
        return (RegExp.$1 > 0) && (RegExp.$1 <= 255) &&
            (RegExp.$2 >= 0) && (RegExp.$2 <= 255) &&
            (RegExp.$3 >= 0) && (RegExp.$3 <= 255) &&
            (RegExp.$4 >= 1) && (RegExp.$4 <= 254)
            ;
    }
    return false;
}
function initPage(obj) {
    //console.log(obj);
    $("#type").val(obj.devtype);
    $("#service").val(obj.serviceList);
    $("#protocol").val(obj.ip_v);

    if (0) {
        $("#priovlan_td").css("display", "");
    }
    else {
        $("#priovlan_td").css("display", "none");
        $("#vlan_td").css("display", "");
        $("#prio_td").css("display", "");
    }
    if (1 * obj.vlanMuxId < 0) {
        //$("#vlanen").prop("checke")
        changevlanen(false);
    }
    else {
        $("#vlanen").prop("checked", true);

        $("#vlan").val(obj.vlanMuxId);
        $("#prio").val(obj.vlanMuxPr);
        changevlanen(true);
    }

    if (1 * obj.vlanMuxId < 0) {
        //$("#vlanen").prop("checke")
        changevlanen(false);
    }
    else {
        $("#vlanen").prop("checked", true);
        $("#vlan").val(obj.vlanMuxId);
        $("#prio").val(obj.vlanMuxPr);
        changevlanen(true);
    }

    $("#mulvlan").val(obj.mulvlan);
    $("#mtu").val(obj.mtu);
    $("#naten").prop("checked", 1 * obj.nat == 1 ? true : false);
    $("#dhcp_ip").text(obj.externalIP);
    $("#dhcp_netmask").text(obj.subnetMask);
    $("#dhcp_gateway").text(obj.gateway);

    $("#staticip").val(obj.externalIP);
    $("#staticnetmask").val(obj.subnetMask);
    $("#staticgateway").val(obj.gateway);


    $("#pppoeuser").val(obj.pppUserName);
    $("#pppoepasswd").val(obj.pppPassword);


    $("#staticipv6_ip").val(obj.ipv6_addr);
    $("#staticipv6_gw").val(obj.ipv6_gw);
    $("#ipv6_prefix").val(obj.SitePrefix);
    $("#dhcpv6en").prop("checked", 1 * obj.dhcpv6 == 1 ? true : false);
    $("#getprefixen").prop("checked", 1 * obj.dhcpv6_prefix == 1 ? true : false);

    if (1 * loginauth == 10) {
        var enable = obj.rateEn == 1 ? true : false;
        changewanRateEnable(enable, 0);
        if (1 * obj.rateEn == 1) {
            document.getElementById("wanRateEnable").checked = "checked";
            document.getElementById("rxrate").value = obj.dsRate;
            document.getElementById("txrate").value = obj.usRate;
        }
    }
}
function fillWANData(wanValue) {
    document.getElementById("mtu").value = wanValue.mtu;
    document.getElementById("protocol").value = wanValue.ip_v;
    switch (1 * wanValue.devtype) {
        case 2:
            document.getElementById("div_dhcp").style.display = "";

            document.getElementById("dhcp_ip").innerText = wanValue.externalIP.length < 3 || wanValue.externalIP == '(null)' ? "0.0.0.0" : wanValue.externalIP;
            document.getElementById("dhcp_netmask").innerText = wanValue.subnetMask.length < 3 || wanValue.subnetMask == '(null)' ? "0.0.0.0" : wanValue.subnetMask;
            document.getElementById("dhcp_gateway").innerText = wanValue.gateway.length < 3 || wanValue.gateway == '(null)' ? "0.0.0.0" : wanValue.gateway;
            document.getElementById("dhcp_ipv6_ip").innerText = wanValue.ipv6_addr;
            document.getElementById("dhcp_ipv6_gw").innerText = wanValue.ipv6_gw;
            document.getElementById("dhcp_ipv6_ip_prefix").innerText = wanValue.SitePrefix;


            break;
        case 6:
            document.getElementById("auto").disabled = "disabled";
            document.getElementById("autolable").disabled = "disabled";
            document.getElementById("div_static").style.display = "";
            document.getElementById("staticip").value = wanValue.externalIP;
            document.getElementById("staticnetmask").value = wanValue.subnetMask;
            document.getElementById("staticgateway").value = wanValue.gateway;
            break;
        case 0:
            document.getElementById("div_pppoe").style.display = "";
            document.getElementById("pppoeuser").value = wanValue.pppUserName;
            document.getElementById("pppoepasswd").value = wanValue.pppPassword;
            break;
        default:
            document.getElementById("dnstable").style.display = "none";
            break;
    }

    if (1 * wanValue.dnsenable == 0) {
        document.getElementById("auto").checked = 'checked';
        changednsen(1, 0);
    }
    else {
        document.getElementById("manual").checked = 'checked';
        changednsen(0, 0);
    }
    document.getElementById("dnsPrimary").value = wanValue.dnsPrimary == '0.0.0.0' ? "" : wanValue.dnsPrimary;
    document.getElementById("dnsSecondary").value = wanValue.dnsSecondary == '0.0.0.0' ? "" : wanValue.dnsSecondary;
    if (1 * wanValue.vlanMuxId != -1) {
        document.getElementById("vlanen").checked = 'checked';
        changevlanen(true);
    }
    else {
        changevlanen(false);
    }
    document.getElementById("vlan").value = wanValue.vlanMuxId;
    document.getElementById("prio").value = wanValue.vlanMuxPr;
    $("#staticipv6_ip").val(wanValue.ipv6_addr);
    $("#staticipv6_gw").val(wanValue.ipv6_gw);
    $("#ipv6_prefix").val(wanValue.SitePrefix);
    $("#naten").prop("checked", 1 * wanValue.nat == 1 ? true : false);
    $("#dhcpv6en").prop("checked", 1 * wanValue.dhcpv6 == 1 ? true : false);
    $("#getprefixen").prop("checked", 1 * wanValue.dhcpv6_prefix == 1 ? true : false);
    $("#ipv6dnsPrimary").val(wanValue.ipv6_dns1);
    $("#ipv6dnsSecondary").val(wanValue.ipv6_dns2);
    if (1 * loginauth == 10) {
        var enable = wanValue.rateEn == 1 ? true : false;
        changewanRateEnable(enable, 0);
        if (1 * wanValue.rateEn == 1) {
            document.getElementById("wanRateEnable").checked = "checked";
            document.getElementById("rxrate").value = wanValue.dsRate;
            document.getElementById("txrate").value = wanValue.usRate;
        }
    }
}

function changewanRateEnable(check, tip) {
    if (check) {
        if(tip == 0 || $("#lan1").prop("checked") || $("#lan2").prop("checked") || $("#lan3").prop("checked") || $("#lan4").prop("checked")){
            document.getElementById("rxrate").disabled = "";
            document.getElementById("txrate").disabled = "";
        }
        else{
            alert(getLanguageString("wanratelimittip"));
            document.getElementById("wanRateEnable").checked = false;
        }
    }
    else {
        document.getElementById("rxrate").disabled = "disabled";
        document.getElementById("txrate").disabled = "disabled";
    }
}

function changewlRateEnable(check) {
    if (check) {
        document.getElementById("rxrate").disabled = "";
        document.getElementById("txrate").disabled = "";
    }
    else {
        document.getElementById("rxrate").disabled = "disabled";
        document.getElementById("txrate").disabled = "disabled";
    }
}

function changeservice(e) {
    var value = e.value;
    var portarray = portService.split(",");
    var len = portarray.length;
    if (loginauth == 10) {
        for (var i = 0; i < len; i++) {
            if (value.indexOf(portarray[i]) >= 0) {
                nobind = 0;
                document.getElementById("bindtable").style.display = "";
                break;
            }
        }
        if (i == len) {
            nobind = 1;
            document.getElementById("bindtable").style.display = "none";
        }
    }
    if (document.getElementById("type") == null || document.getElementById("type").value == 3) {
        if (value.indexOf("Other") >= 0 || value.indexOf("INTERNET") >= 0) {
            $("#mulvlan").removeClass("input-disabled").removeAttr("disabled");
        }
        else {
            $("#mulvlan").val(-1).addClass("input-disabled").attr("disabled", "disabled");
        }
    }
    else {
        if (value.indexOf("Other") >= 0 || value.indexOf("INTERNET") >= 0) {
            $("#mulvlan").removeClass("input-disabled").removeAttr("disabled");
        }
        else {
            $("#mulvlan").addClass("input-disabled").attr("disabled", "disabled");
        }

    }
}
function changeType(e) {
    var v = e.selectedIndex;
    //console.log("********************," + v);
    $("#div_static").css("display", "none");
    $("#div_dhcp").css("display", "none");
    $("#div_pppoe").css("display", "none");
    $(".static").css("display", "none");
    $(".dhcp").css("display", "none");
    $("#ipv6_ipv4_protocoltr").css("display", "");
    changeprotocol(document.getElementById("protocol"));

    $("#auto_ipv6").removeAttr("disabled");
    $("#autolable_ipv6").removeAttr("disabled");
    $("#auto").removeAttr("disabled");
    $("#autolable").removeAttr("disabled");

    if (v == 0) {//static
        $("#auto").attr("disabled", "disabled");
        $("#autolable").attr("disabled", "disabled");
        document.getElementById("manual").checked = "checked";
        changednsen(0, 0);

        $("#auto_ipv6").attr("disabled", "disabled");
        $("#autolable_ipv6").attr("disabled", "disabled");
        document.getElementById("manual_ipv6").checked = "checked";
        changednsen(0, 1);
        $("#div_static").css("display", "");
        $(".static").css("display", "");
    }
    else if (v == 1) {//dhcp
        document.getElementById("auto").checked = "checked";
        changednsen(1, 0);
        document.getElementById("auto_ipv6").checked = "checked";
        changednsen(1, 1);
        $("#div_dhcp").css("display", "");
        $(".dhcp").css("display", "");
    }
    else if (v == 2) {//pppoe                    
        document.getElementById("auto").checked = "checked";
        changednsen(1, 0);
        document.getElementById("auto_ipv6").checked = "checked";
        changednsen(1, 1);
        $("#div_pppoe").css("display", "");
        $(".pppoe").css("display", "");
    }
    else {//bridge
        //$("#dnstable").css("display", "none");                    
        $("#ipv6_ipv4_protocoltr").css("display", "none");
        hide_ipv4_ipv6();
    }
}
function changevlanen(enable) {
    if (enable) {
        //document.getElementById("vlan").disabled = "";
        //document.getElementById("prio").disabled = "";
        $("#vlan").removeClass("input-disabled").removeAttr("disabled");
        $("#prio").removeClass("input-disabled").removeAttr("disabled");
    }
    else {
        //document.getElementById("vlan").disabled = "disabled";
        //document.getElementById("prio").disabled = "disabled";        
        $("#vlan").addClass("input-disabled").attr("disabled", "disabled");
        $("#prio").addClass("input-disabled").attr("disabled", "disabled");
    }
}
function changednsen(val, ipv6) {
    if (ipv6 == 0) {
        if (val) {
            $("#dnsPrimary").addClass("input-disabled").attr("disabled", "disabled");
            $("#dnsSecondary").addClass("input-disabled").attr("disabled", "disabled");
        }
        else {
            $("#dnsPrimary").removeClass("input-disabled").removeAttr("disabled");
            $("#dnsSecondary").removeClass("input-disabled").removeAttr("disabled");
        }
    }
    else {
        if (val) {
            $("#ipv6dnsPrimary").addClass("input-disabled").attr("disabled", "disabled");
            $("#ipv6dnsSecondary").addClass("input-disabled").attr("disabled", "disabled");
        }
        else {
            $("#ipv6dnsPrimary").removeClass("input-disabled").removeAttr("disabled");
            $("#ipv6dnsSecondary").removeClass("input-disabled").removeAttr("disabled");
        }
    }
}
function btnSave(chooseWan) {
    var loc = 'ktwancfg.cmd?';
    var tmp = chooseWan.name.split("_");
    var v = document.getElementById("protocol").value;
    var mtu = document.getElementById("mtu").value;
    var type ;
    if (tmp.length > 3) {
        loc += '&name=' + tmp[1];
    }
    else {
        loc += '&name=' + chooseWan.name;
    }
    loc += '&ifName=' + chooseWan.wanIfName;
    if(1 * chooseWan.devtype == 3){
        type = chooseWan.devtype;
    }
    else{
        type = document.getElementById("type").value;
    }
    loc += '&devtype=' + type;
    loc += '&protocol=' + document.getElementById("protocol").value;

    if (checkinteger(mtu) == false || mtu < 68 || mtu > 1540) {
        alert(getLanguageString("mtuerror"));
        return loc;
    }
    loc += '&mtu=' + mtu;

    if (document.getElementById("vlanen").checked) {
        var setVLAN = '';
        var setPrio = '';
        if (0) {
            var priovlan_value = document.getElementById("priovlan").value;
            var tmp = priovlanValue[1 * priovlan_value].split(",");
            setVLAN = tmp[2];
            setPrio = tmp[1];
        }
        else {
            setVLAN = document.getElementById("vlan").value;
            setPrio = document.getElementById("prio").value;
        }

        if (checkinteger(setVLAN) == false || 1 * setVLAN < 1 || 1 * setVLAN > 4094) {
            alert(getLanguageString("vlanerror"));
            return loc;
        }

        if (checkinteger(setPrio) == false || 1 * setPrio < 0 || 1 * setPrio > 7) {
            alert(getLanguageString("prioerror"));
            return loc;
        }
        loc += '&vlanid=' + setVLAN;
        loc += '&prio=' + setPrio;
    }
    else {
        loc += '&vlanid=-1&prio=-1';
    }

    if ($("#mulvlan").prop("disabled")) {
        loc += '&mulvlan=-1';
    }
    else {
        var mulvlan = document.getElementById("mulvlan").value;
        if ((checkinteger(mulvlan) == false) || (1 * mulvlan != -1 && (1 * mulvlan < 1 || 1 * mulvlan > 4094))) {
            alert(getLanguageString("mulvlanerror"));
            return loc;
        }
        loc += '&mulvlan=' + mulvlan;
    }

    if (1 * type == 6) {
        if (1 * v == 0 || 1 * v == 2) {
            if (checkip_no_network(document.getElementById("staticip").value) == false) {
                alert(getLanguageString("wanstaticiperror"));
                return loc;
            }
            if (isValidSubnetMask(document.getElementById("staticnetmask").value) == false) {
                alert(getLanguageString("wanstaticnetmaskerror"));
                return loc;
            }
            if (checkip_no_network(document.getElementById("staticgateway").value) == false) {
                alert(getLanguageString("wanstaticgatewayerror"));
                return loc;
            }
            loc += '&ipv4_ip=' + document.getElementById("staticip").value;
            loc += '&netmask=' + document.getElementById("staticnetmask").value;
            loc += '&gateway=' + document.getElementById("staticgateway").value;
        }
        if (1 * v == 1 || 1 * v == 2) {
            if (isValidIpAddress6(document.getElementById("staticipv6_ip").value) == false) {
                alert(getLanguageString("wanstaticipv6_iperror"));
                return loc;
            }
            if (isValidIpAddress6(document.getElementById("staticipv6_gw").value) == false) {
                alert(getLanguageString("wanstaticipv6_gwerror"));
                return loc;
            }
            if (isValidIpAddress6(document.getElementById("ipv6_prefix").value) == false) {
                alert(getLanguageString("wanstaticipv6_prefix"));
                return loc;
            }
            loc += '&ipv6_ip=' + document.getElementById("staticipv6_ip").value;
            loc += '&ipv6_prefix=' + document.getElementById("staticipv6_gw").value;
            loc += "&SitePrefix=" + document.getElementById("ipv6_prefix").value;
        }
    }
    else if (1 * type == 2) {
        if (1 * v == 0 || 1 * v == 2) {
            loc += '&ipv4_ip=0.0.0.0';
        }
        if (1 * v == 1 || 1 * v == 2) {
            loc += '&dhcpv6=' + ($("#dhcpv6en").prop("checked") ? 1 : 0);
            loc += '&prefix_ipv6=' + ($("#getprefixen").prop("checked") ? 1 : 0);
        }
    }
    else if (1 * type == 0) {

        if (!checkPPPoEUser(document.getElementById("pppoeuser").value)) {
            alert(getLanguageString("pppoeusererror"));
            return loc;
        }
        if (!checkPPPoEUser(document.getElementById("pppoepasswd").value)) {
            alert(getLanguageString("pppoepwderror"));
            return loc;
        }
        loc += '&pppoeuser=' + encodeUrl(document.getElementById("pppoeuser").value);
        loc += '&pppoepasswd=' + encodeUrl(document.getElementById("pppoepasswd").value);

        if (1 * v == 1 || 1 * v == 2) {
            loc += '&dhcpv6=' + ($("#dhcpv6en").prop("checked") ? 1 : 0);
            loc += '&prefix_ipv6=' + ($("#getprefixen").prop("checked") ? 1 : 0);
        }
        
    }

    if (1 * v == 0 || 1 * v == 2) {
        if (document.getElementById("manual").checked) {
            if (document.getElementById("dnsPrimary").value.length != 0) {
                if (checkip_no_network(document.getElementById("dnsPrimary").value) == false) {
                    alert(getLanguageString("wandnsPrimaryerror"));
                    return loc;
                }
            }
            if (document.getElementById("dnsSecondary").value.length != 0) {
                if (checkip_no_network(document.getElementById("dnsSecondary").value) == false) {
                    alert(getLanguageString("wandnsSecondaryerror"));
                    return loc;
                }
            }
            loc += '&dnsenable=1&dnsPrimary=' + document.getElementById("dnsPrimary").value;
            loc += '&dnsenable=1&dnsSecondary=' + document.getElementById("dnsSecondary").value;
        }
        else {
            loc += '&dnsenable=0&dnsPrimary=0.0.0.0&dnsSecondary=0.0.0.0';
        }
    }

    if (1 * v == 1 || 1 * v == 2) {
        if (document.getElementById("manual_ipv6").checked) {
            if (document.getElementById("ipv6dnsPrimary").value.length > 0 && isValidIpAddress6(document.getElementById("ipv6dnsPrimary").value) == false) {
                alert(getLanguageString("wanstaticipv6_primaryerror"));
                return loc;
            }
            if (document.getElementById("ipv6dnsSecondary").value.length > 0 && isValidIpAddress6(document.getElementById("ipv6dnsSecondary").value) == false) {
                alert(getLanguageString("wanstaticipv6_seconderror"));
                return loc;
            }
            loc += "&ipv6dnsenable=1";
            loc += "&ipv6_pri=" + document.getElementById("ipv6dnsPrimary").value;
            loc += "&ipv6_sec=" + document.getElementById("ipv6dnsSecondary").value;
        }
        else {
            loc += '&ipv6dnsenable=0&ipv6_pri=0.0.0.0&ipv6_sec=0.0.0.0';
        }
    }

    if (1 * v == 0 || 1 * v == 2) {
        loc += '&naten=' + ($("#naten").prop("checked") ? 1 : 0);
    }

    if (1 * loginauth == 1) {
        loc += '&rateEn=' + chooseWan.rateEn;
        loc += "&wanDsRate=" + chooseWan.dsRate;
        loc += "&wanUsRate=" + chooseWan.usRate;
    }
    else {
        if ($("#ratetable").css("display") == "none") {
            loc += '&rateEn=0&wanDsRate=0&wanUsRate=0';
        }
        else{
            if (document.getElementById("wanRateEnable").checked) {
                //if(0){
                loc += '&rateEn=1';
                if (checkinteger(document.getElementById("rxrate").value) == false) {
                    alert(getLanguageString("wanRateerror"));
                    return loc;
                }
                if (1 * document.getElementById("rxrate").value > 1024000 || 1 * document.getElementById("rxrate").value < 1) {
                    alert(getLanguageString("wanRateerror"));
                    return loc;
                }
                if (checkinteger(document.getElementById("txrate").value) == false) {
                    alert(getLanguageString("wanRateerror"));
                    return loc;
                }
                if (1 * document.getElementById("txrate").value > 1024000 || 1 * document.getElementById("txrate").value < 1) {
                    alert(getLanguageString("wanRateerror"));
                    return loc;
                }
    
                loc += "&wanDsRate=" + document.getElementById("rxrate").value;
                loc += "&wanUsRate=" + document.getElementById("txrate").value;
            }
            else {
                loc += '&rateEn=0&wanDsRate=0&wanUsRate=0';
            }
        }
        
    }

    var setiflist = '';
    $("input:checkbox:gt(4)").each(function (n) {
        if (this.checked) {
            setiflist += this.value;
            setiflist += '|';
        }
    });
    if (1 * nobind == 0 && setiflist.length > 1) {
        setiflist = setiflist.substr(0, setiflist.length - 1);
    }
    else {
        //alert(getLanguageString("error_nobind"));
        //return ;
        setiflist = "not";
    }
    loc += '&iflist=' + setiflist;
    loc += '&connectionId=' + chooseWan.connectionId;
    loc += '&serviceList=' + document.getElementById("service").value;
    var code = 'location="' + loc + '"';
    return code;
}

function Base64() {

    // private property   
    _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    // public method for encoding   
    this.encode = function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;
        input = _utf8_encode(input);
        while (i < input.length) {
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }
            output = output +
                _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
                _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
        }
        return output;
    }

    // public method for decoding   
    this.decode = function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
        while (i < input.length) {
            enc1 = _keyStr.indexOf(input.charAt(i++));
            enc2 = _keyStr.indexOf(input.charAt(i++));
            enc3 = _keyStr.indexOf(input.charAt(i++));
            enc4 = _keyStr.indexOf(input.charAt(i++));
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
            output = output + String.fromCharCode(chr1);
            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }
        }
        output = _utf8_decode(output);
        return output;
    }

    // private method for UTF-8 encoding   
    _utf8_encode = function (string) {
        string = string.replace(/\r\n/g, "\n");
        var utftext = "";
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if ((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }
        return utftext;
    }

    // private method for UTF-8 decoding   
    _utf8_decode = function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;
        while (i < utftext.length) {
            c = utftext.charCodeAt(i);
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            } else if ((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i + 1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            } else {
                c2 = utftext.charCodeAt(i + 1);
                c3 = utftext.charCodeAt(i + 2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }
        return string;
    }
}

function togglepwd(id) {
    var $obj = $("#" + id);
    if ($obj.attr("type") == "password") {
        //$obj.unbind("onblur");
        $obj.focus().attr("type", "text");
    }
    else {
        $obj.focus().attr("type", "password")
    }
}

function isHexaDigit(digit) {
    var hexVals = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
        "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f");
    var len = hexVals.length;
    var i = 0;
    var ret = false;

    for (i = 0; i < len; i++)
        if (digit == hexVals[i]) break;

    if (i < len)
        ret = true;

    return ret;
}

function isDecDigit(digit) {
    var DecVals = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
    var len = DecVals.length;
    var i = 0;
    var ret = false;

    for (i = 0; i < len; i++)
        if (digit == DecVals[i]) break;

    if (i < len)
        ret = true;

    return ret;
}

function isValidDecNum(val) {
    for (var i = 0; i < val.length; i++)
        if (isDecDigit(val.charAt(i)) == false)
            return false;

    return true;
}

function isValidKey(val, size) {
    var ret = false;
    var len = val.length;
    var dbSize = size * 2;

    if (len == size)
        ret = true;
    else if (len == dbSize) {
        for (i = 0; i < dbSize; i++)
            if (isHexaDigit(val.charAt(i)) == false)
                break;
        if (i == dbSize)
            ret = true;
    } else
        ret = false;

    return ret;
}


function isValidHexKey(val, size) {
    var ret = false;
    if (val.length == size) {
        for (i = 0; i < val.length; i++) {
            if (isHexaDigit(val.charAt(i)) == false) {
                break;
            }
        }
        if (i == val.length) {
            ret = true;
        }
    }

    return ret;
}


function isNameUnsafe(compareChar) {
    var unsafeString = "\"<>%\\^[]`\+\$\,='#&@.: \t";

    if (unsafeString.indexOf(compareChar) == -1 && compareChar.charCodeAt(0) > 32
        && compareChar.charCodeAt(0) < 123)
        return false; // found no unsafe chars, return false
    else
        return true;
}

// Check if a name valid
function isValidName(name) {
    var i = 0;

    for (i = 0; i < name.length; i++) {
        if (isNameUnsafe(name.charAt(i)) == true)
            return false;
    }

    return true;
}

// same as is isNameUnsafe but allow spaces
function isCharUnsafe(compareChar) {
    var unsafeString = "\"<>%\\^[]`\+\$\,='#&@.:\t";

    if (unsafeString.indexOf(compareChar) == -1 && compareChar.charCodeAt(0) >= 32
        && compareChar.charCodeAt(0) < 123)
        return false; // found no unsafe chars, return false
    else
        return true;
}

function isValidNameWSpace(name) {
    var i = 0;

    for (i = 0; i < name.length; i++) {
        if (isCharUnsafe(name.charAt(i)) == true)
            return false;
    }

    return true;
}

function isSameSubNet(lan1Ip, lan1Mask, lan2Ip, lan2Mask) {

    var count = 0;

    lan1a = lan1Ip.split('.');
    lan1m = lan1Mask.split('.');
    lan2a = lan2Ip.split('.');
    lan2m = lan2Mask.split('.');

    for (i = 0; i < 4; i++) {
        l1a_n = parseInt(lan1a[i]);
        l1m_n = parseInt(lan1m[i]);
        l2a_n = parseInt(lan2a[i]);
        l2m_n = parseInt(lan2m[i]);
        if ((l1a_n & l1m_n) == (l2a_n & l2m_n))
            count++;
    }
    if (count == 4)
        return true;
    else
        return false;
}


function isValidIpAddress(address) {

    ipParts = address.split('/');
    if (ipParts.length > 2) return false;
    if (ipParts.length == 2) {
        num = parseInt(ipParts[1]);
        if (num <= 0 || num > 32)
            return false;
    }

    if (ipParts[0] == '0.0.0.0' ||
        ipParts[0] == '255.255.255.255')
        return false;

    addrParts = ipParts[0].split('.');
    if (addrParts.length != 4) return false;
    for (i = 0; i < 4; i++) {
        if (isNaN(addrParts[i]) || addrParts[i] == "")
            return false;
        num = parseInt(addrParts[i]);
        if (num < 0 || num > 255)
            return false;
    }
    return true;
}

function substr_count(haystack, needle, offset, length) {
    var pos = 0, cnt = 0;

    haystack += '';
    needle += '';
    if (isNaN(offset)) { offset = 0; }
    if (isNaN(length)) { length = 0; }
    offset--;

    while ((offset = haystack.indexOf(needle, offset + 1)) != -1) {
        if (length > 0 && (offset + needle.length) > length) {
            return false;
        } else {
            cnt++;
        }
    }

    return cnt;
}

function test_ipv6(ip) {
    // Test for empty address
    if (ip.length < 3) {
        return ip == "::";
    }

    // Check if part is in IPv4 format
    if (ip.indexOf('.') > 0) {
        lastcolon = ip.lastIndexOf(':');

        if (!(lastcolon && checkip_no_network(ip.substr(lastcolon + 1))))
            return false;

        // replace IPv4 part with dummy
        ip = ip.substr(0, lastcolon) + ':0:0';
    }

    // Check uncompressed
    if (ip.indexOf('::') < 0) {
        var match = ip.match(/^(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}$/i);
        return match != null;
    }

    // Check colon-count for compressed format
    if (substr_count(ip, ':')) {
        var match = ip.match(/^(?::|(?:[a-f0-9]{1,4}:)+):(?:(?:[a-f0-9]{1,4}:)*[a-f0-9]{1,4})?$/i);
        return match != null;
    }

    // Not a valid IPv6 address
    return false;
}

function isValidIpv6Address(str) {
    var i = str.indexOf(":");
    if (i == -1) {
        return false;
    }
    else {
        return str.match(/:/g).length <= 7
            && /::/.test(str)
            ? /^([\da-f]{1,4}(:|::)){1,6}[\da-f]{1,4}$/i.test(str)
            : /^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(str);
    }

}

function isValidIpAddress6(address) {
    ipParts = address.split('/');
    if (ipParts.length > 2) return false;
    if (ipParts.length == 2) {
        num = parseInt(ipParts[1]);
        if (num <= 0 || num > 128)
            return false;
    }

    addrParts = ipParts[0];
    /*addrParts = ipParts[0].split(':');
    if (addrParts.length < 3 || addrParts.length > 8)
        return false;
    for (i = 0; i < addrParts.length; i++) {
        if (addrParts[i] != "")
            num = parseInt(addrParts[i], 16);
        if (i == 0) {
            //         if ( (num & 0xf000) == 0xf000 )
            //            return false;	//can not be link-local, site-local or multicast address
        }
        else if ((i + 1) == addrParts.length) {
            if (num == 0 || num == 1)
                return false;	//can not be unspecified or loopback address
        }
        if (num != 0)
            break;
    }*/
    var reg = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/

    return reg.test(addrParts);
}

function isValidPrefixLength(prefixLen) {
    var num;

    num = parseInt(prefixLen);
    if (num <= 0 || num > 128)
        return false;
    return true;
}

function areSamePrefix(addr1, addr2) {
    var i, j;
    var a = [0, 0, 0, 0, 0, 0, 0, 0];
    var b = [0, 0, 0, 0, 0, 0, 0, 0];

    addr1Parts = addr1.split(':');
    if (addr1Parts.length < 3 || addr1Parts.length > 8)
        return false;
    addr2Parts = addr2.split(':');
    if (addr2Parts.length < 3 || addr2Parts.length > 8)
        return false;
    j = 0;
    for (i = 0; i < addr1Parts.length; i++) {
        if (addr1Parts[i] == "") {
            if ((i != 0) && (i + 1 != addr1Parts.length)) {
                j = j + (8 - addr1Parts.length + 1);
            }
            else {
                j++;
            }
        }
        else {
            a[j] = parseInt(addr1Parts[i], 16);
            j++;
        }
    }
    j = 0;
    for (i = 0; i < addr2Parts.length; i++) {
        if (addr2Parts[i] == "") {
            if ((i != 0) && (i + 1 != addr2Parts.length)) {
                j = j + (8 - addr2Parts.length + 1);
            }
            else {
                j++;
            }
        }
        else {
            b[j] = parseInt(addr2Parts[i], 16);
            j++;
        }
    }
    //only compare 64 bit prefix
    for (i = 0; i < 4; i++) {
        if (a[i] != b[i]) {
            return false;
        }
    }
    return true;
}

function getLeftMostZeroBitPos(num) {
    var i = 0;
    var numArr = [128, 64, 32, 16, 8, 4, 2, 1];

    for (i = 0; i < numArr.length; i++)
        if ((num & numArr[i]) == 0)
            return i;

    return numArr.length;
}

function getRightMostOneBitPos(num) {
    var i = 0;
    var numArr = [1, 2, 4, 8, 16, 32, 64, 128];

    for (i = 0; i < numArr.length; i++)
        if (((num & numArr[i]) >> i) == 1)
            return (numArr.length - i - 1);

    return -1;
}

function isValidSubnetMask(mask) {
    var i = 0, num = 0;
    var zeroBitPos = 0, oneBitPos = 0;
    var zeroBitExisted = false;

    if (mask == '0.0.0.0')
        return false;

    maskParts = mask.split('.');
    if (maskParts.length != 4) return false;

    for (i = 0; i < 4; i++) {
        if (isNaN(maskParts[i]) == true)
            return false;
        num = parseInt(maskParts[i]);
        if (num < 0 || num > 255)
            return false;
        if (zeroBitExisted == true && num != 0)
            return false;
        zeroBitPos = getLeftMostZeroBitPos(num);
        oneBitPos = getRightMostOneBitPos(num);
        if (zeroBitPos < oneBitPos)
            return false;
        if (zeroBitPos < 8)
            zeroBitExisted = true;
    }

    return true;
}

function isValidPort(port) {
    var fromport = 0;
    var toport = 100;

    portrange = port.split(':');
    if (portrange.length < 1 || portrange.length > 2) {
        return false;
    }
    if (isNaN(portrange[0]))
        return false;
    fromport = parseInt(portrange[0]);

    if (portrange.length > 1) {
        if (isNaN(portrange[1]))
            return false;
        toport = parseInt(portrange[1]);
        if (toport <= fromport)
            return false;
    }

    if (fromport < 1 || fromport > 65535 || toport < 1 || toport > 65535)
        return false;

    return true;
}

function isValidNatPort(port) {
    var fromport = 0;
    var toport = 100;

    portrange = port.split('-');
    if (portrange.length < 1 || portrange.length > 2) {
        return false;
    }
    if (isNaN(portrange[0]))
        return false;
    fromport = parseInt(portrange[0]);

    if (portrange.length > 1) {
        if (isNaN(portrange[1]))
            return false;
        toport = parseInt(portrange[1]);
        if (toport <= fromport)
            return false;
    }

    if (fromport < 1 || fromport > 65535 || toport < 1 || toport > 65535)
        return false;

    return true;
}

function isValidMacAddress(address) {

    //var reg_name=/[A-F\d]{2}:[A-F\d]{2}:[A-F\d]{2}:[A-F\d]{2}:[A-F\d]{2}:[A-F\d]{2}/; 
    var reg_name = /^[A-F0-9]{2}(:[A-F0-9]{2}){5}$/;
    if (!reg_name.test(address)) {
        //alert("mac地址格式不正确！mac地址格式为00:24:21:19:BD:E4");
        //document.form2.mac.focus();
        return false;
    }
    else {
        return true;
    }
    /* var c = '';
     var num = 0;
     var i = 0, j = 0;
     var zeros = 0;
 
     addrParts = address.split(':');
     if (addrParts.length != 6) return false;
 
     for (i = 0; i < 6; i++) {
         if (addrParts[i] == '')
             return false;
         for (j = 0; j < addrParts[i].length; j++) {
             c = addrParts[i].toLowerCase().charAt(j);
             if ((c >= '0' && c <= '9') ||
                 (c >= 'a' && c <= 'f'))
                 continue;
             else
                 return false;
         }
 
         num = parseInt(addrParts[i], 16);
         if (num == NaN || num < 0 || num > 255)
             return false;
         if (num == 0)
             zeros++;
     }
     if (zeros == 6)
         return false;
 
     //if (parseInt(addrParts[0], 16) & 1)
     //    return false;
 
     return true;*/
}

function isValidMacMask(mask) {
    var c = '';
    var num = 0;
    var i = 0, j = 0;
    var zeros = 0;
    var zeroBitPos = 0, oneBitPos = 0;
    var zeroBitExisted = false;

    maskParts = mask.split(':');
    if (maskParts.length != 6) return false;

    for (i = 0; i < 6; i++) {
        if (maskParts[i] == '')
            return false;
        for (j = 0; j < maskParts[i].length; j++) {
            c = maskParts[i].toLowerCase().charAt(j);
            if ((c >= '0' && c <= '9') ||
                (c >= 'a' && c <= 'f'))
                continue;
            else
                return false;
        }

        num = parseInt(maskParts[i], 16);
        if (num == NaN || num < 0 || num > 255)
            return false;
        if (zeroBitExisted == true && num != 0)
            return false;
        if (num == 0)
            zeros++;
        zeroBitPos = getLeftMostZeroBitPos(num);
        oneBitPos = getRightMostOneBitPos(num);
        if (zeroBitPos < oneBitPos)
            return false;
        if (zeroBitPos < 8)
            zeroBitExisted = true;
    }
    if (zeros == 6)
        return false;

    return true;
}

var hexVals = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
    "A", "B", "C", "D", "E", "F");
var unsafeString = "\"<>%\\^[]`\+\$\,'#&";
// deleted these chars from the include list ";", "/", "?", ":", "@", "=", "&" and #
// so that we could analyze actual URLs

function isUnsafe(compareChar)
// this function checks to see if a char is URL unsafe.
// Returns bool result. True = unsafe, False = safe
{
    if (unsafeString.indexOf(compareChar) == -1 && compareChar.charCodeAt(0) > 32
        && compareChar.charCodeAt(0) < 123)
        return false; // found no unsafe chars, return false
    else
        return true;
}

function decToHex(num, radix)
// part of the hex-ifying functionality
{
    var hexString = "";
    while (num >= radix) {
        temp = num % radix;
        num = Math.floor(num / radix);
        hexString += hexVals[temp];
    }
    hexString += hexVals[num];
    return reversal(hexString);
}

function reversal(s)
// part of the hex-ifying functionality
{
    var len = s.length;
    var trans = "";
    for (i = 0; i < len; i++)
        trans = trans + s.substring(len - i - 1, len - i);
    s = trans;
    return s;
}

function convert(val)
// this converts a given char to url hex form
{
    return "%" + decToHex(val.charCodeAt(0), 16);
}


function hexToAscii(hexstr) {
    var hex = hexstr.toString();
    var str = '';
    for (var i = 0; i < hexstr.length; i += 2)
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    return str;
}

function asciiToHex(asciiStr) {
    var hexStr = '';
    for (var i = 0; i < asciiStr.length; i++)
        hexStr += Number(asciiStr.charCodeAt(i)).toString(16);

    return hexStr;
}

function transKey(key) {
    if (key.length == 13 || key.length == 5) // ascii str
        return asciiToHex(key);
    return key;
}

function isAsciiStr(str) {
    for (var i = 0; i < str.length; i += 2) {
        code = parseInt(str.substr(i, 2), 16);
        if (code < 32 || code > 123)
            return false;
    }
    return true;
}

function transKeyView(key) {
    if (isAsciiStr(key))
        return hexToAscii(key);
    return key;
}

function encodeUrl(val) {
    var len = val.length;
    var i = 0;
    var newStr = "";
    var original = val;

    for (i = 0; i < len; i++) {
        if (val.substring(i, i + 1).charCodeAt(0) < 255) {
            // hack to eliminate the rest of unicode from this
            if (isUnsafe(val.substring(i, i + 1)) == false)
                newStr = newStr + val.substring(i, i + 1);
            else
                newStr = newStr + convert(val.substring(i, i + 1));
        } else {
            // woopsie! restore.
            //alert ("Found a non-ISO-8859-1 character at position: " + (i+1) + ",\nPlease eliminate before continuing.");
            newStr = original;
            // short-circuit the loop and exit
            i = len;
        }
    }

    return newStr;
}

var markStrChars = "\"'";

// Checks to see if a char is used to mark begining and ending of string.
// Returns bool result. True = special, False = not special
function isMarkStrChar(compareChar) {
    if (markStrChars.indexOf(compareChar) == -1)
        return false; // found no marked string chars, return false
    else
        return true;
}

// use backslash in front one of the escape codes to process
// marked string characters.
// Returns new process string
function processMarkStrChars(str) {
    var i = 0;
    var retStr = '';

    for (i = 0; i < str.length; i++) {
        if (isMarkStrChar(str.charAt(i)) == true)
            retStr += '\\';
        retStr += str.charAt(i);
    }

    return retStr;
}

// Web page manipulation functions

function showhide(element, sh) {
    var status;
    if (sh == 1) {
        status = "block";
    }
    else {
        status = "none";
    }

    if (document.getElementById) {
        // standard
        document.getElementById(element).style.display = status;
    }
    else if (document.all) {
        // old IE
        document.all[element].style.display = status;
    }
    else if (document.layers) {
        // Netscape 4
        document.layers[element].display = status;
    }
}

// Load / submit functions

function getSelect(item) {
    var idx;
    if (item.options.length > 0) {
        idx = item.selectedIndex;
        return item.options[idx].value;
    }
    else {
        return '';
    }
}

function setSelect(item, value) {
    for (i = 0; i < item.options.length; i++) {
        if (item.options[i].value == value) {
            item.selectedIndex = i;
            break;
        }
    }
}

function setCheck(item, value) {
    if (value == '1') {
        item.checked = true;
    } else {
        item.checked = false;
    }
}

function setInnerHtml(item, value) {
    document.getElementById(item).innerHTML = value;
}

function setDisable(item, value) {
    if (value == 1 || value == '1') {
        item.disabled = true;
    } else {
        item.disabled = false;
    }
}

function submitText(item) {
    return '&' + item.name + '=' + item.value;
}

function submitSelect(item) {
    return '&' + item.name + '=' + getSelect(item);
}


function submitCheck(item) {
    var val;
    if (item.checked == true) {
        val = 1;
    }
    else {
        val = 0;
    }
    return '&' + item.name + '=' + val;
}

function isHexaDigit(digit) {
    var hexVals = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
        "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f");
    var len = hexVals.length;
    var i = 0;
    var ret = false;

    for (i = 0; i < len; i++)
        if (digit == hexVals[i]) break;

    if (i < len)
        ret = true;

    return ret;
}

function isInValidDhcpPool(lan1StartIp, lan1EndIp, lan2StartIp, lan2EndIp) {
    lan1addrEnd = lan1EndIp.split('.');
    lan1addrStart = lan1StartIp.split('.');
    lan2addrEnd = lan2EndIp.split('.');
    lan2addrStart = lan2StartIp.split('.');
    E1 = parseInt(lan1addrEnd[3]) + 1;
    S1 = parseInt(lan1addrStart[3]) + 1;
    E2 = parseInt(lan2addrEnd[3]) + 1;
    S2 = parseInt(lan2addrStart[3]) + 1;

    if (E1 > S2 && E1 < E2)
        return false;
    if (S1 > S2 && S1 < E2)
        return false;
    if (S2 > S1 && S2 < E1)
        return false;
    if (E2 > S1 && E2 < E1)
        return false;
    return true;
}

function isValidIpAddress_dhcpDevice(address) {
    var i = 0;

    if (address == '255.255.255.255')
        return false;

    addrParts = address.split('.');
    if (addrParts.length != 4) return false;
    for (i = 0; i < 4; i++) {
        if (isNaN(addrParts[i]) || addrParts[i] == "")
            return false;
        num = parseInt(addrParts[i]);
        if (num < 0 || num > 255)
            return false;
    }
    return true;
}

function isValidDigit(digit) {
    var hexVals = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
    var len = hexVals.length;
    var i = 0;
    var ret = false;

    for (i = 0; i < len; i++)
        if (digit == hexVals[i]) break;

    if (i < len)
        ret = true;

    return ret;
}

function isValidServerPort(val) {
    var ret = false;
    var max = 65535;
    var min = 0;
    var i = 0;

    if ((val.length > 1) && (val.charAt(0) == '0')) {
        return false;
    }

    for (i; i < val.length; i++) {
        if (isValidDigit(val.charAt(i)) == false)
            break;
    }
    if (i == val.length) {
        ret = true;
    }

    if (ret == true) {
        if ((val <= max) && (val >= min))
            ret = true;
        else
            ret = false;
    }

    return ret;
}

function isValidValue(val) {
    var ret = false;
    var min = 0;
    var i = 0;

    if ((val.length > 1) && (val.charAt(0) == '0')) {
        return false;
    }

    for (i; i < val.length; i++) {
        if (isValidDigit(val.charAt(i)) == false)
            break;
    }
    if (i == val.length) {
        ret = true;
    }

    if (ret == true) {
        if (val > min) {
            ret = true;
        }
        else {
            ret = false;
        }
    }
    return ret;
}

function isSameSubNet(lan1Ip, lan1Mask, lan2Ip, lan2Mask) {

    var count = 0;

    lan1a = lan1Ip.split('.');
    lan1m = lan1Mask.split('.');
    lan2a = lan2Ip.split('.');
    lan2m = lan2Mask.split('.');

    for (i = 0; i < 4; i++) {
        var l1a_n = parseInt(lan1a[i], 10);
        var l1m_n = parseInt(lan1m[i], 10);
        var l2a_n = parseInt(lan2a[i], 10);
        var l2m_n = parseInt(lan2m[i], 10);

        if ((l1a_n & l1m_n) == (l2a_n & l2m_n))
            count++;
    }
    if (count == 4)
        return true;
    else
        return false;
}

function isNumber(val) {
    var len = val.length;
    var sign = 0;

    for (var i = 0; i < len; ++i) {
        if ((val.charAt(i) == '-') && (sign == 0)) {
            sign = 1;
            continue;
        }

        if ((val.charAt(i) > '9')
            || (val.charAt(i) < '0')) {
            return false;
        }
        sign = 1;
    }

    return true;
}

function IsNotDigit(fData) {
    var i;

    for (i = 0; i < fData.length; i++) {
        if (!(fData.charAt(i) >= '0' && fData.charAt(i) <= '9'))
            return true;
    }

    return false;
}

function isValidNetMask(address) {

    ipParts = address.split('/');
    if (ipParts.length > 2) return false;
    if (ipParts.length == 2) {
        num = parseInt(ipParts[1]);
        if (num <= 0 || num > 32)
            return false;
    }

    if (ipParts[0] == '0.0.0.0' ||
        ipParts[0] == '255.255.255.255')
        return false;

    addrParts = ipParts[0].split('.');
    if (addrParts.length != 4) return false;
    for (i = 0; i < 4; i++) {
        if (isNaN(addrParts[i]) || addrParts[i] == "")
            return false;
        num = parseInt(addrParts[i]);
        if (num < 0 || num > 255)
            return false;
    }
    return true;
}


function isValidIpAddress_dhcpDevice(address) {
    var i = 0;

    if (address == '255.255.255.255')
        return false;

    addrParts = address.split('.');
    if (addrParts.length != 4) return false;
    for (i = 0; i < 4; i++) {
        if (IsNotDigit(addrParts[i]) || addrParts[i] == "")
            return false;

        num = parseInt(addrParts[i]);
        if (i == 0 && num == 0) {
            return false;
        }
        if (num < 0 || num >= 255)
            return false;
    }
    if (parseInt(addrParts[3]) == 0)
        return false;
    return true;
}

function isValidPrefixAddress(address) {
    var i = 0, num = 0;
    var space = 0;
    addrParts = address.split(':');
    if (addrParts.length < 3 || addrParts.length > 8)
        return false;
    for (i = 0; i < addrParts.length; i++) {
        if (addrParts[i] != "" && isValidHexKey(addrParts[i], addrParts[i].length))
            num = parseInt(addrParts[i], 16);
        else {
            space++;
            if (space > 1 && (i + 1) != addrParts.length)
                return false;
            continue;
        }
        if (i == 0) {
            if ((num & 0xf000) == 0xf000)
                return false;
        }
        if (num > 0xffff || num < 0)
            return false;
    }
    return true;
}

/*Get row numbers from valueslsit whose delimiter is rowD*/
function numOfRow(valuelist, rowDelimiter) {
    if (typeof (rowD) == 'undefined')
        rowD = '|';

    var numR = 0;
    if (valuelist != '') {
        if (rowD != '') {
            var tnodes = valuelist.split(rowD);
        } else {
            var tnodes = valuelist;
        }
        numR = tnodes.length - 2; // not include parameter name line/row
        return numR;
    }

    return numR;
}

/*Get column numbers from valueslsit whose row's delimiter is rowD and colum's delimiter is colD*/
function numOfCol(valuelist, rowD, colD) {
    if (typeof (rowD) == 'undefined')
        rowD = '|';
    if (typeof (colD) == 'undefined')
        colD = '/';

    var numC = 0;
    if (valuelist != '') {
        if (rowD != '') {
            var tnodes = valuelist.split(rowD);
        } else {
            var tnodes = valuelist;
        }
        if (tnodes.length > 0) {
            if (colD != '') {
                var tdata = tnodes[0].split(colD);// only need check row[0]'s column number
                numC = tdata.length - 1;
            }
        }
        return numC;
    }
    return numC;
}

function getParamNum(valuelist, colNum, rowD, colD) {
    var i;
    if (valuelist != '') {
        if (rowD != '') {
            var tnodes = valuelist.split(rowD);
        } else {
            var tnodes = valuelist;
        }

        var row = numOfRow(valuelist, rowD);
        var names = tnodes[row].split(colD);
        for (i = 0; i < names.length; i++) {
            if (names[i] == colNum) {
                return i;
            }
        }
    }
    return -1;
}

/*Get specific parameter value from valueslsit whose row's delimiter is rowD and colum's is colD and rowid is rowNum & colid is colNum */
function getValueFromList(valuelist, colNum, rowNum, rowD, colD) {
    if (typeof (rowD) == 'undefined')
        rowD = '|';
    if (typeof (colD) == 'undefined')
        colD = '/';
    if (typeof (rowNum) == 'undefined')
        rowNum = 0;

    var n;
    if (isNaN(colNum))
        n = getParamNum(valuelist, colNum, rowD, colD);
    else
        n = colNum;

    var mName = new Array();
    if (valuelist != '' && n != -1) {
        if (rowD != '') {
            var tnodes = valuelist.split(rowD);
        } else {
            var tnodes = valuelist;
        }

        var tdata = tnodes[rowNum].split(colD);
        (tdata[n]) ? mName = tdata[n] : mName = '';

        return mName;
    }
    return mName;
}

/*Get colid is colNum's paramer values from valueslsit whose row's delimiter is rowD and colum's is colD */
function getColFromList(valuelist, colNum, rowD, colD) {
    if (typeof (rowD) == 'undefined')
        rowD = '|';
    if (typeof (colD) == 'undefined')
        colD = '/';

    var n;
    if (isNaN(colNum))
        n = getParamNum(valuelist, colNum, rowD, colD);
    else
        n = colNum;

    var mName = new Array();
    if (valuelist != '') {
        if (rowD != '') {
            var tnodes = valuelist.split(rowD);
        } else {
            var tnodes = valuelist;
        }
        for (i = 0; i < tnodes.length - 1; i++) {
            var tdata = tnodes[i].split(colD);
            (tdata[n]) ? mName[i] = tdata[n] : mName[i] = '';
        }
        return mName;
    }
    return mName;
}

function getIpMaskBit(mask) {
    var i = 0, num = 0;
    var oneBitPos = 0;

    if (isValidSubnetMask(mask) == false)
        return -1;

    maskParts = mask.split('.');
    for (i = 0; i < 4; i++) {
        num = parseInt(maskParts[i]);
        oneBitPos = getRightMostOneBitPos(num);
        if (oneBitPos < 7) {
            return i * 8 + oneBitPos + 1;
        }
    }
    return 32;
}

function markDscpToName(mark) {
    var i;
    var dscpMarkDesc = new Array('auto', 'default', 'AF13', 'AF12', 'AF11', 'CS1',
        'AF23', 'AF22', 'F21', 'S2',
        'AF33', 'AF32', 'AF31', 'CS3',
        'AF43', 'AF42', 'AF41', 'CS4',
        'EF', 'CS5', 'CS6', 'CS7', '');
    var dscpMarkValues = new Array(-2, 0x00, 0x38, 0x30, 0x28, 0x20,
        0x58, 0x50, 0x48, 0x40,
        0x78, 0x70, 0x68, 0x60,
        0x98, 0x90, 0x88, 0x80,
        0xB8, 0xA0, 0xC0, 0xE0);
    if (mark == -1)
        return '';
    for (i = 0; dscpMarkDesc[i] != ''; i++) {
        if (mark == dscpMarkValues[i])
            return dscpMarkDesc[i];
    }
    return dscpMarkDesc[0];
}

function String_Replace(expression, find, replacewith, start) {
    var index = expression.indexOf(find, start);
    if (index == -1)
        return expression;

    var findLen = find.length;
    var newexp = "";
    newexp = expression.substring(0, index) + (replacewith) + (expression.substring(index + findLen));

    return String_Replace(newexp, find, replacewith, index + 1 + findLen);
}


function SsidisIncludeInvalidChar(val) {
    var len = val.length;

    for (i = 0; i < len; i++) {
        if (val.charAt(i) == '&') {
            return false;
        }
    }

    return true;
}

function isPppNameUnsafe(compareChar) {
    var unsafeString = "\"\\`\,=' \t";

    if (unsafeString.indexOf(compareChar) == -1 && compareChar.charCodeAt(0) > 32
        && compareChar.charCodeAt(0) < 123)
        return false; // found no unsafe chars, return false
    else
        return true;
}
function getElById(idVal) {
    if (document.getElementById != null)
        return document.getElementById(idVal)
    if (document.all != null)
        return document.all[idVal]

    alert("Problem getting element by id")
    return null
}

// Check if a ppp name or password valid
function isValidPppName(pppname) {
    var i = 0;

    for (i = 0; i < pppname.length; i++) {
        if (isPppNameUnsafe(pppname.charAt(i)) == true)
            return false;
    }

    return true;
}

function Resizeiframe() {
    getElById('mainFrameid').style.height = 531;
    var mainbody = mainFrame.document.body.scrollHeight;
    var trmainbody = getElById('trmain').clientHeight;
    var mainbodyoffset = getElById('mainFrameid').offsetHeight;
    var end = mainbody;
    if (end < (trmainbody - 31))
        end = trmainbody - 31;
    getElById('mainFrameid').style.height = end;  //must be id
}

function isValidWPAPskKey(reg, val) {
    var ret = false;
    var len = val.length;
    var maxSize = 64;
    var minSize = 8;

    if (reg.test(val) == true) {
        if (len >= minSize && len < maxSize)
            ret = true;
        else if (len == maxSize) {
            for (i = 0; i < maxSize; i++)
                if (isHexaDigit(val.charAt(i)) == false)
                    break;
            if (i == maxSize)
                ret = true;
        } else
            ret = false;
    }
    return ret;
}

function isValidString(reg, val) {
    var ret = false;
    var len = val.length;
    var maxSize = 64;
    var minSize = 8;

    if (reg.test(val) == true) {
        if (len >= minSize && len < maxSize)
            ret = true;
        else if (len == maxSize) {
            for (i = 0; i < maxSize; i++)
                if (isHexaDigit(val.charAt(i)) == false)
                    break;
            if (i == maxSize)
                ret = true;
        } else
            ret = false;
    }
    return ret;
}

function checkWPAPskKey(val) {
    var reg = /^[a-zA-Z0-9\-_@.+!#/]+$/;

    return isValidWPAPskKey(reg, val);
}

function checkPPPoEUser(val) {
    var reg = /^[a-zA-Z0-9\-_@.+!/]+$/;

    return reg.test(val);
}

function checkNum(val) {
    if (val.length == 0) {
        return false;
    }
    if (/^(\+|-)?\d+($|\.\d+$)/.test(val)) {
        return true;
    }
    else {
        return false;
    }
    //if(1*val == val)
    /*for (var i = 0; i < val.length; i++) {
        if (val.charCodeAt(i) < 48 || val.charCodeAt(i) > 57) {
            return false;
        }
    }*/
}
//检查数字的范围  这个必须在检查完是数字校验之后 checkNum(val)
function checkRange(min, max, val) {
    var min = min * 1;
    var max = max * 1;
    var val = val * 1;
    if (val >= min && val <= max) {
        return true;
    } else {
        return false;
    }
}

function checknumber(obj, min, max) {
    if (checkNum(obj.value) && checkRange(min, max, obj.value)) {
        //$(obj).removeClass("input_error");
        return true;
    }
    else {
        //$(obj).addClass("input_error");
        return false;
    }
}


function changeprotocol(obj) {
    var v = obj.selectedIndex;
    hide_ipv4_ipv6();
    if (v == 0 || v == 2) {
        $(".ipv4").css("display", "");
        $("#ipv4_div").css("display", "");
    }
    if (v == 1 || v == 2) {
        $("#ipv6_div").css("display", "");
    }
}
function hide_ipv4_ipv6() {
    $(".ipv4").css("display", "none");
    $("#ipv4_div").css("display", "none");
    $("#ipv6_div").css("display", "none");
}

function validateKey(str) {
    for (var i = 0; i < str.length; i++) {
        if ((str.charAt(i) >= '0' && str.charAt(i) <= '9') ||
            (str.charAt(i) == '.'))
            continue;
        return 0;
    }
    return 1;
}
function getDigit(str, num) {
    i = 1;
    if (num != 1) {
        while (i != num && str.length != 0) {
            if (str.charAt(0) == '.') {
                i++;
            }
            str = str.substring(1);
        }
        if (i != num)
            return -1;
    }
    for (i = 0; i < str.length; i++) {
        if (str.charAt(i) == '.') {
            str = str.substring(0, i);
            break;
        }
    }
    if (str.length == 0)
        return -1;
    d = parseInt(str, 10);
    return d;
}
function checkMask(netmask) {
    var i, d;
    var zero = 0;
    if (netmask == "") {
        return false;
    }

    if (validateKey(netmask) == 0) {
        return false;
    }

    for (i = 1; i <= 4; i++) {
        d = getDigit(netmask, i);
        if (!(d == 0 || d == 128 || d == 192 || d == 224 || d == 240 || d == 248 || d == 252 || d == 254 || d == 255)) {
            return false;
        }
        if (zero == 1 && d != 0) {
            return false;
        }
        if (d == 0) {
            zero = 1;
        }

    }

    return true;
}

