[Feature][S300][task-view-617][project] add S300 project based CPE_COMMON

Change-Id: I1ff09219a8d432a839f89312341021ddaf5da4d8
diff --git a/lynq/S300/ap/app/zte_webui/js/com.js b/lynq/S300/ap/app/zte_webui/js/com.js
new file mode 100755
index 0000000..e103a35
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/com.js
@@ -0,0 +1,11413 @@
+

+define("service","underscore jquery set CryptoJS".split(" "), function (_, $, config, CryptoJS) {

+    function addTimerSomething(querys, cb) {

+        if (_.isArray(querys)) {

+            for (var i = 0; i < querys.length; i++) {

+                addQueryString(querys[i]);

+            }

+        } else {

+            addQueryString(querys);

+        }

+        addCallback(cb);

+    }

+    function removeTimerSomething(querys, cb) {

+        if (_.isArray(querys)) {

+            for (var i = 0; i < querys.length; i++) {

+                removeQueryString(querys[i]);

+            }

+        } else {

+            removeQueryString(querys);

+        }

+        removeCallback(cb);

+    }

+    function getCurretnMAC() {

+        return getUserMacAddr({}).get_user_mac_addr;

+    }

+    function getDdnsParams(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "DDNS_Enable,DDNS_Mode,DDNSProvider,DDNSAccount,DDNSPassword,DDNS,DDNS_Hash_Value"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    DDNS_Enable: paramD.DDNS_Enable,

+                    DDNS_Mode: paramD.DDNS_Mode,

+                    DDNSProvider: paramD.DDNSProvider,

+                    DDNSAccount: paramD.DDNSAccount,

+                    DDNSPassword: paramD.DDNSPassword,

+                    DDNS: paramD.DDNS,

+                    DDNS_Hash_Value: paramD.DDNS_Hash_Value

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setDDNSForward() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+   function getLoginData() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "modem_main_state,puknumber,pinnumber,blc_wan_mode,blc_wan_auto_mode,psw_fail_num_str,login_lock_time,psw_changed";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.blc_wan_mode == "AUTO") {

+                    paramD.blc_wan_mode = paramD.blc_wan_auto_mode ? paramD.blc_wan_auto_mode : 'AUTO_PPP';

+                } else {

+                    paramD.blc_wan_mode = paramD.blc_wan_mode ? paramD.blc_wan_mode : 'PPP';

+                }

+                paramD.psw_fail_num_str = paramD.psw_fail_num_str == '' ? config.MAX_LOGIN_COUNT : paramD.psw_fail_num_str;

+                paramD.login_lock_time = paramD.login_lock_time == '' ? '300' : paramD.login_lock_time;

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function login() {

+        return stuffMake(arguments, {}, prepare, deal, {

+            errorType: 'badPassword'

+        }, true);

+        function prepare(values, isPost) {

+            var obj = {

+                goformId: "LOGIN",

+                password: config.PASSWORD_ENCODE ? Base64.encode(values.password) : values.password

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.result == "0" || paramD.result == "4")) {

+                informationAll.isLoggedIn = true;

+                return {

+                    result: true

+                };

+            } else {

+                var loginError = {};

+                switch (paramD.result) {

+                case "1":

+                    loginError = {

+                        errorType: "Login Fail"

+                    };

+                    break;

+                case "2":

+                    loginError = {

+                        errorType: "duplicateUser"

+                    };

+                    break;

+                case "3":

+                    loginError = {

+                        errorType: "badPassword"

+                    };

+                    break;

+                default:

+                    loginError = {

+                        errorType: "Login Fail"

+                    };

+                    break;

+                }

+                informationAll.isLoggedIn = false;

+                return $.extend(errUnknownObj, loginError);

+            }

+        }

+    }

+    function getLoginStatus() {

+        if (informationAll.isLoggedIn != undefined) {

+            return stuffMake(arguments, {

+                status: informationAll.isLoggedIn ? 'loggedIn' : 'loggedOut'

+            });

+        } else {

+            var resultObject = {};

+            if (!config.HAS_LOGIN) {

+                resultObject.status = 'loggedIn';

+                resultObject.errorType = 'no_login';

+                informationAll.isLoggedIn = true;

+            }

+            return stuffMake(arguments, resultObject, prepare, deal, null, false);

+        }

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "loginfo";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.loginfo || paramD.loginfo == "") {

+                var loginStatus = {};

+                switch (paramD.loginfo) {

+                case "ok":

+                    informationAll.isLoggedIn = true;

+                    loginStatus.status = "loggedIn";

+                    break;

+                default:

+                    informationAll.isLoggedIn = false;

+                    loginStatus.status = "loggedOut";

+                    break;

+                }

+                return loginStatus;

+            } else {

+                informationAll.isLoggedIn = undefined;

+                return $.extend(errUnknownObj, {

+                    errorType: "LoginStatusError"

+                });

+            }

+        }

+    }

+    function enterPIN() {

+        return stuffMake(arguments, {}, prepare, deal, {}, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "ENTER_PIN";

+            obj.PinNumber = values.PinNumber;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function enterPUK() {

+        return stuffMake(arguments, {}, prepare, deal, {}, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "ENTER_PUK";

+            obj.PUKNumber = values.PUKNumber;

+            obj.PinNumber = values.PinNumber;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }	

+

+    function getStatusInfo() {

+        if (informationAll.isLoggedIn === undefined) {

+            var loginStatus = getLoginStatus();

+            return {

+                networkType: informationAll.networkType,

+                signalImg: informationAll.signalImg,

+                networkOperator: informationAll.networkOperator,

+                spn_b1_flag: informationAll.spn_b1_flag,

+                spn_name_data: informationAll.spn_name_data,

+                spn_b2_flag: informationAll.spn_b2_flag,

+                connectStatus: informationAll.connectStatus,

+                rj45ConnectStatus: informationAll.rj45ConnectStatus,

+                ssid1AttachedNum: informationAll.ssid1AttachedNum,

+                ssid2AttachedNum: informationAll.ssid2AttachedNum,

+                wirelessDeviceNum: informationAll.ssid1AttachedNum + informationAll.ssid2AttachedNum,

+                roamingStatus: informationAll.roamingStatus,

+                wifiStatus: informationAll.wifiStatus,

+                simStatus: informationAll.simStatus,

+                pinStatus: informationAll.pinStatus,

+                batteryStatus: informationAll.batteryStatus,

+                batteryLevel: informationAll.batteryLevel,

+                batteryPers: informationAll.batteryPers,

+                batteryTime: informationAll.batteryTime,

+                ssid: informationAll.ssid,

+                authMode: informationAll.authMode,

+                data_counter: informationAll.data_counter,

+                isLoggedIn: loginStatus.status == "loggedIn",

+                newSmsReceived: informationAll.newSmsReceived,

+                smsReportReceived: informationAll.smsReportReceived,

+                smsUnreadCount: informationAll.smsUnreadCount,

+                limitVolumeEnable: informationAll.limitVolumeEnable,

+                limitVolumeType: informationAll.limitVolumeType,

+                limitVolumePercent: informationAll.limitVolumePercent,

+                limitVolumeSize: informationAll.limitVolumeSize,

+                connectWifiProfile: informationAll.connectWifiProfile,

+                connectWifiSSID: informationAll.connectWifiSSID,

+                connectWifiStatus: informationAll.connectWifiStatus,

+                multi_ssid_enable: informationAll.multi_ssid_enable,

+                roamMode: informationAll.roamMode,

+                blc_wan_mode: informationAll.blc_wan_mode,

+                current_upgrade_state: informationAll.current_upgrade_state,

+                is_mandatory: informationAll.is_mandatory,

+                new_version_state: informationAll.new_version_state,

+                allowRoamingUpdate: informationAll.allowRoamingUpdate,

+                ap_station_enable: informationAll.ap_station_enable,

+                ap_station_mode: informationAll.ap_station_mode,

+                dialMode: informationAll.dialMode,

+                fota_package_already_download: informationAll.fota_package_already_download,

+                ethWanMode: informationAll.ethWanMode,

+                fota_user_selector: informationAll.fota_user_selector,

+                defaultWanName: informationAll.defaultWanName

+            };

+        }

+        return {

+            networkType: informationAll.networkType,

+            signalImg: informationAll.signalImg,

+            networkOperator: informationAll.networkOperator,

+            spn_b1_flag: informationAll.spn_b1_flag,

+            spn_name_data: informationAll.spn_name_data,

+            spn_b2_flag: informationAll.spn_b2_flag,

+            connectStatus: informationAll.connectStatus,

+            rj45ConnectStatus: informationAll.rj45ConnectStatus,

+            ssid1AttachedNum: informationAll.ssid1AttachedNum,

+            ssid2AttachedNum: informationAll.ssid2AttachedNum,

+            wirelessDeviceNum: informationAll.ssid1AttachedNum + informationAll.ssid2AttachedNum,

+            roamingStatus: informationAll.roamingStatus,

+            wifiStatus: informationAll.wifiStatus,

+            simStatus: informationAll.simStatus,

+            pinStatus: informationAll.pinStatus,

+            batteryStatus: informationAll.batteryStatus,

+            batteryLevel: informationAll.batteryLevel,

+            batteryPers: informationAll.batteryPers,

+            batteryTime: informationAll.batteryTime,

+            ssid: informationAll.ssid,

+            authMode: informationAll.authMode,

+            data_counter: informationAll.data_counter,

+            isLoggedIn: informationAll.isLoggedIn,

+            newSmsReceived: informationAll.newSmsReceived,

+            smsReportReceived: informationAll.smsReportReceived,

+            smsUnreadCount: informationAll.smsUnreadCount,

+            limitVolumeEnable: informationAll.limitVolumeEnable,

+            limitVolumeType: informationAll.limitVolumeType,

+            limitVolumePercent: informationAll.limitVolumePercent,

+            limitVolumeSize: informationAll.limitVolumeSize,

+            connectWifiProfile: informationAll.connectWifiProfile,

+            connectWifiSSID: informationAll.connectWifiSSID,

+            connectWifiStatus: informationAll.connectWifiStatus,

+            multi_ssid_enable: informationAll.multi_ssid_enable,

+            blc_wan_mode: informationAll.blc_wan_mode,

+            roamMode: informationAll.roamMode,

+            current_upgrade_state: informationAll.current_upgrade_state,

+            is_mandatory: informationAll.is_mandatory,

+            new_version_state: informationAll.new_version_state,

+            allowRoamingUpdate: informationAll.allowRoamingUpdate,

+            ap_station_enable: informationAll.ap_station_enable,

+            ap_station_mode: informationAll.ap_station_mode,

+            dialMode: informationAll.dialMode,

+            fota_package_already_download: informationAll.fota_package_already_download,

+            ethWanMode: informationAll.ethWanMode,

+            fota_user_selector: informationAll.fota_user_selector,

+            defaultWanName: informationAll.defaultWanName

+        };

+    }

+    function getConnectionInfo() {

+        var isData = informationAll.limitVolumeType == '1';

+        var result = {

+            data_counter: informationAll.data_counter,

+            connectStatus: informationAll.connectStatus,

+            rj45ConnectStatus: informationAll.rj45ConnectStatus,

+            limitVolumeEnable: informationAll.limitVolumeEnable,

+            limitVolumeType: informationAll.limitVolumeType,

+            limitVolumePercent: informationAll.limitVolumePercent,

+            networkType: informationAll.networkType

+        };

+        if (isData) {

+            result.limitDataMonth = informationAll.limitVolumeSize;

+            result.limitTimeMonth = 0;

+        } else {

+            result.limitTimeMonth = informationAll.limitVolumeSize;

+            result.limitDataMonth = 0;

+        }

+        result.blc_wan_mode = informationAll.blc_wan_mode;

+        return result;

+    }

+    function resetNewSmsReceivedVar() {

+        informationAll.newSmsReceived = false;

+    }

+    function resetSmsReportReceivedVar() {

+        informationAll.smsReportReceived = false;

+    }

+    function getSmsCapability() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "sms_capacity_info";

+            return valueReq;

+        }

+        function deal(paramD) {

+            return {

+                nvTotal: parseInt(paramD.sms_nv_total, 10),

+                nvUsed: parseInt(paramD.sms_nv_rev_total, 10) + parseInt(paramD.sms_nv_send_total, 10) + parseInt(paramD.sms_nv_draftbox_total, 10),

+                simTotal: parseInt(paramD.sms_sim_total, 10),

+                simUsed: parseInt(paramD.sms_sim_rev_total, 10) + parseInt(paramD.sms_sim_send_total, 10) + parseInt(paramD.sms_sim_draftbox_total, 10),

+                nvReceive: parseInt(paramD.sms_nv_rev_total, 10),

+                nvSend: parseInt(paramD.sms_nv_send_total, 10),

+                nvDraft: parseInt(paramD.sms_nv_draftbox_total, 10),

+                simReceive: parseInt(paramD.sms_sim_rev_total, 10),

+                simSend: parseInt(paramD.sms_sim_send_total, 10),

+                simDraft: parseInt(paramD.sms_sim_draftbox_total, 10)

+            };

+        }

+    }

+    function connect() {

+        var callback = arguments[1];

+        var checkPoint = 0;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "CONNECT_NETWORK";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                checkPoint = new Date().getTime();

+                addCallback(checkConnectStatus);

+            } else {

+                callback({

+                    result: false

+                });

+            }

+        }

+        function checkConnectStatus(paramD) {

+            if (paramD.ppp_status == "ppp_connecting") {

+                informationAll.connectStatus = "ppp_connecting";

+            } else if (paramD.ppp_status == "ppp_connected") {

+                removeCallback(checkConnectStatus);

+                informationAll.connectStatus = "ppp_connected";

+                callback({

+                    result: true,

+                    status: informationAll.connectStatus

+                });

+            } else if (new Date().getTime() - checkPoint < 1e4) {

+                informationAll.connectStatus = "ppp_connecting";

+            } else {

+                removeCallback(checkConnectStatus);

+                callback({

+                    result: false

+                });

+            }

+        }

+    }

+    function disconnect() {

+        var callback = arguments[1];

+        var checkPoint = 0;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "DISCONNECT_NETWORK";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                checkPoint = new Date().getTime();

+                addCallback(checkDisconnectStatus);

+            } else {

+                callback({

+                    result: false

+                });

+            }

+        }

+        function checkDisconnectStatus(paramD) {

+            if (paramD.ppp_status == "ppp_disconnecting") {

+                informationAll.connectStatus = "ppp_disconnecting";

+            } else if (paramD.ppp_status == "ppp_disconnected") {

+                removeCallback(checkDisconnectStatus);

+                informationAll.connectStatus = "ppp_disconnected";

+                callback({

+                    result: true,

+                    status: informationAll.connectStatus

+                });

+            } else if (new Date().getTime() - checkPoint < 1e4) {

+                informationAll.connectStatus = "ppp_disconnecting";

+            } else {

+                removeCallback(checkDisconnectStatus);

+                callback({

+                    result: false

+                });

+            }

+        }

+    }

+    function getApnSettings() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "APN_configtmp0,APN_configtmp1,APN_configtmp2,APN_configtmp3,APN_configtmp4,APN_configtmp5,APN_configtmp6,APN_configtmp7,APN_configtmp8,APN_configtmp9," + "APN_configtmp10,APN_configtmp11,APN_configtmp12,APN_configtmp13,APN_configtmp14,APN_configtmp15,APN_configtmp16,APN_configtmp17,APN_configtmp18,APN_configtmp19," + "ipv6_APN_configtmp0,ipv6_APN_configtmp1,ipv6_APN_configtmp2,ipv6_APN_configtmp3,ipv6_APN_configtmp4,ipv6_APN_configtmp5,ipv6_APN_configtmp6,ipv6_APN_configtmp7,ipv6_APN_configtmp8,ipv6_APN_configtmp9," + "ipv6_APN_configtmp10,ipv6_APN_configtmp11,ipv6_APN_configtmp12,ipv6_APN_configtmp13,ipv6_APN_configtmp14,ipv6_APN_configtmp15,ipv6_APN_configtmp16,ipv6_APN_configtmp17,ipv6_APN_configtmp18,ipv6_APN_configtmp19," + "m_profile_name,profile_name,wan_dial,pdp_type,pdp_select,index,Current_index,apn_auto_config,ipv6_apn_auto_config," + "apn_mode,wan_apn,ppp_auth_mode,ppp_username,ppp_passtmp," + "ipv6_wan_apn,ipv6_pdp_type,ipv6_ppp_auth_mode,ipv6_ppp_username,ipv6_ppp_passtmp,apn_num_preset";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(result) {

+            if (result) {

+                return {

+                    APNs: result.APN_configtmp0 + "||" + result.APN_configtmp1 + "||" + result.APN_configtmp2 + "||" + result.APN_configtmp3 + "||" + result.APN_configtmp4 + "||"

+                    +result.APN_configtmp5 + "||" + result.APN_configtmp6 + "||" + result.APN_configtmp7 + "||" + result.APN_configtmp8 + "||" + result.APN_configtmp9 + "||"

+                    +result.APN_configtmp10 + "||" + result.APN_configtmp11 + "||" + result.APN_configtmp12 + "||" + result.APN_configtmp13 + "||" + result.APN_configtmp14 + "||"

+                    +result.APN_configtmp15 + "||" + result.APN_configtmp16 + "||" + result.APN_configtmp17 + "||" + result.APN_configtmp18 + "||" + result.APN_configtmp19,

+                    ipv6APNs: result.ipv6_APN_configtmp0 + "||" + result.ipv6_APN_configtmp1 + "||" + result.ipv6_APN_configtmp2 + "||" + result.ipv6_APN_configtmp3 + "||" + result.ipv6_APN_configtmp4 + "||"

+                    +result.ipv6_APN_configtmp5 + "||" + result.ipv6_APN_configtmp6 + "||" + result.ipv6_APN_configtmp7 + "||" + result.ipv6_APN_configtmp8 + "||" + result.ipv6_APN_configtmp9 + "||"

+                    +result.ipv6_APN_configtmp10 + "||" + result.ipv6_APN_configtmp11 + "||" + result.ipv6_APN_configtmp12 + "||" + result.ipv6_APN_configtmp13 + "||" + result.ipv6_APN_configtmp14 + "||"

+                    +result.ipv6_APN_configtmp15 + "||" + result.ipv6_APN_configtmp16 + "||" + result.ipv6_APN_configtmp17 + "||" + result.ipv6_APN_configtmp18 + "||" + result.ipv6_APN_configtmp19,

+                    apnMode: result.apn_mode,

+                    profileName: result.m_profile_name || result.profile_name,

+                    wanDial: result.wan_dial,

+                    pdpType: result.pdp_type == 'IP' ? 'IP' : result.ipv6_pdp_type,

+                    pdpSelect: result.pdp_select,

+                    index: result.index,

+                    currIndex: result.Current_index,

+                    autoApns: result.apn_auto_config,

+                    autoApnsV6: result.ipv6_apn_auto_config,

+                    wanApn: result.wan_apn,

+                    authMode: result.ppp_auth_mode.toLowerCase(),

+                    username: result.ppp_username,

+                    password: result.ppp_passtmp,

+                    dnsMode: "",

+                    dns1: "",

+                    dns2: "",

+                    wanApnV6: result.ipv6_wan_apn,

+                    authModeV6: result.ipv6_ppp_auth_mode.toLowerCase(),

+                    usernameV6: result.ipv6_ppp_username,

+                    passwordV6: result.ipv6_ppp_passtmp,

+                    dnsModeV6: "",

+                    dns1V6: "",

+                    dns2V6: "",

+                    apnNumPreset: result.apn_num_preset

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function deleteApn() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                apn_action: "delete",

+                apn_mode: "manual",

+                index: values.index

+            };

+            valueReq.goformId = "APN_PROC_EX";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function setDefaultApn() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var requestParam = {

+                goformId: "APN_PROC_EX",

+                apn_mode: values.apnMode

+            };

+            if (values.apnMode == 'manual') {

+                requestParam.apn_action = "set_default";

+                requestParam.set_default_flag = "1";

+                requestParam.pdp_type = values.pdpType;

+                requestParam.index = values.index;

+            }

+            return requestParam;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function addOrEditApn() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "APN_PROC_EX",

+                apn_action: "save",

+                apn_mode: "manual",

+                profile_name: values.profileName,

+                wan_dial: '*99#',

+                pdp_type: values.pdpType,

+                pdp_select: 'auto',

+                index: values.index

+            };

+            if (values.pdpType == "IP") {

+                $.extend(valueReq, {

+                    wan_apn: values.wanApn,

+                    ppp_auth_mode: values.authMode,

+                    ppp_username: values.username,

+                    ppp_passtmp: values.password,

+                });

+            } else if (values.pdpType == "IPv6") {

+                $.extend(valueReq, {

+                    ipv6_wan_apn: values.wanApnV6,

+                    ipv6_ppp_auth_mode: values.authModeV6,

+                    ipv6_ppp_username: values.usernameV6,

+                    ipv6_ppp_passtmp: values.passwordV6

+                });

+            } else {

+                $.extend(valueReq, {

+                    wan_apn: values.wanApn,

+                    ppp_auth_mode: values.authMode,

+                    ppp_username: values.username,

+                    ppp_passtmp: values.password,

+                    dns_mode: values.dnsMode,

+                    prefer_dns_manual: values.dns1,

+                    standby_dns_manual: values.dns2,

+                    ipv6_wan_apn: values.wanApnV6,

+                    ipv6_ppp_auth_mode: values.authModeV6,

+                    ipv6_ppp_username: values.usernameV6,

+                    ipv6_ppp_passtmp: values.passwordV6

+                });

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    var timerQueryString = ["modem_main_state", "pin_status", "blc_wan_mode", "blc_wan_auto_mode", "loginfo", "fota_new_version_state", "fota_current_upgrade_state", "fota_upgrade_selector", "network_provider", "is_mandatory", "sta_count", "m_sta_count"];

+    var loginTimerQueryString = ["signalbar", "network_type", "sub_network_type", "ppp_status", "rj45_state", "EX_SSID1", "sta_ip_status", "EX_wifi_profile", "m_ssid_enable", "wifi_cur_state", "SSID1", "simcard_roam", "lan_ipaddr", "battery_charging", "battery_vol_percent", "battery_pers", "spn_name_data", "spn_b1_flag", "spn_b2_flag", "realtime_tx_bytes", "realtime_rx_bytes", "realtime_time", "realtime_tx_thrpt", "realtime_rx_thrpt", "monthly_rx_bytes", "monthly_tx_bytes", "traffic_alined_delta", "monthly_time", "date_month", "data_volume_limit_switch", "data_volume_limit_size", "data_volume_alert_percent", "data_volume_limit_unit", "roam_setting_option", "upg_roam_switch", "fota_package_already_download", 'ssid', 'dial_mode', 'ethwan_mode', 'default_wan_name'];

+    if (config.HAS_SMS) {

+        $.merge(loginTimerQueryString, ["sms_received_flag", "sts_received_flag", 'sms_unread_num']);

+    }

+    var timerCallbackStack = [];

+    var timerCallbacks = [timerUpdateStatus];

+    function timerUpdater() {

+        if (!updateTimerFlag) {

+            setTimeout(function () {

+                timerUpdater();

+            }, 1000);

+            return;

+        }

+        var queryParams = checkTimerUpdaterParameters();

+        reqAsync(queryParams, function (paramD) {

+            for (var i = 0; i < timerCallbacks.length; i++) {

+                if (typeof timerCallbacks[i] === "function") {

+                    timerCallbacks[i](paramD);

+                }

+            }

+            $.merge(timerCallbacks, timerCallbackStack);

+            timerCallbackStack = [];

+            setTimeout(function () {

+                timerUpdater();

+            }, 1000);

+        }, function () {

+            timerUpdaterErrorCallback();

+            setTimeout(function () {

+                timerUpdater();

+            }, 1000);

+        }, false);

+    }

+    function checkTimerUpdaterParameters() {

+        var queryParams = {

+            multi_data: 1,

+        };

+        if (window.location.hash && window.location.hash != '#entry' && informationAll.isLoggedIn) {

+            if (config.HAS_SMS) {

+                queryParams.sms_received_flag_flag = 0;

+                queryParams.sts_received_flag_flag = 0;

+            }

+            if (loginTimerQueryString.length > 0 && _.indexOf(timerQueryString, loginTimerQueryString[0]) == -1) {

+                $.each(loginTimerQueryString, function (i, n) {

+                    timerQueryString.push(n);

+                });

+            }

+        } else {

+            if (loginTimerQueryString.length > 0 && _.indexOf(timerQueryString, loginTimerQueryString[0]) != -1) {

+                timerQueryString = _.without(timerQueryString, loginTimerQueryString);

+            }

+        }

+        queryParams.cmd = timerQueryString.join(",");

+        return queryParams;

+    }

+    function addCallback(cb) {

+        if (_.indexOf(timerCallbackStack, cb) == -1) {

+            timerCallbackStack.push(cb);

+        }

+    }

+    function removeCallback(cb) {

+        timerCallbacks = _.without(timerCallbacks, cb);

+        if (timerCallbacks.length == 0) {

+            timerCallbacks.push(timerUpdateStatus);

+        }

+        return timerCallbackStack;

+    }

+    function addQueryString(query) {

+        if (_.indexOf(timerQueryString, query) == -1) {

+            timerQueryString.push(query);

+        }

+    }

+    function removeQueryString(query) {

+        timerQueryString = _.without(timerQueryString, query);

+        return timerQueryString;

+    }

+    function timerUpdateStatus(paramD) {

+        informationAll.defaultWanName = paramD.default_wan_name;

+        informationAll.signalImg = typeof paramD.signalbar == 'undefined' ? '0' : paramD.signalbar;

+        informationAll.networkType = paramD.sub_network_type ? paramD.sub_network_type : (paramD.network_type ? paramD.network_type : '');

+        if (informationAll.networkType.toLowerCase().indexOf("limited_service") != -1 || informationAll.networkType.toLowerCase().indexOf("limited service") != -1) {

+            informationAll.networkType = "limited_service";

+        } else if (informationAll.networkType.toLowerCase().indexOf("no_service") != -1 || informationAll.networkType.toLowerCase().indexOf("no service") != -1) {

+            informationAll.networkType = "no_service";

+        }

+        informationAll.networkOperator = paramD.network_provider ? paramD.network_provider : '';

+        informationAll.spn_b1_flag = paramD.spn_b1_flag;

+        informationAll.spn_b2_flag = paramD.spn_b2_flag;

+        informationAll.spn_name_data = paramD.spn_name_data;

+        informationAll.connectStatus = typeof paramD.ppp_status == 'undefined' ? 'ppp_disconnected' : paramD.ppp_status;

+        informationAll.rj45ConnectStatus = (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state;

+        informationAll.ethWanMode = paramD.ethwan_mode;

+        informationAll.ssid1AttachedNum = paramD.sta_count == "" ? 0 : parseInt(paramD.sta_count, 10);

+        informationAll.ssid2AttachedNum = paramD.m_sta_count == "" ? 0 : parseInt(paramD.m_sta_count, 10);

+        informationAll.roamingStatus = getRoamStatus(informationAll.networkType, paramD.modem_main_state, paramD.simcard_roam);

+        informationAll.wifiStatus = paramD.wifi_cur_state == "1";

+        informationAll.simStatus = paramD.modem_main_state;

+        informationAll.pinStatus = paramD.pin_status;

+        var needMinutes = 3 * 60 * 60;

+        var batteryLevel = (paramD.battery_vol_percent && paramD.battery_vol_percent.length > 0) ? paramD.battery_vol_percent : 100;

+        informationAll.batteryPers = paramD.battery_pers;

+        var remainMinutes = Math.round(needMinutes * (1 - batteryLevel / 100));

+        informationAll.batteryStatus = (typeof paramD.battery_charging == 'undefined') ? '0' : paramD.battery_charging;

+        informationAll.batteryLevel = batteryLevel;

+        informationAll.batteryTime = remainMinutes.toString();

+        informationAll.data_counter = {

+            uploadRate: paramD.realtime_tx_thrpt == '' ? 0 : paramD.realtime_tx_thrpt,

+            downloadRate: paramD.realtime_rx_thrpt == '' ? 0 : paramD.realtime_rx_thrpt,

+            currentSent: paramD.realtime_tx_bytes == '' ? 0 : paramD.realtime_tx_bytes,

+            currentReceived: paramD.realtime_rx_bytes == '' ? 0 : paramD.realtime_rx_bytes,

+            currentConnectedTime: paramD.realtime_time == '' ? 0 : paramD.realtime_time,

+            monthlySent: paramD.monthly_tx_bytes == '' ? 0 : paramD.monthly_tx_bytes,

+            monthlyReceived: paramD.monthly_rx_bytes == '' ? 0 : paramD.monthly_rx_bytes,

+            traffic_alined_delta: paramD.traffic_alined_delta == '' ? 0 : paramD.traffic_alined_delta,

+            monthlyConnectedTime: paramD.monthly_time == '' ? 0 : paramD.monthly_time,

+            month: paramD.date_month == '' ? 1 : paramD.date_month

+        };

+        informationAll.ssid = paramD.SSID1;

+        informationAll.authMode = paramD.AuthMode;

+        informationAll.isLoggedIn = config.HAS_LOGIN ? paramD.loginfo == "ok" : true;

+        if (config.HAS_SMS) {

+            if (!informationAll.newSmsReceived) {

+                informationAll.newSmsReceived = paramD.sms_received_flag > 0;

+            }

+            if (!informationAll.smsReportReceived) {

+                informationAll.smsReportReceived = paramD.sts_received_flag > 0;

+            }

+            if (typeof paramD.sms_dev_unread_num != "undefined") {

+                informationAll.smsUnreadCount = config.SMS_UNREAD_NUM_INCLUDE_SIM ? parseInt(paramD.sms_dev_unread_num | 0, 10) + parseInt(paramD.sms_sim_unread_num | 0, 10) : parseInt(paramD.sms_dev_unread_num | 0, 10);

+            } else {

+                informationAll.smsUnreadCount = parseInt(paramD.sms_unread_num | 0, 10)

+            }

+        }

+        if (paramD.data_volume_limit_switch == '1') {

+            informationAll.limitVolumeEnable = true;

+            informationAll.limitVolumeType = paramD.data_volume_limit_unit == 'data' ? '1' : '0';

+            informationAll.limitVolumePercent = paramD.data_volume_alert_percent;

+            if (paramD.data_volume_limit_unit == 'data') {

+                var limitMonth = paramD.data_volume_limit_size.split("_");

+                informationAll.limitVolumeSize = limitMonth[0] * limitMonth[1] * 1024 * 1024;

+            } else {

+                informationAll.limitVolumeSize = paramD.data_volume_limit_size * 60 * 60;

+            }

+        } else {

+            informationAll.limitVolumeEnable = false;

+            informationAll.limitVolumeType = '1';

+            informationAll.limitVolumePercent = '100';

+            informationAll.limitVolumeSize = '0';

+        }

+        informationAll.connectWifiProfile = paramD.EX_wifi_profile;

+        informationAll.connectWifiSSID = paramD.EX_SSID1;

+        informationAll.connectWifiStatus = paramD.sta_ip_status;

+        informationAll.multi_ssid_enable = paramD.m_ssid_enable;

+        informationAll.roamMode = paramD.roam_setting_option;

+        if (paramD.blc_wan_mode == "AUTO") {

+            informationAll.blc_wan_mode = paramD.blc_wan_auto_mode ? paramD.blc_wan_auto_mode : 'AUTO_PPP';

+        } else {

+            informationAll.blc_wan_mode = paramD.blc_wan_mode ? paramD.blc_wan_mode : 'PPP';

+        }

+        informationAll.new_version_state = paramD.fota_new_version_state == "has_critical" || paramD.fota_new_version_state == "has_optional" || paramD.fota_new_version_state == "already_has_pkg";

+        informationAll.current_upgrade_state = paramD.fota_current_upgrade_state;

+        if (informationAll.current_upgrade_state == "verify_failed") {

+            informationAll.current_upgrade_state = "upgrade_pack_error";

+        }

+        informationAll.fota_user_selector = paramD.fota_upgrade_selector;

+        informationAll.is_mandatory = paramD.is_mandatory == "1" || paramD.fota_new_version_state == "has_critical";

+        informationAll.allowRoamingUpdate = paramD.upg_roam_switch;

+        informationAll.dialMode = paramD.dial_mode;

+        informationAll.fota_package_already_download = paramD.fota_package_already_download;

+    }

+    function timerUpdaterErrorCallback() {

+        informationAll.batteryStatus = '0';

+    }

+    function getRoamStatus(networkType, modemState, simcardRoam) {

+        if (("" == $.trim(networkType)) || "no_service" == networkType.toLowerCase() || "limited_service" == networkType.toLowerCase() || "modem_sim_undetected" == modemState || "modem_waitpin" == modemState || "modem_waitpuk" == modemState) {

+            return false;

+        }

+        if ("Internal" == simcardRoam || "International" == simcardRoam) {

+            return true;

+        } else {

+            return false;

+        }

+    }

+    $(document).ready(function () {

+        setTimeout(function () {

+            timerUpdater();

+        }, 0);

+    });

+    function setNetwork(strNetworkNumber, nRat, nSubAct, callback) {

+        if ((typeof(strNetworkNumber) !== "string") || (strNetworkNumber === "") || (typeof(nRat) !== "number") || (isNaN(nRat))) {

+            if (typeof(callback) === "function") {

+                callback(false);

+                return;

+            }

+        }

+        var nRat1 = -1;

+        if (nRat === 0) {

+            nRat1 = 0;

+        } else if (nRat === 2) {

+            nRat1 = 2;

+        } else if (nRat == 7) {

+            nRat1 = 7;

+        } else {

+            nRat1 = -1;

+        }

+        if (-1 === nRat1) {

+            if (typeof(callback) === "function") {

+                callback(false);

+                return;

+            }

+        }

+        var SubAct;

+        if (nSubAct.toString() == "NaN") {

+            SubAct = "";

+        } else {

+            SubAct = nSubAct;

+        }

+        reqAsync({

+            goformId: "SET_NETWORK",

+            NetworkNumber: strNetworkNumber,

+            Rat: nRat,

+            nSubrat: SubAct

+        }, function (paramD) {

+            if (paramD && paramD.result == "success") {

+                var flag;

+                var counter = 0;

+                var timer = setInterval(function () {

+                    var obj = reqSync({

+                        cmd: 'm_netselect_result',

+                    }, false);

+                    if (!obj) {

+                        callback(false);

+                        return;

+                    }

+                    if (obj.m_netselect_result == "manual_success") {

+                        flag = "1";

+                        window.clearInterval(timer);

+                        callback(true);

+                    } else if (obj.m_netselect_result == "manual_fail") {

+                        flag = "0";

+                        window.clearInterval(timer);

+                        callback(false);

+                    } else if (counter < 120) {

+                        counter++;

+                    } else {

+                        window.clearInterval(timer);

+                        callback(false);

+                    }

+                }, 1000);

+            } else {

+                callback(false);

+            }

+        }, function (paramD) {

+            callback(false);

+        }, true);

+    }

+    function savePhoneBook() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "PBM_CONTACT_ADD";

+            valueReq.location = values.location;

+            valueReq.name = encodeMessage(values.name);

+            valueReq.mobilephone_num = values.mobile_phone_number;

+            if (valueReq.location == 1) {

+                valueReq.add_index_pc = values.index;

+                valueReq.homephone_num = values.home_phone_number;

+                valueReq.officephone_num = values.office_phone_number;

+                valueReq.email = encodeMessage(values.mail);

+                valueReq.groupchoose = values.group;

+                if (!valueReq.groupchoose) {

+                    valueReq.groupchoose = "common";

+                }

+            } else {

+                valueReq.edit_index = values.index;

+            }

+            if (values.delId != undefined) {

+                valueReq.delId = values.delId;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addTimerSomething("pbm_write_flag", checkSavePhoneBook);

+            } else {

+                callback(paramD);

+            }

+        }

+        function checkSavePhoneBook(paramD) {

+            checkPbmWriteFlag(paramD, callback, checkSavePhoneBook);

+        }

+    }

+    function checkPbmWriteFlag(paramD, callback, fn) {

+        if (paramD.pbm_write_flag == "0") {

+            removeTimerSomething("pbm_write_flag", fn);

+            callback({

+                result: "success"

+            });

+        } else if (paramD.pbm_write_flag == "6" || paramD.pbm_write_flag == "7" || paramD.pbm_write_flag == "8" || paramD.pbm_write_flag == "9" || paramD.pbm_write_flag == "10" || paramD.pbm_write_flag == "11" || paramD.pbm_write_flag == "14") {

+            removeTimerSomething("pbm_write_flag", fn);

+            callback({

+                result: "fail"

+            });

+        } else {}

+    }

+    function deletePhoneBooks() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "PBM_CONTACT_DEL";

+            valueReq.del_option = "delete_num";

+            valueReq.delete_id = values.indexs.join(",");

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addTimerSomething("pbm_write_flag", checkDeletePhoneBooks);

+            } else {

+                callback(paramD);

+            }

+        }

+        function checkDeletePhoneBooks(paramD) {

+            checkPbmWriteFlag(paramD, callback, checkDeletePhoneBooks);

+        }

+    }

+    function deleteAllPhoneBooks() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "PBM_CONTACT_DEL";

+            valueReq.del_option = "delete_all";

+            valueReq.del_all_location = values.location;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addTimerSomething("pbm_write_flag", checkDeleteAllPhoneBooks);

+            } else {

+                callback(paramD);

+            }

+        }

+        function checkDeleteAllPhoneBooks(paramD) {

+            checkPbmWriteFlag(paramD, callback, checkDeleteAllPhoneBooks);

+        }

+    }

+    function deleteAllPhoneBooksByGroup() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "PBM_CONTACT_DEL";

+            valueReq.del_option = "delete_all_by_group";

+            valueReq.del_all_location = 3;

+            valueReq.del_group = values.group;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addTimerSomething("pbm_write_flag", checkDeleteAllPhoneBooksByGroup);

+            } else {

+                callback(paramD);

+            }

+        }

+        function checkDeleteAllPhoneBooksByGroup(paramD) {

+            checkPbmWriteFlag(paramD, callback, checkDeleteAllPhoneBooksByGroup);

+        }

+    }

+    function setConnectionMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_CONNECTION_MODE";

+            valueReq.ConnectionMode = values.connectionMode;

+            valueReq.roam_setting_option = values.isAllowedRoaming;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                callback(paramD);

+            }

+        }

+    }

+    function getConnectionMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "ConnectionMode";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.connectionMode = paramD.connectionMode;

+                result.isAllowedRoaming = paramD.autoConnectWhenRoaming;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function _getPhoneBooks(array, location) {

+        if (array[0].data_per_page == 0) {

+            return {

+                "pbm_data": []

+            };

+        }

+        return stuffMake(array, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.mem_store = location;

+            if (location == 2) {

+                valueReq.cmd = "pbm_data_total";

+            } else {

+                valueReq.cmd = "pbm_data_info";

+            }

+            valueReq.page = values.page;

+            valueReq.data_per_page = values.data_per_page;

+            valueReq.orderBy = values.orderBy;

+            valueReq.isAsc = values.isAsc;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.pbm_data) {

+                var books = [];

+                $.each(paramD.pbm_data, function (i) {

+                    books.push({

+                        pbm_id: paramD.pbm_data[i].pbm_id,

+                        pbm_location: paramD.pbm_data[i].pbm_location,

+                        pbm_number: paramD.pbm_data[i].pbm_number,

+                        pbm_anr: paramD.pbm_data[i].pbm_anr,

+                        pbm_anr1: paramD.pbm_data[i].pbm_anr1,

+                        pbm_group: paramD.pbm_data[i].pbm_group,

+                        pbm_name: decodeMessage(paramD.pbm_data[i].pbm_name),

+                        pbm_email: decodeMessage(paramD.pbm_data[i].pbm_email)

+                    });

+                });

+                return {

+                    pbm_data: books

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPhoneBooksByGroup() {

+        if (arguments[0].data_per_page == 0) {

+            return {

+                "pbm_data": []

+            };

+        }

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "pbm_data_total";

+            valueReq.mem_store = 3;

+            valueReq.pbm_group = values.group;

+            valueReq.page = values.page;

+            valueReq.data_per_page = values.data_per_page;

+            valueReq.orderBy = values.orderBy;

+            valueReq.isAsc = values.isAsc;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.pbm_data) {

+                var books = [];

+                $.each(paramD.pbm_data, function (i) {

+                    books.push({

+                        pbm_id: paramD.pbm_data[i].pbm_id,

+                        pbm_location: paramD.pbm_data[i].pbm_location,

+                        pbm_number: paramD.pbm_data[i].pbm_number,

+                        pbm_anr: paramD.pbm_data[i].pbm_anr,

+                        pbm_anr1: paramD.pbm_data[i].pbm_anr1,

+                        pbm_group: paramD.pbm_data[i].pbm_group,

+                        pbm_name: decodeMessage(paramD.pbm_data[i].pbm_name),

+                        pbm_email: decodeMessage(paramD.pbm_data[i].pbm_email)

+                    });

+                });

+                return {

+                    pbm_data: books

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getDevicePhoneBooks() {

+        return _getPhoneBooks(arguments, 1);

+    }

+    function getSIMPhoneBooks() {

+        return _getPhoneBooks(arguments, 0);

+    }

+    function getPhoneBooks() {

+        return _getPhoneBooks(arguments, 2);

+    }

+    function getPhoneBookReady() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "pbm_init_flag";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPhoneBookCapacity(array, isSIM) {

+        return stuffMake(array, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "pbm_capacity_info";

+            if (isSIM) {

+                valueReq.pbm_location = "pbm_sim";

+            } else {

+                valueReq.pbm_location = "pbm_native";

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSIMPhoneBookCapacity() {

+        var paramD = getPhoneBookCapacity(arguments, true);

+        return {

+            simPbmTotalCapacity: parseInt(paramD.pbm_sim_max_record_num),

+            simPbmUsedCapacity: parseInt(paramD.pbm_sim_used_record_num),

+            simType: paramD.pbm_sim_type,

+            maxNameLen: parseInt(paramD.pbm_sim_max_name_len),

+            maxNumberLen: parseInt(paramD.pbm_sim_max_number_len) > 40 ? 40 : parseInt(paramD.pbm_sim_max_number_len)

+        };

+    }

+    function getDevicePhoneBookCapacity() {

+        var paramD = getPhoneBookCapacity(arguments, false);

+        return {

+            pcPbmTotalCapacity: parseInt(paramD.pbm_dev_max_record_num),

+            pcPbmUsedCapacity: parseInt(paramD.pbm_dev_used_record_num)

+        };

+    }

+    function getAttachedCableDevices() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "lan_station_list"

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            var deviceArr = [];

+            var attachedDevices = paramD.lan_station_list || paramD.station_list;

+            for (var i = 0; attachedDevices && i < attachedDevices.length; i++) {

+                var obj = {};

+                obj.macAddress = attachedDevices[i].mac_addr;

+                var hostname = attachedDevices[i].hostname;

+                obj.hostName = hostname == "" ? $.i18n.prop("unknown") : hostname;

+                obj.ipAddress = attachedDevices[i].ip_addr;

+                deviceArr.push(obj);

+            }

+            return {

+                attachedDevices: deviceArr

+            };

+        }

+    }

+    function getCurrentlyAttachedDevicesInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "station_list"

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            var deviceArr = [];

+            var attachedDevices = paramD.station_list;

+            for (var i = 0; attachedDevices && i < attachedDevices.length; i++) {

+                var obj = {};

+                obj.macAddress = attachedDevices[i].mac_addr;

+                var hostname = attachedDevices[i].hostname;

+                obj.hostName = hostname == "" ? $.i18n.prop("unknown") : hostname;

+                obj.ipAddress = attachedDevices[i].ip_addr;

+                deviceArr.push(obj);

+            }

+            return {

+                attachedDevices: deviceArr

+            };

+        }

+    }	

+

+    function setLanguage() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_WEB_LANGUAGE";

+            valueReq.Language = values.Language;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getLanguage() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "Language";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.Language = (paramD && paramD.Language) ? paramD.Language : "en";

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }	

+

+    function setBearerPreference() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_BEARER_PREFERENCE";

+            valueReq.BearerPreference = values.strBearerPreference;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function scanForNetwork(callback) {

+        $.post("/reqproc/proc_post", {

+            goformId: "SCAN_NETWORK"

+        }, function (paramD) {

+            if (paramD.result == "success") {

+                checkScanStatus();

+            } else {

+                callback(false, []);

+            }

+        }, "json").error(function () {

+            callback(false, []);

+        });

+        function checkScanStatus() {

+            $.getJSON("/reqproc/proc_get", {

+                cmd: "m_netselect_status",

+                "_": new Date().getTime()

+            }, function (paramD) {

+                if (paramD.m_netselect_status == "manual_selecting") {

+                    setTimeout(checkScanStatus, 1000);

+                } else {

+                    $.getJSON("/reqproc/proc_get", {

+                        cmd: "m_netselect_contents",

+                        "_": new Date().getTime()

+                    }, function (paramD2) {

+                        if (trim(paramD2.m_netselect_contents) != "") {

+                            parseScanResult(paramD2.m_netselect_contents);

+                        } else {

+                            callback(false, []);

+                        }

+                    }).error(function () {

+                        callback(false, []);

+                    });

+                }

+            }).error(function () {

+                callback(false, []);

+            });

+        }

+        function parseScanResult(result) {

+            var pattern = /([^,;]*),([^,]*),([^,]*),([^,]*),([^,;]*)/g;

+            var listNetwork = [];

+            var mts;

+            var unit = result.split(";");

+            var unitString = "";

+            for (i = 0; i < unit.length; i++) {

+                var unitLength = unit[i].split(",").length;

+                if (unitLength == 4) {

+                    unitString += unit[i] + ",NON;";

+                } else {

+                    unitString += unit[i] + ";";

+                }

+            }

+            while (mts = pattern.exec(unitString)) {

+                if (mts != null) {

+                    listNetwork.push({

+                        strShortName: mts[2].replace(/\"/g, ''),

+                        strNumeric: mts[3].replace(/\D/g, ''),

+                        nRat: parseInt(mts[4], 10),

+                        nState: parseInt(mts[1], 10),

+                        SubAct: parseInt(mts[5], 10)

+                    });

+                }

+            }

+            callback(true, listNetwork);

+        }

+    }

+	    function getNetSelectInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "current_network_mode,m_netselect_save,net_select_mode,m_netselect_contents,net_select,ppp_status,modem_main_state";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.current_network_mode = paramD.current_network_mode;

+                result.net_select_mode = paramD.net_select_mode;

+                result.m_netselect_save = paramD.m_netselect_save;

+                result.m_netselect_contents = paramD.m_netselect_contents;

+                result.net_select = paramD.net_select;

+                result.ppp_status = paramD.ppp_status;

+                result.modem_main_state = paramD.modem_main_state;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }	

+

+    function getSMSMessages() {

+        return stuffMake(arguments, {}, prepare, deal, {}, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "sms_data_total",

+                page: values.page,

+                data_per_page: config.SMS_DATABASE_SORT_SUPPORT ? values.smsCount : 500,

+                mem_store: values.nMessageStoreType,

+                tags: values.tags,

+                order_by: values.orderBy

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.messages && paramD.messages.length > 0) {

+                return {

+                    messages: parseMessages(paramD.messages)

+                };

+            } else {

+                return {

+                    messages: []

+                };

+            }

+        }

+    }

+    function parseMessages(messages, isReport) {

+        var result = [];

+        for (var i = 0; i < messages.length; i++) {

+            if (!config.SHOW_UN_COMPLETE_CONCAT_SMS && typeof messages[i].received_all_concat_sms != "undefined" && messages[i].received_all_concat_sms == '0') {

+                continue;

+            }

+            var oneMessage = {};

+            oneMessage.id = messages[i].id;

+            oneMessage.number = messages[i].number;

+            oneMessage.content = isReport ? messages[i].content : decodeMessageContent(messages[i].content);

+            oneMessage.time = transTime('20' + messages[i].date);

+            oneMessage.isNew = messages[i].tag == "1";

+            oneMessage.groupId = messages[i].draft_group_id;

+            oneMessage.tag = messages[i].tag;

+            oneMessage.receivedAll = messages[i].received_all_concat_sms == '1';

+            result.push(oneMessage);

+        }

+        if (!config.SMS_DATABASE_SORT_SUPPORT) {

+            var ids = [];

+            var tmpResult = [];

+            for (var i = result.length; i--; ) {

+                var n = result[i];

+                var idx = $.inArray(n.id, ids);

+                if (idx == -1) {

+                    ids.push(n.id);

+                    tmpResult.push(n);

+                } else {

+                    if (n.content.length > tmpResult[idx].content.length) {

+                        tmpResult[idx] = n;

+                    }

+                }

+            }

+            return _.sortBy(tmpResult, function (n) {

+                return 0 - n.id;

+            });

+        } else {

+            return result;

+        }

+    }

+    function decodeMessageContent(msgContent) {

+        return decodeMessage(escapeMessage(msgContent));

+    }

+    function sendSMS() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {

+                goformId: "SEND_SMS",

+                notCallback: true,

+                Number: values.number,

+                sms_time: getCurrentTimeString(),

+                MessageBody: escapeMessage(encodeMessage(values.message)),

+                ID: values.id,

+                encode_type: getEncodeType(values.message).encodeType

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "sendFail",

+                        errorText: "send_fail_try_again"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                setTimeout(function () {

+                    getSmsStatusInfo({

+                        smsCmd: 4,

+                        errorType: "sendFail",

+                        errorText: "send_fail_try_again"

+                    }, callback, errorCabllback);

+                }, 1000);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "sendFail",

+                        errorText: "send_fail_try_again"

+                    }));

+            }

+        }

+    }

+    function saveSMS() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {

+                notCallback: true,

+                goformId: "SAVE_SMS",

+                SMSMessage: escapeMessage(encodeMessage(values.message)),

+                SMSNumber: values.numbers.join(";") + ";",

+                Index: values.index,

+                encode_type: getEncodeType(values.message).encodeType,

+                sms_time: values.currentTimeString,

+                draft_group_id: values.groupId

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "saveFail",

+                        errorText: "save_fail"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                getSmsStatusInfo({

+                    smsCmd: 5,

+                    errorType: "saveFail",

+                    errorText: "save_fail"

+                }, callback, errorCabllback);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "saveFail",

+                        errorText: "save_fail"

+                    }));

+            }

+        }

+    }

+    function deleteAllMessages() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {

+                goformId: "ALL_DELETE_SMS",

+                notCallback: true,

+                which_cgi: values.location

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                addTimerSomething("sms_cmd_status_info", checkDeleteStatus);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+            }

+        }

+        function checkDeleteStatus(paramD) {

+            var status = paramD.sms_cmd_status_info;

+            if (status == "2") {

+                removeTimerSomething("sms_cmd_status_info", checkDeleteStatus);

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+            } else if (status == "3") {

+                removeTimerSomething("sms_cmd_status_info", checkDeleteStatus);

+                callback({

+                    result: true

+                });

+            }

+        }

+    }

+    function deleteMessage() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var msgIds = values.ids.join(";") + ";";

+            var obj = {

+                goformId: "DELETE_SMS",

+                msg_id: msgIds,

+                notCallback: true

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                getSmsStatusInfo({

+                    smsCmd: 6,

+                    errorType: "deleteFail",

+                    errorText: "delete_fail_try_again"

+                }, callback, errorCabllback);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+            }

+        }

+    }

+    function getSmsStatusInfo(obj, callback, errorCabllback) {

+        reqAsync({

+            cmd: "sms_cmd_status_info",

+            sms_cmd: obj.smsCmd,

+        }, function (paramD) {

+            if (paramD) {

+                var status = paramD.sms_cmd_status_result;

+                if (status == "2") {

+                    errorCabllback($.extend(errUnknownObj, {

+                            errorType: obj.errorType,

+                            errorText: obj.errorText

+                        }));

+                } else if (status == "3") {

+                    callback({

+                        result: "success"

+                    });

+                } else {

+                    window.setTimeout(function () {

+                        getSmsStatusInfo(obj, callback, errorCabllback);

+                    }, 1000);

+                }

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: obj.errorType,

+                        errorText: obj.errorText

+                    }));

+            }

+        }, function (paramD) {

+            errorCabllback($.extend(errUnknownObj, {

+                    errorType: obj.errorType,

+                    errorText: obj.errorText

+                }));

+        }, false);

+    }

+    function getSMSReady() {

+        if (config.smsIsReady) {

+            var callback = arguments[1];

+            if (callback) {

+                return callback({

+                    "sms_cmd": "1",

+                    "sms_cmd_status_result": "3"

+                });

+            } else {

+                return {

+                    "sms_cmd": "1",

+                    "sms_cmd_status_result": "3"

+                };

+            }

+        } else {

+            return stuffMake(arguments, {}, prepare, deal, null, false);

+        }

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "sms_cmd_status_info";

+            valueReq.sms_cmd = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.sms_cmd_status_result == "3") {

+                    config.smsIsReady = true;

+                }

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSmsRead() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var msgIds = values.ids.join(";");

+            if (values.ids.length > 0) {

+                msgIds += ";";

+            }

+            var obj = {

+                goformId: "SET_MSG_READ",

+                msg_id: msgIds,

+                tag: 0

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function getSMSDeliveryReport() {

+        return stuffMake(arguments, {}, prepare, deal, {}, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "sms_status_rpt_data",

+                page: values.page,

+                data_per_page: values.smsCount

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    messages: parseMessages(paramD.messages, true)

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function logout() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = $.extend({}, values);

+            obj.goformId = "LOGOUT";

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                informationAll.isLoggedIn = false;

+                return {

+                    result: true

+                };

+            } else {

+                return $.extend(errUnknownObj, {

+                    errorType: "loggedOutError"

+                });

+            }

+        }

+    }

+    function changeManageInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.newPassword = config.PASSWORD_ENCODE ? Base64.encode(values.newValue) : values.newValue;

+            obj.oldPassword = config.PASSWORD_ENCODE ? Base64.encode(values.oldValue) : values.oldValue;

+            obj.goformId = "CHANGE_PASSWORD";

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return $.extend(errUnknownObj, {

+                    errorType: "badPassword"

+                });

+            }

+        }

+    }

+    function getPinData() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "pinnumber,pin_status,puknumber";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function enablePin() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "ENABLE_PIN";

+            obj.OldPinNumber = values.oldPin;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function disablePin() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "DISABLE_PIN";

+            obj.OldPinNumber = values.oldPin;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function changePin() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "ENABLE_PIN";

+            obj.OldPinNumber = values.oldPin;

+            obj.NewPinNumber = values.newPin;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function getLanInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "lan_ipaddr,lan_netmask,mac_address,dhcpEnabled,dhcpStart,dhcpEnd,dhcpLease_hour";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.ipAddress = paramD.lan_ipaddr;

+                result.subnetMask = paramD.lan_netmask;

+                result.macAddress = paramD.mac_address;

+                result.dhcpServer = paramD.dhcpEnabled;

+                result.dhcpStart = paramD.dhcpStart;

+                result.dhcpEnd = paramD.dhcpEnd;

+                result.dhcpLease = parseInt(paramD.dhcpLease_hour, 10);

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setLanInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DHCP_SETTING";

+            valueReq.lanIp = values.ipAddress;

+            valueReq.lanNetmask = values.subnetMask;

+            valueReq.lanDhcpType = values.dhcpServer == "1" ? "SERVER" : "DISABLE";

+            if (valueReq.lanDhcpType == "SERVER") {

+                valueReq.dhcpStart = values.dhcpStart;

+                valueReq.dhcpEnd = values.dhcpEnd;

+                valueReq.dhcpLease = values.dhcpLease;

+            }

+            valueReq.dhcp_reboot_flag = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSmsSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "sms_parameter_info";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.centerNumber = paramD.sms_para_sca;

+                result.memStroe = paramD.sms_para_mem_store;

+                result.deliveryReport = paramD.sms_para_status_report;

+                switch (parseInt(paramD.sms_para_validity_period, 10)) {

+                case 143:

+                    result.validity = "twelve_hours";

+                    break;

+                case 167:

+                    result.validity = "one_day";

+                    break;

+                case 173:

+                    result.validity = "one_week";

+                    break;

+                case 244:

+                    result.validity = "largest";

+                    break;

+                case 255:

+                    result.validity = "largest";

+                    break;

+                default:

+                    result.validity = "twelve_hours";

+                    break;

+                }

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSmsSetting() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_MESSAGE_CENTER";

+            valueReq.save_time = values.validity;

+            valueReq.MessageCenter = values.centerNumber;

+            valueReq.status_save = values.deliveryReport;

+            valueReq.save_location = 'native';

+            valueReq.notCallback = true;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "smsSettingFail",

+                        errorText: "error_info"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                getSmsStatusInfo({

+                    smsCmd: 3,

+                    errorType: "smsSettingFail",

+                    errorText: "error_info"

+                }, callback, errorCabllback);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+            }

+        }

+    }

+    function restoreFactorySettings() {

+        var preErrorObj = {};

+        if (config.HAS_PARENTAL_CONTROL && config.currentUserInChildGroup != false) {

+            preErrorObj = {

+                errorType: 'no_auth'

+            };

+        }

+        return stuffMake(arguments, preErrorObj, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "RESTORE_FACTORY_SETTINGS";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function checkRestoreStatus(successCallback) {

+        var valueReq = {};

+        valueReq.cmd = "restore_flag";

+        valueReq.multi_data = 1;

+        reqAsync(valueReq, function (paramD) {

+            if (paramD && paramD.restore_flag === "1") {

+                successCallback();

+            } else {

+                setTimeout(function () {

+                    checkRestoreStatus(successCallback);

+                }, 5000);

+            }

+        }, function () {

+            setTimeout(function () {

+                checkRestoreStatus(successCallback);

+            }, 5000);

+        }, false);

+    }

+    function getWpsInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "wifi_wps_index,WscModeOption,AuthMode,wifi_cur_state,EncrypType,wps_mode,WPS_SSID,m_ssid_enable,SSID1,m_SSID,m_EncrypType,m_AuthMode,wifi_sta_connection";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.wpsFlag = paramD.WscModeOption;

+                result.authMode = paramD.AuthMode;

+                result.wpsType = paramD.wps_mode;

+                result.radioFlag = paramD.wifi_cur_state == "1" ? "1" : "0";

+                result.encrypType = paramD.EncrypType;

+                result.wpsSSID = paramD.WPS_SSID;

+                result.ssidEnable = paramD.m_ssid_enable;

+                result.ssid = paramD.SSID1;

+                result.multiSSID = paramD.m_SSID;

+                result.m_encrypType = paramD.m_EncrypType;

+                result.wifi_wps_index = paramD.wifi_wps_index;

+                result.AuthMode = paramD.AuthMode;

+                result.m_AuthMode = paramD.m_AuthMode;

+                result.ap_station_enable = paramD.wifi_sta_connection;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function openWps() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "WIFI_WPS_SET";

+            valueReq.WPS_SSID = values.wpsSSID;

+            valueReq.wps_mode = values.wpsType;

+            valueReq.wifi_wps_index = values.wpsIndex;

+            if (valueReq.wps_mode == 'PIN') {

+                valueReq.wps_pin = values.wpsPin;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function openWps_5g() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "WIFI_M_WPS_SET";

+            valueReq.m_WPS_SSID = values.wpsSSID;

+            valueReq.m_wps_mode = values.wpsType;

+            valueReq.m_wifi_wps_index = values.wpsIndex;

+            if (valueReq.m_wps_mode == 'PIN') {

+                valueReq.m_wps_pin = values.wpsPin;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSleepMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "Sleep_interval";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.sleepMode = paramD.Sleep_interval;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSleepMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_WIFI_SLEEP_INFO";

+            valueReq.sysIdleTimeToSleep = values.sleepMode;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSysSecurity() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "RemoteManagement,WANPingFilter";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.remoteFlag = paramD.RemoteManagement == "1" ? "1" : "0";

+                result.pingFlag = paramD.WANPingFilter == "1" ? "1" : "0";

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSysSecurity() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "FW_SYS";

+            valueReq.remoteManagementEnabled = values.remoteFlag;

+            valueReq.pingFrmWANFilterEnabled = values.pingFlag;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPortForward() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "PortForwardEnable,PortForwardRules_0,PortForwardRules_1,PortForwardRules_2,PortForwardRules_3,PortForwardRules_4,PortForwardRules_5,PortForwardRules_6,PortForwardRules_7,PortForwardRules_8,PortForwardRules_9";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.portForwardEnable = paramD.PortForwardEnable;

+                var rules = [];

+                if (paramD.PortForwardRules_0 != "") {

+                    rules.push([0, paramD.PortForwardRules_0]);

+                }

+                if (paramD.PortForwardRules_1 != "") {

+                    rules.push([1, paramD.PortForwardRules_1]);

+                }

+                if (paramD.PortForwardRules_2 != "") {

+                    rules.push([2, paramD.PortForwardRules_2]);

+                }

+                if (paramD.PortForwardRules_3 != "") {

+                    rules.push([3, paramD.PortForwardRules_3]);

+                }

+                if (paramD.PortForwardRules_4 != "") {

+                    rules.push([4, paramD.PortForwardRules_4]);

+                }

+                if (paramD.PortForwardRules_5 != "") {

+                    rules.push([5, paramD.PortForwardRules_5]);

+                }

+                if (paramD.PortForwardRules_6 != "") {

+                    rules.push([6, paramD.PortForwardRules_6]);

+                }

+                if (paramD.PortForwardRules_7 != "") {

+                    rules.push([7, paramD.PortForwardRules_7]);

+                }

+                if (paramD.PortForwardRules_8 != "") {

+                    rules.push([8, paramD.PortForwardRules_8]);

+                }

+                if (paramD.PortForwardRules_9 != "") {

+                    rules.push([9, paramD.PortForwardRules_9]);

+                }

+                result.portForwardRules = parsePortForwardRules(rules);

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function parsePortForwardRules(paramD) {

+            var rules = [];

+            if (paramD && paramD.length > 0) {

+                for (var i = 0; i < paramD.length; i++) {

+                    var aRule = {};

+                    var elements = paramD[i][1].split(",");

+                    aRule.index = paramD[i][0];

+                    aRule.ipAddress = elements[0];

+                    aRule.portRange = elements[1] + ' - ' + elements[2];

+                    aRule.protocol = transProtocol(elements[3]);

+                    aRule.comment = elements[4];

+                    rules.push(aRule);

+                }

+            }

+            return rules;

+        }

+    }

+    function setPortForward() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "FW_FORWARD_ADD";

+            valueReq.ipAddress = values.ipAddress;

+            valueReq.portStart = values.portStart;

+            valueReq.portEnd = values.portEnd;

+            valueReq.protocol = values.protocol;

+            valueReq.comment = values.comment;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteForwardRules() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "FW_FORWARD_DEL";

+            valueReq.delete_id = values.indexs.join(';') + ";";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function enableVirtualServer() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "VIRTUAL_SERVER";

+            valueReq.PortForwardEnable = values.portForwardEnable;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function wifiDecode(fact1,fact2,encode_aes) {//wifiDecode(paramD.rnum_js,paramD.imei,paramD.WPAPSK1_enaes,paramD.m_WPAPSK1_enaes);

+        var kstr = fact1 + fact2 + "FFFFFFFFFFFFFFFFFFFFFFFF";

+        var kstr_final;

+	var kiv_final;

+

+        kstr_final = kstr.substring(0, 24);

+	kiv_final = kstr.substring(0, 16);

+

+        var tkey = CryptoJS.enc.Latin1.parse(kstr_final);

+	var tiv = CryptoJS.enc.Latin1.parse(kiv_final);

+        var decdata = CryptoJS.AES.decrypt(encode_aes, tkey, {

+            iv: tiv,

+            mode: CryptoJS.mode.CBC,

+            padding: CryptoJS.pad.ZeroPadding

+        }).toString(CryptoJS.enc.Utf8);

+

+        return decdata;

+    }

+    function getQuickSettingInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            var wpask = config.PASSWORD_ENCODE ? ",WPAPSK1_encode" : ",imei,rnum_js,WPAPSK1_enaes";

+            valueReq.cmd = "pdp_type,ipv6_pdp_type,wifi_cur_state,SSID1,HideSSID,AuthMode,WscModeOption,ppp_status,apn_index,ipv6_apn_index,ipv6_APN_index,m_profile_name,apn_mode,EncrypType,DefaultKeyID,Key1Str1,Key2Str1,Key3Str1,Key4Str1" + wpask + ",APN_configtmp0,APN_configtmp1,APN_configtmp2,APN_configtmp3,APN_configtmp4,APN_configtmp5,APN_configtmp6,APN_configtmp7,APN_configtmp8,APN_configtmp9,APN_configtmp10,APN_configtmp11,APN_configtmp12,APN_configtmp13,APN_configtmp14,APN_configtmp15,APN_configtmp16,APN_configtmp17,APN_configtmp18,APN_configtmp19" + ",ipv6_APN_configtmp0,ipv6_APN_configtmp1,ipv6_APN_configtmp2,ipv6_APN_configtmp3,ipv6_APN_configtmp4,ipv6_APN_configtmp5,ipv6_APN_configtmp6,ipv6_APN_configtmp7,ipv6_APN_configtmp8,ipv6_APN_configtmp9,ipv6_APN_configtmp10,ipv6_APN_configtmp11,ipv6_APN_configtmp12,ipv6_APN_configtmp13,ipv6_APN_configtmp14,ipv6_APN_configtmp15,ipv6_APN_configtmp16,ipv6_APN_configtmp17,ipv6_APN_configtmp18,ipv6_APN_configtmp19";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (config.PASSWORD_ENCODE) {

+                    paramD.WPAPSK1 = Base64.decode(paramD.WPAPSK1_encode);

+                } else {

+		    paramD.WPAPSK1 = wifiDecode(paramD.rnum_js,paramD.imei,paramD.WPAPSK1_enaes);

+		}

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setQuickSetting4IPv6() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var valueReq = {

+                goformId: "QUICK_SETUP_EX",

+                index: values.apn_index,

+                pdp_type: values.pdp_type,

+                apn_mode: values.apnMode,

+                profile_name: values.profile_name,

+                wan_apn: values.wan_apn,

+                ppp_auth_mode: values.ppp_auth_mode,

+                ppp_username: values.ppp_username,

+                ppp_passtmp: values.ppp_passtmp,

+                ipv6_wan_apn: values.ipv6_wan_apn,

+                ipv6_ppp_auth_mode: values.ipv6_ppp_auth_mode,

+                ipv6_ppp_username: values.ipv6_ppp_username,

+                ipv6_ppp_passtmp: values.ipv6_ppp_passtmp,

+                SSID_name: values.SSID_name,

+                SSID_Broadcast: values.SSID_Broadcast,

+                Encryption_Mode_hid: values.Encryption_Mode_hid,

+                security_shared_mode: values.security_shared_mode,

+                WPA_PreShared_Key: config.PASSWORD_ENCODE ? Base64.encode(values.WPA_PreShared_Key) : values.WPA_PreShared_Key,

+                wep_default_key: values.wep_default_key,

+                WPA_ENCRYPTION_hid: values.WPA_ENCRYPTION_hid

+            }

+            valueReq.wep_key_1 = values.wep_key_1;

+            valueReq.wep_key_2 = values.wep_key_2;

+            valueReq.wep_key_3 = values.wep_key_3;

+            valueReq.wep_key_4 = values.wep_key_4;

+            if (values.wep_default_key == '1') {

+                valueReq.WEP2Select = values.WEP2Select;

+            } else if (values.wep_default_key == '2') {

+                valueReq.WEP3Select = values.WEP3Select;

+            } else if (values.wep_default_key == '3') {

+                valueReq.WEP4Select = values.WEP4Select;

+            } else {

+                valueReq.WEP1Select = values.WEP1Select;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return $.extend(errUnknownObj, {

+                    errorType: "SetSetUpError"

+                });

+            }

+        }

+    }

+    function stuffMakeAndCheckServerIsOnline(arg, prepare, deal) {

+        var isServerOnline = false;

+        var isCallbackExecuted = false;

+        var values = prepare(arg[0]);

+        var callback = arg[1];

+        var successCallback = function (paramD) {

+            isServerOnline = true;

+            if (!isCallbackExecuted && callback) {

+                callback(deal(paramD));

+            }

+            isCallbackExecuted = true;

+        };

+        var errorMethod = arg[2];

+        var errorCallback = function () {

+            isServerOnline = true;

+            if (errorMethod) {

+                errorMethod();

+            }

+        };

+        reqAsync(values, successCallback, errorCallback, true);

+        addTimeout(function () {

+            if (isServerOnline == false) {

+                var timer = addInterval(function () {

+                    if (isServerOnline == false) {

+                        getLanguage({}, function (paramD) {

+                            window.clearInterval(timer);

+                            successCallback({

+                                result: "success"

+                            });

+                        });

+                    }

+                }, 1000);

+            }

+        }, 5000);

+    }

+    function getSDConfiguration() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "sdcard_mode_option,sd_card_state,HTTP_SHARE_STATUS,HTTP_SHARE_WR_AUTH,HTTP_SHARE_FILE",

+                multi_data: 1

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var fileToShare;

+                if ("mmc2" == paramD.HTTP_SHARE_FILE || "/mmc2" == paramD.HTTP_SHARE_FILE || "/mmc2/" == paramD.HTTP_SHARE_FILE) {

+                    fileToShare = "1";

+                } else {

+                    fileToShare = "0";

+                }

+                var result = {

+                    sd_mode: paramD.sdcard_mode_option == "1" ? "0" : "1",

+                    sd_status: paramD.sd_card_state,

+                    share_status: paramD.HTTP_SHARE_STATUS == "Enabled" ? "1" : "0",

+                    share_auth: paramD.HTTP_SHARE_WR_AUTH == "readOnly" ? "0" : "1",

+                    file_to_share: fileToShare,

+                    share_file: paramD.HTTP_SHARE_FILE

+                };

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSdCardMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "HTTPSHARE_MODE_SET",

+                mode_set: values.mode == "0" ? "http_share_mode" : "usb_mode"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return {

+                    result: 'success'

+                };

+            } else if (paramD && paramD.result == 'processing') {

+                return {

+                    result: 'processing'

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function checkFileExists() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "GOFORM_HTTPSHARE_CHECK_FILE",

+                path_SD_CARD: values.path

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.result == "no_sdcard") {

+                    return {

+                        status: "no_sdcard"

+                    };

+                } else if (paramD.result == "noexist") {

+                    return {

+                        status: "noexist"

+                    };

+                } else if (paramD.result == "processing") {

+                    return {

+                        status: "processing"

+                    };

+                } else {

+                    return {

+                        status: "exist"

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getFileList() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "HTTPSHARE_ENTERFOLD",

+                path_SD_CARD: values.path,

+                indexPage: values.index

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.result == 'failure') {

+                    return $.extend(errUnknownObj, {

+                        errorType: "get_file_list_failure"

+                    });

+                } else if (paramD.result == "no_sdcard") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "no_sdcard"

+                    });

+                } else {

+                    return parseSdCardFile(paramD.result);

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function parseSdCardFile(result) {

+            var fileInfo = {};

+            fileInfo.totalRecord = result.totalRecord;

+            var fileArr = [];

+            var details = result.fileInfo;

+            for (var i = 0; details && i < details.length; i++) {

+                if (details[i].fileName == "") {

+                    continue;

+                }

+                var obj = {};

+                obj.fileName = details[i].fileName;

+                obj.attribute = details[i].attribute;

+                obj.size = details[i].size;

+                obj.lastUpdateTime = details[i].lastUpdateTime;

+                fileArr.push(obj);

+            }

+            fileInfo.details = fileArr;

+            return fileInfo;

+        }

+    }

+    function fileRename() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var d = new Date();

+            var currentTime = d.getTime();

+            var zoneOffsetSeconds = d.getTimezoneOffset() * 60;

+            return {

+                goformId: "HTTPSHARE_FILE_RENAME",

+                path_SD_CARD: values.path,

+                OLD_NAME_SD_CARD: values.oldPath,

+                NEW_NAME_SD_CARD: values.newPath,

+                path_SD_CARD_time: transUnixTime(currentTime),

+                path_SD_CARD_time_unix: Math.round((currentTime - zoneOffsetSeconds * 1000) / 1e3)

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.result == "success") {

+                    return {

+                        result: true

+                    };

+                } else if (paramD.result == "no_sdcard") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "no_sdcard"

+                    });

+                } else if (paramD.result == "noexist") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "no_exist"

+                    });

+                } else if (paramD.result == "processing") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "sd_file_processing_cant_rename"

+                    });

+                } else {

+                    return {

+                        result: false

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSdMemorySizes() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "HTTPSHARE_GETCARD_VALUE"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (!paramD || (paramD.result && paramD.result == "no_sdcard")) {

+                return $.extend(errUnknownObj, {

+                    errorType: "no_sdcard"

+                });

+            } else {

+                return {

+                    totalMemorySize: paramD.sd_card_total_size == "" ? 0 : paramD.sd_card_total_size * 32 * 1024,

+                    availableMemorySize: paramD.sd_card_avi_space == "" ? 0 : paramD.sd_card_avi_space * 32 * 1024

+                };

+            }

+        }

+    }

+    function deleteFilesAndFolders() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var currentTime = new Date().getTime();

+            var valueReq = {

+                goformId: "HTTPSHARE_DEL",

+                path_SD_CARD: values.path,

+                name_SD_CARD: values.names,

+                path_SD_CARD_time: transUnixTime(currentTime),

+                path_SD_CARD_time_unix: Math.round(currentTime / 1e3)

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result && paramD.result == "failure") {

+                return {

+                    status: "failure"

+                };

+            } else if (paramD.result && paramD.result == "no_sdcard") {

+                return {

+                    status: "no_sdcard"

+                };

+            } else if (paramD.result && paramD.result == "processing") {

+                return {

+                    status: "processing"

+                };

+            } else if (paramD.result && paramD.result == "success") {

+                return {

+                    status: "success"

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function createFolder() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var d = new Date();

+            var currentTime = d.getTime();

+            var zoneOffsetSeconds = d.getTimezoneOffset() * 60;

+            return {

+                goformId: "HTTPSHARE_NEW",

+                path_SD_CARD: values.path,

+                path_SD_CARD_time: transUnixTime(currentTime),

+                path_SD_CARD_time_unix: Math.round((currentTime - zoneOffsetSeconds * 1000) / 1e3)

+            };

+        }

+        function deal(paramD) {

+            if (paramD.result && paramD.result == "failure") {

+                return $.extend(errUnknownObj, {

+                    errorType: "create_folder_failure"

+                });

+            } else if (paramD.result && paramD.result == "no_sdcard") {

+                return $.extend(errUnknownObj, {

+                    errorType: "no_sdcard"

+                });

+            } else if (paramD.result && paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSdCardSharing() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "HTTPSHARE_AUTH_SET",

+                HTTP_SHARE_STATUS: values.share_status == "1" ? "Enabled" : "Disabled",

+                HTTP_SHARE_WR_AUTH: values.share_auth == "1" ? "readWrite" : "readOnly",

+                HTTP_SHARE_FILE: values.share_file

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.result == "no_sdcard") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "no_sdcard"

+                    });

+                } else {

+                    return {

+                        result: true

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPortFilter() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "IPPortFilterEnable,DefaultFirewallPolicy,IPPortFilterRules_0,IPPortFilterRules_1,IPPortFilterRules_2,IPPortFilterRules_3,IPPortFilterRules_4,IPPortFilterRules_5,IPPortFilterRules_6,IPPortFilterRules_7,IPPortFilterRules_8,IPPortFilterRules_9";

+            valueReq.cmd += ",IPPortFilterRulesv6_0,IPPortFilterRulesv6_1,IPPortFilterRulesv6_2,IPPortFilterRulesv6_3,IPPortFilterRulesv6_4,IPPortFilterRulesv6_5,IPPortFilterRulesv6_6,IPPortFilterRulesv6_7,IPPortFilterRulesv6_8,IPPortFilterRulesv6_9";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.portFilterEnable = paramD.IPPortFilterEnable;

+                result.defaultPolicy = paramD.DefaultFirewallPolicy;

+                var rules = [];

+                if (paramD.IPPortFilterRules_0 != "") {

+                    rules.push([0, paramD.IPPortFilterRules_0]);

+                }

+                if (paramD.IPPortFilterRules_1 != "") {

+                    rules.push([1, paramD.IPPortFilterRules_1]);

+                }

+                if (paramD.IPPortFilterRules_2 != "") {

+                    rules.push([2, paramD.IPPortFilterRules_2]);

+                }

+                if (paramD.IPPortFilterRules_3 != "") {

+                    rules.push([3, paramD.IPPortFilterRules_3]);

+                }

+                if (paramD.IPPortFilterRules_4 != "") {

+                    rules.push([4, paramD.IPPortFilterRules_4]);

+                }

+                if (paramD.IPPortFilterRules_5 != "") {

+                    rules.push([5, paramD.IPPortFilterRules_5]);

+                }

+                if (paramD.IPPortFilterRules_6 != "") {

+                    rules.push([6, paramD.IPPortFilterRules_6]);

+                }

+                if (paramD.IPPortFilterRules_7 != "") {

+                    rules.push([7, paramD.IPPortFilterRules_7]);

+                }

+                if (paramD.IPPortFilterRules_8 != "") {

+                    rules.push([8, paramD.IPPortFilterRules_8]);

+                }

+                if (paramD.IPPortFilterRules_9 != "") {

+                    rules.push([9, paramD.IPPortFilterRules_9]);

+                }

+                result.portFilterRules = parsePortFilterRules(rules, "IPv4");

+                var v6Rules = [];

+                if (paramD.IPPortFilterRulesv6_0 != "") {

+                    v6Rules.push([10, paramD.IPPortFilterRulesv6_0]);

+                }

+                if (paramD.IPPortFilterRulesv6_1 != "") {

+                    v6Rules.push([11, paramD.IPPortFilterRulesv6_1]);

+                }

+                if (paramD.IPPortFilterRulesv6_2 != "") {

+                    v6Rules.push([12, paramD.IPPortFilterRulesv6_2]);

+                }

+                if (paramD.IPPortFilterRulesv6_3 != "") {

+                    v6Rules.push([13, paramD.IPPortFilterRulesv6_3]);

+                }

+                if (paramD.IPPortFilterRulesv6_4 != "") {

+                    v6Rules.push([14, paramD.IPPortFilterRulesv6_4]);

+                }

+                if (paramD.IPPortFilterRulesv6_5 != "") {

+                    v6Rules.push([15, paramD.IPPortFilterRulesv6_5]);

+                }

+                if (paramD.IPPortFilterRulesv6_6 != "") {

+                    v6Rules.push([16, paramD.IPPortFilterRulesv6_6]);

+                }

+                if (paramD.IPPortFilterRulesv6_7 != "") {

+                    v6Rules.push([17, paramD.IPPortFilterRulesv6_7]);

+                }

+                if (paramD.IPPortFilterRulesv6_8 != "") {

+                    v6Rules.push([18, paramD.IPPortFilterRulesv6_8]);

+                }

+                if (paramD.IPPortFilterRulesv6_9 != "") {

+                    v6Rules.push([19, paramD.IPPortFilterRulesv6_9]);

+                }

+                result.portFilterRules = _.union(result.portFilterRules, parsePortFilterRules(v6Rules, "IPv6"));

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function parsePortFilterRules(paramD, ipTypeTmp) {

+            var rules = [];

+            if (paramD && paramD.length > 0) {

+                for (var i = 0; i < paramD.length; i++) {

+                    var aRule = {};

+                    var elements = paramD[i][1].split(",");

+                    aRule.index = paramD[i][0];

+                    aRule.macAddress = elements[11];

+                    aRule.destIpAddress = elements[4] == "any/0" ? "" : elements[4];

+                    aRule.sourceIpAddress = elements[0] == "any/0" ? "" : elements[0];

+                    aRule.destPortRange = elements[6] == '0' ? '' : elements[6] + " - " + elements[7];

+                    aRule.sourcePortRange = elements[2] == '0' ? '' : elements[2] + " - " + elements[3];

+                    aRule.action = elements[9] == 1 ? "filter_accept" : "filter_drop";

+                    aRule.protocol = transProtocol(elements[8]);

+                    aRule.comment = elements[10];

+                    aRule.ipType = ipTypeTmp;

+                    rules.push(aRule);

+                }

+            }

+            return rules;

+        }

+    }

+    function setPortFilterBasic() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "BASIC_SETTING";

+            valueReq.portFilterEnabled = values.portFilterEnable;

+            valueReq.defaultFirewallPolicy = values.defaultPolicy;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setPortFilter() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_IP_PORT_FILETER_V4V6";

+            valueReq.ip_version = values.ipType;

+            valueReq.mac_address = values.macAddress;

+            valueReq.dip_address = values.destIpAddress;

+            valueReq.sip_address = values.sourceIpAddress;

+            valueReq.dFromPort = values.destPortStart;

+            valueReq.dToPort = values.destPortEnd;

+            valueReq.sFromPort = values.sourcePortStart;

+            valueReq.sToPort = values.sourcePortEnd;

+            valueReq.action = values.action;

+            valueReq.protocol = values.protocol;

+            valueReq.comment = values.comment;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteFilterRules() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            var deleteIds = _.filter(values.indexs, function (item) {

+                return item.length == 1;

+            });

+            valueReq.goformId = "DEL_IP_PORT_FILETER_V4V6";

+            var deletev6Ids = [];

+            _.each(values.indexs, function (item) {

+                if (item.length == 2) {

+                    deletev6Ids.push(item.substring(1));

+                }

+            });

+            valueReq.delete_id_v6 = deletev6Ids.length > 0 ? deletev6Ids.join(';') + ";" : "";

+            valueReq.delete_id = deleteIds.length > 0 ? deleteIds.join(';') + ";" : "";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getWifiAdvance() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "WirelessMode,CountryCode,Channel,HT_MCS,wifi_band,wifi_11n_cap,MAX_Access_num,m_MAX_Access_num,MAX_Station_num,wifi_sta_connection";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {

+                    mode: paramD.WirelessMode,

+                    countryCode: paramD.CountryCode,

+                    channel: paramD.Channel,

+                    rate: paramD.HT_MCS,

+                    wifiBand: paramD.wifi_band == 'a' ? 'a' : 'b',

+                    bandwidth: paramD.wifi_11n_cap,

+                    MAX_Station_num: $.isNumeric(paramD.MAX_Station_num) ? paramD.MAX_Station_num : config.MAX_STATION_NUMBER,

+                    MAX_Access_num: paramD.MAX_Access_num,

+                    m_MAX_Access_num: paramD.m_MAX_Access_num,

+                    ap_station_enable: paramD.wifi_sta_connection

+                };

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setWifiAdvance() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var valueReq = {

+                goformId: "SET_WIFI_INFO",

+                wifiMode: values.mode,

+                countryCode: values.countryCode,

+                MAX_Access_num: values.station,

+                m_MAX_Access_num: values.m_station

+            };

+            if (config.WIFI_BAND_SUPPORT) {

+                valueReq.wifi_band = values.wifiBand;

+            }

+            if (config.WIFI_BAND_SUPPORT && values.wifiBand == 'a') {

+                valueReq.selectedChannel = 'auto';

+            } else {

+                valueReq.selectedChannel = values.channel;

+                valueReq.abg_rate = values.rate;

+            }

+            if (config.WIFI_BANDWIDTH_SUPPORT) {

+                valueReq.wifi_11n_cap = values.bandwidth;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getDeviceInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+	    var wpask = config.PASSWORD_ENCODE ? "WPAPSK1_encode,m_WPAPSK1_encode," : "rnum_js,WPAPSK1_enaes,m_WPAPSK1_enaes,";

+            var valueReq = {

+                cmd: "wifi_coverage,m_ssid_enable,imei,network_type,sub_network_type,rssi,rscp,lte_rsrp,imsi,sim_imsi,cr_version,hw_version,MAX_Access_num," + wpask + "SSID1,AuthMode,m_SSID,m_AuthMode,m_HideSSID,m_MAX_Access_num,lan_ipaddr," + "mac_address,msisdn,LocalDomain,wan_ipaddr,static_wan_ipaddr,ipv6_wan_ipaddr,ipv6_pdp_type,pdp_type,ppp_status,sta_ip_status,rj45_state,ethwan_mode",

+                multi_data: 1

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    ssid: paramD.SSID1,

+                    authMode: paramD.AuthMode,

+                    passPhrase: config.PASSWORD_ENCODE ? Base64.decode(paramD.WPAPSK1_encode) : wifiDecode(paramD.rnum_js,paramD.imei,paramD.WPAPSK1_enaes),

+                    m_ssid: paramD.m_SSID,

+                    m_AuthMode: paramD.m_AuthMode,

+                    m_passPhrase: config.PASSWORD_ENCODE ? Base64.decode(paramD.m_WPAPSK1_encode) : wifiDecode(paramD.rnum_js,paramD.imei,paramD.m_WPAPSK1_enaes),

+                    m_max_access_num: paramD.m_MAX_Access_num,

+                    multi_ssid_enable: paramD.m_ssid_enable,

+                    ipAddress: paramD.lan_ipaddr,

+                    wanIpAddress: paramD.wan_ipaddr,

+                    staticWanIpAddress: paramD.static_wan_ipaddr,

+                    ipv6WanIpAddress: paramD.ipv6_wan_ipaddr,

+                    ipv6PdpType: paramD.ipv6_pdp_type,

+                    macAddress: paramD.mac_address,

+                    simSerialNumber: paramD.msisdn,

+                    lanDomain: paramD.LocalDomain,

+                    imei: paramD.imei,

+                    signal: convertSignal(paramD),

+                    imsi: paramD.imsi || paramD.sim_imsi,

+                    sw_version: paramD.cr_version,

+                    hw_version: paramD.hw_version,

+                    max_access_num: paramD.MAX_Access_num,

+                    wifiRange: paramD.wifi_coverage,

+                    pdpType: paramD.pdp_type,

+                    rj45ConnectStatus: (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state,

+                    blc_wan_mode: informationAll.blc_wan_mode,

+                    connectStatus: paramD.ppp_status,

+                    wifiConStatus: paramD.sta_ip_status,

+                    ethwan_mode: paramD.ethwan_mode.toUpperCase()

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getDeviceInfoLow() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "imei,rnum_js",

+                multi_data: 1

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var kstr = paramD.rnum_js + paramD.imei + "FFFFFFFFFFFFFFFFFFFFFFFF";

+                var kstr_final;

+		var kiv_final;

+

+                kstr_final = kstr.substring(0, 24);

+		kiv_final = kstr.substring(0, 16);

+

+                return {

+                    skey: kstr_final,

+		    siv: kiv_final

+            	};

+            } else {

+

+	        return {

+                    skey: "FFFFFFFFFFFFFFFFFFFFFFFF",

+		    siv: "FFFFFFFFFFFFFFFF"

+            	};

+            }

+        }

+    }

+    function getWifiRange() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "wifi_coverage";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.wifiRangeMode = paramD.wifi_coverage;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setWifiRange() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_WIFI_COVERAGE";

+            valueReq.wifi_coverage = values.wifiRangeMode;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUpnpSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "upnpEnabled";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.upnpSetting = paramD.upnpEnabled == "1" ? "1" : "0";

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setUpnpSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "UPNP_SETTING";

+            valueReq.upnp_setting_option = values.upnpSetting;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getDmzSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "DMZEnable,DMZIPAddress";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.dmzSetting = paramD.DMZEnable == "1" ? "1" : "0";

+                result.ipAddress = paramD.DMZIPAddress;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setDmzSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DMZ_SETTING";

+            valueReq.DMZEnabled = values.dmzSetting;

+            if (valueReq.DMZEnabled == '1') {

+                valueReq.DMZIPAddress = values.ipAddress;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPortMap() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "PortMapEnable,PortMapRules_0,PortMapRules_1,PortMapRules_2,PortMapRules_3,PortMapRules_4,PortMapRules_5,PortMapRules_6,PortMapRules_7,PortMapRules_8,PortMapRules_9",

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.portMapEnable = paramD.PortMapEnable;

+                var rules = [];

+                if (paramD.PortMapRules_0 != "") {

+                    rules.push([0, paramD.PortMapRules_0]);

+                }

+                if (paramD.PortMapRules_1 != "") {

+                    rules.push([1, paramD.PortMapRules_1]);

+                }

+                if (paramD.PortMapRules_2 != "") {

+                    rules.push([2, paramD.PortMapRules_2]);

+                }

+                if (paramD.PortMapRules_3 != "") {

+                    rules.push([3, paramD.PortMapRules_3]);

+                }

+                if (paramD.PortMapRules_4 != "") {

+                    rules.push([4, paramD.PortMapRules_4]);

+                }

+                if (paramD.PortMapRules_5 != "") {

+                    rules.push([5, paramD.PortMapRules_5]);

+                }

+                if (paramD.PortMapRules_6 != "") {

+                    rules.push([6, paramD.PortMapRules_6]);

+                }

+                if (paramD.PortMapRules_7 != "") {

+                    rules.push([7, paramD.PortMapRules_7]);

+                }

+                if (paramD.PortMapRules_8 != "") {

+                    rules.push([8, paramD.PortMapRules_8]);

+                }

+                if (paramD.PortMapRules_9 != "") {

+                    rules.push([9, paramD.PortMapRules_9]);

+                }

+                result.portMapRules = parsePortMapRules(rules);

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function parsePortMapRules(paramD) {

+            var rules = [];

+            if (paramD && paramD.length > 0) {

+                for (var i = 0; i < paramD.length; i++) {

+                    var aRule = {};

+                    var elements = paramD[i][1].split(",");

+                    aRule.index = paramD[i][0];

+                    aRule.sourcePort = elements[1];

+                    aRule.destIpAddress = elements[0];

+                    aRule.destPort = elements[2];

+                    aRule.protocol = transProtocol(elements[3]);

+                    aRule.comment = elements[4];

+                    rules.push(aRule);

+                }

+            }

+            return rules;

+        }

+    }

+    function setPortMap() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_PORT_MAP";

+            valueReq.portMapEnabled = values.portMapEnable;

+            valueReq.fromPort = values.sourcePort;

+            valueReq.ip_address = values.destIpAddress;

+            valueReq.toPort = values.destPort;

+            valueReq.protocol = values.protocol;

+            valueReq.comment = values.comment;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function enablePortMap() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_PORT_MAP";

+            valueReq.portMapEnabled = values.portMapEnable;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteMapRules() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DEL_PORT_MAP";

+            valueReq.delete_id = values.indexs.join(';') + ";";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getTrafficAlertInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "data_volume_limit_switch,data_volume_limit_unit,data_volume_limit_size,data_volume_alert_percent,monthly_tx_bytes,monthly_rx_bytes,monthly_time,traffic_alined_delta",

+                multi_data: 1

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var isData = paramD.data_volume_limit_unit == 'data';

+                var result = {

+                    dataLimitChecked: paramD.data_volume_limit_switch,

+                    dataLimitTypeChecked: isData ? '1' : '0',

+                    limitDataMonth: isData ? paramD.data_volume_limit_size : '0',

+                    alertDataReach: isData ? paramD.data_volume_alert_percent : '0',

+                    limitTimeMonth: isData ? '0' : paramD.data_volume_limit_size,

+                    alertTimeReach: isData ? '0' : paramD.data_volume_alert_percent,

+                    monthlySent: paramD.monthly_tx_bytes == '' ? 0 : paramD.monthly_tx_bytes,

+                    monthlyReceived: paramD.monthly_rx_bytes == '' ? 0 : paramD.monthly_rx_bytes,

+                    monthlyConnectedTime: paramD.monthly_time == '' ? 0 : paramD.monthly_time,

+                    traffic_alined_delta: paramD.traffic_alined_delta == '' ? 0 : paramD.traffic_alined_delta

+                };

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setTrafficAlertInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var isData = values.dataLimitTypeChecked == '1';

+            var valueReq = {

+                goformId: "DATA_LIMIT_SETTING",

+                data_volume_limit_switch: values.dataLimitChecked

+            };

+            if (values.dataLimitChecked == '1') {

+                valueReq.data_volume_limit_unit = isData ? 'data' : 'time';

+                valueReq.data_volume_limit_size = isData ? values.limitDataMonth : values.limitTimeMonth;

+                valueReq.data_volume_alert_percent = isData ? values.alertDataReach : values.alertTimeReach;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUSSDResponse() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            if (values.sendOrReply == "send") {

+                return {

+                    goformId: "USSD_PROCESS",

+                    USSD_operator: values.operator,

+                    USSD_send_number: values.strUSSDCommand,

+                    notCallback: true

+                };

+            } else if (values.sendOrReply == "reply") {

+                return {

+                    goformId: "USSD_PROCESS",

+                    USSD_operator: values.operator,

+                    USSD_reply_number: values.strUSSDCommand,

+                    notCallback: true

+                };

+            }

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                callback(false, "ussd_fail");

+                return;

+            }

+            if (paramD.result == "success") {

+                callbackTemp = callback;

+                getResponse();

+            } else {

+                callback(false, "ussd_fail");

+            }

+        }

+    }

+    function getResponse() {

+        $.ajax({

+            url: "/reqproc/proc_get",

+            data: {

+                cmd: "ussd_write_flag"

+            },

+            cache: false,

+            async: true,

+            dataType: "json",

+            success: function (result) {

+                if (result.ussd_write_flag == "1") {

+                    callbackTemp(false, "ussd_no_service");

+                } else if (result.ussd_write_flag == "4" || result.ussd_write_flag == "unknown" || result.ussd_write_flag == "3") {

+                    callbackTemp(false, "ussd_timeout");

+                } else if (result.ussd_write_flag == "15") {

+                    setTimeout(getResponse, 1000);

+                } else if (result.ussd_write_flag == "10") {

+                    callbackTemp(false, "ussd_retry");

+                } else if (result.ussd_write_flag == "99") {

+                    callbackTemp(false, "ussd_unsupport");

+                } else if (result.ussd_write_flag == "41") {

+                    callbackTemp(false, "operation_not_supported");

+                } else if (result.ussd_write_flag == "2") {

+                    callbackTemp(false, "network_terminated");

+                } else if (result.ussd_write_flag == "16") {

+                    $.ajax({

+                        url: "/reqproc/proc_get",

+                        data: {

+                            cmd: "ussd_data_info"

+                        },

+                        dataType: "json",

+                        async: true,

+                        cache: false,

+                        success: function (paramD) {

+                            var content = {};

+                            content.data = paramD.ussd_data;

+                            content.ussd_action = paramD.ussd_action;

+                            content.ussd_dcs = paramD.ussd_dcs;

+                            callbackTemp(true, content);

+                        },

+                        error: function () {

+                            callbackTemp(false, "ussd_info_error");

+                        }

+                    });

+                } else {

+                    callbackTemp(false, "ussd_fail");

+                }

+            },

+            error: function () {

+                callbackTemp(false, "ussd_fail");

+            }

+        });

+    }

+    function USSDReplyCancel(callback) {

+        $.ajax({

+            url: "/reqproc/proc_post",

+            data: {

+                goformId: "USSD_PROCESS",

+                USSD_operator: "ussd_cancel"

+            },

+            cache: false,

+            dataType: "json",

+            success: function (paramD) {

+                if (paramD.result == "success") {

+                    getCancelResponse();

+                } else {

+                    callback(false);

+                }

+            }

+        });

+        function getCancelResponse() {

+            $.ajax({

+                url: "/reqproc/proc_get",

+                data: {

+                    cmd: "ussd_write_flag"

+                },

+                cache: false,

+                async: true,

+                dataType: "json",

+                success: function (result) {

+                    if (result.ussd_write_flag == "15") {

+                        setTimeout(getCancelResponse, 1000);

+                    } else if (result.ussd_write_flag == "13") {

+                        callback(true);

+                    } else {

+                        callback(false);

+                    }

+                },

+                error: function () {

+                    callback(false);

+                }

+            });

+        }

+    }

+    function unlockNetwork() {

+        var callback = arguments[1];

+        var checkPoint = 0;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "UNLOCK_NETWORK",

+                notCallback: true,

+                unlock_network_code: values.unlock_network_code

+            };

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addCallback(checkUnlockNetworkStatus);

+            } else {

+                callback({

+                    result: 'fail'

+                });

+            }

+        }

+        function checkUnlockNetworkStatus() {

+            if (checkPoint > 5) {

+                removeCallback(checkUnlockNetworkStatus);

+                callback({

+                    result: 'fail'

+                });

+            } else if (informationAll.simStatus != 'modem_imsi_waitnck') {

+                removeCallback(checkUnlockNetworkStatus);

+                callback({

+                    result: 'success'

+                });

+            }

+            checkPoint++;

+        }

+    }

+    function getNetworkUnlockTimes() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "unlock_nck_time"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setUpdateInfoWarning() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "SET_UPGRADE_NOTICE",

+                upgrade_notice_flag: values.upgrade_notice_flag,

+                notCallback: true

+            };

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                callback(true);

+            } else {

+                callback(false);

+            }

+        }

+    }

+    function getUpdateInfoWarning() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "upgrade_notice_flag"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getAPStationBasic() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "wifi_sta_connection,pswan_priority,wifiwan_priority,ethwan_priority"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    ap_station_enable: paramD.wifi_sta_connection,

+                    ap_station_mode: parseInt(paramD.wifiwan_priority, 10) > parseInt(paramD.pswan_priority, 10) ? "wifi_pref" : "dial_pref"

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setAPStationBasic() {

+        var tmp = arguments[0];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "WIFI_STA_CONTROL",

+                wifi_sta_connection: values.ap_station_enable

+            };

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                informationAll.ap_station_enable = tmp.ap_station_enable == 1;

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function refreshAPStationStatus() {

+        return getAPStationBasic({}, function (paramD) {

+            informationAll.ap_station_enable = paramD.ap_station_enable == 1;

+            informationAll.ap_station_mode = paramD.ap_station_mode;

+        });

+    }

+    function getHotspotList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var cmdStr = "wifi_profile_num,wifi_profile";

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                cmdStr = cmdStr + ",wifi_profile" + i;

+            }

+            return {

+                multi_data: 1,

+                cmd: cmdStr

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var wifiList = [];

+                for (var i = 0; i < config.AP_STATION_LIST_LENGTH; i++) {

+                    var wifiStr = "";

+                    if (i == 0) {

+                        wifiStr = paramD.wifi_profile;

+                    } else {

+                        wifiStr = paramD["wifi_profile" + i];

+                    }

+                    var wifiArray = wifiStr.split(";");

+                    for (var j = 0; j < wifiArray.length; j++) {

+                        var item = wifiArray[j].split(",");

+                        if (!item[0]) {

+                            break;

+                        }

+                        var wifiJson = {

+                            profileName: item[0],

+                            fromProvider: item[1],

+                            connectStatus: item[2],

+                            signal: item[3],

+                            ssid: item[4],

+                            authMode: item[5],

+                            encryptType: item[6],

+                            password: item[7] == "0" ? "" : item[7],

+                            keyID: item[8],

+                            mac: item[9]

+                        };

+                        wifiList.push(wifiJson);

+                    }

+                }

+                return {

+                    hotspotList: wifiList

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function searchHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "WLAN_SET_STA_REFRESH"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSearchHotspotList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "scan_finish,EX_APLIST,EX_APLIST1"

+            }

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.scan_finish == "0") {

+                    return {

+                        scan_finish: "0",

+                        hotspotList: []

+                    };

+                }

+                if (paramD.scan_finish == "2") {

+                    return {

+                        scan_finish: "2",

+                        hotspotList: []

+                    };

+                }

+                var wifiList = [];

+                for (var i = 0; i <= 1; i++) {

+                    var wifiStr;

+                    if (i == 0) {

+                        wifiStr = paramD.EX_APLIST;

+                    } else {

+                        wifiStr = paramD.EX_APLIST1;

+                    }

+                    var wifiArray = wifiStr.split(";");

+                    for (var j = 0; j < wifiArray.length; j++) {

+                        var item = wifiArray[j].split(",");

+                        if (!item[0]) {

+                            break;

+                        }

+                        var wifiJson = {

+                            fromProvider: item[0],

+                            connectStatus: item[1],

+                            ssid: item[2],

+                            signal: item[3],

+                            channel: item[4],

+                            authMode: item[5],

+                            encryptType: item[6],

+                            mac: item[7]

+                        }

+                        wifiList.push(wifiJson);

+                    }

+                }

+                return {

+                    scan_finish: "1",

+                    hotspotList: wifiList

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function creatHotspotString(hotspot) {

+        var tmp = [];

+        tmp.push(hotspot.profileName);

+        tmp.push(hotspot.fromProvider || "0");

+        tmp.push(hotspot.connectStatus || "0");

+        tmp.push(hotspot.signal);

+        tmp.push(hotspot.ssid);

+        tmp.push(hotspot.authMode);

+        tmp.push(hotspot.encryptType);

+        tmp.push(hotspot.password || "0");

+        tmp.push(hotspot.keyID);

+        tmp.push(hotspot.mac);

+        return tmp.join(",");

+    }

+    function saveHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var apList = values.apList;

+            var action = "modify";

+            if (values.profileName == "") {

+                action = "add";

+                var newName = (jQuery.fn.jquery + Math.random()).replace(/\D/g, "");

+                values.profileName = newName;

+                apList.push({

+                    profileName: newName,

+                    fromProvider: "0",

+                    connectStatus: "0",

+                    signal: values.signal,

+                    ssid: values.ssid,

+                    authMode: values.authMode,

+                    encryptType: values.encryptType,

+                    password: values.password || "0",

+                    keyID: values.keyID,

+                    mac: values.mac

+                });

+            }

+            var wifi = {

+                "profile0": []

+            };

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                wifi["profile" + i] = [];

+            }

+            var activeHotspotStr = "";

+            for (var i = 0; i < apList.length; i++) {

+                var hotspotStr = "";

+                if (values.profileName == apList[i].profileName) {

+                    hotspotStr = creatHotspotString(values);

+                    activeHotspotStr = hotspotStr;

+                } else {

+                    hotspotStr = creatHotspotString(apList[i]);

+                }

+                var index = parseInt(i % 10);

+                wifi["profile" + index].push(hotspotStr);

+            }

+            var profileParams = {

+                wifi_profile: wifi.profile0.join(";")

+            };

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                profileParams["wifi_profile" + i] = wifi["profile" + i].join(";");

+            }

+            var valueReq = $.extend({

+                goformId: "WIFI_SPOT_PROFILE_UPDATE",

+                wifi_profile_num: apList.length,

+                wifi_update_profile: activeHotspotStr,

+                action: action

+            }, profileParams);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var apList = values.apList;

+            var wifi = {

+                "profile0": []

+            };

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                wifi["profile" + i] = [];

+            }

+            var foundDelete = false;

+            var activeHotspotStr = "";

+            for (var i = 0; i < apList.length; i++) {

+                var hotspotStr = creatHotspotString(apList[i]);

+                if (apList[i].profileName == values.profileName) {

+                    foundDelete = true;

+                    activeHotspotStr = hotspotStr;

+                    continue;

+                }

+                var idIndex = i;

+                if (foundDelete) {

+                    idIndex = i - 1;

+                }

+                var index = parseInt(idIndex % 10);

+                wifi["profile" + index].push(hotspotStr);

+            }

+            var num = foundDelete ? apList.length - 1 : apList.length;

+            var profileParams = {

+                wifi_profile: wifi.profile0.join(";")

+            };

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                profileParams["wifi_profile" + i] = wifi["profile" + i].join(";");

+            }

+            var valueReq = $.extend({

+                goformId: "WIFI_SPOT_PROFILE_UPDATE",

+                wifi_profile_num: num,

+                wifi_update_profile: activeHotspotStr,

+                action: "delete"

+            }, profileParams);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function connectHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "WLAN_SET_STA_CON",

+                EX_SSID1: values.EX_SSID1,

+                EX_AuthMode: values.EX_AuthMode,

+                EX_EncrypType: values.EX_EncrypType,

+                EX_DefaultKeyID: values.EX_DefaultKeyID,

+                EX_WEPKEY: values.EX_WEPKEY,

+                EX_WPAPSK1: values.EX_WPAPSK1,

+                EX_wifi_profile: values.EX_wifi_profile,

+                EX_mac: values.EX_mac

+            };

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.result == "success" || paramD.result == "processing")) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function disconnectHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "WLAN_SET_STA_DISCON"

+            };

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getOpMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "blc_wan_mode,blc_wan_auto_mode,loginfo,ppp_status,rj45_state,ethwan_mode"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                if (paramD.blc_wan_mode == 'AUTO') {

+                    result.blc_wan_mode = paramD.blc_wan_auto_mode ? paramD.blc_wan_auto_mode : 'AUTO_PPP';

+                } else {

+                    result.blc_wan_mode = paramD.blc_wan_mode ? paramD.blc_wan_mode : 'PPP';

+                }

+                result.loginfo = paramD.loginfo;

+                result.ppp_status = paramD.ppp_status;

+                result.rj45_state = (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state;

+                result.ethwan_mode = paramD.ethwan_mode.toUpperCase();

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getRj45PlugState() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "rj45_plug"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.rj45_plug = paramD.rj45_plug == "" ? "wan_lan_off" : paramD.rj45_plug;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function checkOpMode(opmode, rj45state) {

+        if (config.RJ45_SUPPORT) {

+            if (rj45state == "dead" || rj45state == "") {

+                return 'PPP';

+            } else if (!opmode || opmode == "undefined") {

+                if (rj45state == "working") {

+                    return 'PPPOE';

+                } else {

+                    return 'PPP';

+                }

+            } else {

+                return opmode;

+            }

+        } else {

+            return 'PPP';

+        }

+    }

+    function SetOperationMode(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({

+                goformId: "OPERATION_MODE"

+            }, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPppoeParams() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "opms_wan_auto_mode,ethwan_mode,pppoe_username,pppoe_cc,ethwan_dialmode,ppp_status,static_wan_ipaddr,static_wan_netmask,static_wan_gateway,static_wan_primary_dns,static_wan_secondary_dns,rj45_state,lan_ipaddr,lan_netmask"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    opms_wan_auto_mode: paramD.opms_wan_auto_mode,

+                    ethwan_mode: paramD.ethwan_mode.toUpperCase(),

+                    pppoe_username: paramD.pppoe_username,

+                    pppoe_cc: paramD.pppoe_cc,

+                    ethwan_dialmode: paramD.ethwan_dialmode == "manual" ? "manual_dial" : "auto_dial",

+                    ppp_status: paramD.ppp_status,

+                    static_wan_ipaddr: paramD.static_wan_ipaddr,

+                    static_wan_netmask: paramD.static_wan_netmask,

+                    static_wan_gateway: paramD.static_wan_gateway,

+                    static_wan_primary_dns: paramD.static_wan_primary_dns,

+                    static_wan_secondary_dns: paramD.static_wan_secondary_dns,

+                    rj45_state: (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state,

+                    lan_ipaddr: paramD.lan_ipaddr,

+                    lan_netmask: paramD.lan_netmask

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setPppoeDialMode(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({

+                notCallback: true

+            }, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                callback({

+                    result: true

+                });

+            } else {

+                callback({

+                    result: false

+                });

+            }

+        }

+    }

+    function getSntpParams(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "sntp_year,sntp_month,sntp_day,sntp_hour,sntp_minute,sntp_second,sntp_time_set_mode,sntp_static_server0,sntp_static_server1,sntp_static_server2,sntp_server0,sntp_server1,sntp_server2,sntp_server3,sntp_server4,sntp_server5,sntp_server6,sntp_server7,sntp_server8,sntp_server9,sntp_other_server0,sntp_other_server1,sntp_other_server2,sntp_timezone,sntp_timezone_index,sntp_dst_enable,ppp_status,sntp_process_result,rj45_state"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var sntp_servers = getSntpServers(paramD);

+                return {

+                    sntp_year: paramD.sntp_year,

+                    sntp_month: paramD.sntp_month,

+                    sntp_day: paramD.sntp_day,

+                    sntp_hour: paramD.sntp_hour,

+                    sntp_minute: paramD.sntp_minute,

+                    sntp_second: paramD.sntp_second,

+                    sntp_time_set_mode: paramD.sntp_time_set_mode,

+                    sntp_servers: sntp_servers,

+                    sntp_server0: paramD.sntp_server0,

+                    sntp_server1: paramD.sntp_server1,

+                    sntp_server2: paramD.sntp_server2,

+                    sntp_static_server0: paramD.sntp_static_server0,

+                    sntp_static_server1: paramD.sntp_static_server1,

+                    sntp_static_server2: paramD.sntp_static_server2,

+                    sntp_other_server0: paramD.sntp_other_server0,

+                    sntp_other_server1: paramD.sntp_other_server1,

+                    sntp_other_server2: paramD.sntp_other_server2,

+                    sntp_timezone: paramD.sntp_timezone,

+                    sntp_timezone_index: paramD.sntp_timezone_index ? paramD.sntp_timezone_index : "0",

+                    sntp_dst_enable: paramD.sntp_dst_enable,

+                    ppp_status: paramD.ppp_status,

+                    blc_wan_mode: informationAll.blc_wan_mode,

+                    sntp_process_result: paramD.sntp_process_result,

+                    rj45_state: (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function getSntpServers(paramD) {

+            var serverArray = [];

+            for (var i = 0; i < 3; i++) {

+                var tmp = "sntp_static_server" + (i).toString();

+                if (paramD[tmp] != "") {

+                    var obj = {};

+                    obj.name = paramD[tmp];

+                    obj.value = paramD[tmp];

+                    serverArray.push(obj);

+                }

+            }

+            var otherArray = [{

+                    name: "Other",

+                    value: "Other"

+                }, {

+                    name: "NONE",

+                    value: ""

+                }

+            ];

+            for (var j = 0; j < 2; j++) {

+                serverArray.push(otherArray[j]);

+            }

+            return serverArray;

+        }

+    }

+    function setSNTPDate(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSntpSetting(values, callback) {

+        var valueReq = $.extend({}, values); {

+            $.post("reqproc/proc_post", valueReq, function (paramD) {

+                if (paramD && paramD.result == "success") {

+                    if (values.manualsettime == "auto") {

+                        setTimeout(checkSyncStatus, 2000);

+                        callback(paramD);

+                    } else {

+                        callback(true);

+                    }

+                } else if (paramD && paramD.result == "processing") {

+                    callback(paramD);

+                } else {

+                    callback(false);

+                }

+            }, "json");

+        }

+        function checkSyncStatus() {

+            $.ajax({

+                url: "reqproc/proc_get",

+                dataType: "json",

+                data: {

+                    cmd: "sntp_process_result"

+                },

+                cache: false,

+                async: false,

+                success: function (paramD) {

+                    if (paramD.sntp_process_result == "failure") {

+                        callback(false);

+                    } else if (paramD.sntp_process_result == "success") {

+                        callback(true);

+                    } else {

+                        setTimeout(checkSyncStatus, 2000);

+                    }

+                },

+                error: function () {

+                    callback(false);

+                }

+            });

+        }

+    }

+    function addUrlFilterRule(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUrlFilterList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "websURLFilters"

+            };

+        }

+        function deal(paramD) {

+            var urlFilterRules = [];

+            if (paramD) {

+                if (paramD.websURLFilters.length == 0) {

+                    return {

+                        urlFilterRules: []

+                    };

+                } else {

+                    var tempArray = paramD.websURLFilters.split(";");

+                    for (var i = 0; i < tempArray.length; i++) {

+                        var aRule = {};

+                        aRule.index = i;

+                        aRule.url = tempArray[i];

+                        urlFilterRules.push(aRule);

+                    }

+                    return {

+                        urlFilterRules: urlFilterRules

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteSelectedRules(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getWdsInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: "1",

+                cmd: "wifi_wds_mode,wifi_wds_ssid,wifi_wds_AuthMode,wifi_wds_EncrypType,wifi_wds_WPAPSK1,wifi_cur_state "

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    currentMode: paramD.wifi_wds_mode,

+                    wdsSSID: paramD.wifi_wds_ssid,

+                    wdsAuthMode: paramD.wifi_wds_AuthMode,

+                    wdsEncrypType: paramD.wifi_wds_EncrypType,

+                    wdsWPAPSK1: paramD.wifi_wds_WPAPSK1,

+                    RadioOff: paramD.wifi_cur_state == "1" ? "1" : "0"

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setWDS(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSyslogInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: "1",

+                cmd: "syslog_mode,debug_level"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    currentMode: paramD.syslog_mode,

+                    debugLevel: paramD.debug_level

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSysLog(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getMacFilterInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: "1",

+                cmd: "ACL_mode,wifi_mac_black_list,wifi_hostname_black_list,wifi_cur_state,user_ip_addr,client_mac_address,wifi_mac_white_list"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    ACL_mode: paramD.ACL_mode,

+                    wifi_mac_black_list: paramD.wifi_mac_black_list,

+                    wifi_hostname_black_list: paramD.wifi_hostname_black_list,

+                    RadioOff: paramD.wifi_cur_state == "1" ? "1" : "0",

+                    user_ip_addr: paramD.user_ip_addr,

+                    client_mac_address: paramD.client_mac_address,

+                    wifi_mac_white_list: paramD.wifi_mac_white_list

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setMacFilter() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({

+                goformId: 'WIFI_MAC_FILTER',

+            }, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getFastbootSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values) {

+            return {

+                cmd: "mgmt_quicken_power_on,need_hard_reboot,need_sim_pin",

+                multi_data: 1

+            };

+        }

+        function deal(paramD) {

+            return {

+                fastbootEnabled: paramD.mgmt_quicken_power_on == '1' ? '1' : '0',

+                need_hard_reboot: paramD.need_hard_reboot,

+                need_sim_pin: paramD.need_sim_pin == 'yes' ? 'yes' : 'no'

+            };

+        }

+    }

+    function setFastbootSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "MGMT_CONTROL_POWER_ON_SPEED",

+                mgmt_quicken_power_on: values.fastbootEnabled

+            };

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function turnOffDevice() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "TURN_OFF_DEVICE";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function restart() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "REBOOT_DEVICE";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getScheduleSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "schedule_restart_enable,schedule_restart_hour,schedule_restart_minute";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.scheduleSetting = paramD.schedule_restart_enable == "1" ? "1" : "0";

+                result.scheduleHour = paramD.schedule_restart_hour;

+                result.scheduleMinute = paramD.schedule_restart_minute;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setScheduleSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SCHEDULE_SETTING";

+            valueReq.scheduleEnabled = values.scheduleSetting;

+            if (valueReq.scheduleEnabled == '1') {

+                valueReq.scheduleHour = values.scheduleHour;

+                valueReq.scheduleMinute = values.scheduleMinute;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getCwmpSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "cwmp_enable,acs_url,acs_username,acs_password,periodic_enable,periodic_interval,cpe_username,cpe_password";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.cwmpSetting = paramD.cwmp_enable == "1" ? "1" : "0";

+                result.acsUrl = paramD.acs_url;

+                result.acsUsername = paramD.acs_username;

+                result.acsPassword = paramD.acs_password;

+                result.periodicEnabled = paramD.periodic_enable == "1" ? "1" : "0";

+                result.periodicInterval = paramD.periodic_interval;

+                result.cpeUsername = paramD.cpe_username;

+                result.cpePassword = paramD.cpe_password;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setCwmpSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "CWMP_SETTING";

+            valueReq.cwmpEnabled = values.cwmpSetting;

+            if (valueReq.cwmpEnabled == '1') {

+                valueReq.acsUrl = values.acsUrl;

+                valueReq.acsUsername = values.acsUsername;

+                valueReq.acsPassword = values.acsPassword;

+                valueReq.periodicEnabled = values.periodicEnabled;

+                if (valueReq.periodicEnabled == '1') {

+                    valueReq.periodicInterval = values.periodicInterval;

+                }

+                valueReq.cpeUsername = values.cpeUsername;

+                valueReq.cpePassword = values.cpePassword;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getNewVersionState() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_new_version_state,fota_current_upgrade_state,fota_package_already_download";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var hasNewVersion = (paramD.fota_new_version_state == 'has_critical' || paramD.fota_new_version_state == 'has_optional' || paramD.fota_new_version_state == 'already_has_pkg');

+                paramD.hasNewVersion = hasNewVersion;

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getMandatory() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            if (config.UPGRADE_TYPE == "OTA") {

+                valueReq.cmd = "is_mandatory";

+            } else {

+                valueReq.cmd = "fota_new_version_state";

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (config.UPGRADE_TYPE == "OTA") {

+                    return {

+                        "is_mandatory": paramD.is_mandatory == "1"

+                    };

+                } else {

+                    return {

+                        "is_mandatory": paramD.fota_new_version_state == "has_critical"

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUpgradeResult() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "upgrade_result";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getCurrentUpgradeState() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_current_upgrade_state";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                paramD.current_upgrade_state = paramD.fota_current_upgrade_state;

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPackSizeInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_pkg_total_size,fota_dl_pkg_size";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setUpgradeSelectOp() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "IF_UPGRADE";

+            valueReq.select_op = values.selectOp;

+            if (valueReq.select_op == 'check') {

+                valueReq.ota_manual_check_roam_state = 1;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_updateMode,fota_updateIntervalDay,fota_allowRoamingUpdate";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    updateMode: paramD.fota_updateMode,

+                    updateIntervalDay: paramD.fota_updateIntervalDay,

+                    allowRoamingUpdate: paramD.fota_allowRoamingUpdate

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SetUpgAutoSetting";

+            valueReq.UpgMode = values.updateMode;

+            valueReq.UpgIntervalDay = values.updateIntervalDay;

+            valueReq.UpgRoamPermission = values.allowRoamingUpdate;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getManualOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_manualUpgradeURL";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    updateURL: paramD.fota_manualUpgradeURL

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setManualOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SetUpgManualSetting";

+            valueReq.UpgURL = values.updateURL;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getOTAlastCheckTime() {

+        return getParams({

+            nv: ['dm_last_check_time']

+        }, arguments[1], arguments[2]);

+    }

+    function getSignalStrength() {

+        return getParams({

+            nv: ['network_type', 'sub_network_type', 'rssi', 'rscp', 'lte_rsrp']

+        }, arguments[1], arguments[2]);

+    }

+    function clearUpdateResult() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "RESULT_RESTORE";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function childGroupList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "childGroupList"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.childGroupList || paramD.devices)) {

+                return paramD;

+            } else {

+                return {

+                    devices: []

+                };

+            }

+        }

+    }

+    function addChildGroup() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "ADD_DEVICE",

+                mac: values.macAddress

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function removeChildGroup() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "DEL_DEVICE",

+                mac: values.mac

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function checkCurrentUserInChildGroup(devices) {

+        if (typeof config.currentUserInChildGroup == "undefined") {

+            var childGroupDevice = [];

+            if (typeof devices != "undefined") {

+                childGroupDevice = devices;

+            } else {

+                childGroupDevice = childGroupList({}).devices;

+            }

+            var userMacAddr = getUserMacAddr({}).get_user_mac_addr;

+            var found = _.find(childGroupDevice, function (item) {

+                return item.mac == userMacAddr;

+            });

+            config.currentUserInChildGroup = typeof found != 'undefined';

+            return {

+                result: typeof found != 'undefined'

+            };

+        }

+        return {

+            result: config.currentUserInChildGroup

+        };

+    }

+    function getUserMacAddr() {

+        return getParams({

+            nv: 'get_user_mac_addr'

+        }, arguments[1], arguments[2]);

+    }

+    function getHostNameList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "hostNameList"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.hostNameList || paramD.devices)) {

+                return paramD;

+            } else {

+                return {

+                    devices: []

+                };

+            }

+        }

+    }

+    function editHostName() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "EDIT_HOSTNAME",

+                mac: values.mac,

+                hostname: values.hostname

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSiteWhiteList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "site_white_list"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.site_white_list || paramD.siteList)) {

+                return paramD;

+            } else {

+                return {

+                    siteList: []

+                };

+            }

+        }

+    }

+    function removeSiteWhite() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "REMOVE_WHITE_SITE",

+                ids: values.ids.join(',')

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function saveSiteWhite() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "ADD_WHITE_SITE",

+                name: values.name,

+                site: values.site

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getTimeLimited() {

+        var defaultResult = {

+            '0': [],

+            '1': [],

+            '2': [],

+            '3': [],

+            '4': [],

+            '5': [],

+            '6': []

+        };

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "time_limited"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return parseTimeLimited(paramD);

+            } else {

+                return defaultResult;

+            }

+        }

+        function parseTimeLimited(paramD) {

+            if (paramD.time_limited == '') {

+                return {

+                    time_limited: []

+                };

+            }

+            var weeks = paramD.time_limited.split(';');

+            _.each(weeks, function (week) {

+                var weekTime = week.split('+');

+                if (weekTime.length == 2) {

+                    defaultResult[weekTime[0]] = weekTime[1].split(',');

+                }

+            });

+            return defaultResult;

+        }

+    }

+    function saveTimeLimited() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "SAVE_TIME_LIMITED",

+                time_limited: values.time

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getTsw() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "openEnable,closeEnable,openTime,closeTime",

+                multi_data: '1'

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.openTime.indexOf(':') != -1) {

+                    var open = paramD.openTime.split(':');

+                    paramD.openH = leftInsert(open[0], 2, '0');

+                    paramD.openM = leftInsert(open[1], 2, '0');

+                } else {

+                    paramD.openH = '06';

+                    paramD.openM = '00';

+                }

+                if (paramD.closeTime.indexOf(':') != -1) {

+                    var close = paramD.closeTime.split(':');

+                    paramD.closeH = leftInsert(close[0], 2, '0');

+                    paramD.closeM = leftInsert(close[1], 2, '0');

+                } else {

+                    paramD.closeH = '22';

+                    paramD.closeM = '00';

+                }

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function saveTsw() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "SAVE_TSW",

+                openEnable: values.openEnable,

+                closeEnable: values.closeEnable

+            };

+            if (values.openEnable == '1') {

+                valueReq.openTime = values.openTime;

+                valueReq.closeTime = values.closeTime;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else if (paramD && paramD.result == 'failure') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function trafficCalibration() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "FLOW_CALIBRATION_MANUAL",

+                calibration_way: values.way,

+                time: values.way == 'time' ? values.value : 0,

+                data: values.way == 'data' ? values.value : 0

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getParams() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            if (_.isArray(values.nv)) {

+                valueReq.cmd = values.nv.join(',');

+                valueReq.multi_data = 1;

+            } else {

+                valueReq.cmd = values.nv;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getRedirectData() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "vwim_mc_state,traffic_overrun,detect_new_version";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.vwim_mc_state = paramD.vwim_mc_state;

+                result.traffic_overrun = paramD.traffic_overrun;

+                result.detect_new_version = paramD.detect_new_version;

+                result.blc_wan_mode = informationAll.blc_wan_mode;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function clearRedirectFlag() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "CLEAR_REDIRECT_FLAG";

+            valueReq.flag_id = values.redirectFlags;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getV4Switch() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "lock_zone_enable,pin_interlock_and_V4_lock";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setV4Switch() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "PIN_LOCK_V4_ENCODE";

+            valueReq.pin_interlock_and_V4_lock = values.pin_interlock_and_V4_lock;

+            valueReq.TspLock_key_data = values.TspLock_key_data;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getCellId() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "cell_id_list,global_cell_id,network_type,sub_network_type,cell_not_correct";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setCellIdSwitch() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "LOCK_ZONE";

+            valueReq.lock_zone_enable = values.lock_zone_enable;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUpdateType() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "update_type"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            return {

+                update_type: paramD.update_type ? paramD.update_type : "mifi_fota"

+            }

+        }

+    }

+    function getSecurityInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "AuthMode,passPhrase";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.AuthMode = paramD.AuthMode;

+                result.passPhrase = config.PASSWORD_ENCODE ? Base64.decode(paramD.passPhrase) : paramD.passPhrase;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    //can delete

+    function setSecurityInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_WIFI_SECURITY_INFO";

+            valueReq.AuthMode = values.AuthMode;

+            if (valueReq.AuthMode == "WPAPSKWPA2PSK") {

+                valueReq.passPhrase = config.PASSWORD_ENCODE ? Base64.encode(values.passPhrase) : values.passPhrase;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }	

+    function setWifiBasic() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var valueReq = {

+                goformId: "SET_WIFI_SSID1_SETTINGS",

+                ssid: values.SSID,

+                broadcastSsidEnabled: values.broadcast,

+                MAX_Access_num: values.station,

+                security_mode: values.AuthMode,

+                cipher: values.cipher,

+                NoForwarding: values.NoForwarding,

+                show_qrcode_flag: values.show_qrcode_flag

+            };

+            if (config.WIFI_WEP_SUPPORT) {

+                valueReq.wep_default_key = values.wep_default_key;

+                valueReq.wep_key_1 = values.wep_key_1;

+                valueReq.wep_key_2 = values.wep_key_2;

+                valueReq.wep_key_3 = values.wep_key_3;

+                valueReq.wep_key_4 = values.wep_key_4;

+                if (values.wep_default_key == '1') {

+                    valueReq.WEP2Select = values.WEP2Select;

+                } else if (values.wep_default_key == '2') {

+                    valueReq.WEP3Select = values.WEP3Select;

+                } else if (values.wep_default_key == '3') {

+                    valueReq.WEP4Select = values.WEP4Select;

+                } else {

+                    valueReq.WEP1Select = values.WEP1Select;

+                }

+            }

+            if (values.AuthMode == "WPAPSK" || values.AuthMode == "WPA2PSK" || values.AuthMode == "WPAPSKWPA2PSK" || values.AuthMode == "WPA3Personal" || values.AuthMode == "WPA2WPA3") {

+                valueReq.security_shared_mode = values.cipher;

+                valueReq.passphrase = config.PASSWORD_ENCODE ? Base64.encode(values.passPhrase) : values.passPhrase;

+            } else if (values.AuthMode == "SHARED") {

+                valueReq.security_shared_mode = "WEP";

+                valueReq.security_mode = "SHARED";

+            } else {

+                if (values.encryptType == "WEP") {

+                    valueReq.security_shared_mode = "WEP";

+                    valueReq.security_mode = "OPEN";

+                } else {

+                    valueReq.security_shared_mode = "NONE";

+                }

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setWifiBasic4SSID2() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var valueReq = {

+                goformId: "SET_WIFI_SSID2_SETTINGS",

+                m_SSID: values.m_SSID,

+                m_HideSSID: values.m_broadcast,

+                m_MAX_Access_num: values.m_station,

+                m_AuthMode: values.m_AuthMode,

+                cipher: values.m_cipher,

+                m_NoForwarding: values.m_NoForwarding,

+                m_show_qrcode_flag: values.m_show_qrcode_flag

+            };

+            if (config.WIFI_WEP_SUPPORT) {

+                valueReq.m_DefaultKeyID = values.m_wep_default_key;

+                valueReq.m_Key1Str1 = values.m_wep_key_1;

+                valueReq.m_Key2Str1 = values.m_wep_key_2;

+                valueReq.m_Key3Str1 = values.m_wep_key_3;

+                valueReq.m_Key4Str1 = values.m_wep_key_4;

+                if (values.m_wep_default_key == '1') {

+                    valueReq.m_Key2Type = values.m_WEP2Select;

+                } else if (values.m_wep_default_key == '2') {

+                    valueReq.m_Key3Type = values.m_WEP3Select;

+                } else if (values.m_wep_default_key == '3') {

+                    valueReq.m_Key4Type = values.m_WEP4Select;

+                } else {

+                    valueReq.m_Key1Type = values.m_WEP1Select;

+                }

+            }

+            if (values.m_AuthMode == "WPAPSK" || values.m_AuthMode == "WPA2PSK" || values.m_AuthMode == "WPAPSKWPA2PSK" || values.m_AuthMode == "WPA3Personal" || values.m_AuthMode == "WPA2WPA3") {

+                valueReq.m_EncrypType = values.m_cipher;

+                valueReq.m_WPAPSK1 = config.PASSWORD_ENCODE ? Base64.encode(values.m_passPhrase) : values.m_passPhrase;

+            } else if (values.m_AuthMode == "SHARED") {

+                valueReq.m_EncrypType = "WEP";

+                valueReq.m_security_mode = "SHARED";

+            } else {

+                if (values.m_encryptType == "WEP") {

+                    valueReq.m_EncrypType = "WEP";

+                    valueReq.m_security_mode = "OPEN";

+                } else {

+                    valueReq.m_EncrypType = "NONE";

+                }

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getWifiBasic() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            var wpapsk = config.PASSWORD_ENCODE ? "WPAPSK1_encode,m_WPAPSK1_encode," : "imei,rnum_js,WPAPSK1_enaes,m_WPAPSK1_enaes,";

+            valueReq.cmd = "m_ssid_enable,wifi_cur_state,NoForwarding,m_NoForwarding," + wpapsk + "MAX_Station_num," + "SSID1,AuthMode,HideSSID,MAX_Access_num,show_qrcode_flag,EncrypType,Key1Str1,Key2Str1,Key3Str1,Key4Str1,DefaultKeyID," + "m_SSID,m_AuthMode,m_HideSSID,m_MAX_Access_num,m_EncrypType,m_show_qrcode_flag,m_DefaultKeyID,m_Key1Str1,m_Key2Str1,m_Key3Str1,m_Key4Str1,rotationFlag,wifi_sta_connection";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {

+                    wifi_enable: paramD.wifi_cur_state == "1" ? "1" : "0",

+                    multi_ssid_enable: paramD.m_ssid_enable,

+                    MAX_Station_num: $.isNumeric(paramD.MAX_Station_num) ? paramD.MAX_Station_num : config.MAX_STATION_NUMBER,

+                    AuthMode: paramD.AuthMode,

+                    SSID: paramD.SSID1,

+                    broadcast: paramD.HideSSID,

+                    apIsolation: paramD.NoForwarding,

+                    passPhrase: config.PASSWORD_ENCODE ? Base64.decode(paramD.WPAPSK1_encode) : wifiDecode(paramD.rnum_js,paramD.imei,paramD.WPAPSK1_enaes),

+                    MAX_Access_num: paramD.MAX_Access_num,

+                    cipher: paramD.EncrypType == "TKIP" ? "0" : paramD.EncrypType == "AES" ? 1 : 2,

+                    encryptType: paramD.EncrypType,

+                    show_qrcode_flag: paramD.show_qrcode_flag == "1" ? true : false,

+                    keyID: paramD.DefaultKeyID,

+                    Key1Str1: paramD.Key1Str1,

+                    Key2Str1: paramD.Key2Str1,

+                    Key3Str1: paramD.Key3Str1,

+                    Key4Str1: paramD.Key4Str1,

+                    m_SSID: paramD.m_SSID,

+                    m_broadcast: paramD.m_HideSSID,

+                    m_apIsolation: paramD.m_NoForwarding,

+                    m_MAX_Access_num: paramD.m_MAX_Access_num,

+                    m_AuthMode: paramD.m_AuthMode,

+                    m_passPhrase: config.PASSWORD_ENCODE ? Base64.decode(paramD.m_WPAPSK1_encode) : wifiDecode(paramD.rnum_js,paramD.imei,paramD.m_WPAPSK1_enaes),

+                    m_cipher: paramD.m_EncrypType == "TKIP" ? "0" : paramD.m_EncrypType == "AES" ? 1 : 2,

+                    m_show_qrcode_flag: paramD.m_show_qrcode_flag == "1" ? true : false,

+                    m_encryptType: paramD.m_EncrypType,

+                    m_keyID: paramD.m_DefaultKeyID,

+                    m_Key1Str1: paramD.m_Key1Str1,

+                    m_Key2Str1: paramD.m_Key2Str1,

+                    m_Key3Str1: paramD.m_Key3Str1,

+                    m_Key4Str1: paramD.m_Key4Str1,

+                    rotationFlag: paramD.rotationFlag,

+                    ap_station_enable: paramD.wifi_sta_connection

+                };

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }	

+    function setWifiBasicMultiSSIDSwitch() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var paraTemp = values;

+            if (values.wifiEnabled == '0') {

+                paraTemp = {

+                    wifiEnabled: values.wifiEnabled

+                }

+            }

+            var valueReq = $.extend({

+                goformId: "SET_WIFI_INFO",

+            }, paraTemp);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function stuffMake(array, result, prepare, dealMethod, errorObject, isPost) {

+        var values = array[0],

+        callback = array[1],

+        errorCallback = array[2];

+        var objectToReturn;

+        if (result && typeof result.errorType === 'string') {

+            objectToReturn = $.extend(errUnknownObj, result);

+            if (!callback) {

+                return objectToReturn;

+            }

+            doCallback(objectToReturn, callback, errorCallback);

+        } else {

+            objectToReturn = $.extend({}, result);

+            var valueReq;

+            if (prepare) {

+                valueReq = prepare(values, isPost);

+            } else {

+                valueReq = values;

+            }

+            if (!callback) {

+                if (valueReq && (valueReq.cmd || valueReq.goformId)) {

+                    var r = reqSync(valueReq, isPost);

+                    if (dealMethod) {

+                        objectToReturn = $.extend({}, dealMethod(r));

+                    } else {

+                        objectToReturn = r;

+                    }

+                }

+                return objectToReturn;

+            } else {

+                if (valueReq && (valueReq.cmd || valueReq.goformId)) {

+                    reqAsync(valueReq, function (paramD) {

+                        if (dealMethod) {

+                            objectToReturn = $.extend({}, dealMethod(paramD));

+                        } else {

+                            objectToReturn = $.extend({}, paramD);

+                        }

+                        if (!valueReq.notCallback) {

+                            doCallback(objectToReturn, callback, errorCallback);

+                        }

+                    }, function () {

+                        if (errorObject) {

+                            objectToReturn = $.extend(errUnknownObj, errorObject);

+                        } else {

+                            objectToReturn = $.extend(errUnknownObj, {

+                                errorType: 'Unknown'

+                            });

+                        }

+                        doCallback(objectToReturn, callback, errorCallback);

+                    }, isPost);

+                } else {

+                    doCallback(objectToReturn, callback, errorCallback);

+                }

+            }

+        }

+        function doCallback(resultToReturn, callback, errorCallback) {

+            errorCallback = errorCallback ? errorCallback : callback;

+            if (isErrorObject(resultToReturn)) {

+                switch (resultToReturn.errorType) {

+                case 'cellularNetworkError':

+                case 'deviceError':

+                case 'wifiConnectionError':

+                    window.receivedNonSpecificError(resultToReturn);

+                    break;

+                default:

+                    errorCallback(resultToReturn);

+                }

+            } else {

+                callback(resultToReturn);

+            }

+        }

+    }	

+    function reqSync(values, isPost) {

+        return reqAJAX(values, null, null, false, isPost);

+    }

+    function reqAsync(values, successCallback, errorCallback, isPost) {

+        reqAJAX(values, successCallback, errorCallback, true, isPost);

+    }

+    function getString(values){

+    var regexp = /^[A-z0-9]+$/;

+    var matches = values.match(regexp);

+    if (matches == null){

+        return "error";

+    } else {

+        return values;

+    }

+    }

+    function reqAJAX(values, successCallback, errorCallback, async, isPost) {

+        var result = null;

+        $.ajax({

+            type: !!isPost ? "POST" : "GET",

+            url: isPost ? "/reqproc/proc_post" : values.cmd ? "/reqproc/proc_get" : "/reqproc/proc_post",

+            data: values,

+            dataType: "json",

+            async: !!async,

+            cache: false,

+            error: function (paramD) {

+                if (async) {

+                    errorCallback(paramD);

+                } else if (paramD.status == 200) {

+                    result = jQuery.parseJSON('(' + getString(paramD.responseText) + ')');

+                }

+            },

+            success: function (paramD) {

+                if (async) {

+                    successCallback(paramD);

+                } else {

+                    result = paramD;

+                }

+            }

+        });

+        if (!async) {

+            return result;

+        }

+    }

+	    var informationAll = {

+        networkType: "",

+        signalImg: "0",

+        spn_b1_flag: "1",

+        spn_name_data: "",

+        spn_b2_flag: "1",

+        networkOperator: "China Mobile",

+        connectStatus: "ppp_disconnected",

+        rj45ConnectStatus: "rj45_dead",

+        attachedDevices: [],

+        ssid1AttachedNum: 0,

+        ssid2AttachedNum: 0,

+        data_counter: {

+            uploadRate: 0,

+            downloadRate: 0,

+            totalSent: 0,

+            totalReceived: 0,

+            totalConnectedTime: 0,

+            currentSent: 0,

+            currentReceived: 0,

+            currentConnectedTime: 0,

+            monthlySent: 0,

+            monthlyReceived: 0,

+            monthlyConnectedTime: 0,

+            month: ''

+        },

+        newSmsReceived: false,

+        smsReportReceived: false,

+        smsUnreadCount: "0",

+        isLoggedIn: undefined,

+        limitVolumeEnable: false,

+        limitVolumeType: '1',

+        limitVolumePercent: "100",

+        limitVolumeSize: "0",

+        allowRoamingUpdate: "0",

+        blc_wan_mode: "",

+        ap_station_enable: undefined,

+        ap_station_mode: undefined,

+        dialMode: '',

+        ethWanMode: 'AUTO',

+        fota_user_selector: '',

+        defaultWanName: ""

+    };

+    var errUnknownObj = {

+        errorType: 'UnknownError',

+        errorId: '123',

+        errorText: 'UnknownError'

+    };

+    var updateTimerFlag = true;	

+    return {

+        clearRedirectFlag: clearRedirectFlag,

+        connect: connect,

+        disconnect: disconnect,

+        getSIMPhoneBookCapacity: getSIMPhoneBookCapacity,

+        getDevicePhoneBookCapacity: getDevicePhoneBookCapacity,

+		getDevicePhoneBooks: getDevicePhoneBooks,

+        getSIMPhoneBooks: getSIMPhoneBooks,

+        getPhoneBooks: getPhoneBooks,

+        getPhoneBookReady: getPhoneBookReady,

+        getPhoneBooksByGroup: getPhoneBooksByGroup,

+        deletePhoneBooks: deletePhoneBooks,

+        deleteAllPhoneBooks: deleteAllPhoneBooks,

+        deleteAllPhoneBooksByGroup: deleteAllPhoneBooksByGroup,		

+        savePhoneBook: savePhoneBook,

+        deleteAllMessages: deleteAllMessages,

+        deleteMessage: deleteMessage,

+        setSmsRead: setSmsRead,

+        sendSMS: sendSMS,

+        saveSMS: saveSMS,

+        getSMSReady: getSMSReady,

+        getSMSMessages: getSMSMessages,

+        getSMSDeliveryReport: getSMSDeliveryReport,

+        getSmsCapability: getSmsCapability,

+        resetNewSmsReceivedVar: resetNewSmsReceivedVar,

+        resetSmsReportReceivedVar: resetSmsReportReceivedVar,

+        getSmsSetting: getSmsSetting,

+        setSmsSetting: setSmsSetting,

+		getAttachedCableDevices: getAttachedCableDevices,

+		getCurrentlyAttachedDevicesInfo: getCurrentlyAttachedDevicesInfo,

+		getConnectionInfo: getConnectionInfo,

+        getRedirectData: getRedirectData,

+        getLanguage: getLanguage,

+        setLanguage: setLanguage,

+        getNetSelectInfo: getNetSelectInfo,		

+        getSecurityInfo: getSecurityInfo,

+        setSecurityInfo: setSecurityInfo,

+        getStatusInfo: getStatusInfo,

+        getConnectionMode: getConnectionMode,

+        setConnectionMode: setConnectionMode,

+        getWifiBasic: getWifiBasic,

+        setWifiBasic: setWifiBasic,

+        setWifiBasic4SSID2: setWifiBasic4SSID2,

+        setWifiBasicMultiSSIDSwitch: setWifiBasicMultiSSIDSwitch, 

+        getWpsInfo: getWpsInfo,

+        openWps: openWps,

+        getSleepMode: getSleepMode,

+        setSleepMode: setSleepMode,

+        getWifiAdvance: getWifiAdvance,

+        setWifiAdvance: setWifiAdvance,

+        getWifiRange: getWifiRange,

+        setWifiRange: setWifiRange,

+

+        getLoginStatus: getLoginStatus,

+        getLoginData: getLoginData,

+        login: login,

+        logout: logout, 

+        changeManageInfo: changeManageInfo,

+        getPinData: getPinData,

+        enablePin: enablePin,

+        disablePin: disablePin,

+        changePin: changePin,

+		enterPIN: enterPIN,

+        enterPUK: enterPUK,

+        getLanInfo: getLanInfo,

+        setLanInfo: setLanInfo,       

+        getApnSettings: getApnSettings,

+        deleteApn: deleteApn,

+        setDefaultApn: setDefaultApn,

+        addOrEditApn: addOrEditApn,

+        getQuickSettingInfo: getQuickSettingInfo,

+        setQuickSetting4IPv6: setQuickSetting4IPv6,

+        scanForNetwork: scanForNetwork,

+        setBearerPreference: setBearerPreference,

+        editHostName: editHostName,

+        getSiteWhiteList: getSiteWhiteList,

+        removeSiteWhite: removeSiteWhite,

+        saveSiteWhite: saveSiteWhite,

+        setNetwork: setNetwork,

+        getUpnpSetting: getUpnpSetting,

+        setUpnpSetting: setUpnpSetting,

+        getDmzSetting: getDmzSetting,

+        setDmzSetting: setDmzSetting,

+        getDeviceInfo: getDeviceInfo,

+        getDeviceInfoLow: getDeviceInfoLow,

+        getPortForward: getPortForward,

+        setPortForward: setPortForward,

+        getPortFilter: getPortFilter,

+        setPortFilterBasic: setPortFilterBasic,

+        setPortFilter: setPortFilter,

+        deleteFilterRules: deleteFilterRules,

+        getPortMap: getPortMap,

+        setPortMap: setPortMap,

+        enablePortMap: enablePortMap,

+        deleteMapRules: deleteMapRules,

+        getTrafficAlertInfo: getTrafficAlertInfo,

+        setTrafficAlertInfo: setTrafficAlertInfo,

+        getCurrentUpgradeState: getCurrentUpgradeState,

+        setUpgradeSelectOp: setUpgradeSelectOp,

+        addTimerThings: addTimerSomething,

+        removeTimerThings: removeTimerSomething,

+        getPackSizeInfo: getPackSizeInfo,

+        getMandatory: getMandatory,

+        getOTAUpdateSetting: getOTAUpdateSetting,

+        setOTAUpdateSetting: setOTAUpdateSetting,

+        getManualOTAUpdateSetting: getManualOTAUpdateSetting,

+        setManualOTAUpdateSetting: setManualOTAUpdateSetting,

+        getSignalStrength: getSignalStrength,

+        getOTAlastCheckTime: getOTAlastCheckTime,

+        clearUpdateResult: clearUpdateResult,

+        refreshAPStationStatus: refreshAPStationStatus,

+        getSntpParams: getSntpParams,

+        setSntpSetting: setSntpSetting,

+        setSNTPDate: setSNTPDate,

+        restoreFactorySettings: restoreFactorySettings,

+        checkRestoreStatus: checkRestoreStatus,

+        getSysSecurity: getSysSecurity,

+        setSysSecurity: setSysSecurity,

+        deleteForwardRules: deleteForwardRules,

+        enableVirtualServer: enableVirtualServer,

+        getSDConfiguration: getSDConfiguration,

+        setSdCardMode: setSdCardMode,

+        checkFileExists: checkFileExists,

+        getFileList: getFileList,

+        fileRename: fileRename,

+        getSdMemorySizes: getSdMemorySizes,

+        deleteFilesAndFolders: deleteFilesAndFolders,

+        createFolder: createFolder,

+        setSdCardSharing: setSdCardSharing,

+        setUpdateInfoWarning: setUpdateInfoWarning,

+        getUpdateInfoWarning: getUpdateInfoWarning,

+        getAPStationBasic: getAPStationBasic,

+        setAPStationBasic: setAPStationBasic,

+        getWdsInfo: getWdsInfo,

+        setWDS: setWDS,

+        addUrlFilterRule: addUrlFilterRule,

+        getUrlFilterList: getUrlFilterList,

+        deleteSelectedRules: deleteSelectedRules,

+        getMacFilterInfo: getMacFilterInfo,

+        setMacFilter: setMacFilter,

+        getFastbootSetting: getFastbootSetting,

+        setFastbootSetting: setFastbootSetting,

+        turnOffDevice: turnOffDevice,

+        restart: restart,

+        getScheduleSetting: getScheduleSetting,

+        setScheduleSetting: setScheduleSetting,

+        getCwmpSetting: getCwmpSetting,

+        setCwmpSetting: setCwmpSetting,

+        updateTimerFlag: updateTimerFlag,

+        childGroupList: childGroupList,

+        addChildGroup: addChildGroup,

+        removeChildGroup: removeChildGroup,

+        checkCurrentUserInChildGroup: checkCurrentUserInChildGroup,

+        getTimeLimited: getTimeLimited,

+        saveTimeLimited: saveTimeLimited,

+        getHostNameList: getHostNameList,

+        getHotspotList: getHotspotList,

+        searchHotspot: searchHotspot,

+        getSearchHotspotList: getSearchHotspotList,

+        saveHotspot: saveHotspot,

+        deleteHotspot: deleteHotspot,

+        connectHotspot: connectHotspot,

+        disconnectHotspot: disconnectHotspot,

+        getOpMode: getOpMode,

+        getRj45PlugState: getRj45PlugState,

+        SetOperationMode: SetOperationMode,

+        getPppoeParams: getPppoeParams,

+        setPppoeDialMode: setPppoeDialMode,

+        getTsw: getTsw,

+        saveTsw: saveTsw,

+        trafficCalibration: trafficCalibration,

+        getParams: getParams,

+        getNewVersionState: getNewVersionState,

+        getUpgradeResult: getUpgradeResult,

+        getV4Switch: getV4Switch,

+        setV4Switch: setV4Switch,

+        getCellId: getCellId,

+        setCellIdSwitch: setCellIdSwitch,

+        getDdnsParams: getDdnsParams,

+        setDDNSForward: setDDNSForward,

+        getUpdateType: getUpdateType,

+        getCurretnMAC: getCurretnMAC,

+        getUSSDResponse: getUSSDResponse,

+        USSDReplyCancel: USSDReplyCancel,

+        getNetworkUnlockTimes: getNetworkUnlockTimes,

+        unlockNetwork: unlockNetwork,	

+        getSyslogInfo: getSyslogInfo,

+        setSysLog: setSysLog,		

+    };

+});

+

+ // Router����

+

+define("adm_lan","jquery knockout set service".split(" "),

+

+    function ($, ko, config, service) {

+

+    var originfrmLan = "";

+

+    // ��ȡ·�����������Ϣ

+    function getLanInfo() {

+        return service.getLanInfo();

+    }	

+

+    function hex(val) {

+        var h = (val - 0).toString(16);

+        if (h.length == 1)

+            h = '0' + h;

+        return h.toUpperCase();

+    }	

+

+    function LanViewModel() {

+        var target = this;

+

+        var info = getLanInfo();

+

+        target.dhcpStart = ko.observable(info.dhcpStart);

+        target.dhcpEnd   = ko.observable(info.dhcpEnd);

+        target.dhcpLease = ko.observable(info.dhcpLease);		

+

+        target.ipAddress  = ko.observable(info.ipAddress);

+        target.subnetMask = ko.observable(info.subnetMask);

+        target.dhcpServer = ko.observable(info.dhcpServer);

+

+		target.macAddress = ko.observable(info.macAddress);

+        target.showMacAddress = ko.observable(config.SHOW_MAC_ADDRESS);

+

+        target.hasWifi        = ko.observable(config.HAS_WIFI);

+        target.hasUssd        = config.HAS_USSD;

+        target.hasDdns        = config.DDNS_SUPPORT;

+

+        target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+

+        target.clear = function () {

+            clearTimer();

+            init();

+            clearValidateMsg();

+        };		

+

+        target.refreshStatus = function () {

+            var connInfo = service.getConnectionInfo();

+            if (connInfo.connectStatus == 'ppp_disconnected') {

+                $('input', '#frmLan').each(function () {

+                    $(this).attr("disabled", false);

+                });

+            } else {

+                $('input', '#frmLan').each(function () {

+                    $(this).attr("disabled", true);

+                });

+

+                clearValidateMsg();

+            }

+        };

+

+        // ������Ӧ�������������ñ���

+        target.saveAct = function () {

+            showLoading();

+            var params = {

+                ipAddress:  target.ipAddress(),

+                subnetMask: target.subnetMask(),

+                dhcpServer: target.dhcpServer(),

+                dhcpStart:  target.dhcpStart(),

+                dhcpEnd:    target.dhcpEnd(),

+                dhcpLease:  target.dhcpLease()

+            };

+

+            service.setLanInfo(params, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                    target.clear();

+                } else {

+                    errorOverlay();

+                }

+            });

+        };		

+

+        // ������Ӧ�������������ñ���

+        target.save = function () {

+            var frmLanObj = $('#frmLan').serialize();

+            if (frmLanObj == originfrmLan) {

+                showAlert("setting_no_change");

+                return false;

+            }

+            if (config.RJ45_SUPPORT) {

+                var pppObj = service.getPppoeParams();

+                if (sf_isValidate_StaticIP(pppObj.static_wan_ipaddr, target.ipAddress(), target.subnetMask())) {

+                    showAlert("lan_tip_staticip_notsame");

+                    return false;

+                }

+            }

+            showConfirm("lan_confirm_reopen", function () {

+                target.saveAct();

+            });

+        };

+

+            target.refreshStatus();

+            // dhcpServer�л���Ӧ����

+            target.dhcpServerHandler = function () {

+                $("#txtIpAddress").parent().find(".error").hide();

+                $("#txtIpAddress").show();

+                return true;

+            };

+        addTimeout(function () {

+            originfrmLan = $('#frmLan').serialize();

+        }, 500);

+    }

+

+

+    function sf_opAnd4Byte(i_v1, i_v2) {

+        var index;

+        var var1 = [];

+        var var2 = [];

+        var result='0x';

+

+        for (index=2,index_tmp=0; index<10; index+=2,index_tmp++) {

+            var1[index_tmp]='0x'+i_v1.substring(index,index+2);

+            var2[index_tmp]='0x'+i_v2.substring(index,index+2);

+        }

+

+        for (index=0; index<4; index++) {

+            result = result + hex(var1[index]&var2[index]);

+        }

+

+        return result - 0;

+    }

+

+    // ������ر���У�����	

+    $.validator.addMethod("dhcp_check", function (i_value, i_element, i_parameter) {

+        var dhcpIp =  i_parameter == "start" ?  $('#txtDhcpIpPoolStart').val() : $('#txtDhcpIpPoolEnd').val();

+        var result = sf_isValidate_Gateway($('#txtIpAddress').val(), $('#txtSubnetMask').val(), dhcpIp);

+        return this.optional(i_element) || result;

+    });

+

+    $.validator.addMethod("dhcpCompare", function (i_value, i_element, i_parameter) {

+        var result;

+        if(i_parameter == "#txtDhcpIpPoolStart") {

+            result = sf_isValidate_StartEndIp($('#txtIpAddress').val(), $('#txtSubnetMask').val(), $(i_parameter).val(), i_value);

+        }

+        else {

+            result = sf_isValidate_StartEndIp($('#txtIpAddress').val(), $('#txtSubnetMask').val(), i_value, $(i_parameter).val());

+        }

+        return result != 1;

+    });

+

+    $.validator.addMethod("ipRange", function (i_value, i_element, i_parameter) {

+        var DHCP_flag = false;

+        if($('#dhcpEnable').is(':checked')){

+            DHCP_flag = true;

+        }

+        var result = sf_isValidate_StartEndIp(i_value, $('#txtSubnetMask').val(), $('#txtDhcpIpPoolStart').val(), $('#txtDhcpIpPoolEnd').val(), DHCP_flag);

+        return result != 2;

+    });

+

+    $.validator.addMethod("subnetmask_check", function (i_value, i_element, i_parameter) {

+        var result = sf_isValidate_Netmask(i_value);

+        return this.optional(i_element) || result;

+    });	

+

+

+    // ��̬��ЧIPУ�麯��

+    function sf_isValidate_StaticIP(i_ip, i_lanIp, i_lanMask){

+            if(!i_ip || !i_lanIp || !i_lanMask){//������������

+                return false;

+            }

+

+		       //������IP���

+            if (i_ip == i_lanIp) { 

+                return true;

+            }

+

+            var res1 = [];

+            var res2 = [];

+

+            var mask_array = [];

+

+            ip_array = i_ip.split(".");

+            lanIp_array = i_lanIp.split(".");

+            mask_array  = i_lanMask.split(".");

+            for(var index = 0; index < ip_array.length; index += 1){

+                res1.push(parseInt(mask_array[index]) & parseInt(ip_array[index]));

+                res2.push(parseInt(mask_array[index]) & parseInt(lanIp_array[index]));

+            }

+            if(res2.join(".") != res1.join(".")){//�ڲ�ͬ����

+                return false;

+            }else{//��ͬһ����

+                return true;

+            }

+        }

+

+

+    function sf_isValidate_NetmaskIP(i_ip) {

+        return (i_ip == 255

+      		 || i_ip == 254 

+			 || i_ip == 252 

+			 || i_ip == 248

+             || i_ip == 240 

+			 || i_ip == 224 

+			 || i_ip == 192 

+			 || i_ip == 128

+			 || i_ip == 0);

+    }

+

+	function sf_convertIpToString(i_ip)

+	{

+        var s_i1 = i_ip.indexOf('.');

+        var s_i2 = i_ip.indexOf('.', (s_i1 + 1));

+        var s_i3 = i_ip.indexOf('.', (s_i2 + 1));

+        o_ip = hex(i_ip.substring(0, s_i1)) + hex(i_ip.substring((s_i1 + 1), s_i2)) + hex(i_ip.substring((s_i2 + 1), s_i3)) + hex(i_ip.substring((s_i3 + 1), i_ip.length));

+        o_ip = '0x' + o_ip;

+

+        return 	o_ip;	

+	}

+

+	function sf_getIpString_3(i_ip)

+	{

+        var i1 = i_ip.indexOf('.');

+        var i2 = i_ip.indexOf('.', (i1 + 1));

+        var i3 = i_ip.indexOf('.', (i2 + 1));

+        var i4 = i_ip.substring((i3+1),i_ip.length)-0;

+

+        return 	i4;	

+	}	

+

+

+    // ����У�麯��

+    function sf_isValidate_Gateway(i_wanIp, i_netmaskIp, i_gatewayIp) {

+	    var s_wanIp = sf_convertIpToString(i_wanIp);

+		var lan4 = sf_getIpString_3(i_wanIp);

+

+	    var s_netmaskIp = sf_convertIpToString(i_netmaskIp);

+		var mask4 = sf_getIpString_3(i_netmaskIp);		

+

+	    var s_gatewayIp = sf_convertIpToString(i_gatewayIp);

+		var pool4 = sf_getIpString_3(i_gatewayIp);	

+

+        var net_no;

+        var lo_broadcast;		

+

+        if (sf_opAnd4Byte(s_wanIp, s_netmaskIp) != sf_opAnd4Byte(s_gatewayIp, s_netmaskIp)) {

+            return false;

+        }

+

+        net_no       = (lan4 & mask4);

+        lo_broadcast =  (lan4 & mask4) + (255-mask4);

+

+        return !(pool4==net_no || pool4==lo_broadcast);		

+

+    }	

+

+	// ��������У�麯��		

+    function sf_isValidate_Netmask(i_netmask) {

+        var addr = i_netmask.split(".");

+

+		if ("0.0.0.0" == i_netmask || "255.255.255.255" == i_netmask) {

+            return false;

+        }

+

+        if (addr.length != 4) {

+            return false;

+        }

+

+        addr[0] = parseInt(addr[0]);

+        addr[1] = parseInt(addr[1]);

+        addr[2] = parseInt(addr[2]);

+        addr[3] = parseInt(addr[3]);

+

+        if (addr[3] != 0) {

+            if (addr[0] != 255 || addr[1] != 255 || addr[2] != 255) {

+                return false;

+            } else {

+                if (!sf_isValidate_NetmaskIP(addr[3])) {

+                    return false;

+                }

+            }

+        }

+

+        if (addr[2] != 0) {

+            if (addr[0] != 255 || addr[1] != 255) {

+                return false;

+            } else {

+                if (!sf_isValidate_NetmaskIP(addr[2])) {

+                    return false;

+                }

+            }

+        }

+

+        if (addr[1] != 0) {

+            if (addr[0] != 255) {

+                return false;

+            } else {

+                if (!sf_isValidate_NetmaskIP(addr[1])) {

+                    return false;

+                }

+            }

+        }

+

+        if (addr[0] != 255) {

+            return false;

+        }

+

+        return true;

+    }

+

+    // DHCP IP��У�麯��

+    function sf_isValidate_StartEndIp(i_lanIpaddr, i_netIp, i_startIp, i_endIp, i_DHCPFlag) {

+	    s_startIp = sf_convertIpToString(i_startIp);

+		s_endIp   = sf_convertIpToString(i_endIp);

+		s_lanIp   = sf_convertIpToString(i_lanIpaddr);

+

+		if(s_startIp>s_endIp) {

+            return 1;

+        }

+

+        if(s_lanIp >= s_startIp && s_lanIp <= s_endIp) {

+            return 2;

+        }

+

+        return 0;		

+	}

+

+

+    function init() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var fwVm = new LanViewModel();

+        ko.applyBindings(fwVm, container[0]);

+

+        addInterval(fwVm.refreshStatus, 1000);

+

+        $('#frmLan').validate({

+            submitHandler:function () {

+                fwVm.save();

+            },

+

+            rules:{

+                txtIpAddress: {

+                    lanip_check: true,

+                    ipRange: true

+                },

+                txtSubnetMask: {

+                    ipv4: true,

+                    subnetmask_check: true

+                },

+                txtDhcpIpPoolStart: {

+                    lanip_check: true,

+                    dhcp_check: "start",

+                    dhcpCompare: "#txtDhcpIpPoolEnd"

+                },

+                txtDhcpIpPoolEnd: {

+                    lanip_check: true,

+                    dhcp_check: "end",

+                    dhcpCompare: "#txtDhcpIpPoolStart"

+                },

+                txtDhcpLease: {

+                    range: [1, 65535],

+                    digits: true

+                }

+            },

+

+            groups: {

+                lanip_check: "txtDhcpIpPoolStart txtDhcpIpPoolEnd"

+            },

+

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "txtDhcpLease") {

+                    error.insertAfter("#errorHolder");

+                } else if (element.attr("name") == "txtDhcpIpPoolStart") {

+                    error.insertAfter("#txtDhcpIpPoolEnd");

+                } else {

+                    error.insertAfter(element);

+                }

+			}

+        });

+

+    }

+

+

+    return {

+        init:init

+    }

+});

+

+define("tr069","jquery knockout set service".split(" "),

+

+    function ($, ko, config, service) {

+        function Tr069ViewModel() {

+            var target = this;

+            target.hasUssd = config.HAS_USSD;

+            target.hasDdns = config.DDNS_SUPPORT;

+            target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+

+            var cwmpInfo = service.getCwmpSetting();

+

+            target.cwmp_active = ko.observable(cwmpInfo.cwmpSetting);

+            target.cwmp_acs_server_url = ko.observable(cwmpInfo.acsUrl);

+            target.cwmp_acs_username = ko.observable(cwmpInfo.acsUsername);

+            target.cwmp_acs_password = ko.observable(cwmpInfo.acsPassword);

+            target.cwmp_periodic_inform_active = ko.observable(cwmpInfo.periodicEnabled);

+            target.cwmp_periodic_inform_interval = ko.observable(cwmpInfo.periodicInterval);

+            target.cwmp_conn_request_username = ko.observable(cwmpInfo.cpeUsername);

+            target.cwmp_conn_request_password = ko.observable(cwmpInfo.cpePassword);

+

+            // target.cwmp_stun_active=ko.observable('');

+            // target.cwmp_stun_server_addr=ko.observable('');

+            // target.cwmp_stun_server_port=ko.observable('');

+            // target.cwmp_stun_username=ko.observable('');

+            // target.cwmp_stun_password=ko.observable('');

+            // target.cwmp_stun_min_keep_alive_interval=ko.observable('');

+            // target.cwmp_stun_max_keep_alive_interval=ko.observable('');

+            // target.cwmp_udp_notify_limit_num=ko.observable('');

+            // target.cwmp_udp_conn_req_addr=ko.observable('');

+            // target.cwmp_nat_detected_mark=ko.observable('');

+

+            // target.btn=function(name,id,enableName){

+            //     if($('#'+id).is(':checked')){

+            //         $("."+name).animate({left: '22px'});

+            //         //$('#'+name).css('background-color','#FD8204');

+            //         if(enableName==='cwmp_active'){

+            //             target.cwmp_active('1')

+            //         }

+            //         else{

+            //             target.cwmp_stun_active("1")

+            //         }

+            //     }

+            //     else{

+            //         $("."+name).animate({left: '-1px'});

+            //         $('#'+name).css('background-color','white');

+            //         if(enableName==='cwmp_active'){

+            //             target.cwmp_active('0')

+            //         }

+            //         else{

+            //             target.cwmp_stun_active("0")

+            //         }

+            //     }

+            // }

+            // ���TR069

+            target.setting= function() {

+                showLoading();

+                var param = {};

+                param.cwmpSetting = target.cwmp_active();

+                param.acsUrl = target.cwmp_acs_server_url();

+                param.acsUsername = target.cwmp_acs_username();

+                param.acsPassword = target.cwmp_acs_password();

+                param.periodicEnabled = target.cwmp_periodic_inform_active();

+                param.periodicInterval =target.cwmp_periodic_inform_interval();

+                param.cpeUsername = target.cwmp_conn_request_username();

+                param.cpePassword = target.cwmp_conn_request_password();

+                service.setCwmpSetting(param, function (result) {

+                    if (result.result != "success") {

+                        errorOverlay();

+                    } else {

+                        successOverlay();

+                    }

+                });

+            }

+            // ���STUN

+            target.stun=function(){

+                console.log(99999);

+            }

+        }

+

+        function init() {

+            var container = $('#container');

+            ko.cleanNode(container[0]);

+            var imVm = new Tr069ViewModel();

+            ko.applyBindings(imVm, container[0]);

+

+            $('#frmTr069').validate({

+                submitHandler:function () {

+                    imVm.setting();

+                },

+                rules:{

+                    cwmp_acs_server_url: {

+                        url_span: false

+                    },

+                },

+            });

+            $('#frmTrtun').validate({

+                submitHandler:function () {

+                    imVm.stun();

+                },

+                rules:{},

+            });

+            $.validator.addMethod("url_span", validURLWithProtocol);

+        }

+    return {

+        init:init

+    }

+});

+

+// others ����:Fast Boot Settings��Restart and Reset��SNTP��Turn Off Device��PIN Management

+define("adm_others","jquery knockout set service underscore".split(" "),

+

+    function ($, ko, config, service, _) {

+

+		var timeSetModes = _.map(config.sntpTimeSetMode, function(item) {

+			return new Option(item.name, item.value);

+		});

+

+		var timeZones    = _.map(config.timeZone, function(item){

+			return new Option(item.name, item.value);

+		});

+

+		var daylightSave = _.map(config.daylightSave, function(item){

+			return new Option(item.name, item.value);

+		});

+

+		var sv_sntpYears    = [];

+		var sv_sntpMonths   = [];

+		var sv_sntpDates    = [];  //���ݴ�С����������

+		var sv_sntpHours    = [];

+		var sv_sntpMinutes  = [];

+        var sc_startpHours  = [];

+		var sc_startMinutes = [];

+

+		var sf_bigMonth     = [1, 3, 5, 7, 8, 10, 12];

+		var sf_smallMonth   = [4, 6, 9, 11];

+

+		function sf_produceArray(start, end, arryName) {

+			var item = {};

+			for(var i = start; i <= end; i++) {

+				item.name  = i;

+				item.value = i;

+				arryName.push(new Option(item.name, item.value));

+			}

+		}

+

+		//�����ꡢ�¡�ʱ���ֵ�����

+		sf_produceArray(2000, 2030, sv_sntpYears);

+		sf_produceArray(1, 12, sv_sntpMonths);

+		sf_produceArray(0, 23, sv_sntpHours);

+		sf_produceArray(0, 59, sv_sntpMinutes);			

+        sf_produceArray(0, 23, sc_startpHours);

+		sf_produceArray(0, 59, sc_startMinutes);		

+

+        function othersViewModel() {

+            var target = this;

+

+			var inChildGroup = false;

+            var scheduleInfo = service.getScheduleSetting();

+

+            target.fastbootSupport    = config.FAST_BOOT_SUPPORT;

+            target.turnOffSupport     = config.TURN_OFF_SUPPORT;     

+            target.SNTPSupport        = config.HAS_SNTP;

+			target.hasUssd            = config.HAS_USSD;

+			target.hasDdns            = config.DDNS_SUPPORT;

+			target.hasUpdateCheck     = config.HAS_UPDATE_CHECK;

+            target.scheduleSetting = ko.observable(scheduleInfo.scheduleSetting);

+            target.scheduleHour = ko.observable(parseInt(scheduleInfo.scheduleHour));

+            target.scheduleMinute = ko.observable(parseInt(scheduleInfo.scheduleMinute));

+            target.scr_hours   = ko.observableArray(sc_startpHours);

+			target.scr_minutes = ko.observableArray(sc_startMinutes);

+

+

+            if (config.HAS_PARENTAL_CONTROL) {

+                inChildGroup = service.checkCurrentUserInChildGroup().result;

+            }

+            target.currentUserInChildGroup = ko.observable(inChildGroup);

+

+            var sv_fastbootInfo = service.getFastbootSetting();

+            target.fastbootEnableFlag =  ko.observable(config.RJ45_SUPPORT ? (sv_fastbootInfo.need_sim_pin != "yes" && service.getRj45PlugState().rj45_plug == "wan_lan_off") : sv_fastbootInfo.need_sim_pin != "yes");

+            target.fastbootSetting = ko.observable(sv_fastbootInfo.fastbootEnabled);

+

+

+            // @method addInterval		

+			addInterval(function(){

+				target.fastbootEnableFlag(config.RJ45_SUPPORT ? (sv_fastbootInfo.need_sim_pin != "yes" && service.getRj45PlugState().rj45_plug == "wan_lan_off") : sv_fastbootInfo.need_sim_pin != "yes");

+			}, 1000);				

+

+            // �ָ���������

+            // @event restore

+            target.restore = function () {

+                showConfirm("restore_confirm", function () {

+                    showLoading("restoring");

+                    service.restoreFactorySettings({}, function (info) {

+                        if (info && info.result == "success") {

+                            successOverlay();

+                        } else {

+                            errorOverlay();

+                        }

+                    }, function (result) {

+                        if (isErrorObject(result) && result.errorType == 'no_auth') {

+                            errorOverlay();

+                        }

+                    });

+                });

+            };

+

+            target.restart = function () {

+                showConfirm("restart_confirm", function () {

+                    restartDevice(service);

+                });

+            };

+

+            target.scheduleRestart = function () {

+                showLoading();

+                var params = {};

+                params.scheduleSetting = target.scheduleSetting();

+                params.scheduleHour = target.scheduleHour();

+                params.scheduleMinute = target.scheduleMinute();

+                service.setScheduleSetting(params, function (result) {

+                    if (result.result != "success") {

+                        errorOverlay();

+                    } else {

+                        successOverlay();

+                    }

+                });

+            };

+

+            // ���ٿ��ػ�����

+            target.saveFastBoot = function() {

+                showLoading();

+                var params = {

+                    fastbootEnabled: target.fastbootSetting(),

+                    need_hard_reboot: sv_fastbootInfo.need_hard_reboot

+                };

+                service.setFastbootSetting(params, function(result) {

+                    if (result.result == "success") {

+                        successOverlay();

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            // �ػ�

+            target.turnoff = function () {

+                showConfirm("turnoff_confirm", function () {

+                    showLoading("turnoff");

+                    service.turnOffDevice({}, function (info) {

+                        if (info && info.result == "success") {

+                            successOverlay();

+                        } else {

+                            errorOverlay();

+                        }

+                    }, $.noop);

+                });

+            };

+

+			//SNTP����serverУ׼ʱ��

+			service.setSNTPDate({

+				goformId: "SNTP_Getdatastatic"

+			});

+

+			var target       = this;

+			var sntpInfo   = service.getSntpParams();

+

+			globalTime     = new Date(parseInt(sntpInfo.sntp_year, 10),parseInt(sntpInfo.sntp_month, 10)-1, parseInt(sntpInfo.sntp_day, 10), parseInt(sntpInfo.sntp_hour, 10), parseInt(sntpInfo.sntp_minute, 10), parseInt(sntpInfo.sntp_second, 10));

+

+			target.day       = ko.observable();

+			target.localTime = ko.observable();

+

+			//��ʼ����ǰ����ʱ��

+			//target.updateCurrentTime; cov_2

+			target.timeSetModes    = ko.observableArray(timeSetModes);

+			target.isManualSetTime = ko.observable(false);

+			target.isAutoSntpTime  = ko.observable(false);

+

+			target.currentMode = ko.observable(sntpInfo.sntp_time_set_mode);

+

+			changeSetTimeMode();

+			target.changeSetTimeMode = function(){

+				changeSetTimeMode();

+			};

+

+			target.currentYear   = ko.observable(parseInt(sntpInfo.sntp_year, 10));

+			target.currentMonth  = ko.observable(parseInt(sntpInfo.sntp_month, 10));

+			target.currentDate   = ko.observable(parseInt(sntpInfo.sntp_day, 10));

+			target.currentHour   = ko.observable(parseInt(sntpInfo.sntp_hour, 10));

+			target.currentMinute = ko.observable(parseInt(sntpInfo.sntp_minute, 10));

+

+

+			// ��Ҫ��������ˢ�������б����ݣ�ע��˳�� 

+

+			target.years  = ko.observableArray(sv_sntpYears);

+			target.months = ko.observableArray(sv_sntpMonths);				

+			//���û�ѡ���·ݵ�ʱ��ı�����ѡ����ѡ��

+			target.initDateList = function(){

+				initDateList();

+				target.dates(sv_sntpDates);

+			}

+

+			//��ʼ�������б�

+			initDateList();

+			target.dates   = ko.observableArray(sv_sntpDates);

+			target.hours   = ko.observableArray(sv_sntpHours);

+			target.minutes = ko.observableArray(sv_sntpMinutes);

+

+			//�Զ�SNTP��ȡʱ�����ݰ󶨴���

+			var serverArray = _.map(sntpInfo.sntp_servers, function(item) {

+				return new Option(item.name, item.value)

+			});

+

+			target.serverList          = ko.observableArray(serverArray);

+

+			// �������ֲ����޸ģ��޸��޷�ˢ����ҳ

+

+			target.currentServer0 = ko.observable(sntpInfo.sntp_server0);

+			target.currentServer1 = ko.observable(sntpInfo.sntp_server1);

+			target.currentServer2 = ko.observable(sntpInfo.sntp_server2);

+			target.customServer0 = ko.observable(sntpInfo.sntp_other_server0);

+			target.customServer1 = ko.observable(sntpInfo.sntp_other_server1);

+			target.customServer2 = ko.observable(sntpInfo.sntp_other_server2);

+			target.isOther0 = ko.observable(false);

+			target.isOther1 = ko.observable(false);

+			target.isOther2 = ko.observable(false);

+

+			initOtherServer();

+

+			target.changeServerSelect = function(){

+				initOtherServer();

+			}

+

+			target.timeZones           = ko.observableArray(timeZones);

+			target.currentTimeZone     = ko.observable(sntpInfo.sntp_timezone + "_" + sntpInfo.sntp_timezone_index);

+			target.daylightSaves       = ko.observableArray(daylightSave);

+			target.currentDaylightSave = ko.observable(sntpInfo.sntp_dst_enable);

+

+			//���µ�ǰ��ʾʱ��

+			target.updateCurrentTime = function() {

+			    var globalDay = globalTime.getDay();

+

+				switch(globalDay){

+				    case 6:

+				    	target.day($.i18n.prop("saturday"));

+				    	break;		

+				    case 5:

+				    	target.day($.i18n.prop("friday"));

+				    	break;	

+				    case 4:

+				    	target.day($.i18n.prop("thursday"));

+				    	break;	

+				    case 3:

+				    	target.day($.i18n.prop("wednesday"));

+				    	break;

+				    case 2:

+				    	target.day($.i18n.prop("tuesday"));

+				    	break;	

+				    case 1:

+				    	target.day($.i18n.prop("monday"));

+				    	break;						

+				    case 0:

+				    	target.day($.i18n.prop("sunday"));

+				    	break;

+				    default:

+			        	break;

+				}

+

+				var localCurrentTime = globalTime.getFullYear() + "-" + getTwoDigit(globalTime.getMonth()+1) + "-" + getTwoDigit(globalTime.getDate()) + " " + getTwoDigit(globalTime.getHours()) + ":" + getTwoDigit(globalTime.getMinutes()) + ":" + getTwoDigit(globalTime.getSeconds());

+				target.localTime(localCurrentTime);

+				globalTime.setTime(globalTime.getTime()+1000);			

+			};

+

+            // SNTP����		

+			target.apply = function(){

+				var tmpArray = [];

+				for(var i=0; i< sntpInfo.sntp_servers.length; i++){

+					tmpArray.push(sntpInfo.sntp_servers[i].value);

+				}

+				var staInfo = service.getStatusInfo();

+				if(!checkConnectedStatus(staInfo.connectStatus, staInfo.rj45ConnectStatus, staInfo.connectWifiStatus) && target.currentMode() == "auto"){

+					showAlert("sntp_syn_time_wan_connected");

+					return;

+				}

+

+				showLoading("");

+				var requestParams = {

+					goformId: "SNTP",

+					manualsettime : target.currentMode(),

+					sntp_server1_ip : target.currentServer0(),

+					sntp_server2_ip : target.currentServer1(),

+					sntp_server3_ip : target.currentServer2(),

+					sntp_other_server0 : target.customServer0(),

+					sntp_other_server1 : target.customServer1(),

+					sntp_other_server2 : target.customServer2(),

+					timezone : target.currentTimeZone().split("_")[0],

+					sntp_timezone_index : target.currentTimeZone().split("_")[1],

+					DaylightEnabled : target.currentDaylightSave(),

+					time_year : target.currentYear(),

+					time_month : target.currentMonth(),

+					time_day : target.currentDate(),

+					time_hour : target.currentHour(),

+					time_minute : target.currentMinute()

+				};

+

+				service.setSntpSetting(requestParams, function(data2){

+					if(data2) {

+					    if(data2.result == "success" && target.currentMode() == "auto"){

+                            successOverlay("sntp_req_success");

+							//hideLoading();

+						}else if(data2.result == "processing" && target.currentMode() == "auto"){

+							successOverlay("sntp_processing");

+						}else{

+							//����serverУ׼ʱ��

+							service.setSNTPDate({

+								goformId: "SNTP_Getdatastatic"

+							}, function(result){

+									var sntpInfo = 	service.getSntpParams();

+									globalTime = new Date(parseInt(sntpInfo.sntp_year, 10),parseInt(sntpInfo.sntp_month, 10)-1, parseInt(sntpInfo.sntp_day, 10), parseInt(sntpInfo.sntp_hour, 10), parseInt(sntpInfo.sntp_minute, 10), parseInt(sntpInfo.sntp_second, 10));

+									successOverlay();

+							});

+						}

+					} else {

+						errorOverlay();

+					}

+				});

+			}

+

+            // �ֶ�/�Զ��л���Ӧ����		

+			function changeSetTimeMode() {

+				if(target.currentMode() == "manual") {

+					target.isManualSetTime(true);

+					target.isAutoSntpTime(false);

+				} else {

+					target.isManualSetTime(false);

+					target.isAutoSntpTime(true);

+				}

+				return true;

+			}

+

+            // ��ʼ��ʱ��

+			function initDateList(){

+				sv_sntpDates = [];

+				if($.inArray(parseInt(target.currentMonth(), 10), sf_smallMonth) != -1) {

+					sf_produceArray(1, 30, sv_sntpDates);

+				} else if($.inArray(parseInt(target.currentMonth(), 10), sf_bigMonth) != -1) {

+					sf_produceArray(1, 31, sv_sntpDates);

+				} else if(parseInt(target.currentYear(), 10)%4 == 0) {

+					sf_produceArray(1, 29, sv_sntpDates);

+				} else {

+					sf_produceArray(1, 28, sv_sntpDates);

+				}

+			}

+

+            // ��ʼ������������			

+			function initOtherServer(){

+				target.isOther0(target.currentServer0() == "Other");

+				target.isOther1(target.currentServer1() == "Other");

+				target.isOther2(target.currentServer2() == "Other");

+				!target.isOther0() && $("#sntp_server0").find(".error").hide();

+				!target.isOther1() && $("#sntp_server1").find(".error").hide();

+				!target.isOther2() && $("#sntp_server2").find(".error").hide();

+			}

+

+

+        }

+

+	    // ��ʼ�� ViewModel����������ͼ��

+        function init() {

+            var fwVm = new othersViewModel();

+            var container = $('#container')[0];

+		    ko.cleanNode(container);

+            ko.applyBindings(fwVm, container);

+			fwVm.updateCurrentTime();

+

+		    addInterval(function(){

+			    fwVm.updateCurrentTime();

+		    }, 1000);

+

+		    $("#sntpForm").validate({

+			    submitHandler: function(){

+				    fwVm.apply();

+			    },

+			    rules: {

+				    sntp_other_server0 : "sntp_invalid_server_name",

+				    sntp_other_server1 : "sntp_invalid_server_name",

+				    sntp_other_server2 : "sntp_invalid_server_name"

+			    }

+		    });

+        }

+

+        return {

+            init:init

+        }

+    });

+// ������� �

+

+define("adm_management","jquery knockout set service underscore CryptoJS".split(" "),

+

+    function ($, ko, config, service, _, CryptoJS) {

+

+        function manageViewModel() {

+            var target = this;

+

+            target.currentValue = ko.observable();

+            target.newValue     = ko.observable();

+            target.confirmValue = ko.observable();

+

+            function sf_changeValue() {

+            var sv_manageInfo = {};

+            if (config.PASSWORD_ENCODE) {

+                sv_manageInfo.oldValue = target.currentValue();

+                sv_manageInfo.newValue = target.newValue(); 

+            } else {            

+                var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,32}');

+

+                if (!pwdRegex.test(target.newValue())) {

+                    showConfirm("password_note_too_low", function () {

+

+                    var kparam = service.getDeviceInfoLow();

+                    var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+					var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                    var cipherold = CryptoJS.AES.encrypt(target.currentValue(), tkey, {

+                            iv: tiv,

+                            mode: CryptoJS.mode.CBC,

+                            padding: CryptoJS.pad.ZeroPadding

+                            }).toString();

+                    var ciphernew = CryptoJS.AES.encrypt(target.newValue(), tkey, {

+                            iv: tiv,

+                            mode: CryptoJS.mode.CBC,

+                            padding: CryptoJS.pad.ZeroPadding

+                            }).toString();

+

+                    sv_manageInfo.oldValue = cipherold;

+                    sv_manageInfo.newValue = ciphernew;

+

+                    showLoading();

+

+                    service.changeManageInfo(sv_manageInfo, function (resultInfo) {

+                        target.cancel();

+                        if (resultInfo && resultInfo.result == true) {

+                            successOverlay();

+                        } else {

+                            if (resultInfo && resultInfo.errorType == "badPassword") {

+                                hideLoading();

+                                showAlert("current_password_error",function(){

+                                    $("#txtCurrent").focus();

+                                });

+                            } else {

+                                errorOverlay();

+                            }

+                        }

+                    });

+                    });

+                    return;

+               }

+                var kparam = service.getDeviceInfoLow();

+                var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                var cipherold = CryptoJS.AES.encrypt(target.currentValue(), tkey, {

+                        iv: tiv,

+                        mode: CryptoJS.mode.CBC,

+                        padding: CryptoJS.pad.ZeroPadding

+                        }).toString();

+                var ciphernew = CryptoJS.AES.encrypt(target.newValue(), tkey, {

+                        iv: tiv,

+                        mode: CryptoJS.mode.CBC,

+                        padding: CryptoJS.pad.ZeroPadding

+                        }).toString();

+

+                sv_manageInfo.oldValue = cipherold;

+                sv_manageInfo.newValue = ciphernew;

+                }

+

+                showLoading();

+

+                service.changeManageInfo(sv_manageInfo, function (resultInfo) {

+                    target.cancel();

+                    if (resultInfo && resultInfo.result == true) {

+                        successOverlay();

+                    } else {

+                        if (resultInfo && resultInfo.errorType == "badPassword") {

+                            hideLoading();

+                            showAlert("current_password_error",function(){

+                                $("#txtCurrent").focus();

+                            });

+                        } else {

+                            errorOverlay();

+                        }

+                    }

+                });     

+            }

+

+            // ������������

+            function sf_cancel() {

+                target.currentValue("");

+                target.newValue("");

+                target.confirmValue("");

+            }           

+

+            target.cancel = sf_cancel;

+

+            // �޸�����

+            target.changeValue = sf_changeValue;

+        }

+

+        function init() {

+            var container = $('#container');

+            ko.cleanNode(container[0]);

+            var fwVm = new manageViewModel();

+            ko.applyBindings(fwVm, container[0]);

+

+            $('#frmPassword').validate({

+                submitHandler:function () {

+                    fwVm.changeValue();

+                },

+                rules:{

+                    txtCurrent:"manage_info_check",

+                    txtNew:"manage_info_check",

+                    txtConfirm:{ equalTo:"#txtNew"}

+                }

+            });

+        }

+

+        return {

+            init:init

+        }

+    }

+);

+// PIN�����

+

+define("adm_pin","jquery knockout set service".split(" "),

+

+    function ($, ko, config, service) {

+        var pageState = {common:0, requirePin:1, modifyPin:2, requirePuk:3, destroyed:4};

+        var pinStatus = {enable:"1", disable:"0"};

+

+

+        function pinViewModel() {

+            var target = this;

+            var sv_currentPinData     = service.getPinData();

+

+            target.isDataCard         = config.PRODUCT_TYPE == 'DATACARD';

+            target.originPinStatus    = ko.observable(sv_currentPinData.pin_status);

+

+            target.pinStatus          = ko.observable(sv_currentPinData.pin_status);

+            target.pinNumber          = ko.observable(sv_currentPinData.pinnumber);

+            target.pukNumber          = ko.observable(sv_currentPinData.puknumber);

+

+            target.currentPin         = ko.observable();

+            target.newPin             = ko.observable();

+            target.confirmPin         = ko.observable();

+

+            target.puk                = ko.observable();

+

+            target.pageState          = ko.observable();

+            // ���������ɹ���־λ

+            target.operateSuccessFlag = true;

+

+			target.callback           = sf_callback;		

+

+			function sf_callback(info) {

+                if (info && info.result == true) {

+                    target.operateSuccessFlag = true;

+                    successOverlay();

+                } else {

+                    target.operateSuccessFlag = false;

+

+                    // ���һ��ǰҪ������ʾ					 

+                    if(target.pinNumber() == 2){

+                      showAlert("last_enter_pin");    

+                    } else if(target.pukNumber() == 2){

+                      showAlert("last_enter_puk");    

+                    }

+                    else{

+                      errorOverlay();      

+                    }   

+                }

+                init(target);

+            }

+

+

+            // ȷ����ť�¼������������޸�PIN������PUK����PIN������PIN��ʹ��״̬

+

+            function sf_changePin() {

+                if (target.isConnectedNetWork()) {

+                    showAlert("cannot_operate_when_connected");

+                    return;

+                }

+

+                if (target.pageState() == pageState.common) {

+                    return;

+                }

+

+                var sv_pinPara = {

+                    oldPin:target.currentPin(),

+                    newPin:target.newPin()

+                };

+                showLoading();

+

+                if (target.pageState() == pageState.modifyPin) {

+                    service.changePin(sv_pinPara, target.callback);

+                } else if (target.pageState() == pageState.requirePuk) {

+                    sv_pinPara = {

+                        PinNumber:target.newPin(),

+                        PUKNumber:target.puk()

+                    };

+                    service.enterPUK(sv_pinPara, target.callback);

+                } else {

+                    if (target.pinStatus() == pinStatus.enable) {

+                        service.enablePin(sv_pinPara, target.callback);

+                    } else {

+                        service.disablePin(sv_pinPara, target.callback);

+                    }

+                }

+            }	

+

+

+			// ȡ���¼�����

+            function sf_cancel() {

+                target.pageState(pageState.common);

+                target.pinStatus(target.originPinStatus());

+                target.clear();

+            }		

+

+            // ���ҳ������ͼ����Ϣ

+			function sf_clear() {

+                target.confirmPin("");			

+                target.currentPin("");

+                target.newPin("");

+                target.puk("");

+                clearValidateMsg();

+            }	

+

+            // �������ݣ����õ�ǰ��ҳ��״̬

+            function sf_computePageState(i_pinData) {

+                if (i_pinData.pinnumber > 0) {

+                    //�����ɹ�ҳ��ص���ʼ״̬������ʧ�ܲ���pinnumber>0,ҳ�治��ת

+                    if (target.operateSuccessFlag) {

+                        target.cancel();

+                    } else {

+                        target.clear();

+                    }

+                } else {

+                    target.clear();

+                    if (i_pinData.puknumber > 0) {

+                        target.pageState(pageState.requirePuk);

+                    } else {

+                        target.pageState(pageState.destroyed);

+                    }

+                }

+            }

+

+            // ����PIN�޸�״̬�¼�����

+			function sf_displayModifyPinPage() {

+                if (target.isConnectedNetWork()) {

+                    showAlert("cannot_operate_when_connected");

+                    return;

+                }

+                target.pinStatus(target.originPinStatus());

+                target.pageState(pageState.modifyPin);

+                target.clear();

+            }

+

+			// ����ҳ��Ԫ�ص�ʹ��״̬

+			function sf_fixPageEnable() {

+                if (target.isConnectedNetWork()) {

+                    $('#frmPin :input').each(function () {

+                        disableBtn($(this));

+                    });

+                    clearValidateMsg();

+                } else {

+                    $('#frmPin :input').each(function () {

+                        if (this.id == "txtPin" || this.id == "btnPinApply") {

+                            if (target.pageState() == pageState.common) {

+                                disableBtn($(this));

+                                return;

+                            }

+                        }

+                        if (this.id == "btnModifyPin") {

+                            if (target.originPinStatus() != pinStatus.enable) {

+                                disableBtn($(this));

+                                return;

+                            }

+                        }

+                        if (this.id == "pinEnable" || this.id == "pinDisable") {

+                            if (target.pageState() == pageState.modifyPin) {

+                                disableBtn($(this));

+                                return;

+                            }

+                        }

+                        enableBtn($(this));

+                    });

+

+                }

+            }

+

+			// �Ƿ�������

+			function sf_isConnectedNetWork() {

+                var info = service.getConnectionInfo();

+                return info.connectStatus == "ppp_connected";

+            }

+

+            // PINʹ�ܸı�ʱ�¼�����

+			function sf_pinStatusChangeEvent() {

+                if (target.pinStatus() == target.originPinStatus()) {

+                    target.pageState(pageState.common);

+                } else {

+                    target.pageState(pageState.requirePin);

+                }

+                target.clear();

+            }

+

+            target.changePin            = sf_changePin;

+            target.cancel               = sf_cancel;

+            target.clear                = sf_clear;	

+            target.computePageState     = sf_computePageState;

+

+            target.computePageState(sv_currentPinData);			

+

+            target.displayModifyPinPage = sf_displayModifyPinPage;   

+            target.fixPageEnable        = sf_fixPageEnable;		

+            target.isConnectedNetWork   = sf_isConnectedNetWork;

+

+            target.pinStatusChangeEvent = ko.dependentObservable(sf_pinStatusChangeEvent, this);			

+        }

+

+        function init(oldViewModel) {

+

+            var fwVm = oldViewModel;		

+

+            if (fwVm) {

+                var sv_currentPinData = service.getPinData();

+                fwVm.originPinStatus(sv_currentPinData.pin_status);

+                fwVm.pinNumber(sv_currentPinData.pinnumber);

+                fwVm.pukNumber(sv_currentPinData.puknumber);

+                fwVm.computePageState(sv_currentPinData);

+            } else {

+                fwVm = new pinViewModel();

+                addInterval(function () {

+                    fwVm.fixPageEnable();

+                }, 1000);

+            }

+

+            var container = $('#container')[0];

+		    ko.cleanNode(container);

+            ko.applyBindings(fwVm, container);

+            fwVm.fixPageEnable();

+

+            $('#frmPin').validate({

+                submitHandler:function () {

+                    fwVm.changePin();

+                },

+                rules:{

+                    txtPuk:"puk_check",

+                    txtPin:"pin_check",

+                    txtNewPin:"pin_check",

+                    txtConfirmPin:{equalToPin:"#txtNewPin"}

+                }

+            });

+        }

+

+        return {

+            init:init

+        }

+    }

+);

+

+// ��������

+define("adm_quick_set","jquery knockout set service underscore CryptoJS".split(" "),

+

+    function ($, ko, config, service, _, CryptoJS) {

+

+        var sv_wifiState = {ok:0, wps_on:1, wifi_off:2};

+        var sv_apnMode   = {auto:"auto", manual:"manual"};

+        var sv_minStep   = 1;

+        var sv_maxStep   = 5;

+

+        // ��ȡ��Ȩ��ʽ

+        function sf_fetchAuthenticationModes() {

+            return _.map(config.APN_AUTH_MODES, function (item) {

+                return new Option(item.name, item.value);

+            });

+        }

+

+        // WIFI��ȫģʽѡ��

+        var sv_securityModes = _.map(config.WIFI_WEP_SUPPORT ? config.AUTH_MODES_WEP : config.AUTH_MODES, function (item) {

+            return new Option(item.name, item.value);

+        });

+

+

+        function quickSettingViewModel() {

+            var target = this;

+

+            var sv_quickSettingInfo        = service.getQuickSettingInfo();

+

+            target.currentStep            = ko.observable(sv_minStep);

+            target.ipType                 = ko.observable(sv_quickSettingInfo.pdp_type == "IP" ? "IP" : sv_quickSettingInfo.ipv6_pdp_type);			

+            target.supportIPv6            = config.IPV6_SUPPORT;

+            target.supportIpv4AndIpv6     = config.IPV4_AND_V6_SUPPORT;

+

+            target.wpsFlag                = ko.observable(sv_quickSettingInfo.WscModeOption);		

+

+            function sf_apnDisabled() {

+                return (sv_quickSettingInfo.apn_index < config.defaultApnSize || sv_quickSettingInfo.ppp_status == "ppp_connected" || sv_quickSettingInfo.ppp_status == "ppp_connecting");

+            }

+

+			function sf_apnModeDisabled() {

+                return (sv_quickSettingInfo.ppp_status == "ppp_connected" || sv_quickSettingInfo.ppp_status == "ppp_connecting" || (!target.profileName() && target.apnMode() == sv_apnMode.auto));//ѡ��Ϊ�ջ��������ӻ�������

+            }	

+

+            function sf_currAPN() {

+                var sv_APNText = sv_quickSettingInfo["APN_configtmp" + sv_quickSettingInfo.apn_index];

+                var strIPv6APN = sv_quickSettingInfo["ipv6_APN_configtmp" + sv_quickSettingInfo.apn_index];

+

+                var sv_apn     = [];

+                var sv_ipv6APNItems = [];

+

+                if (sv_APNText) {

+                    sv_apn = sv_APNText.split("($)");

+                }

+

+                if (strIPv6APN) {

+                    sv_ipv6APNItems = strIPv6APN.split("($)");

+                }

+

+                return {

+                    m_profile_name:sv_apn[0],

+                    wan_apn:sv_apn[1],

+                    ppp_auth_mode: sv_apn[4] == "" || typeof(sv_apn[4]) == "undefined" ? "" : sv_apn[4].toLowerCase(),					

+                    ppp_username:sv_apn[5],

+                    ppp_passtmp:sv_apn[6],						

+                    pdp_type: sv_apn[7],			

+                    ipv6_wan_apn:sv_ipv6APNItems[1],	

+                    ipv6_ppp_auth_mode:typeof(sv_ipv6APNItems[4]) == "undefined" || sv_ipv6APNItems[4] == ""? "" : sv_ipv6APNItems[4].toLowerCase(),

+                    ipv6_ppp_username:sv_ipv6APNItems[5],					

+                    ipv6_ppp_passtmp:sv_ipv6APNItems[6],					

+                    ipv6_pdp_type:sv_ipv6APNItems[7]			

+                }

+            }			

+

+            // ��ǰAPN����			

+            target.currAPN                = ko.computed(sf_currAPN);

+

+			target.apn                    = ko.observable(target.currAPN().wan_apn);

+			target.ipv6_apn               = ko.observable(target.currAPN().ipv6_wan_apn);

+            target.ipv6_selectedAuthMode  = ko.observable(target.currAPN().ipv6_ppp_auth_mode);				

+            target.ipv6_username          = ko.observable(target.currAPN().ipv6_ppp_username);

+            target.ipv6_password          = ko.observable(target.currAPN().ipv6_ppp_passtmp);			

+			target.profileName            = ko.observable(target.currAPN().m_profile_name);	

+			target.selectedAuthMode       = ko.observable(target.currAPN().ppp_auth_mode);

+            target.username               = ko.observable(target.currAPN().ppp_username);

+            target.password               = ko.observable(target.currAPN().ppp_passtmp);

+

+            target.transAPN               = ko.observable("apn_ipv4_apn");

+			target.transAPNIPv6           = ko.observable("apn_ipv6_apn");			

+            target.transAuthMode          = ko.observable("apn_authentication_ipv4");

+			target.transAuthModeIPv6      = ko.observable("apn_authentication_ipv6");

+            target.transUserName          = ko.observable("apn_user_name_ipv4");

+            target.transPassword          = ko.observable("apn_password_ipv4");     

+            target.transUserNameIPv6      = ko.observable("apn_user_name_ipv6");

+            target.transPasswordIPv6      = ko.observable("apn_password_ipv6");	

+

+

+

+            target.apnDisabled            = ko.computed(sf_apnDisabled);

+			target.apnMode                = ko.observable(sv_quickSettingInfo.apn_mode);	

+            target.apnModeDisabled        = ko.computed(sf_apnModeDisabled);

+            target.authModes              = ko.observableArray(sf_fetchAuthenticationModes());

+

+            if (target.ipType() == "IPv6") {

+                target.showIPv4 = false;

+                target.showIPv6 = true;

+                target.transAPNIPv6("apn");

+                target.transAuthModeIPv6("apn_authentication");

+                target.transUserNameIPv6("apn_user_name");

+                target.transPasswordIPv6("apn_password");

+            } else if (config.IPV4_AND_V6_SUPPORT && target.ipType() == "IPv4v6") {

+                target.showIPv4 = true;

+                target.showIPv6 = true;

+                //ʹ��Ĭ��

+            } else if (target.ipType() == "IP" || target.ipType() == "IPv4") {

+                target.showIPv4 = true;

+                target.showIPv6 = false;

+                target.transAPN("apn");

+                target.transAuthMode("apn_authentication");

+                target.transUserName("apn_user_name");

+                target.transPassword("apn_password");

+            } else { //pdp_type == "IPv4v6" && config.IPV4V6_SUPPORT

+                target.showIPv4 = true;

+                target.showIPv6 = false;

+                target.transAPN("apn");

+                target.transAuthMode("apn_authentication");

+                target.transUserName("apn_user_name");

+                target.transPassword("apn_password");

+            }

+

+            target.wifiDisabled                  = (sv_quickSettingInfo.wifi_cur_state != "1");

+            target.ssid                          = ko.observable(sv_quickSettingInfo.SSID1);

+            target.broadcast                     = ko.observable(sv_quickSettingInfo.HideSSID);

+	    target.hasWifiWep                    = config.WIFI_WEP_SUPPORT;

+	    target.hasWifiWpa3                   = config.WIFI_WAP3_SUPPORT;

+	    target.hasWifiWpa23                  = config.WIFI_WPA2_WAP3_SUPPORT;

+

+            target.securityModes                 = ko.observableArray(sv_securityModes);

+            target.selectedSecurityMode          = ko.observable(sv_quickSettingInfo.AuthMode);

+            target.WPAKey                        = ko.observable(sv_quickSettingInfo.WPAPSK1);

+

+            target.apnMode_display               = ko.observable("");

+

+            target.apnMode_trans                 = ko.computed(sf_apnMode_trans);

+            target.selectedAuthMode_display      = ko.computed(sf_selectedAuthMode_display);

+            target.ipv6_selectedAuthMode_display = ko.computed(sf_ipv6_selectedAuthMode_display);

+

+            target.showWifiPassword              = ko.observable(false);

+            target.showWifiPasswordHandler       = sf_showWifiPasswordHandler;

+

+			//�ж��Ƿ���802 n only��

+			var sv_adInfo                        = service.getWifiAdvance();

+			target.adBand                        = ko.observable(sv_adInfo.wifiBand);

+			target.adMode                        = ko.observable(sv_adInfo.mode);

+

+			target.encryptType                   = ko.observable(sv_quickSettingInfo.EncrypType);

+			target.keyID                         = ko.observable(sv_quickSettingInfo.DefaultKeyID);

+			target.wepPassword                   = ko.observable("");

+

+			target.getWepPassword                = sf_getWepPassword;

+			target.wepPassword(target.getWepPassword());

+			target.profileChangeHandler          = sf_profileChangeHandler;

+

+            target.broadcast_display             = ko.observable("");

+            target.broadcast_trans               = ko.computed(sf_broadcast_trans);

+

+            target.selectedSecurityMode_display  = ko.observable();   

+            target.selectedSecurityMode_trans    = ko.computed(sf_selectedSecurityMode_trans);

+

+

+            target.callback                      = sf_callback;

+            target.next                          = sf_button_next;			

+            target.previous                      = sf_button_previous;					

+            target.save                          = sf_button_save;

+

+			function sf_apnMode_trans() {

+                if (sv_apnMode.auto == target.apnMode()) {

+                    target.apnMode_display($.i18n.prop("apn_auto_apn"));

+                    return "apn_auto_apn";

+                } else {

+                    target.apnMode_display($.i18n.prop("apn_manual_apn"));

+                    return "apn_manual_apn";

+                }

+            }

+

+			function sf_broadcast_trans() {

+                if ("0" == target.broadcast()) {

+                    target.broadcast_display($.i18n.prop("enable"));

+                    return "enable";

+                } else {

+                    target.broadcast_display($.i18n.prop("disable"));

+                    return "disable";

+                }

+            }

+

+			function sf_button_next() {

+                var currentStep = target.currentStep();

+                var toStep = target.currentStep() + 1;

+                sf_changeStep(toStep);

+

+                if (currentStep == 1 && target.apnMode() == sv_apnMode.auto) {

+                    toStep = target.currentStep() + 1;

+                    sf_changeStep(toStep);

+                }

+            }

+

+			function sf_button_previous() {

+

+                var currentStep = target.currentStep();

+                var toStep = target.currentStep() - 1;

+

+                sf_changeStep(toStep);

+

+                if (currentStep == 3 && target.apnMode() == sv_apnMode.auto) {

+                    toStep = target.currentStep() - 1;

+                    sf_changeStep(toStep);

+                }

+            }

+			function sf_button_save() {

+                var submit = function () {

+                    sf_quickSetting4IPv6();

+                };

+                var result = sf_isDisabled_Wifi();

+                if(result == sv_wifiState.wifi_off){

+                    showConfirm("quick_setting_wifi_disable_confirm", submit);

+                } else if (result == sv_wifiState.wps_on) {

+                    showAlert("wps_on_info");

+                } else{

+                    showConfirm("quick_setting_param_changed_confirm", submit);//submit();

+                }

+            }

+            // ���������ύ��Ļص�����

+			function sf_callback(data) {

+                if (data.result == "success") {

+                    successOverlay();

+                    location.hash = "#network_choose";

+                }

+                else {

+                    errorOverlay();

+                }

+            }

+

+            // �任����ʱ����

+            function sf_changeStep(i_step) {

+                if (i_step > sv_maxStep) {

+                    i_step = sv_maxStep;

+                } else if (i_step < sv_minStep) {

+                    i_step = sv_minStep;

+                }

+

+                target.currentStep(i_step);

+                return true;

+            }			

+

+			function sf_ipv6_selectedAuthMode_display() {

+                var mode = target.ipv6_selectedAuthMode();

+                return sf_getAuthModeNameByValue(mode);

+            }

+			// ���ݼ�Ȩģʽ��ֵ��������

+            function sf_getAuthModeNameByValue(authMode) {

+                for (var i = 0; i < config.APN_AUTH_MODES.length; i++) {

+                    if (authMode == config.APN_AUTH_MODES[i].value) {

+                        return config.APN_AUTH_MODES[i].name;

+                    }

+                }

+            }

+

+			function sf_getWepPassword(){

+				return target.keyID() == '3' ? sv_quickSettingInfo.Key4Str1 : (target.keyID() == '2' ? sv_quickSettingInfo.Key3Str1 : target.keyID() == '1' ? sv_quickSettingInfo.Key2Str1 : sv_quickSettingInfo.Key1Str1);

+			}

+

+            function sf_isDisabled_Wifi() {

+                var s_wpsInfo = service.getWpsInfo();

+                if(s_wpsInfo.radioFlag == "0"){

+                    return sv_wifiState.wifi_off;

+                }else if (s_wpsInfo.wpsFlag == '1') {

+                    return sv_wifiState.wps_on;

+                }

+                return sv_wifiState.ok;

+            }			

+			function sf_profileChangeHandler(i_data, i_event) {

+			    $("#pwdWepKey").parent().find("label[class='error']").hide();		

+			    target.wepPassword(target.getWepPassword());

+			    return true;

+		    }

+

+           // ���������ύ(֧��IPv6��

+            function sf_quickSetting4IPv6() {

+                showLoading();

+                var useIPv4ForV6 = config.IPV4V6_SUPPORT && target.currAPN().pdp_type == "IPv4v6";

+

+                var ciphertext = "";

+                if (config.PASSWORD_ENCODE) {

+		    ciphertext = target.WPAKey();

+		} else {

+                    var kparam = service.getDeviceInfoLow();

+                    var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		    var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                    ciphertext = CryptoJS.AES.encrypt(target.WPAKey(), tkey, {

+                        iv: tiv,

+                        mode: CryptoJS.mode.CBC,

+                        padding: CryptoJS.pad.ZeroPadding

+                        }).toString();

+		}

+

+                var s_quickSettingParameters = {

+                    apn_index: sv_quickSettingInfo.apn_index,

+                    apnMode: target.apnMode(),		

+                    Encryption_Mode_hid: target.selectedSecurityMode(),	

+                    ipv6_ppp_auth_mode: useIPv4ForV6 ? target.selectedAuthMode() : target.ipv6_selectedAuthMode(),

+                    ipv6_ppp_username: useIPv4ForV6 ? target.username() : target.ipv6_username(),

+                    ipv6_ppp_passtmp: useIPv4ForV6 ? target.password() : target.ipv6_password(),	

+                    ipv6_wan_apn: useIPv4ForV6 ? target.apn() : target.ipv6_apn(),					

+                    pdp_type: target.ipType(),

+                    ppp_auth_mode: target.selectedAuthMode(),

+                    ppp_username: target.username(),

+                    ppp_passtmp: target.password(),

+                    profile_name: target.profileName(),

+                    //Ŀǰ����ģʽֻ��2�֣�����3������Ϊ�̶�ֵ

+                    //�����Ҫ����Ϊ5�֣�����ֵ��Ҫ����

+                    security_shared_mode: "NONE",					

+                    SSID_Broadcast: target.broadcast(),

+                    SSID_name: target.ssid(),

+                    wan_apn: target.apn(),		

+                    wep_default_key: 0,				

+                    WPA_ENCRYPTION_hid: target.selectedSecurityMode() == "OPEN" ? "NONE" : target.selectedSecurityMode() == "WPA2PSK" ? 1 : 2,					

+                    WPA_PreShared_Key: ciphertext

+                }

+

+				s_quickSettingParameters.wep_default_key = target.keyID();	

+

+				if(target.encryptType() == "SHARED" || target.selectedSecurityMode() == "WEP") {

+

+					s_quickSettingParameters.security_shared_mode = "WEP";

+

+                    s_quickSettingParameters.wep_key_1 = sv_quickSettingInfo.Key1Str1;

+					s_quickSettingParameters.wep_key_2 = sv_quickSettingInfo.Key2Str1;

+					s_quickSettingParameters.wep_key_3 = sv_quickSettingInfo.Key3Str1;

+					s_quickSettingParameters.wep_key_4 = sv_quickSettingInfo.Key4Str1;

+

+					var WEPSelectTmp = '0';

+

+                    if(target.wepPassword().length =='5' ||target.wepPassword().length =='13'){

+						WEPSelectTmp = '1';	

+					}else{

+						WEPSelectTmp = '0';	

+					}	

+

+					if(target.keyID() =='3'){

+						s_quickSettingParameters.wep_key_4  = target.wepPassword();

+						s_quickSettingParameters.WEP4Select = WEPSelectTmp;						

+					}else if(target.keyID() =='2'){	

+						s_quickSettingParameters.wep_key_3  = target.wepPassword();

+						s_quickSettingParameters.WEP3Select = WEPSelectTmp;						

+					}else if(target.keyID() =='1'){						

+						s_quickSettingParameters.wep_key_2  = target.wepPassword();

+						s_quickSettingParameters.WEP2Select = WEPSelectTmp;					

+					}else{

+						s_quickSettingParameters.wep_key_1  = target.wepPassword();

+						s_quickSettingParameters.WEP1Select = WEPSelectTmp;					

+					}					

+				}else if(target.encryptType() == "WPAPSKWPA2PSK") {

+					s_quickSettingParameters.security_shared_mode = "NONE";

+				}else {

+					s_quickSettingParameters.security_shared_mode = "NONE";

+				}

+

+                service.setQuickSetting4IPv6(s_quickSettingParameters, target.callback);

+            }			

+

+			function sf_selectedAuthMode_display() {

+                var mode = target.selectedAuthMode();

+                return sf_getAuthModeNameByValue(mode);

+            }

+

+            function sf_selectedSecurityMode_trans() {

+                var mode = target.selectedSecurityMode();

+				var modesOption = config.WIFI_WEP_SUPPORT ? config.AUTH_MODES_WEP : config.AUTH_MODES;

+                for (var i = 0; i < modesOption.length; i++) {

+                    if (mode == modesOption[i].value) {

+                        target.selectedSecurityMode_display($.i18n.prop("security_mode_" +  modesOption[i].value));

+                        return "security_mode_" +  modesOption[i].value;

+                    }

+                }

+            }

+

+			function sf_showWifiPasswordHandler(){

+				$("#pwdWepKey").parent().find(".error").hide();

+                $("#codeWPAKey").parent().find(".error").hide();

+                var checkbox = $("#showWifiPassword:checked");

+                if(checkbox && checkbox.length == 0){

+                    target.showWifiPassword(true);

+                }else{

+                    target.showWifiPassword(false);

+                }

+            }			

+

+        }

+

+        function init() {

+            var container = $('#container');

+            ko.cleanNode(container[0]);

+            var fwVm = new quickSettingViewModel();

+            ko.applyBindings(fwVm, container[0]);

+

+            $('#quickSettingForm').validate({

+                submitHandler:function () {

+                    if (fwVm.currentStep() < 5) {

+                        fwVm.next();

+                    } else {

+                        fwVm.save();

+                    }

+                },

+                rules:{

+                    txtAPN:"apn_check",

+                    txtIPv6APN:"apn_check",

+                    txtSSID:'ssid',

+                    pwdWepKey:{wifi_wep_password_check:true,wifi_password_check: true},

+                    txtWepKey:{wifi_wep_password_check:true,wifi_password_check: true},

+                    txtWPAKey:'wifi_password_check',

+                    codeWPAKey:'wifi_password_check',

+                    txtUserName:'ppp_username_check',

+                    txtIPv6UserName:'ppp_username_check',

+                    txtSecretCode:"ppp_secretcode_check",

+                    txtIPv6SecretCode:"ppp_secretcode_check"

+                },

+                errorPlacement:function (error, element) {

+                    var id = element.attr("id");

+                    if (id == "pwdWepKey" || id == "txtWepKey"){

+						error.insertAfter("#lblShowWepPassword");

+					} else if (id == "txtWPAKey" || id == "codeWPAKey") {

+                        error.insertAfter("#lblShowWifiPassword");

+                    } else {

+                        error.insertAfter(element);

+                    }

+                }

+            });

+        }

+

+        return {

+            init:init

+        };

+    }

+);

+

+define("main","set service knockout underscore jquery statusBar echarts".split(" "), function (set, fnc, libko, libus, libjq, barStat, echarts) {

+

+    var chartOptions = {

+        color: ['red', 'red', 'red', 'red', 'red'],	

+        series: [{

+                name: '��������',

+                type: 'pie',

+                radius: ['0', '72'],

+                itemStyle: {

+                    normal: {

+                        label: {

+                            show: false

+                        },

+                        labelLine: {

+                            show: false

+                        }

+                    }

+                },

+                data: [],

+                selectedOffset: 3

+            }

+        ],

+		animation: false,

+        title: {

+            text: '',

+            x: 'center',

+            y: 'center',

+            itemGap: 0,

+            textStyle: {

+                color: '#FFF',

+                fontFamily: '΢���ź�',

+                fontSize: 20,

+                fontWeight: 'bolder'

+            },

+            subtextStyle: {

+                color: '#FFF',

+                fontFamily: '΢���ź�',

+                fontSize: 16,

+                fontWeight: 'bolder'

+            }

+        },

+        tooltip: {

+            formatter: "{b}"

+        },

+    };

+	var languageOld = window.language;

+	var num_refresh = 0;

+	var traffic_graphic_chart = null;

+    var connStat = {

+        CONNECTED: 1,

+        DISCONNECTED: 2,

+        CONNECTING: 3,

+        DISCONNECTING: 4

+    };

+	function init() {

+        num_refresh = 0;

+        homeUtil.oldUsedData = null;

+        homeUtil.oldAlarmData = null;

+        traffic_graphic_chart = echarts.init(libjq("#traffic_graphic")[0]);

+        var container = libjq('#container')[0];

+        libko.cleanNode(container);

+        var tmp = new VmHome();

+        libko.applyBindings(tmp, container);

+		var data = fnc.getLoginData();

+		var psw_flg = data.psw_changed;

+		if (psw_flg != "1") {

+			showConfirm("password_note_first_change", function () {

+                    window.location.hash = '#pwd_mode';

+                });

+			return;

+		}										

+    }

+

+    var homeUtil = {

+        initStatus: null,

+        initShownStatus: function (data) {

+            this.initStatus = {};

+            var ipv6Mode = data.ipv6PdpType.toLowerCase().indexOf("v6") > 0;

+            if (set.RJ45_SUPPORT) {

+                var mode = checkCableMode(data.blc_wan_mode);

+                if (mode) {

+                    this.initStatus.showIpv6WanIpAddr = false;

+                    this.initStatus.showIpv4WanIpAddr = true;

+                } else if (set.IPV6_SUPPORT) {

+                    if (data.pdpType == "IP") {

+                        this.initStatus.showIpv6WanIpAddr = false;

+                        this.initStatus.showIpv4WanIpAddr = true;

+                    } else if (ipv6Mode) {

+                        if (data.ipv6PdpType == "IPv6") {

+                            this.initStatus.showIpv6WanIpAddr = true;

+                            this.initStatus.showIpv4WanIpAddr = false;

+                        } else {

+                            this.initStatus.showIpv6WanIpAddr = true;

+                            this.initStatus.showIpv4WanIpAddr = true;

+                        }

+                    }

+                } else {

+                    this.initStatus.showIpv6WanIpAddr = false;

+                    this.initStatus.showIpv4WanIpAddr = true;

+                }

+            } else {

+                if (set.IPV6_SUPPORT) {

+                    if (data.pdpType == "IP") {

+                        this.initStatus.showIpv6WanIpAddr = false;

+                        this.initStatus.showIpv4WanIpAddr = true;

+                    } else if (ipv6Mode) {

+                        if (data.ipv6PdpType == "IPv6") {

+                            this.initStatus.showIpv6WanIpAddr = true;

+                            this.initStatus.showIpv4WanIpAddr = false;

+                        } else {

+                            this.initStatus.showIpv6WanIpAddr = true;

+                            this.initStatus.showIpv4WanIpAddr = true;

+                        }

+                    }

+                } else {

+                    this.initStatus.showIpv6WanIpAddr = false;

+                    this.initStatus.showIpv4WanIpAddr = true;

+                }

+            }

+        },

+        wanIpGet: function (data) {

+            var addrInfo = {

+                wanIpAddress: '',

+                ipv6WanIpAddress: ''

+            };

+            addrInfo.wanIpAddress = verifyDeviceInfo(data.wanIpAddress);

+            addrInfo.ipv6WanIpAddress = verifyDeviceInfo(data.ipv6WanIpAddress);

+            return addrInfo;

+        },

+        cachedAPStationBasic: null,

+        cachedConnectionMode: null,

+        getCanConnectNetWork: function (param) {

+            var status = fnc.getStatusInfo();

+            if (status.simStatus != "modem_init_complete") {

+                return false;

+            }

+            var typeNetworkTmp = status.networkType.toLowerCase();

+            if (typeNetworkTmp == 'searching') {

+                return false;

+            }

+            if (typeNetworkTmp == '' || typeNetworkTmp == 'limited service') {

+                typeNetworkTmp = 'limited_service';

+            }

+            if (typeNetworkTmp == 'no service') {

+                typeNetworkTmp = 'no_service';

+            }

+            if (typeNetworkTmp == 'limited_service' || typeNetworkTmp == 'no_service') {

+                if (param.cStatus() != connStat.CONNECTED) {

+                    return false;

+                }

+            }

+            if (set.AP_STATION_SUPPORT) {

+                if (status.connectWifiStatus == "connect") {

+                    if (status.ap_station_mode == "wifi_pref") {

+                        return false;

+                    }

+                }

+            }

+            return true;

+        },

+        doConnect: function () {

+            showLoading('connecting');

+            fnc.connect({}, function (data) {

+                if (data.result) {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        },

+        refreshHomeData: function (param) {

+            var info = fnc.getConnectionInfo();

+            param.connectStatus(info.connectStatus);

+            param.canConnect(this.getCanConnectNetWork(param));

+            param.networkType(homeUtil.getNetworkType(info.networkType));

+            if (info.connectStatus == "ppp_connected") {

+                param.current_Flux(transUnit(parseInt(info.data_counter.currentReceived, 10) + parseInt(info.data_counter.currentSent, 10), false));

+                param.connected_Time(transSecond2Time(info.data_counter.currentConnectedTime));

+                param.up_Speed(transUnit(info.data_counter.uploadRate, true));

+                param.down_Speed(transUnit(info.data_counter.downloadRate, true));

+            } else {

+                param.current_Flux(transUnit(0, false));

+                param.connected_Time(transSecond2Time(0));

+                param.up_Speed(transUnit(0, true));

+                param.down_Speed(transUnit(0, true));

+            }

+            param.trafficAlertEnable(info.limitVolumeEnable);

+            if (info.limitVolumeEnable) {

+                if (info.limitVolumeType == '1') {

+                    param.trafficUsed(transUnit(parseInt(info.data_counter.monthlySent, 10) + parseInt(info.data_counter.monthlyReceived, 10), false));

+                    param.trafficLimited(transUnit(info.limitDataMonth, false));

+                } else {

+                    param.trafficUsed(transSecond2Time(info.data_counter.monthlyConnectedTime));

+                    param.trafficLimited(transSecond2Time(info.limitTimeMonth));

+                }

+            }

+            if (languageOld != window.language) {

+                languageOld = window.language;

+                num_refresh = 1;

+            }

+            if (param.showTraffic()) {

+                homeUtil.updateEcharts(info);

+            } else {

+                homeUtil.allFreeEcharts();

+            }

+            homeUtil.refreshStationInfo(param);

+        },

+        allFreeEcharts: function () {

+            var usedData = homeUtil.data.free;

+            usedData.value = 1;

+            usedData.selected = false;

+            usedData.name = libjq.i18n.prop("echarts_no");

+            chartOptions.series[0].data = [usedData];

+            chartOptions.title.text = '';

+            homeUtil.setEcharts(chartOptions, libjq.i18n.prop("echarts_no"));

+        },

+        getNetworkType: function (networkType) {

+            var typeNetworkTmp = networkType.toLowerCase();

+            if (typeNetworkTmp == '' || typeNetworkTmp == 'limited service') {

+                typeNetworkTmp = 'limited_service';

+            }

+            if (typeNetworkTmp == 'no service') {

+                typeNetworkTmp = 'no_service';

+            }

+            if (typeNetworkTmp == 'limited_service' || typeNetworkTmp == 'no_service') {

+                return libjq.i18n.prop("network_type_" + typeNetworkTmp);

+            } else {

+                return networkType;

+            }

+        },

+        data: {

+            full: {

+                value: 30,

+                name: '��������',

+                itemStyle: {

+                    normal: {

+                        color: '#DF4313'

+                    }

+                }

+            },		

+            used: {

+                value: 30,

+                name: '��ʹ��',

+                itemStyle: {

+                    normal: {

+                        color: '#8CC916'

+                    }

+                }

+            },

+            left1: {

+                value: 50,

+                name: '����ֵ��δʹ��',

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                }

+            },

+            free: {

+                value: 50,

+                name: 'δʹ��',

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                }

+            },

+            alert: {

+                value: 1,

+                name: '����ֵ',

+                itemStyle: {

+                    normal: {

+                        color: '#FF5500'

+                    }

+                }

+            },

+            alarm: {

+                value: 19.7,

+                name: '������',

+                itemStyle: {

+                    normal: {

+                        color: '#8CC916'

+                    }

+                }

+            },

+            start: {

+                value: 50,

+                name: '����ֵ��δʹ��',

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                }

+            },

+        },

+		getDataInfo: function (value) {

+            return {

+                data: /\d+(.\d+)?/.exec(value)[0],

+                unit: /[A-Z]{1,2}/.exec(value)[0]

+            }

+        },

+        oldAlarmData: null,

+        oldUsedData: null,

+        updateEcharts: function (info) {

+            var startName = libjq.i18n.prop("echarts_no");

+            num_refresh++;

+            if (num_refresh % 10 != 2) {

+                return false;

+            }

+            var total = 0,

+            used = 0,

+            reach = 0,

+            left = 0,

+            alarm = 0,

+            left1 = 0;

+            if (info.limitVolumeEnable) {

+                startName = libjq.i18n.prop("echarts_used");

+                chartOptions.series[0].data = [];

+                if (info.limitVolumeType == '1') {

+                    var limitedDataFormatted = transUnit(info.limitDataMonth, false);

+                    chartOptions.series[0].data = [];

+                    if (info.limitDataMonth == 0) {

+                        var usedData = homeUtil.data.used;

+                        usedData.value = 1;

+                        usedData.selected = false;

+                        usedData.name = libjq.i18n.prop("echarts_used");

+                        chartOptions.series[0].data.push(usedData);

+                    } else {

+                        var dataInfo = homeUtil.getDataInfo(limitedDataFormatted);

+                        total = dataInfo.data * homeUtil.getUnitValue(dataInfo.unit) * 1048576;

+                        used = parseInt(info.data_counter.monthlySent, 10) + parseInt(info.data_counter.monthlyReceived, 10);

+                        reach = total * info.limitVolumePercent / 100;

+                        if (used >= total) {

+                            var fullData = homeUtil.data.full;

+                            fullData.value = 100;

+                            fullData.name = libjq.i18n.prop("echarts_full");

+                            chartOptions.series[0].data.push(fullData);

+                            startName = libjq.i18n.prop("echarts_full");

+                        } else {

+                            if (reach - used > 0) {

+                                left1 = reach - used;

+                                left = total - reach;

+                            } else {

+                                alarm = used - reach;

+                                left = total - used;

+                            }

+                            var usedData = homeUtil.data.used;

+                            if (reach - used > 0) {

+                                usedData.value = used;

+                            } else {

+                                usedData.value = reach;

+                            }

+                            usedData.name = libjq.i18n.prop("echarts_used");

+                            chartOptions.series[0].data.push(usedData);

+                            if (left1 > 0) {

+                                var left1Data = homeUtil.data.left1;

+                                left1Data.value = left1;

+                                left1Data.name = libjq.i18n.prop("echarts_left1");

+                                chartOptions.series[0].data.push(left1Data);

+                            }

+                            var alertData = homeUtil.data.alert;

+                            alertData.value = total / 200;

+                            alertData.name = libjq.i18n.prop("echarts_alert");

+                            chartOptions.series[0].data.push(alertData);

+                            if (alarm > 0) {

+                                var alarmData = homeUtil.data.alarm;

+                                alarmData.value = alarm;

+                                alarmData.name = libjq.i18n.prop("echarts_alarm");

+                                chartOptions.series[0].data.push(alarmData);

+                            }

+                            var freeData = homeUtil.data.free;

+                            freeData.value = left;

+                            freeData.name = libjq.i18n.prop("echarts_free");

+                            chartOptions.series[0].data.push(freeData);

+                        }

+                    }

+                } else {

+                    chartOptions.series[0].data = [];

+                    if (info.limitTimeMonth == 0) {

+                        var usedData = homeUtil.data.used;

+                        usedData.value = 1;

+                        usedData.selected = false;

+                        usedData.name = libjq.i18n.prop("echarts_used");

+                        chartOptions.series[0].data.push(usedData);

+                    } else {

+                        total = info.limitTimeMonth;

+                        used = info.data_counter.monthlyConnectedTime;

+                        reach = total * info.limitVolumePercent / 100;

+                        if (used >= total) {

+                            var fullTime = homeUtil.data.full;

+                            fullTime.value = 100;

+                            fullTime.name = libjq.i18n.prop("echarts_full");

+                            chartOptions.series[0].data.push(fullTime);

+                            startName = libjq.i18n.prop("echarts_full");

+                        } else {

+                            if (reach - used > 0) {

+                                left1 = reach - used;

+                                left = total - reach;

+                            } else {

+                                alarm = used - reach;

+                                left = total - used;

+                            }

+                            var usedTime = homeUtil.data.used;

+                            if (reach - used > 0) {

+                                usedTime.value = used;

+                            } else {

+                                usedTime.value = reach;

+                            }

+                            usedTime.name = libjq.i18n.prop("echarts_used");

+                            chartOptions.series[0].data.push(usedTime);

+                            if (left1 > 0) {

+                                var left1Time = homeUtil.data.left1;

+                                left1Time.value = left1;

+                                left1Time.name = libjq.i18n.prop("echarts_left1");

+                                chartOptions.series[0].data.push(left1Time);

+                            }

+                            var alertTime = homeUtil.data.alert;

+                            alertTime.value = total / 200;

+                            alertTime.name = libjq.i18n.prop("echarts_alert");

+                            chartOptions.series[0].data.push(alertTime);

+                            if (alarm > 0) {

+                                var alarmTime = homeUtil.data.alarm;

+                                alarmTime.value = alarm;

+                                alarmTime.name = libjq.i18n.prop("echarts_alarm");

+                                chartOptions.series[0].data.push(alarmTime);

+                            }

+                            var freeTime = homeUtil.data.free;

+                            freeTime.value = left;

+                            freeTime.name = libjq.i18n.prop("echarts_free");

+                            chartOptions.series[0].data.push(freeTime);

+                        }

+                    }

+                }

+            } else {

+                var usedData = homeUtil.data.used;

+                usedData.value = 1;

+                usedData.selected = false;

+                usedData.name = libjq.i18n.prop("echarts_no");

+                chartOptions.series[0].data = [usedData];

+                chartOptions.title.text = '';

+            }

+            var firstEle = libus.find(chartOptions.series[0].data, function (n) {

+                return n.name == libjq.i18n.prop("echarts_used");

+            });

+            var alarmEle = libus.find(chartOptions.series[0].data, function (n) {

+                return n.name == libjq.i18n.prop("echarts_alarm");

+            });

+            if (!alarmEle) {

+                alarmEle = {

+                    value: 0

+                };

+            }

+            if (typeof firstEle == "undefined") {

+                homeUtil.setEcharts(chartOptions, startName);

+            } else if (homeUtil.oldUsedData != firstEle.value || homeUtil.oldAlarmData != alarmEle.value) {

+                homeUtil.oldUsedData = firstEle.value;

+                homeUtil.oldAlarmData = alarmEle.value;

+                homeUtil.setEcharts(chartOptions, startName);

+            }

+        },

+        getUnitValue: function (unit) {

+            unit = unit.toUpperCase();

+            if (unit == 'GB') {

+                return '1024';

+            } else if (unit == 'TB') {

+                return '1048576';

+            } else {

+                return '1';

+            }

+        },		

+        setEcharts: function (options, startName) {

+            var startPart = homeUtil.data.start;

+            startPart.value = 0;

+            startPart.name = startName;

+            startPart.selected = false;

+            var arr = [startPart].concat(options.series[0].data);

+            options.series[0].data = arr;

+            traffic_graphic_chart.setOption(options, true);

+            addTimeout(function () {

+                traffic_graphic_chart.resize();

+            }, 1000);

+        },

+        refreshStationInfo: function (param) {

+            param.wirelessDeviceNum(fnc.getStatusInfo().wirelessDeviceNum);

+            if (num_refresh % 10 == 2) {

+                fnc.getAttachedCableDevices({}, function (data) {

+                    param.wireDeviceNum(data.attachedDevices.length);

+                });

+            }

+        },		

+        getUnit: function (val) {

+            if (val == '1024') {

+                return 'GB';

+            } else if (val == '1048576') {

+                return 'TB';

+            } else {

+                return 'MB';

+            }

+        },

+        refreshOpmodeInfo: function (param) {

+            var obj = fnc.getOpMode();

+            param.isLoggedIn(obj.loginfo == "ok");

+            var currentMode = checkCableMode(obj.blc_wan_mode);

+            if (param.opCurMode() && !currentMode) {

+                var data = fnc.getLoginData();

+                var state = data.modem_main_state;

+                if (state == "modem_sim_undetected" || state == "modem_undetected" || state == "modem_sim_destroy" || state == "modem_waitpin" || state == "modem_waitpuk" || state == "modem_imsi_waitnck") {

+                    window.location.reload();

+                    return;

+                }

+            }

+            param.opCurMode(currentMode);

+            if (currentMode && obj.ethwan_mode == "DHCP") {

+                param.enableFlag(false);

+            } else if ((!currentMode && obj.ppp_status != "ppp_disconnected") || (currentMode && obj.rj45_state != "idle" && obj.rj45_state != "dead")) {

+                param.enableFlag(true);

+            } else {

+                param.enableFlag(false);

+            }

+            var mode = (obj.blc_wan_mode == "AUTO_PPP" || obj.blc_wan_mode == "AUTO_PPPOE") ? "AUTO" : obj.blc_wan_mode;

+            var currentOpMode = "";

+            switch (mode) {

+            case "AUTO":

+                currentOpMode = "opmode_auto";

+                break;

+            case "PPPOE":

+                currentOpMode = "opmode_cable";

+                break;

+            case "PPP":

+                currentOpMode = "opmode_gateway";

+                break;

+            default:

+                break;

+            }

+            libjq("#opmode").attr("data-trans", currentOpMode).text(libjq.i18n.prop(currentOpMode));

+            param.isShowHomeConnect(!currentMode);

+            param.showTraffic(set.TRAFFIC_SUPPORT && !currentMode);

+            param.isSupportQuicksetting(set.HAS_QUICK_SETTING && !currentMode);

+        }

+    };

+	function VmHome() {

+        var target = this;

+        target.hasSms = set.HAS_SMS;

+        target.hasPhonebook = set.HAS_PHONEBOOK;

+        target.isSupportSD = set.SD_CARD_SUPPORT;

+        target.isCPE = set.PRODUCT_TYPE == 'CPE';

+        target.hasRj45 = set.RJ45_SUPPORT;

+        target.notDataCard = set.PRODUCT_TYPE != 'DATACARD';

+        target.hasParentalControl = set.HAS_PARENTAL_CONTROL;

+        var wifiInfo = fnc.getWifiBasic();

+        if (set.WIFI_SUPPORT_QR_SWITCH) {

+            target.showQRCode = set.WIFI_SUPPORT_QR_CODE && wifiInfo.show_qrcode_flag;

+        } else {

+            target.showQRCode = set.WIFI_SUPPORT_QR_CODE;

+        }

+        if(set.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_ssid_wifikey.png?_=' + libjq.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        if (target.hasRj45) {

+            var opModeObj = checkCableMode(fnc.getOpMode().blc_wan_mode);

+            target.opCurMode = libko.observable(opModeObj);

+            target.isShowHomeConnect = libko.observable(!opModeObj);

+            target.showTraffic = libko.observable(set.TRAFFIC_SUPPORT && !opModeObj);

+            target.isSupportQuicksetting = libko.observable(set.HAS_QUICK_SETTING && !opModeObj);

+        } else {

+            target.isShowHomeConnect = libko.observable(true);

+            target.showTraffic = libko.observable(set.TRAFFIC_SUPPORT);

+            target.isSupportQuicksetting = libko.observable(set.HAS_QUICK_SETTING);

+        }

+        if (set.PRODUCT_TYPE == 'DATACARD') {

+            libjq('#home_image').addClass('data-card');

+        }

+        var info = fnc.getConnectionInfo();

+        target.networkType = libko.observable(homeUtil.getNetworkType(info.networkType));

+        target.connectStatus = libko.observable(info.connectStatus);

+        target.canConnect = libko.observable(false);

+        target.cStatus = libko.computed(function () {

+            if (target.connectStatus().indexOf('_connected') != -1) {

+                return connStat.CONNECTED;

+            } else if (target.connectStatus().indexOf('_disconnecting') != -1) {

+                return connStat.DISCONNECTING;

+            } else if (target.connectStatus().indexOf('_connecting') != -1) {

+                return connStat.CONNECTING;

+            } else {

+                return connStat.DISCONNECTED;

+            }

+        });

+        target.current_Flux = libko.observable(transUnit(0, false));

+        target.connected_Time = libko.observable(transSecond2Time(0));

+        target.up_Speed = libko.observable(transUnit(0, true));

+        target.down_Speed = libko.observable(transUnit(0, true));

+        target.isLoggedIn = libko.observable(false);

+        target.enableFlag = libko.observable(true);

+        target.simSerialNumber = libko.observable('');

+        target.imei = libko.observable('');

+        target.imsi = libko.observable('');

+        target.ssid = libko.observable('');

+        target.hasWifi = set.HAS_WIFI;

+        target.showMultiSsid = libko.observable(set.HAS_MULTI_SSID && wifiInfo.multi_ssid_enable == "1");

+        target.trafficAlertEnable = libko.observable(false);

+        target.trafficUsed = libko.observable('');

+        target.trafficLimited = libko.observable('');

+        target.wireDeviceNum = libko.observable(fnc.getAttachedCableDevices().attachedDevices.length);

+        target.wirelessDeviceNum = libko.observable(fnc.getStatusInfo().wirelessDeviceNum);

+        target.showOpModeWindow = function () {

+            if (target.enableFlag()) {

+                return;

+            }

+            showSettingWindow("change_mode", "opmode_popup", "opmode_popup", 400, 300, function () {});

+        };

+        target.currentOpMode = libko.observable("0");

+        var popoverShown = false;

+        libjq('#showDetailInfo').popover({

+            html: true,

+            placement: 'top',

+            trigger: 'focus',

+            title: function () {

+                return libjq.i18n.prop('device_info')

+            },

+            content: function () {

+                return getDetailInfoContent();

+            }

+        }).on('shown.bs.popover', function () {

+            popoverShown = true;

+        }).on('hidden.bs.popover', function () {

+            popoverShown = false;

+        });

+        function fetchDeviceInfo() {

+            var data = fnc.getDeviceInfo();

+            target.simSerialNumber(verifyDeviceInfo(data.simSerialNumber));

+            target.imei(verifyDeviceInfo(data.imei));

+            target.imsi(verifyDeviceInfo(data.imsi));

+            target.ssid(verifyDeviceInfo(data.ssid));

+            target.showMultiSsid(set.HAS_MULTI_SSID && data.multi_ssid_enable == "1");

+            return data;

+        }

+        fetchDeviceInfo();

+        function getDetailInfoContent() {

+            var data = fetchDeviceInfo();

+            homeUtil.initShownStatus(data);

+            var addrInfo = homeUtil.wanIpGet(data);

+            var compiled = libus.template(libjq("#detailInfoTmpl").html());

+            var tmpl = compiled({

+                simSerialNumber: verifyDeviceInfo(data.simSerialNumber),

+                imei: verifyDeviceInfo(data.imei),

+                imsi: verifyDeviceInfo(data.imsi),

+                signal: signalFormat(data.signal),

+                hasWifi: set.HAS_WIFI,

+                isCPE: set.PRODUCT_TYPE == 'CPE',

+                hasRj45: set.RJ45_SUPPORT,

+                showMultiSsid: set.HAS_MULTI_SSID && data.multi_ssid_enable == "1",

+                ssid: verifyDeviceInfo(data.ssid),

+                max_access_num: verifyDeviceInfo(data.max_access_num),

+                m_ssid: verifyDeviceInfo(data.m_ssid),

+                m_max_access_num: verifyDeviceInfo(data.m_max_access_num),

+                wifi_long_mode: "wifi_des_" + data.wifiRange,

+                lanDomain: verifyDeviceInfo(data.lanDomain),

+                ipAddress: verifyDeviceInfo(data.ipAddress),

+                showMacAddress: set.SHOW_MAC_ADDRESS,

+                macAddress: verifyDeviceInfo(data.macAddress),

+                showIpv4WanIpAddr: homeUtil.initStatus.showIpv4WanIpAddr,

+                wanIpAddress: addrInfo.wanIpAddress,

+                showIpv6WanIpAddr: homeUtil.initStatus.showIpv6WanIpAddr,

+                ipv6WanIpAddress: addrInfo.ipv6WanIpAddress,

+                sw_version: verifyDeviceInfo(data.sw_version),

+                hw_version: verifyDeviceInfo(data.hw_version)

+            });

+            return libjq(tmpl).translate();

+        }

+        target.connectHandler = function () {

+            if (target.connectStatus() == "ppp_connected") {

+                showLoading('disconnecting');

+                fnc.disconnect({}, function (data) {

+                    if (data.result) {

+                        successOverlay();

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            } else {

+                if (fnc.getStatusInfo().roamingStatus) {

+                    showConfirm('dial_roaming_connect', function () {

+                        target.connect();

+                    });

+                } else {

+                    target.connect();

+                }

+            }

+        };

+        target.connect = function () {

+            var statusInfo = fnc.getStatusInfo();

+            var trafficResult = barStat.getTrafficResult(statusInfo);

+            if (statusInfo.limitVolumeEnable && trafficResult.showConfirm) {

+                var confirmMsg = null;

+                if (trafficResult.usedPercent > 100) {

+                    confirmMsg = {

+                        msg: 'traffic_beyond_connect_msg'

+                    };

+                    barStat.setTrafficAlertPopuped(true);

+                } else {

+                    confirmMsg = {

+                        msg: 'traffic_limit_connect_msg',

+                        params: [trafficResult.limitPercent]

+                    };

+                    barStat.setTrafficAlert100Popuped(false);

+                }

+                showConfirm(confirmMsg, function () {

+                    homeUtil.doConnect();

+                });

+            } else {

+                homeUtil.doConnect();

+            }

+        };

+        fnc.getSignalStrength({}, function (data) {

+            var signalTxt = signalFormat(convertSignal(data));

+            libjq("#fresh_signal_strength").text(signalTxt);

+            if (popoverShown) {

+                libjq("#popoverSignalTxt").text(signalTxt);

+            }

+        });

+        homeUtil.refreshHomeData(target);

+        addInterval(function () {

+            fnc.getSignalStrength({}, function (data) {

+                var signalTxt = signalFormat(convertSignal(data));

+                libjq("#fresh_signal_strength").text(signalTxt);

+                if (popoverShown) {

+                    libjq("#popoverSignalTxt").text(signalTxt);

+                }

+            });

+            homeUtil.refreshHomeData(target);

+        }, 1000);

+        if (target.hasRj45) {

+            homeUtil.refreshOpmodeInfo(target);

+            addInterval(function () {

+                homeUtil.refreshOpmodeInfo(target);

+            }, 1000);

+        }

+        target.showNetworkSettingsWindow = function () {

+            if (target.hasRj45) {

+                fnc.getOpMode({}, function (data) {

+                    var mode = checkCableMode(data.blc_wan_mode);

+                    if (mode) {

+                        window.location.hash = '#network_set';

+                    } else {

+                        window.location.hash = '#conn_set';

+                    }

+                });

+            } else {

+                window.location.hash = '#conn_set';

+            }

+        }

+    };

+    return {

+        init: init

+    };

+});

+

+

+define("language","knockout service jquery set underscore".split(" "), 

+    function(ko, service, $, config, _) {

+

+    //  ��ȡ��ǰ������

+    function getCurrentLanguage() {

+        return service.getLanguage();

+    }		

+

+    //  �������������������Դ������ҳ���ϵ�body����

+    //  @param {String} current ������:zh-cn

+    function loadLanguageAndRefresh(current){

+        window.CURRENT_LANGUAGE = current;

+        $("body").attr('lang', current);

+        $.i18n.properties({

+            name:'Messages',

+            path:'i18n/',

+            mode:'map',

+            cache: true,

+            language:current,

+            callback: function() {

+                jQuery.validator.messages = $.i18n.map;

+                $('body').translate();

+            }

+        });

+    }

+

+	window.language = null;

+

+

+    function LanguageViewModel() {

+        var target = this;

+        var currentLan = getCurrentLanguage();

+        var languages = _.map(config.LANGUAGES, function(item) {

+            return new Option(item.name, item.value);

+        });

+

+        document.title = config.WEBUI_TITLE;

+        if($('#webui_title')[0]) {

+            $('#webui_title').html(config.WEBUI_TITLE);

+        }

+

+        target.languages   = ko.observableArray(languages);

+        target.currentLan = ko.observable(currentLan.Language);

+		window.language      = target.currentLan();

+

+        //  �л������¼�����

+        //  @event langChangeHandler 

+        target.langChangeHandler = function(info, event) {

+            clearValidateMsg();

+

+            service.setLanguage({Language: target.currentLan()}, function() {

+                loadLanguageAndRefresh(target.currentLan());

+				window.language = target.currentLan();

+            });

+        };

+

+        // ���������б���ˢ�½���

+        loadLanguageAndRefresh(target.currentLan());

+    }

+

+    //  ��ʼ������VM����

+    function init() {

+        ko.applyBindings(new LanguageViewModel(), $('#language')[0]);

+    }

+

+    return {

+        init: init

+    };

+});

+

+

+// ��½ ģ��

+define("entry","jquery knockout set service underscore menu logout CryptoJS".split(" "), 

+	function($, ko,config, service, _, menu, logout, CryptoJS) {

+

+

+        var pageState      = {LOGIN:0, WAIT_PIN:1, WAIT_PUK:2, PUK_LOCKED:3, LOGGEDIN:4, LOADING:5};

+        var timer          = loginStatusCheckingTimer();

+        var loginLockTimer = 0;

+        var lastLoginStatus = "0";

+

+        function loginViewModel() {

+            var target        = this;

+            var data        = service.getLoginData();

+            var loginStatus = service.getLoginStatus();

+

+            target.confirmPIN           = ko.observable();	

+            target.leftSeconds          = ko.observable(0);				

+            target.loginCount           = ko.observable(0);

+            target.loginSecuritySupport = ko.observable(config.LOGIN_SECURITY_SUPPORT);

+            target.newPIN               = ko.observable();			

+            target.password             = ko.observable();

+            target.PIN                  = ko.observable();

+            target.pinNumber            = ko.observable(data.pinnumber);			

+            target.PUK                  = ko.observable();

+            target.pukNumber            = ko.observable(data.puknumber);	

+            target.showEntrance         = ko.observable(false);

+            target.sharePathInvalid     = ko.observable(false);			

+            target.uiLoginTimer         = ko.observable(300);

+

+            // ע��˳�򣬵���ǰ����޷�ˢ�³�����

+            target.accountLocked        = ko.computed(function () {

+                return target.loginCount() == config.MAX_LOGIN_COUNT && target.leftSeconds() != '-1';

+            });			

+

+            target.leftUnlockTime       = ko.computed(function () {

+                target.leftSeconds();

+                var formatted = transSecond2Time(target.uiLoginTimer());

+                return formatted.substring(formatted.indexOf(':') + 1, formatted.length);

+            });

+

+

+            if(config.SD_CARD_SUPPORT){

+                service.getSDConfiguration({}, function (data) {

+                    target.showEntrance(data.sd_status == "1" && data.share_status == "1" && data.sd_mode == "0");

+                    if(target.showEntrance()){

+                        service.checkFileExists({

+                            path: data.share_file

+                        }, function (data1) {

+                            if (data1.status == 'exist' || data1.status == 'processing') {

+                                target.sharePathInvalid(false);

+                            } else {

+                                target.sharePathInvalid(true);

+                            }

+                        });

+                    }

+                });

+            }

+

+            var state = computePageState(loginStatus, data);

+            target.pageState = ko.observable(state);

+            if (state == pageState.LOADING) {

+                addTimeout(refreshPage, 500);

+            }

+            setFocus();

+

+

+            // login �¼�����

+

+            target.login = function () {

+                if(config.LOGIN_SECURITY_SUPPORT && target.accountLocked()){

+                    showAlert("password_error_account_lock_time", function () {

+                        setFocus();

+                    });

+                    return false;

+                }

+                target.pageState(pageState.LOADING);

+                window.clearInterval(timer);

+                var ciphertext = "";

+                if (config.PASSWORD_ENCODE) {

+		    ciphertext = target.password();

+		} else {

+                    var kparam = service.getDeviceInfoLow();

+                    var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		    var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                    ciphertext = CryptoJS.AES.encrypt(target.password(), tkey, {

+                        iv: tiv,

+                        mode: CryptoJS.mode.CBC,

+                        padding: CryptoJS.pad.ZeroPadding

+                        }).toString();

+		}

+                service.login({

+                    password:ciphertext

+                }, function (info) {

+                    setTimeout(function () {

+                        timer = loginStatusCheckingTimer();

+                    }, 1300);

+                    if (info.result) {

+                        target.pageState(pageState.LOGGEDIN);

+                        if(config.LOGIN_SECURITY_SUPPORT){

+                            target.loginCount(0);

+                            target.uiLoginTimer(300);

+                            clearInterval(loginLockTimer);

+                        }

+                        $("#container").empty();

+                        window.location.hash = "#main";

+                        logout.init();

+                    } else {

+                        target.password("");

+                        if(config.LOGIN_SECURITY_SUPPORT){

+                            target.checkLoginData(function(){

+                                if (target.loginCount() == config.MAX_LOGIN_COUNT) {

+                                    showAlert("password_error_five_times", function () {

+                                        setFocus();

+                                    });

+                                    target.startLoginLockInterval();

+                                } else {

+                                    showAlert({msg: 'password_error_left', params: [config.MAX_LOGIN_COUNT - target.loginCount()]}, function () {

+                                        setFocus();

+                                    });

+                                }

+                            });

+                        }else {

+                            showAlert("password_error", function () {

+                                setFocus();

+                            });

+                        }

+                        target.pageState(pageState.LOGIN);

+                    }

+                });

+            };

+

+

+

+

+            // ��ȡ��¼�����Ϣ          

+            target.checkLoginData = function(cb){

+                service.getLoginData({}, function(r){

+                    var failTimes = parseInt(r.psw_fail_num_str, 10);

+                    target.loginCount(config.MAX_LOGIN_COUNT - failTimes);

+                    target.leftSeconds(r.login_lock_time);

+                    target.uiLoginTimer(r.login_lock_time);

+                    if($.isFunction(cb)){

+                        cb();

+                    } else if (target.loginCount() == config.MAX_LOGIN_COUNT) {

+                        target.startLoginLockInterval();

+                    }

+                });

+            };

+

+            // ��������ʱ��ʱ����

+            target.startLoginLockInterval = function () {

+                loginLockTimer = setInterval(function () {

+                    service.getLoginData({}, function (data) {

+                        if (data.login_lock_time <= 0 || data.psw_fail_num_str == 5) {

+                            target.loginCount(0);

+                            clearInterval(loginLockTimer);

+                        }

+                        if(target.leftSeconds() != data.login_lock_time){

+                            target.leftSeconds(data.login_lock_time);

+                            target.uiLoginTimer(data.login_lock_time);

+                        } else {

+                            target.uiLoginTimer(target.uiLoginTimer() > 0 ? target.uiLoginTimer() - 1 : 0);

+                        }

+                    });

+                }, 1000);

+            };            

+

+            target.checkLoginData();

+

+

+

+            // ��֤����PIN�¼�����

+            target.enterPIN = function () {

+                target.pageState(pageState.LOADING);

+                var pin = target.PIN();

+                service.enterPIN({

+                    PinNumber:pin

+                }, function (data) {

+                    if (!data.result) {

+                        showAlert("pin_error", function () {

+                            refreshPage();

+                        });

+                        target.PIN('');

+                    } else {

+                        refreshPage();

+                    }

+                });

+            };

+

+            function setFocus(){

+                setTimeout(function () {

+                    var txtAdmin = $('#txtAdmin:visible');

+                    var txtPIN = $('#txtPIN:visible');

+                    var txtPUK = $('#txtPUK:visible');

+                    if (txtAdmin.length > 0) {

+                        txtAdmin.focus();

+                    } else if (txtPIN.length > 0) {

+                        txtPIN.focus();

+                    } else if (txtPUK.length > 0) {

+                        txtPUK.focus();

+                    }

+                }, 100);

+            }            

+

+

+            // ˢ��ҳ��״̬           

+            function refreshPage() {

+                var data = service.getLoginData();

+                var loginStatus = service.getLoginStatus();

+                var state = computePageState(loginStatus, data);

+                if (state == pageState.LOADING) {

+                    addTimeout(refreshPage, 500);

+                } else {

+                    target.pageState(state);

+                    target.pinNumber(data.pinnumber);

+                    target.pukNumber(data.puknumber);

+                }

+                setFocus();

+            }

+

+            // ����PUK������PIN�¼�����

+            target.enterPUK = function () {

+                target.pageState(pageState.LOADING);

+                var newPIN = target.newPIN();

+                var confirmPIN = target.confirmPIN();

+                var params = {};

+                params.PinNumber = newPIN;

+                params.PUKNumber = target.PUK();

+                service.enterPUK(params, function (data) {

+                    if (!data.result) {

+                        showAlert("puk_error", function () {

+                            refreshPage();

+                        });

+                        target.PUK('');

+                        target.newPIN('');

+                        target.confirmPIN('');

+                    } else {

+                        refreshPage();

+                    }

+                });

+            };            

+

+

+

+            // ���ݵ�¼״̬��SIM��״̬����ҳ��״̬

+            function checkPinAfterLogin(loginStatus, data) {

+                if (loginStatus.status == "loggedIn") {

+                    var currentState = data.modem_main_state; // cov_2

+                    if (currentState == "modem_waitpin") {

+                        return pageState.WAIT_PIN;

+                    } else if ((currentState == "modem_waitpuk" || data.pinnumber == 0) && (data.puknumber != 0)) {

+                        return pageState.WAIT_PUK;

+                    } else if ((data.puknumber == 0 || currentState == "modem_sim_destroy")

+                        && currentState != "modem_sim_undetected" && currentState != "modem_undetected") {

+                        return pageState.PUK_LOCKED;

+                    } else {

+                        return pageState.LOGGEDIN;

+                    }

+                } else {

+                    var currentState = data.modem_main_state;

+                    if ($.inArray(currentState, config.TEMPORARY_MODEM_MAIN_STATE) != -1) {

+                        return pageState.LOADING;

+                    } else {

+                        return pageState.LOGIN;

+                    }

+                }

+            }			

+

+            // ���ݵ�¼״̬��SIM��״̬����ҳ��״̬

+            function computePageState(loginStatus, data) {

+                //PX-880 �ȵ�¼�ٽ���PIN��֤������router���ԭ�򣬵�¼��PIN��֤���ڵ�¼ҳ����У������ݿ�����֤����һ�¡�

+                if (config.LOGIN_THEN_CHECK_PIN) {

+                    return checkPinAfterLogin(loginStatus, data);

+                } else {

+                    return loginAfterCheckPin(loginStatus, data);

+                }

+            }

+

+            // ���ݵ�¼״̬��SIM��״̬����ҳ��״̬

+            function loginAfterCheckPin(loginStatus, data) {

+                if (loginStatus.status == "loggedIn") {

+                    return pageState.LOGGEDIN;

+                } else {

+                    var currentState = data.modem_main_state;

+						if ($.inArray(currentState, config.TEMPORARY_MODEM_MAIN_STATE) != -1) {

+							return pageState.LOADING;

+						} else if (currentState == "modem_waitpin") {

+							return pageState.WAIT_PIN;

+						} else if ((currentState == "modem_waitpuk" || parseInt(data.pinnumber) === 0) && (parseInt(data.puknumber) != 0)) {

+							return pageState.WAIT_PUK;

+						} else if ((parseInt(data.puknumber) === 0 || currentState == "modem_sim_destroy") && currentState != "modem_sim_undetected" && currentState != "modem_undetected") {

+							return pageState.PUK_LOCKED;

+						} else {

+							return pageState.LOGIN;

+					}                    

+                }

+            }

+        }

+

+

+        // ��鵱ǰwindow.location.hash���쳣����ת��index.html      

+        function gotoLogin() {

+            if (window.location.hash != config.defaultRoute && _.indexOf(config.GUEST_HASH, window.location.hash) == -1) {

+                if (!manualLogout && lastLoginStatus == "1") {

+                    manualLogout = false;

+                    lastLoginStatus = 'UNREAL';

+                    showAlert('need_login_again', function () {

+                        window.location = "index.html";

+                    });

+                } else if (lastLoginStatus == 'UNREAL') {

+                    //do nothing, only popup need_login_again alert one time

+                    return;

+                } else {

+                    window.location = "index.html";

+                }

+            }

+        }

+

+        // ��ʱ����¼״̬      

+        function loginStatusCheckingTimer() {

+            return setInterval(function () {

+                var info = service.getStatusInfo();

+                if (!info.isLoggedIn) {

+                    gotoLogin();

+                    return;

+                }

+                lastLoginStatus = service.getStatusInfo().isLoggedIn ? "1" : "0";

+            }, 1000);

+        }	

+

+        function init() {

+            var info = service.getStatusInfo();

+            if (info.isLoggedIn) {

+                window.location.hash = '#main';

+                return;

+            }

+

+            var container = $('#container')[0];

+            ko.cleanNode(container);

+            var fwVm = new loginViewModel();

+            ko.applyBindings(fwVm, container);

+

+            $('#frmLogin').validate({

+                submitHandler:function () {

+                    fwVm.login();

+                },

+                rules: {

+                    txtAdmin: 'login_password_length_check'

+                }

+            });

+            $('#frmPIN').validate({

+                submitHandler:function () {

+                    fwVm.enterPIN();

+                },

+                rules:{

+                    txtPIN:"pin_check"

+                }

+            });

+            $('#frmPUK').validate({

+                submitHandler:function () {

+                    fwVm.enterPUK();

+                },

+                rules:{

+                    txtNewPIN:"pin_check",

+                    txtConfirmPIN:{equalToPin:"#txtNewPIN"},

+                    txtPUK:"puk_check"

+                }

+            });

+        }

+

+

+        return {

+            init:init,

+            gotoLogin:gotoLogin

+        };

+    });

+

+

+// Logout �

+define("logout","set service knockout underscore jquery".split(" "),

+    function (config, service, ko, _, $) {

+

+    function logoutViewModel() {

+        var target = this;

+        // ��ȡ�Ƿ��¼

+        var loginFlag = function () {

+            var loginInfo = service.getLoginStatus();

+            return (loginInfo.status == "loggedIn");

+        }

+        ();

+        target.loggedIn = ko.observable(loginFlag);

+

+        // �˳�ϵͳ

+        target.logout = function () {

+            showConfirm("confirm_logout", function () {

+                manualLogout = true;

+                service.logout({}, setLocation());

+            });

+        };

+

+        // �Ƿ���ʾ�˳���ť

+        target.showLogout = function () {

+            if (config.HAS_LOGIN) {

+                return target.loggedIn();

+            } else {

+                return false;

+            }

+        };

+    }

+    function setLocation() {

+        window.location = 'index.html';

+    }

+    function initialize() {

+        var fwVm = new logoutViewModel();

+        bindContainer(fwVm);

+    }

+    function bindContainer(fwVm) {

+        var con = $('#logout')[0];

+        ko.cleanNode(con);

+        ko.applyBindings(fwVm, con);

+    }

+    return {

+        init: initialize

+    };

+});

+

+// operation mode �

+define("opmode","knockout service jquery set underscore".split(" "),

+

+    function (ko, service, $, config, _) {

+

+	function currentOperationModeViewMode(){

+		var target = this;

+		target.isLoggedIn = ko.observable(false);	

+		target.enableFlag = ko.observable(false);

+

+		target.showOpModeWindow = function () {

+			showSettingWindow("change_mode", "opmode_popup", "opmode_popup", 400, 300, function () {

+			});

+		};

+		target.currentOpMode = ko.observable("0");

+

+		service.getOpMode({}, function(info){

+			target.isLoggedIn(info.loginfo == "ok");

+			if (info.opms_wan_mode != "PPP" && info.rj45_state != "idle" && info.rj45_state != "dead") {

+				target.enableFlag(false);

+			} else if (info.opms_wan_mode == "PPP" && info.ppp_status != "ppp_disconnected") {

+				target.enableFlag(false);

+			} else if(info.opms_wan_mode == "DHCP"){

+				target.enableFlag(true);

+			} else {

+				target.enableFlag(true);

+			}

+

+			var opmsWanMode = (info.opms_wan_mode == "DHCP" || info.opms_wan_mode == "STATIC") ? "PPPOE" : info.opms_wan_mode;

+

+			var currentOperationMode = "";

+			switch(opmsWanMode){

+				case "BRIDGE":

+					currentOperationMode = "opmode_bridge";

+					break;

+				case "PPP":

+					currentOperationMode = "opmode_gateway";

+					break;					

+				case "PPPOE":

+					currentOperationMode = "opmode_cable";

+					break;

+				default:

+					break;

+			}

+			$("#opmode").attr("data-trans", currentOperationMode).text($.i18n.prop(currentOperationMode));

+		});

+        // ��ʱ��ѯ����ģʽ���״̬�����ý���״̬

+		setInterval(function(){

+			var object = service.getConnectionInfo();

+			if(object.opms_wan_mode == "DHCP") {

+				target.enableFlag(true);

+			} else if((object.opms_wan_mode == "PPP" && object.ppp_status != "ppp_disconnected") || (object.opms_wan_mode != "PPP" && object.rj45_state != "idle" && object.rj45_state != "dead")) {

+				target.enableFlag(false);

+			} else {

+				target.enableFlag(true);

+			}

+		}, 1000);

+	}

+

+	function init() {

+		var container = $('#currentOpMode')[0];

+        ko.cleanNode(container);

+        var fwVm = new currentOperationModeViewMode();

+        ko.applyBindings(fwVm, container);

+	}

+

+	return {

+		init:init

+	};

+});

+

+// operation mode popup�

+

+define("opmode_popup","knockout service jquery set underscore".split(" "),

+

+    function (ko, service, $, config, _) {

+

+    function operationModeViewMode() {

+		var target = this;

+		var currentSelectedOperationMode = "";

+		target.selectedMode = ko.observable("0");	

+

+	    // ��ʼ������ģʽ��ʾ	

+		service.getOpMode({}, function(info){

+			if(info.blc_wan_mode == "AUTO_PPP"){

+                currentSelectedOperationMode = "AUTO";

+            }else if(info.blc_wan_mode == "AUTO_PPPOE"){

+                currentSelectedOperationMode = "AUTO";

+            }else if(info.blc_wan_mode == "PPPOE"){

+                currentSelectedOperationMode = "PPPOE";

+            }else{

+                currentSelectedOperationMode = info.blc_wan_mode;

+            }

+			target.selectedMode(currentSelectedOperationMode);

+		});

+

+	    // ģʽ����/�л�	

+		target.changeOpMode = function(){

+			var userSelectedOperationMode = $('input:radio[name="opMode"]:checked').val();

+            var messageText = "";

+			if(userSelectedOperationMode == currentSelectedOperationMode) {

+				hidePopupSettingWindow();

+				return;

+			}

+            if(userSelectedOperationMode == "LTE_BRIDGE"){

+                messageText = "opmode_msg3";

+            }else{

+                messageText = "opmode_msg2";

+            }

+			showConfirm(messageText, function(){

+                showLoading();

+				service.SetOperationMode({

+					opMode: userSelectedOperationMode

+				},function(info){

+					if (info && info.result == "success") {

+						var currentOperationMode = "";

+						switch(userSelectedOperationMode){

+							case "AUTO":

+								currentOperationMode = "opmode_auto"

+								break;

+							case "PPP":

+								currentOperationMode = "opmode_gateway";

+								break;

+							case "PPPOE":

+								currentOperationMode = "opmode_cable";

+								break;								

+							default:

+								break;

+						}

+						$("#opmode").attr("data-trans", currentOperationMode).text($.i18n.prop(currentOperationMode));

+						successOverlay();						

+					} else {

+						errorOverlay();

+					}

+				});

+			});

+

+		}

+

+	}

+

+	function init() {

+		var fwVm = new operationModeViewMode();

+		ko.applyBindings(fwVm, $('#popupSettingWindow')[0]);

+

+		$("#opmode_form").validate({

+			submitHandler: function(){

+				fwVm.changeOpMode();

+			}

+		});

+	}

+

+	return {

+		init:init

+	};

+});

+

+define("router","underscore jquery menu set service".split(" "),

+    function (_, $, menu, config, service) {

+    var currentHash = '';

+    var container = $('#container');

+

+    //�뿪����ʱ����Ƿ��������޸ģ����������ʾ

+    checkFormContentModify = function (href) {

+        if (config.CONTENT_MODIFIED.modified && window.location.hash != href) {

+            if (config.CONTENT_MODIFIED.message == 'sms_to_save_draft') {

+                config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                config.resetContentModifyValue();

+                window.location.hash = href;

+            } else {

+                showConfirm(config.CONTENT_MODIFIED.message, {

+                    ok: function () {

+                        config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                        config.resetContentModifyValue();

+                        window.location.hash = href;

+                    },

+                    no: function () {

+                        var result = config.CONTENT_MODIFIED.callback.no(config.CONTENT_MODIFIED.data);

+                        if (!result) {

+                            window.location.hash = href;

+                            config.resetContentModifyValue();

+                        }

+                    }

+                });

+            }

+            return false;

+        } else {

+            return true;

+        }

+    };

+

+    //��ʱ�鿴SIM����״̬������ǰSIM��״̬��Ϊ����״̬��δ��ʾnosimcardҳ�棬����ʾnosimcardҳ��,�Ա��ⲻ�ر�webui�����²���豸�󣬲����ж�SIM��״̬������

+    function checkSimCardStatus() {

+        setInterval(function () {

+            var data = service.getStatusInfo();

+            var match = menu.findMenu();

+            if (match.length == 0) {

+                return false;

+            }

+            var requirePinHash = ["phonebook", "sms_list"];

+            var isRequirePin = ($.inArray(match[0].path, requirePinHash) != -1);

+            if (match[0].checkSIMStatus === true) {

+                var simstatus = data.simStatus == "modem_sim_undetected"

+                     || data.simStatus == "modem_sim_destroy" || data.simStatus == "modem_waitpin"

+                     || data.simStatus == "modem_waitpuk";

+                var netlockstatus = data.simStatus == "modem_imsi_waitnck";

+                if (data.isLoggedIn && (

+                        ($('#div-nosimcard')[0] == undefined && simstatus)

+                         || ($('#div-network-lock')[0] == undefined && netlockstatus)

+                         || (($('#div-nosimcard')[0] != undefined || $('#div-network-lock')[0] != undefined) && data.simStatus == "modem_init_complete"))) {

+                    fixedLoadResources(match[0], data.simStatus, isRequirePin);

+                }

+            }

+        }, 1000);

+    }

+

+    //����¼ҳ�汳��

+    function checkLoginPageBg() {

+        var h = window.location.hash;

+        if (h == '#entry' || _.indexOf(config.GUEST_HASH, h) != -1) {

+            $("#manageContainer").attr("style", "margin-top:-36px;");

+        } else {

+            $("#manageContainer").attr("style", "margin-top:0px;");

+        }

+

+        if (window.location.hash == '#entry') {

+            $("#mainContainer").addClass('loginBackgroundBlue');

+        } else {

+            var mainContainer = $("#mainContainer");

+            if (mainContainer.hasClass('loginBackgroundBlue')) {

+                $("#container").css({

+                    margin: 0

+                });

+                mainContainer.removeClass('loginBackgroundBlue').height('auto');

+            }

+        }

+    }

+

+    function fixedLoadResources(menuItem, simStatus, isRequirePin) {

+        var item = {};

+        $.extend(item, menuItem);

+        //û��SIM��ʱ�����homeҳ�治��������

+        //���类��ʱ��homeҳ����ʾ����ҳ��

+        if (simStatus == "modem_sim_undetected" || simStatus == "modem_sim_destroy") {

+            if (!isRequirePin) {

+                item.path = "sim_abnormal";

+            }

+        } else if (simStatus == "modem_waitpin" || simStatus == "modem_waitpuk") {

+            item.path = "sim_abnormal";

+        } else if (simStatus == "modem_imsi_waitnck") {

+            item.path = "locknet";

+        }

+        //load tmpl and controller js

+        loadResources(item);

+    }

+

+    //���ݲ˵�����item���ض�Ӧ����Դ

+    function loadResources(item) {

+        var pId = item.path.replace(/\//g, '_');

+        var $body = $('body').removeClass();

+        if (pId != 'entry' && pId != 'main') {

+            $body.addClass('beautiful_bg page_' + pId);

+        } else {

+            $body.addClass('page_' + pId);

+        }

+        clearTimer();

+        hideLoading();

+        var tmplPath = 'text!tmpl/' + item.path + '.html';

+        //TODO: prevent first menu click cover the second menu content, need test with device

+        require([tmplPath, item.path], function (tmpl, viewModel) {

+            container.stop(true, true);

+            container.hide();

+            container.html(tmpl);

+            viewModel.init();

+            //support backward/forward

+            menu.refreshMenu();

+            $('#container').translate();

+            menu.activeSubMenu();

+

+            $("form").attr("autocomplete", "off");

+            container.fadeIn();

+        });

+    }

+    //�ȶ�hash״̬, ����仯������µ�hashƥ��˵�����,ƥ�䲻��ʱ��ת��homeҳ��, ƥ����ʱ��¼hashֵ����̬���ض�Ӧ����Դ�ļ�

+    function hashCheck() {

+        if (window.location.hash != currentHash) {

+            //�����½���������, ��½�û����ʷǵ�¼�û�ʱҳ�治��ת

+            var info = service.getStatusInfo();

+            if (window.location.hash == config.defaultRoute || _.indexOf(config.GUEST_HASH, window.location.hash) != -1) {

+                if (info.isLoggedIn) {

+                    window.location.hash = currentHash == "" ? "#main" : currentHash;

+                    return;

+                }

+            }

+

+            var match = menu.findMenu();

+

+            if (match.length == 0) {

+                window.location.hash = config.defaultRoute;

+            } else {

+                //��¼ʱ��鹤��ģʽ������ģʽ������������Ҫ���SIM��״̬�����¼���,����ģʽ�������治��Ҫ���SIM��״̬�����¼���

+                if (config.RJ45_SUPPORT && window.location.hash == "#main") {

+                    if ((match[0].checkSIMStatus && checkCableMode(info.blc_wan_mode)) || (!match[0].checkSIMStatus && !checkCableMode(info.blc_wan_mode))) {

+                        window.location.reload();

+                        return;

+                    }

+                }

+                //TODO: �����˵����Ӧ�����˵���һ����л�ʱ�����¼�������, ��TODO: click the same menu ʵ�ַ�ʽ����

+                var oldMenu = menu.findMenu(currentHash);

+                currentHash = match[0].hash;

+                if (currentHash == "#entry") {

+                    $('#indexContainer').addClass('login-page-bg');

+                    menu.rebuild();

+                } else {

+                    $('#indexContainer').removeClass('login-page-bg');

+                }

+

+                if (oldMenu.length != 0 && match[0].path == oldMenu[0].path && match[0].level != oldMenu[0].level && match[0].level != '1' && oldMenu[0].level != '1') {

+                    return;

+                }

+

+                checkLoginPageBg();

+                var requirePinHash = ["phonebook", "sms_list"];

+                var isRequirePin = ($.inArray(match[0].path, requirePinHash) != -1);

+                if (match[0].checkSIMStatus === true || isRequirePin) {

+                    //simStatus is undefined when refreshing page

+                    if (info.simStatus == undefined) {

+                        showLoading('waiting');

+                        function checkSIM() {

+                            var data = service.getStatusInfo();

+                            if (data.simStatus == undefined || $.inArray(data.simStatus, config.TEMPORARY_MODEM_MAIN_STATE) != -1) {

+                                addTimeout(checkSIM, 500);

+                            } else {

+                                fixedLoadResources(match[0], data.simStatus, isRequirePin);

+                                hideLoading();

+                            }

+                        }

+                        checkSIM();

+                    } else {

+                        fixedLoadResources(match[0], info.simStatus, isRequirePin);

+                    }

+                } else {

+                    loadResources(match[0]);

+                }

+            }

+        }

+    }

+

+    //Ĭ�����ҳ��Ϊ#main, ��ʱ���hash״̬

+    function init() {

+        checkSimCardStatus();

+        window.location.hash = window.location.hash || "#main";

+        //if support onhashchange then use. If ie8 in ie7 mode, it doesn't trigger onhashchange.

+        if (('onhashchange' in window) && ((typeof document.documentMode === 'undefined') || document.documentMode == 8)) {

+            window.onhashchange = hashCheck;

+            hashCheck();

+        } else {

+            setInterval(hashCheck, 200);

+        }

+

+        //����޸���ҳ������, �뿪ʱ������ʾ

+        $("a[href^='#']").die('click').live('click', function () {

+            var $this = $(this);

+            config.CONTENT_MODIFIED.checkChangMethod();

+            return checkFormContentModify($this.attr('href'));

+        });

+    }

+

+    return {

+        init: init

+    };

+});

+

+// statusBar �

+

+define("statusBar", "knockout jquery underscore service set menu tooltip".split(" "), 

+

+    function (ko, $, _, service, config, menu, tooltip) {

+

+	var sv__hasCheckedSMSCapacity   = false;	

+    var sv__initSMSCompleted        = false;		

+    var sv_newSMSMessageInDealing   = false;		

+    var sv_fotaUpdateCancel         = null;

+	var sv_batteryCheckTimer        = 0;	

+    var sv_dbMessageIds             = [];	

+    var sv_fotaResultAlertPopuped   = false;

+    var sv_isFirstLoadNewMessage    = true;	

+    var isLoggedIn                  = true;		

+    var sv_messagePopStack          = {};

+    var sv_newMessagePopTemplate    = null;	

+    var sv_resetTrafficAlertPopuped = false;

+    var sv_simMessageListTemplate   = null;

+    var sv_smsListTemplate          = null;		

+    var sv_trafficAlertPopuped_100  = false;		

+    var sv_trafficAlertPopuped      = false;

+    var sv_timer                    = 0;

+

+    // ��ȡ״̬��Ϣ�������硢SIM��WIFI��

+    var getCurrentStatusInfo = function () {

+        return service.getStatusInfo();

+    };

+

+    function statusViewModel() {

+        var target         = this;

+        var info           = getCurrentStatusInfo();

+		var roamStatus   = info.roamingStatus ? true : false;

+		var $langLogoBar = $("#langLogoBar");

+

+

+        // �����������¼�����

+		function sf_connect() {

+            showLoading("connecting");

+            service.connect({}, function (data) {

+                if (data.result) {

+                    refreshWifiConnectStatus(target, data.status);

+                }

+                successOverlay();

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+        // �Ͽ������¼�����

+		function sf_disconnect() {

+            showLoading("disconnecting");

+            service.disconnect({}, function (data) {

+                if (data.result) {

+                    refreshWifiConnectStatus(target, data.status);

+                }

+                successOverlay();

+            }, function (data) {

+                errorOverlay();

+            });

+        }			

+

+        if(info.isLoggedIn){

+        	if(!$langLogoBar.hasClass("langborderBg")){

+                $langLogoBar.addClass("langborderBg");

+        	}

+        	$("#statusBar:hidden").show();

+        } else {

+        	if($langLogoBar.hasClass("langborderBg")){

+                $langLogoBar.removeClass("langborderBg");

+        	}

+        	$("#statusBar:visible").hide();

+        }	

+

+

+        //target.attachedDevices        = ko.observable(info.attachedDevices);

+        target.batteryLevel             = ko.observable(info.batteryLevel + '%');

+        target.batteryPers              = ko.observable(sf_getBatteryLevelImage(info.batteryPers, info.batteryStatus));		

+        target.batteryStatus            = ko.observable(info.batteryStatus);	

+        target.connectionCssClass       = ko.observable("");		

+        target.connectStatus            = ko.observable(info.connectStatus);

+        target.connectStatusText        = ko.observable();

+        target.connectStatusTrans       = ko.observable();

+        target.hasWifi                  = ko.observable(config.HAS_WIFI);

+        target.hasBattery               = ko.observable(config.HAS_BATTERY);		

+        target.isLoggedIn               = ko.observable(info.isLoggedIn);

+        target.isShowConnectionIcon     = ko.observable(false);

+		target.isShowFotaNewversionIcon = ko.observable(info.new_version_state && info.fota_package_already_download != "yes" && !config.isShowFotaIcon);		

+        target.isShowRj45ConnectionIcon = ko.observable(false);

+        target.networkOperator          = ko.observable(sf_getNetWorkProvider(info.spn_b1_flag,info.spn_name_data,info.spn_b2_flag,info.networkOperator,roamStatus));		

+        target.networkType              = ko.observable(getNetworkType(info.networkType));

+        target.pinStatus                = ko.observable(info.pinStatus);

+        target.pinStatusText            = ko.observable();	

+        target.rj45ConnectionCssClass   = ko.observable("");		

+        target.roamingStatus            = ko.observable(info.roamingStatus ? "R" : "");

+        target.showAttachedDevices      = ko.observable(info.wifiStatus);		

+        target.showSmsDeleteConfirm     = ko.observable(false);

+        target.smsUnreadCount           = ko.observable(0);

+        target.simStatus                = ko.observable(sf_convertSimStatusToImage(info.simStatus));

+        target.signalCssClass           = ko.observable(sf_getSignalCssClass(info.signalImg, info.networkType, info.simStatus));		

+        target.updateType               = ko.observable(service.getUpdateType().update_type);

+        target.wifiStatusCssClass       = ko.observable(sf_getWifiStatusCssClass(info.wifiStatus, info.wirelessDeviceNum));

+        target.wifiStatusImg            = ko.observable(sf_getWifiStatusImage(info.wifiStatus, info.wirelessDeviceNum));

+

+        sf_getConnectionCssClass(target, info.connectStatus, info.data_counter, info.connectWifiSSID, info.connectWifiStatus, info.rj45ConnectStatus);	

+

+        target.connect    = sf_connect;

+        target.disconnect = sf_disconnect;

+    }

+

+	function sf_gotoSmsList(){

+        var s_href = '#msg_main';

+        if(window.location.hash == '#msg_main'){

+            s_href = '#msg_list';

+        }

+		config.CONTENT_MODIFIED.checkChangMethod();

+        if(checkFormContentModify(s_href)){

+            window.location.hash = s_href;

+        }

+    }

+

+    gotoSmsList = sf_gotoSmsList;	

+

+    function sf_getNetWorkProvider(i_spnB1Flag, i_spnNameData, i_spnB2Flag, i_networkProvider, i_roamStatus) {

+        if (i_spnNameData == "") {

+            return i_networkProvider;

+        } else {

+            i_spnNameData = decodeMessage(i_spnNameData);

+            if (i_spnB1Flag == "0" && i_spnB2Flag == "0") {

+                if (i_roamStatus) {//����

+                    return i_spnNameData == i_networkProvider ? i_networkProvider : (i_spnNameData + '  ' + i_networkProvider);

+                } else {//������

+                    return i_spnNameData;

+                }

+            }else if (i_spnB1Flag == "1" && i_spnB2Flag == "1") {

+                if (i_roamStatus) {//����

+                    return i_networkProvider;

+                } else {//������

+                    return i_spnNameData == i_networkProvider ? i_networkProvider : (i_spnNameData + '  ' + i_networkProvider);

+                }

+            } else if (i_spnB1Flag == "1") {

+                return i_spnNameData == i_networkProvider ? i_networkProvider : (i_spnNameData + '  ' + i_networkProvider);

+            } else if (i_spnB2Flag == "1") {

+                if (i_roamStatus) {//����

+                    return i_networkProvider;

+                } else {//������

+                    return i_spnNameData;

+                }

+            } 

+            return "";

+        }

+    }

+

+    // �����¶���Ϣ��ʾ���������������

+    function sf_addNewMessage(i_message, i_isUpdate, i_type){

+    	config.smsMaxId = i_message.id;

+    	var now = $.now();

+    	sv_messagePopStack["m" + now] = now;

+    	var name = i_message.number;

+    	if(sv_isFirstLoadNewMessage && config.phonebook && config.phonebook.length == 0){

+    		sv_isFirstLoadNewMessage = false;

+    		if(config.HAS_PHONEBOOK){

+				sf_getPhoneBooks();

+			}else{

+				config.phonebook = [];

+			}

+    	}

+    	for(i in config.phonebook){

+    		if(getLastNumber(config.phonebook[i].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+    			name = config.phonebook[i].pbm_name;

+    			break;

+    		}

+    	}

+		var s_newMsg = {

+			mark : "m" + now,

+			name: name,

+			title: $.i18n.prop("sms"),

+			titleTrans: "sms",

+			tag: i_message.tag,

+			content : i_message.content,

+			datetime : i_message.time

+		};

+		if(sv_newMessagePopTemplate == null){

+			sv_newMessagePopTemplate = $.template("newMessagePopTmpl", $("#newMessagePopTmpl"));

+		}

+        $(".bubbleItem:not(.report)", "#buttom-bubble").remove();

+        $.tmpl("newMessagePopTmpl", s_newMsg).appendTo("#buttom-bubble");

+		if((window.location.hash == "#msg_main" || window.location.hash == "#msg_list") && i_type == "1"){

+            //sf_dealChosenNumber(s_newMsg.name, i_message.number);

+			var s_inChating = config.currentChatObject && config.currentChatObject == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH);

+			var s_itemId = getLastNumber(i_message.number, config.SMS_MATCH_LENGTH);

+			var item = $("#smslist-item-" + s_itemId);

+			if(item && item.length > 0){

+                // �Ѵ������ݣ��������ݵ���˳��

+				for(var i = 0; config.listMsgs && i < config.listMsgs.length; i++){

+					if(getLastNumber(config.listMsgs[i].number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+						config.listMsgs[i].id = i_message.id;

+						config.listMsgs[i].latestId = i_message.id;

+						config.listMsgs[i].latestSms = i_message.content;

+						config.listMsgs[i].latestTime = i_message.time;

+						if(!i_isUpdate){

+							config.listMsgs[i].newCount++;

+							config.listMsgs[i].totalCount++;

+						}

+						break;

+					}

+				}

+				item.find(".smslist-item-checkbox p.checkbox").attr("id", i_message.id);

+				item.find(".smslist-item-checkbox input:checkbox").val(i_message.id).attr("id", "checkbox" + i_message.id);

+				if(!i_isUpdate){

+					var s_itemCount = item.find(".smslist-item-total-count").text();

+					s_itemCount = Number(s_itemCount.substring(1, s_itemCount.length - 1));

+					item.find(".smslist-item-total-count").text("(" + (s_itemCount + 1) + ")");

+					if(!config.currentChatObject || config.currentChatObject != getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+						var s_newNum = item.find(".smslist-item-new-count").removeClass("hide");

+						if(s_newNum && s_newNum.text().length > 0){

+							s_newNum.text(Number(s_newNum.text()) + 1);

+						}else{

+							s_newNum.text(1);

+						}

+					}

+				}

+				if(item.find(".smslist-item-draft-flag").length > 0){

+					if (config.currentChatObject && config.currentChatObject == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)) {

+					    item.find(" td:nth-child(2)").removeClass("font-weight-bold");

+				    } else {

+					    item.find(" td:nth-child(2)").addClass("font-weight-bold");

+				    }

+				}else{

+					var msgContent = item.find(".smslist-item-msg").text(i_message.content);

+				    msgContent.closest('td').prop('title', i_message.content);

+				    item.find("span.clock-time").text(i_message.time);

+					if (config.currentChatObject && config.currentChatObject == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)) {

+					    msgContent.closest('tr').removeClass("font-weight-bold");

+				    } else {

+					    msgContent.closest('tr').addClass("font-weight-bold");

+				    }

+				}

+				item.find(".smslist-item-repeat span").die().click(function() {

+					forwardClickHandler(i_message.id);

+				});

+

+				var s_tmpItem = item;

+				item.hide().remove();

+				$("#smslist-table").prepend(s_tmpItem.show());

+			} else {

+                // ��������б��в�������Ӧ����ϵ�˶�Ϣ��Ӧ�ڶ����б�����������

+				var s_theName = "";

+				if(config.phonebook && config.phonebook.length > 0) {

+					for(i in config.phonebook){

+						if(getLastNumber(config.phonebook[i].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+							s_theName = config.phonebook[i].pbm_name;

+							break;

+						}

+					}

+				}

+				var s_theNewMessage = {

+					id : i_message.id,

+					name : s_theName,

+					number : i_message.number,

+					latestId :i_message.id,

+					totalCount : 1,

+					newCount : s_inChating ? 0 : 1,

+					latestSms : i_message.content,

+					latestTime : i_message.time,

+					checked : false,

+					hasDraft : false,

+					itemId : getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)

+				};

+				if(sv_smsListTemplate == null){

+					sv_smsListTemplate = $.template("smsTableTmpl", $("#smsTableTmpl"));

+				}

+				$.tmpl("smsTableTmpl", {data: [s_theNewMessage]}).prependTo("#smslist-table");

+            }

+            if(config.HAS_PHONEBOOK){

+                $(".sms-add-contact-icon").removeClass("hide");

+            }else{

+                $(".sms-add-contact-icon").addClass("hide");

+            }

+			if(s_inChating){

+				var talkItem = $("#talk-item-" + i_message.id, "#chatlist");

+				if (talkItem && talkItem.length > 0) {// ���¼�����������

+					$(".J_content pre", talkItem).html(dealContent(i_message.content));

+					$(".time .smslist-item-time", talkItem).text(i_message.time);

+					$(".smslist-item-repeat", talkItem).die().click(

+							function() {

+								forwardClickHandler(i_message.id);

+							});

+					$(".smslist-item-delete", talkItem).die().click(

+							function() {

+								deleteSingleItemClickHandler(i_message.id);

+							});

+				} else {// �����µĻظ�����

+					$("#smsOtherTmpl").tmpl(i_message).appendTo("#chatlist");

+					$(".clear-container", "#chatpanel").animate({

+						scrollTop : $("#chatlist").height()

+					});

+				}

+                if (!config.SMS_SET_READ_WHEN_COMPLETE) {

+                    service.setSmsRead({ids: [i_message.id]}, $.noop);

+                } else if (config.SMS_SET_READ_WHEN_COMPLETE && i_message.receivedAll) {

+                    service.setSmsRead({ids: [i_message.id]}, $.noop);

+                }

+			}

+            enableCheckbox($("#smslist-checkAll"));

+		}

+		if(window.location.hash == "#msg_sim" && i_type == "0"){

+			// ��������б��в�������Ӧ����ϵ�˶�Ϣ��Ӧ�ڶ����б�����������

+				var s_theName = "";

+				if(config.phonebook && config.phonebook.length > 0) {

+					for(i in config.phonebook){

+						if(getLastNumber(config.phonebook[i].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+							s_theName = config.phonebook[i].pbm_name;

+							break;

+						}

+					}

+				}

+				var s_theNewMessage = {

+					id : i_message.id,

+					name : s_theName,

+					number : i_message.number,

+					content : i_message.content,

+					time : i_message.time,

+					tag: i_message.tag,

+					checked : false,

+					itemId : getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)

+				};

+				if(i_isUpdate){

+					var s_item = $(".simMsgList-item-class-" + s_theNewMessage.id);

+				    s_item.hide().remove();				

+				}

+				if(sv_simMessageListTemplate == null){

+					sv_simMessageListTemplate = $.template("ssimMessageListTemplate", $("#simMessageListTemplate"));

+				}

+				$.tmpl("simMessageListTemplate", {data: [s_theNewMessage]}).prependTo("#simMsgList_container");

+		}

+	}

+

+ 	function sf_checkBatteryStatusForFota(){

+	  var s_state = service.getCurrentUpgradeState();

+	  if(s_state.current_upgrade_state == 'low_battery'){

+			showInfo('ota_low_battery');

+			clearInterval(sv_batteryCheckTimer);

+		}

+	} 

+

+    // ��SIM��״̬ת��Ϊ��Ӧ����������

+    function sf_convertSimStatusToImage(i_status) {

+        var s_image;

+        switch (i_status) {

+            case "modem_destroy":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_destroy");

+                break;

+            case "modem_imsi_waitnck":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_waitnck");

+                break;				

+            case "modem_init_complete":

+                s_image = "./pic/simcard_detected.png";//$.i18n.prop("sim_status_ready");

+                break;	

+            case "modem_sim_destroy":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_destroy");

+                break;				

+            case "modem_sim_undetected":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_undetected");

+                break;

+            case "modem_undetected":

+                s_image = "./pic/simcard_undetected.png";

+                break;				

+            case "modem_waitpin":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_waitpin");

+                break;

+            case "modem_waitpuk":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_waitpuk");

+                break;

+

+            default:

+                s_image = "./pic/simcard_detected.png";//$.i18n.prop("sim_status_ready");

+                break;

+        }

+        return s_image;

+    }

+

+    function sf_dealChosenNumber(i_choosenName, i_choosenNum) {

+        setTimeout(function () {

+            var s_choosen  = $("#chosenUserSelect");

+            var s_options = $("option", s_choosen);

+            for (var index  = 0; index < s_options.length; index++) {

+                if (getLastNumber(i_choosenNum, config.SMS_MATCH_LENGTH) == s_options[index].value) {

+

+                    s_options[index].text  = i_choosenName + '/' + i_choosenNum;

+					s_options[index].value = i_choosenNum;

+

+                    break;

+                }

+            }

+            s_choosen.trigger("liszt:updated");

+        }, 0);

+    } 

+

+	// ˫�첽��ȡ�豸���sim����ö���Ϣ��������ϲ�

+	function sf_dealPhoneBooksResult(i_books){

+		if($.isArray(i_books.pbm_data) && i_books.pbm_data.length > 0){

+			config.phonebook = i_books.pbm_data;

+		}

+	}	

+

+    // �������µ�5������Ϣ����δ���ӵ������б��еĵ�����ʾ

+    function sf_filterNewMessage(i_messages, i_type){

+    	if(!config.dbMsgs){

+    		config.dbMsgs = [];

+    	}

+    	if(sv_dbMessageIds.length == 0){

+    		$.each(config.dbMsgs, function(index_1, i_element){

+    			sv_dbMessageIds.push(i_element.id);

+    		});

+    	}

+    	$.each(i_messages, function(index_2, i_element){

+    		if($.inArray(i_element.id, sv_dbMessageIds) == -1){//�����¶���

+    			sv_dbMessageIds.push(i_element.id);

+    			config.dbMsgs.push(i_element);

+    			if(i_element.tag == '1'){

+    				sf_addNewMessage(i_element, false, i_type);

+    			}

+    		}else{

+    			for(var index = 0; index < config.dbMsgs.length; index++){//���¼�������

+    				if(config.dbMsgs[index].id == i_element.id && config.dbMsgs[index].content != i_element.content && i_element.tag == '1'){

+    					config.dbMsgs[index].content = i_element.content;

+    					sf_addNewMessage(i_element, true, i_type);

+    					break;

+    				}

+    			}

+    		}

+    	});

+    }

+

+    // ������ת��Ϊ��ӦͼƬ

+    function sf_getBatteryLevelImage(pers, i_status) {

+    	var s_Image = null;

+		if ("0" == i_status) {

+			if ("-1" == pers) {

+				s_Image = null;

+			} else if ("1" == pers) {

+				s_Image = "pic/power_one.png";

+			} else if ("2" == pers) {

+				s_Image = "pic/power_two.png";

+			} else if ("3" == pers) {

+				s_Image = "pic/power_three.png";

+			} else if ("4" == pers) {

+				s_Image = "pic/power_full.png";

+			} else { //"5" == pers || "0" == pers

+				s_Image = "pic/power_out.png";

+			}

+		} else {

+			s_Image = "pic/power_charging.gif";

+		}

+		return s_Image;

+    }

+

+    // ��ȡ����״̬��CSS��ʽ

+    function sf_getConnectionCssClass(i_fwVm, i_status, i_data_counter, i_wifiSSID, i_wifiStatus, i_rj45Status) {

+

+        var s_rj45ConnectionStatus = "icon_connection ";

+        var s_connectionStatus     = "icon_connection ";

+

+        if(i_rj45Status == "connect"){

+            s_rj45ConnectionStatus += "connecting";

+        }else if(i_rj45Status == "working"){

+            s_rj45ConnectionStatus += "rj45_connected";

+        }else{

+            s_rj45ConnectionStatus += "disconnect";			

+        }

+

+        if (i_status == "ppp_connecting" || i_status == "wifi_connecting") {

+            s_connectionStatus += "connecting";

+        } else if(i_status == "ppp_connected") {//CPE ppp_statusΪnone ready��ֵ

+            if (i_data_counter.uploadRate != '0' && i_data_counter.downloadRate != '0') {

+                s_connectionStatus += "connectionBoth";

+            } else if (i_data_counter.uploadRate != '0' && i_data_counter.downloadRate == '0') {

+                s_connectionStatus += "connectionUp";

+            } else if (i_data_counter.uploadRate == '0' && i_data_counter.downloadRate != '0') {

+                s_connectionStatus += "connectionDown";

+            } else {

+                s_connectionStatus += "connectionNone";

+            }

+        } else if (i_status == "ppp_disconnected") {

+            if (i_wifiSSID && i_wifiStatus == "connect") {

+                service.getHotspotList({}, function (data) {

+                    var s_cssName = "icon_connection ";

+                    var s_css = "connecting ";

+                    for (var i = 0, len = data.hotspotList.length; i < len; i++) {

+                        if (data.hotspotList[i].connectStatus == "1") {

+                            s_css = "wifi_connected";

+                            break;

+                        }

+                    }

+                    s_cssName += s_css;

+                    i_fwVm.connectionCssClass(s_cssName);

+                });

+                i_fwVm.rj45ConnectionCssClass(s_rj45ConnectionStatus);

+                return;

+            } else if (i_wifiSSID && (i_wifiStatus == "connecting" || i_wifiStatus =="dhcping")) {

+                s_connectionStatus += "connecting";

+            } else {

+                s_connectionStatus += "disconnect";

+            }

+        }  else {

+            s_connectionStatus += "disconnect";

+        }

+

+        i_fwVm.connectionCssClass(s_connectionStatus);

+        i_fwVm.rj45ConnectionCssClass(s_rj45ConnectionStatus);

+    }

+

+	// ��ȡ�绰����Ϣ

+	function sf_getPhoneBooks() {

+		var s_books = service.getPhoneBooks({

+            page : 0,

+            data_per_page : 2000,

+            orderBy : "id",

+            isAsc : false

+		});

+		sf_dealPhoneBooksResult(s_books);

+	}

+

+	// ��ȡ�ź�����CSS��ʽ

+    function sf_getSignalCssClass(siganl, networkType, simStatus) {

+    	networkType = networkType.toLowerCase();

+    	simStatus = simStatus ? simStatus.toLowerCase() : '';

+    	if(networkType == '' || networkType == 'limited_service' || networkType == 'no_service' || networkType == 'limited service' || networkType == 'no service'

+            || simStatus != 'modem_init_complete'){

+    		siganl = '_none';

+    	}

+        return "signal signal" + siganl;

+    }

+

+    function sf_getWifiStatusCssClass(i_status, i_deviceSize) {

+        if (i_status) {

+            if (i_deviceSize == 0) {

+                return "wifi_status0";

+            } else {

+                return "wifi_status" + i_deviceSize;

+            }

+        } else {

+            return "wifi_status_off";

+        }

+    }

+

+    // ����wifi״̬��ȡwifi��ͼƬ��Դ

+    function sf_getWifiStatusImage(i_status, i_deviceSize) {

+		if (i_status) {

+			if (i_deviceSize == 0) {

+				return "./pic/wlan0.png";

+			} else {

+				return "./pic/wlan" + i_deviceSize + ".png";

+			}

+		} else {

+			return "./pic/wlan_off.png";

+		}

+	}	

+

+    // ��ȡ��������������С���������ؽ���

+    function sf_refreshFotaDownloadProgress(){

+        service.getPackSizeInfo({}, function (data) {

+            var percents;

+            if (parseInt(data.fota_pkg_total_size) == 0) {

+                percents = 0;

+            } else {

+                percents = parseInt(parseInt(data.fota_dl_pkg_size) * 100 / parseInt(data.fota_pkg_total_size));

+            }

+            if (percents > 100) {

+                percents = 100;

+            }

+            if (percents >= 0) {

+                if (percents > 95) {

+                    showProgressBar("ota_update", "<br/>" + $.i18n.prop("ota_update_warning"));

+                }

+                setProgressBar(percents);

+            }

+        });

+    }		

+

+    // �������ŷ��ͱ���

+    function sf_responseSmsReport(){

+    	if(sv_isFirstLoadNewMessage && config.phonebook && config.phonebook.length == 0){

+

+    		sv_isFirstLoadNewMessage = false;

+

+    		if(config.HAS_PHONEBOOK){

+				sf_getPhoneBooks();

+			}else{

+				config.phonebook = [];

+			}

+    	}

+    	service.getSMSDeliveryReport({

+    		page: 0,

+    		smsCount: 10

+    	}, function(data){

+    		var s_messages = data.messages;

+    		var s_nums = [];

+    		$.each(s_messages, function(i, i_message){

+    			if($.inArray(i_message.number, s_nums) == -1){

+    				s_nums.push(i_message.number);

+                    window.setTimeout(function(){

+    					var s_now = $.now();

+    					sv_messagePopStack["m" + s_now] = s_now;

+    					i_message.name = i_message.number;

+    					for(i in config.phonebook){

+    						if(getLastNumber(config.phonebook[i].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+    							i_message.name = config.phonebook[i].pbm_name;

+    							break;

+    						}

+    					}

+    					var s_msgContent = $.i18n.prop("sms_delivery_report_" + i_message.content);

+

+    					var s_newMsg = {

+    							mark : "m" + s_now,

+    							name: i_message.name,

+    							title: $.i18n.prop("sms_report"),

+    							titleTrans: "sms_report",

+    							content : s_msgContent,

+    							datetime : i_message.time,

+    							report : 'report'

+    					};

+

+    					if(sv_newMessagePopTemplate == null){

+    						sv_newMessagePopTemplate = $.template("newMessagePopTmpl", $("#newMessagePopTmpl"));

+    					}

+

+                        $(".report", "#buttom-bubble").remove();

+    					$.tmpl("newMessagePopTmpl", s_newMsg).appendTo("#buttom-bubble");

+    				}, 100);

+    			}

+    		});

+    	}, function(){

+    		//No Deal

+    	});

+    }

+

+    function sf_simStatusInvalid(simStatus){

+        return simStatus == 'modem_sim_undetected' || simStatus == 'modem_undetected' || simStatus == 'modem_sim_destroy'

+            || simStatus == 'modem_waitpin' || simStatus == 'modem_waitpuk' || simStatus == 'modem_imsi_waitnck';

+    }	

+

+    // ��ʾFOTA������ǰ״̬

+    function sf_showFotaCurrentStatus() {

+        sv_fotaUpdateCancel = true;

+		var r = service.getNewVersionState();

+

+        function showProgress() {

+            var upgradingState = ["downloading"];

+            var info = service.getCurrentUpgradeState();

+            if(info.current_upgrade_state.toLowerCase() == "idle") {

+                addTimeout(showProgress, 1000);

+            } else if(($.inArray(info.current_upgrade_state, upgradingState) != -1)&&(r.fota_new_version_state != "already_has_pkg")) {

+                hideLoading();

+                sf_showFotaUpgradeStatus();

+            }

+        }

+        if (!($("#progress").is(":visible"))) {

+            showProgress();

+        }

+        var times = 0;

+        var getOTAUpgradeState = function () {

+            var data = null;

+            if (times <= 3) {

+                times = times + 1;

+                data = service.getCurrentUpgradeState();

+            } else {

+                data = getCurrentStatusInfo();

+            }

+            var state = data.current_upgrade_state;

+            if(sv_fotaUpdateCancel && isLoggedIn == true){

+

+				if(r.fota_new_version_state == "already_has_pkg"){

+					if(state == 'low_battery'){

+                        hideProgressBar();

+                        sv_fotaUpdateCancel = false;

+					    service.removeTimerThings('fota_current_upgrade_state',function(){});

+                        showInfo('ota_pkg_low_battery');

+                        window.clearTimeout(sv_timer);

+                        return;

+                    }else if(state == 'prepare_install'){

+                        hideProgressBar();

+                        sv_fotaUpdateCancel = false;

+                        service.removeTimerThings('fota_current_upgrade_state',function(){});

+                        showInfo('ota_pkg_download_success');

+                        window.clearTimeout(sv_timer);

+                        sv_batteryCheckTimer = setInterval(function () {

+                            sf_checkBatteryStatusForFota();

+                            }, 1000);

+                        return;

+				    } 

+				}else if(state == 'downloading') {

+                    sf_refreshFotaDownloadProgress();

+                }else if(state == 'download_failed') {

+                    hideProgressBar();

+                    sv_fotaUpdateCancel = false;

+                    showAlert('ota_download_failed');

+                    window.clearTimeout(sv_timer);

+                    return;

+                }else if(state == 'low_battery'){

+                    hideProgressBar();

+                    sv_fotaUpdateCancel = false;

+					service.removeTimerThings('fota_current_upgrade_state',function(){});

+                    showInfo('ota_low_battery');

+                    window.clearTimeout(sv_timer);

+                    return;

+                }else if(state == 'prepare_install'){

+                    hideProgressBar();

+                    sv_fotaUpdateCancel = false;

+                    service.removeTimerThings('fota_current_upgrade_state',function(){});

+                    showInfo('ota_download_success');

+                    window.clearTimeout(sv_timer);

+                    sv_batteryCheckTimer = setInterval(function () {

+                        sf_checkBatteryStatusForFota();

+                    }, 1000);

+                    return;

+                }else{

+                    sv_fotaUpdateCancel = false;

+                    hideProgressBar();

+                    window.clearTimeout(sv_timer);

+                    return;

+                }

+                sv_timer = window.setTimeout(getOTAUpgradeState , 1000);

+            }

+        };

+

+        if(sv_fotaUpdateCancel && isLoggedIn == true){

+            sv_timer = window.setTimeout(getOTAUpgradeState , 100);

+        }else{

+            window.clearTimeout(sv_timer);

+        }

+    }	

+

+    // ��ʾFota�������

+    function sf_showFotaUpdateResult(i_otaResult) {

+        if ((!($("#loading").is(":visible"))) && (!($("#confirm").is(":visible")))) {

+            var s_message = i_otaResult ? "ota_update_success" : "ota_update_failed";

+            sv_fotaResultAlertPopuped = true;

+            showAlert(s_message, function () {

+                sv_fotaResultAlertPopuped = false;

+                if (config.UPGRADE_TYPE == "OTA") {

+                    service.clearUpdateResult({}, $.noop());

+                }

+            });

+        } else {

+            window.setTimeout(function () {

+                sf_showFotaUpdateResult(i_otaResult)

+            }, 1000);

+        }

+    }	

+

+    // ��ʾ��ǰ����״̬

+    function sf_showFotaUpgradeStatus() {

+        var s_data        = service.getMandatory();

+        var s_isMandatory = s_data.is_mandatory;

+        var s_sizeInfo    =service.getPackSizeInfo();

+		var s_percents;

+

+        if (parseInt(s_sizeInfo.fota_pkg_total_size) == 0) {

+            s_percents = 0;

+        } else {

+            s_percents = parseInt(parseInt(s_sizeInfo.fota_dl_pkg_size) * 100 / parseInt(s_sizeInfo.fota_pkg_total_size));

+        }

+        if (s_percents > 100) {

+            s_percents = 100;

+        }

+

+        if (s_isMandatory) {

+            showProgressBar("ota_update", "<br/>" + $.i18n.prop("ota_update_warning"));

+        } else {

+            var cancelHtml = "";

+            if (config.UPGRADE_TYPE == "OTA") {

+                cancelHtml = "<br/><br/><button id='btnStopUpgrade' onclick='stopOTAUpgrade();' class='btn-1 btn-primary'>" + $.i18n.prop("cancel") + "</button>";

+            }

+            showProgressBar("ota_update", "<br/>" + $.i18n.prop("ota_update_warning") + cancelHtml);

+        }

+

+        //setProgressBar(0);

+       if (s_percents >= 0) {

+            setProgressBar(s_percents);       

+       }

+    }

+

+

+

+

+

+    function sf_startFotaUpgrade(){

+        service.setUpgradeSelectOp({selectOp:'1'},function(result){

+            if (result.result == "success"){

+                sf_showFotaCurrentStatus();

+            }});

+    }

+

+    function cancelFotaUpgrade(){

+        service.setUpgradeSelectOp({selectOp:'0'},function(result){ });

+    }

+

+

+    function refreshFotaStatusForUserSelector(choice){

+        var info = getCurrentStatusInfo();

+        if(choice){

+			var modeData = service.getOpMode();

+            if (!checkConnectedStatus(info.connectStatus, modeData.rj45_state, info.connectWifiStatus)) {

+                showAlert("ota_network_disconnected");

+                return;

+            }

+

+            if(info.fota_user_selector == 'none'){

+                sf_startFotaUpgrade();

+            }else if(info.fota_user_selector == 'accept'){

+                sf_showFotaCurrentStatus();

+            }else if(info.fota_user_selector == 'cancel'){

+                showAlert("ota_have_cancel");

+            }else if(info.fota_user_selector == 'downloading_cancel'){

+                showAlert("ota_have_cancel");

+            }

+        }else{

+            if(info.fota_user_selector == 'none'){

+                cancelFotaUpgrade();

+            }else if(info.fota_user_selector == 'accept'){

+                sf_showFotaCurrentStatus();

+            }else if(info.fota_user_selector == 'cancel'){

+                // todo: 

+            }else if(info.fota_user_selector == 'downloading_cancel'){

+                // todo: 

+            }

+        }

+    }

+

+

+    // ��ʾ���°汾�������ж��Ƿ������ʾ

+    function showFotaStatusForUserToConfirm(upgradeState) {

+        var upgState = upgradeState.current_upgrade_state;

+        if (upgState == 'upgrade_pack_redownload') {

+            showConfirm("ota_interrupted", {ok: function () {

+                refreshFotaStatusForUserSelector(1);

+            }, no: function () {

+                refreshFotaStatusForUserSelector(0);

+            }});

+        } else {

+            var upgradingState = ["prepare_install", "low_battery",

+                "connecting_server", "connect_server_success", "downloading", "accept"];

+            if ($.inArray(upgState, upgradingState) != -1) {

+                sf_showFotaCurrentStatus();

+            } else {

+

+                showConfirm($.i18n.prop('ota_new_version'), {ok: function () {

+                    refreshFotaStatusForUserSelector(1);

+					config.ISNOW_NOTICE = false;

+                }, no: function () {

+                    refreshFotaStatusForUserSelector(0);

+					config.ISNOW_NOTICE = false;

+                }});

+            }

+        }

+    }

+

+    showOTAAlert = function () {

+		config.ISNOW_NOTICE = true;

+        var is_mandatory = service.getMandatory().is_mandatory;

+        if (is_mandatory) {

+            sf_showFotaCurrentStatus();

+        } else {

+            var upgradeState = {};

+            upgradeState = service.getCurrentUpgradeState();

+            showFotaStatusForUserToConfirm(upgradeState);

+        }

+    };

+

+    // ��ֹFota����

+    stopOTAUpgrade = function () {

+        service.setUpgradeSelectOp({selectOp:'2'},function(result){ });

+        sv_fotaUpdateCancel = false;

+        window.clearTimeout(sv_timer);

+        hideLoading();

+        showAlert('ota_cancel');

+    };

+

+    // �������������Ƿ����ѹ�

+    function setTrafficAlertPopuped(val){

+    	sv_trafficAlertPopuped = !!val;

+        sv_trafficAlertPopuped_100 = !!val;

+        if(!val){

+            sv_resetTrafficAlertPopuped = true;

+        }

+    }

+

+    function setTrafficAlert100Popuped(val){

+        sv_trafficAlertPopuped_100 = !!val;

+        if(!val){

+            sv_resetTrafficAlertPopuped = true;

+        }

+    }

+

+    // ���������ṹ

+    function getTrafficResult(info){

+        var s_trafficResult = {

+            showConfirm : false,

+            limitPercent : info.limitVolumePercent

+        };

+        if(info.limitVolumeType == '1'){

+            var monthlyTraffic = parseInt(info.data_counter.monthlySent, 10) + parseInt(info.data_counter.monthlyReceived, 10);

+            s_trafficResult.usedPercent = monthlyTraffic / info.limitVolumeSize * 100;

+            if(s_trafficResult.usedPercent > s_trafficResult.limitPercent){

+                s_trafficResult.showConfirm = true;

+                s_trafficResult.type = 'data';

+            }

+        }else{

+            s_trafficResult.usedPercent = info.data_counter.monthlyConnectedTime / info.limitVolumeSize * 100;

+            if(s_trafficResult.usedPercent > s_trafficResult.limitPercent){

+                s_trafficResult.showConfirm = true;

+                s_trafficResult.type = 'time';

+            }

+        }

+        return s_trafficResult;

+    }

+

+	// ��ʼ�� ViewModel����������ͼ��

+    function init() {

+        if(config.PRODUCT_TYPE == 'DATACARD') {

+            $('#statusBar').addClass('padding-right-90');

+            $('#language').addClass('data-card-language');

+        }

+        //preload img 

+        var imgAlert   = $('<img />').attr('src', 'pic/res_alert.png');

+        var imgConfirm = $('<img />').attr('src', 'pic/res_confirm.png');

+        var imgInfo    = $('<img />').attr('src', 'pic/res_info.png');

+

+        window.setTimeout(function () {

+

+            var fwVm = new statusViewModel();

+

+            ko.applyBindings(fwVm, $('#statusBar')[0]);

+

+            window.setInterval(function () {

+                var info          = getCurrentStatusInfo();

+				var s_roamStatus    = info.roamingStatus ? true : false;

+                var $langLogoBar  = $("#langLogoBar");

+                isLoggedIn        = info.isLoggedIn;

+

+

+                //fwVm.attachedDevices(info.attachedDevices);	

+                fwVm.batteryLevel(info.batteryLevel + '%');				

+                fwVm.batteryPers(sf_getBatteryLevelImage(info.batteryPers, info.batteryStatus));

+                fwVm.batteryStatus(info.batteryStatus);				

+				fwVm.isShowFotaNewversionIcon(info.new_version_state && info.fota_user_selector && info.fota_package_already_download != "yes" && config.ISNOW_NOTICE && fwVm.updateType() == 'mifi_fota');

+				fwVm.isShowRj45ConnectionIcon(config.RJ45_SUPPORT);

+                fwVm.networkOperator(sf_getNetWorkProvider(info.spn_b1_flag,info.spn_name_data,info.spn_b2_flag,info.networkOperator,s_roamStatus));

+                fwVm.networkType(getNetworkType(info.networkType));

+                fwVm.pinStatus(info.pinStatus);

+                fwVm.roamingStatus(info.roamingStatus ? "R" : "");

+                fwVm.showAttachedDevices(info.wifiStatus);

+                fwVm.simStatus(sf_convertSimStatusToImage(info.simStatus));				

+                fwVm.signalCssClass(sf_getSignalCssClass(info.signalImg, info.networkType, info.simStatus));				

+                fwVm.isLoggedIn(info.isLoggedIn);

+                fwVm.wifiStatusCssClass(sf_getWifiStatusCssClass(info.wifiStatus, info.wirelessDeviceNum));

+                fwVm.wifiStatusImg(sf_getWifiStatusImage(info.wifiStatus, info.wirelessDeviceNum));	

+

+				if(config.HAS_SMS ){

+					if(!sv__hasCheckedSMSCapacity && info.isLoggedIn){

+						checkSMSCapacity(info.smsUnreadCount);

+					} else {

+						fwVm.smsUnreadCount(info.smsUnreadCount);

+					}

+                }

+

+                sf_getConnectionCssClass(fwVm, info.connectStatus, info.data_counter, info.connectWifiSSID, info.connectWifiStatus, info.rj45ConnectStatus);

+                refreshWifiConnectStatus(fwVm, info.connectStatus,info.connectWifiSSID,info.connectWifiStatus);

+                checkTrafficLimitAlert(fwVm, info);

+                updateStatusBarTrans({simStatus: info.simStatus, wifiStatus: info.wifiStatus, deviceSize: info.wirelessDeviceNum, networkType: info.networkType});

+

+                if(info.isLoggedIn){

+                	$("#statusBar:hidden").show();

+                } else {

+                	$("#statusBar:visible").hide();

+                }

+            }, 500);

+

+            if(config.HAS_SMS){

+                window.setInterval(function(){

+                    if(fwVm.isLoggedIn()){

+                        checkSMSCapacity();

+                    }

+                }, 10000);

+                checkSmsModelReady();

+            }

+

+            window.setInterval(function() {

+                var data = getCurrentStatusInfo();

+				var upgradingState = ["prepare_install", "low_battery", "download_success","downloading"];

+

+                if (fwVm.isLoggedIn() == true && !($("#progress").is(":visible")) && data.defaultWanName != ""){                    

+					 	if ($.inArray(data.current_upgrade_state, upgradingState) != -1){

+                        if(null == sv_fotaUpdateCancel){

+                            if(!data.is_mandatory){

+                                $.modal.close();

+                            }

+                            sf_showFotaCurrentStatus();

+                        }else if(false == sv_fotaUpdateCancel){

+                            sv_fotaUpdateCancel = null;

+                        }

+                    }

+                }

+            }, 1000);

+

+            var checkFotaUpgradeResult = function () {

+                var info = service.getStatusInfo();

+                if (info.isLoggedIn) {

+                    service.getUpgradeResult({}, function (data) {

+                        if (data.upgrade_result == "success") {

+                            sf_showFotaUpdateResult(true);

+                        } else if (data.upgrade_result == "fail") {

+                            sf_showFotaUpdateResult(false);

+                        } else {

+                            window.setTimeout(checkFotaUpgradeResult, 1000);

+                        }

+                    }, function () {

+                        window.setTimeout(checkFotaUpgradeResult, 1000);

+                    });

+                } else {

+                    window.setTimeout(checkFotaUpgradeResult, 1000);

+                }

+            };

+            if(fwVm.updateType() == "mifi_fota"){

+                checkFotaUpgradeResult();

+                window.setInterval(function () {

+                    var info = getCurrentStatusInfo();

+                    if (info.isLoggedIn && info.defaultWanName != "") { 

+                        if(info.new_version_state && info.fota_package_already_download != "yes" && !config.ALREADY_NOTICE){

+                            service.getUpgradeResult({}, function (data) {

+                                if (data.upgrade_result == "success") {

+                                    sf_showFotaUpdateResult(true);

+                                } else if (data.upgrade_result == "fail") {

+                                    sf_showFotaUpdateResult(false);

+                                } else {

+                                    if(sv_fotaResultAlertPopuped == false){

+                                        config.ALREADY_NOTICE = true;

+                                        showOTAAlert();

+                                    }

+                                }

+                            });

+                        }

+                    }

+                }, 1000);

+            }

+			function checkSMSCapacity(unreadCount){

+				service.getSmsCapability({}, function(info){

+					var showSmsConfirm = false;

+					if(info.nvTotal != 0 && info.nvUsed >= info.nvTotal){

+						$("#sms_unread_count").attr("tipTitle", "sms_capacity_is_full");

+						showSmsConfirm = true;

+					} else if(info.nvTotal != 0 && info.nvUsed + 5 >= info.nvTotal) {

+						$("#sms_unread_count").attr("tipTitle", "sms_capacity_will_full");

+						showSmsConfirm = true;

+					} else {

+						$("#sms_unread_count").attr("tipTitle", "sms_unread_count");

+					}

+					fwVm.showSmsDeleteConfirm(showSmsConfirm);

+					if(typeof unreadCount != "undefined"){

+						fwVm.smsUnreadCount(unreadCount);

+					}

+					sv__hasCheckedSMSCapacity = true;

+				});

+			}

+        }, 1200);

+

+        tooltip.init();

+

+        // ����Ϣģ���ʼ��״̬

+        function checkSmsModelReady(){

+            var info = getCurrentStatusInfo();

+            if(info.isLoggedIn){

+                service.getSMSReady({}, function (data) {

+                    if (data.sms_cmd_status_result == "1") {

+                        window.setTimeout(function(){checkSmsModelReady();}, 1000);

+                    } else {

+                        sv__initSMSCompleted = true;

+                    }

+                });

+            } else {

+                window.setTimeout(function(){checkSmsModelReady();}, 1000);

+            }

+        }

+

+        // ����������״̬

+        checkTrafficLimitAlert = function(fwVm, info){

+	    if(window.location.hash == '#entry'){

+                return false;

+            }

+            var APStationEnabled = config.AP_STATION_SUPPORT ? service.getStatusInfo().ap_station_enable : 'undefined';

+			var trafficResult    = getTrafficResult(info);

+            var inShow           = $("#confirm-container:visible").length > 0;

+            // var notPPP           = (config.PRODUCT_TYPE == 'CPE' && checkCableMode(info.blc_wan_mode)) ? true : false;

+            var notPPP = false;

+

+            // ��ȡAp Stationʹ��״̬���������ѷ�ʽ

+            if (config.AP_STATION_SUPPORT && (typeof APStationEnabled == "undefined" || APStationEnabled === '')) {

+                service.refreshAPStationStatus({}, $.noop());

+                return false;

+            }

+            APStationEnabled = APStationEnabled == 1;

+

+            if (!info.isLoggedIn || inShow || (sv_trafficAlertPopuped && sv_trafficAlertPopuped_100) || !info.limitVolumeEnable || (!APStationEnabled && !(info.connectStatus == "ppp_connected")) || notPPP) {

+                return false;

+            }

+

+            if(sv_resetTrafficAlertPopuped){

+                window.setTimeout(function () {

+                    sv_resetTrafficAlertPopuped = false;

+                }, 2000);

+                return false;

+            }

+

+        	if(trafficResult.showConfirm){

+

+                var confirmMessage = null;

+

+                if(trafficResult.usedPercent > 100 && !sv_trafficAlertPopuped_100){

+

+                    sv_trafficAlertPopuped     = true;

+					sv_trafficAlertPopuped_100 = true;

+

+                    confirmMessage = {msg: APStationEnabled ? 'traffic_beyond_msg' : 'traffic_beyond_disconnect_msg'};

+

+                } else if (!sv_trafficAlertPopuped) {

+

+                    sv_trafficAlertPopuped     = true;

+                    sv_trafficAlertPopuped_100 = false;

+                    confirmMessage = {msg: APStationEnabled ? 'traffic_limit_msg' : 'traffic_limit_disconnect_msg',

+                        params: [trafficResult.limitPercent]};

+                }

+

+                if (confirmMessage != null) {

+                    if (APStationEnabled) {

+                        showAlert(confirmMessage);

+                    } else {

+                        showConfirm(confirmMessage, function () {

+                            showLoading("disconnecting");

+                            service.disconnect({}, function (data) {

+                                if (data.result) {

+                                    successOverlay();

+                                } else {

+                                    errorOverlay();

+                                }

+                            });

+                        });

+                    }

+                }

+            }

+            return true;

+        };

+

+        // ����״̬�е�tooltip

+        function updateStatusBarTrans(status){

+    		$("#statusItemSimStatus").attr("tipTitle", "sim_status_" + status.simStatus);

+    		if (status.wifiStatus) {

+				if (status.deviceSize == 0) {

+					$("#wifi_status").attr("tipTitle","wifi_status_on");

+				} else {

+					$("#wifi_status").attr("tipTitle","wifi_status" + status.deviceSize);

+				}

+			} else {

+				$("#wifi_status").attr("tipTitle","wifi_status_off");

+			}

+        }

+

+

+        // ˢ��wifi��������״̬

+        function refreshWifiConnectStatus(fwVm, status, wifiSSID, wifiStatus) {

+            fwVm.connectStatus(status);

+            if (status == "ppp_disconnecting") {

+                fwVm.connectStatusTrans("disconnecting");

+                fwVm.connectStatusText($.i18n.prop("disconnecting"));

+            } else if (status == "ppp_connecting") {

+                fwVm.connectStatusTrans("connecting");

+                fwVm.connectStatusText($.i18n.prop("connecting"));

+            } else if (status == "ppp_connected") {

+                fwVm.connectStatusTrans("connected");

+                fwVm.connectStatusText($.i18n.prop("connected"));

+            } else if(wifiSSID){

+                if(wifiStatus =="dhcping" || wifiStatus =="connecting"){

+                    fwVm.connectStatus("wifi_connecting");

+                    fwVm.connectStatusTrans("connecting");

+                    fwVm.connectStatusText($.i18n.prop("connecting"));

+                }else if(wifiStatus =="connect"){

+                    fwVm.connectStatus("wifi_connect");

+                    fwVm.connectStatusTrans("connected");

+                    fwVm.connectStatusText($.i18n.prop("connected"));

+                }else{

+                    fwVm.connectStatus("ppp_disconnected");

+                    fwVm.connectStatusTrans("disconnected");

+                    fwVm.connectStatusText($.i18n.prop("disconnected"));

+                }

+            }else{

+                fwVm.connectStatusTrans("disconnected");

+                fwVm.connectStatusText($.i18n.prop("disconnected"));

+            }

+        }

+

+        // ��ȡ��ǰ����״̬

+        getNetworkType = function(networkType) {

+			var networkTypeTmp = networkType.toLowerCase();

+			if (networkTypeTmp == '' || networkTypeTmp == 'limited service') {

+				networkTypeTmp = 'limited_service';

+			}

+			if(networkTypeTmp == 'no service') {

+				networkTypeTmp = 'no_service';

+			}

+			if (networkTypeTmp == 'limited_service' || networkTypeTmp == 'no_service') {

+				$("#networkType", "#statusBar").attr("data-trans", "network_type_" + networkTypeTmp);

+				return $.i18n.prop("network_type_" + networkTypeTmp);

+			} else {

+                $("#networkType", "#statusBar").removeAttr("data-trans");

+                return networkType;

+            }

+		};

+

+		if(config.HAS_SMS && menu.checkIsMenuExist("sms_list")){

+            window.setInterval(function () {

+                var info = getCurrentStatusInfo();

+        		if(window.location.hash == "#entry" || sf_simStatusInvalid(info.simStatus)){

+        			return;

+        		}

+        		for(key in sv_messagePopStack){

+        			var val = sv_messagePopStack[key];

+        			if($.now() - val > 5000){

+        				delete(sv_messagePopStack["m" + val]);

+        				var node = $(".bubbleItem#m" + val, "#buttom-bubble");

+        				node.fadeOut(1000, function(){

+        					$(this).remove();

+        				});

+        			}

+        		}

+        		if(info.isLoggedIn){

+        			if(info.newSmsReceived && !sv_newSMSMessageInDealing){

+                        sv_newSMSMessageInDealing = true;

+        				service.resetNewSmsReceivedVar();

+        				sf_checkNewMessages();

+        			}

+        			if(info.smsReportReceived){

+        				service.resetSmsReportReceivedVar();

+        				sf_responseSmsReport();

+        			}

+        		}

+			}, 1000);

+

+            if(config.SMS_DATABASE_SORT_SUPPORT){

+                window.setInterval(function(){

+                    if(menu.checkIsMenuExist("sms_list")){

+                        var info = getCurrentStatusInfo();

+                        if(info.isLoggedIn && sv__initSMSCompleted && !sv_newSMSMessageInDealing && !sf_simStatusInvalid(info.simStatus)){

+                            sv_newSMSMessageInDealing = true;

+                            sf_checkNewMessages();

+                        }

+                    }

+                }, 20001);

+            }

+		}

+

+    	function sf_checkNewMessages(){

+

+            var s_tags     = 1;		

+            var s_smsCount = 5;

+

+            if(!config.dbMsgs || config.dbMsgs.length == 0){

+                s_smsCount = 500;

+                s_tags     = 10;

+            }

+            service.getSMSMessages({

+                page : 0,

+                smsCount : s_smsCount,

+                nMessageStoreType : 0,

+                tags : s_tags,

+                orderBy : "order by id desc"

+            }, function(data){

+                if(data && data.messages){

+                    sf_filterNewMessage(data.messages, 0);

+                }

+                sv_newSMSMessageInDealing = false;

+            });	

+            service.getSMSMessages({

+                page : 0,

+                smsCount : s_smsCount,

+                nMessageStoreType : 1,

+                tags : s_tags,

+                orderBy : "order by id desc"

+            }, function(data){

+                if(data && data.messages){

+                    sf_filterNewMessage(data.messages, 1);

+                }

+                sv_newSMSMessageInDealing = false;

+            });

+    	}

+

+        if(config.HAS_SMS){

+            $(".bubbleItem", "#buttom-bubble").live("mouseover", function(){

+                var $this = $(this);

+                delete(sv_messagePopStack[$this.attr("id")]);

+            }).live("mouseout", function(){

+                    var $this = $(this);

+                    var now = $.now();

+                    sv_messagePopStack["m" + now] = now;

+                    $this.attr("id", "m" + now);

+                    $(".bubbleItem h3 a.bubbleCloseBtn", "#buttom-bubble").data("targetid", "m" + now);

+                });

+

+            $(".bubbleItem h3 a.bubbleCloseBtn", "#buttom-bubble").die().live("click", function(){

+                var id = $(this).data("targetid");

+                delete(sv_messagePopStack[id]);

+                var node = $(".bubbleItem#" + id, "#buttom-bubble");

+                node.fadeOut(1000, function(){

+                    $(this).remove();

+                });

+            });

+        }

+    }

+

+

+    return {

+        init:init,

+        setTrafficAlertPopuped: setTrafficAlertPopuped,

+        setTrafficAlert100Popuped: setTrafficAlert100Popuped,

+        getTrafficResult: getTrafficResult,

+        showOTAAlert:showOTAAlert

+    };

+});

+

+// ����ͳ������ģ��

+define("status_traffic_alert","jquery knockout service statusBar echarts".split(" "), 

+

+    function ($, ko, service, status, echarts) {

+

+    var sv_trafficGraph          = null;

+    var sv_sourceData     = null;

+    var sv_usedDataModified = false;

+    var sv_usedTimeModified = false;	

+

+    var sv_trafficStaticalInfo = {

+        // ����ͼ��ʼֵ

+        data: {

+            alarm: {          

+

+                itemStyle: {

+                    normal: {

+                        color: '#8CC916'

+                    }

+                },

+				name: '������',

+				value: 19.7

+            },

+            alert: {      

+

+                itemStyle: {

+                    normal: {

+                        color: '#FF5500'

+                    }

+                },

+				name: '����ֵ',

+				value: 1

+            },	

+            free: {             

+

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                },

+				name: 'δʹ��',

+				value: 50

+            },

+            full: {

+

+

+                itemStyle: {

+                    normal: {

+                        color: '#DF4313'

+                    }

+                },

+				name: '��������',

+				value: 30

+            },			

+            left1: {            

+

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                },

+				name: '����ֵ��δʹ��',

+				value: 50,

+            },			

+            start: {

+

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                },

+				name: '����ֵ��δʹ��',

+				value: 50

+            },

+            used: {

+

+                itemStyle: {

+                    normal: {

+                        color: '#8CC916'

+                    }

+                },

+				name: '��ʹ��',

+				value: 30

+            }

+        },	

+        cacheEle: {},

+        // Ԫ�ػ�ȡ

+        getEle: function (i_elementId) {

+            if (this.cacheEle.hasOwnProperty('id')) {

+                return this.cacheEle[i_elementId];

+            } else {

+                this.cacheEle[i_elementId] = $("#" + i_elementId);

+                return this.cacheEle[i_elementId];

+            }

+        },

+        // ��ȡ�����澯״ֵ̬

+        fetchTrafficAlertInfo: function(){

+            sv_sourceData = getTrafficAlertInfo();

+            return sv_sourceData;

+        },		

+        // ��ȡ����ֵ�Ͷ�Ӧ��λֵ

+        getTrafficStatisticalDatalnfo: function (i_valueInfo) {

+            return {

+                data: /\d+(.\d+)?/.exec(i_valueInfo)[0],

+                unit: /[A-Z]{1,2}/.exec(i_valueInfo)[0]

+            }

+        },

+

+        // ��ȡʱ��ʱ���֡���

+        getTrafficTimeHours: function (i_time) {

+            var s_timeArray = i_time.split(':');

+            return {

+                h: parseInt(s_timeArray[0], 10),

+                m: parseInt(s_timeArray[1], 10),

+                s: parseInt(s_timeArray[2], 10)

+            }

+        },

+        // ��ȡͳ��ʱ��Ͷ�Ӧ��λֵ

+        getTrafficTimeInfo: function (i_valueInfo) {

+            return {

+                data: /\d+(.\d+)?/.exec(i_valueInfo)[0],

+                unit: /[a-z]{4,6}/.exec(i_valueInfo)[0]

+            }

+        },

+        // ʱ�任���S

+        getTrafficTimeToSeconds: function (i_time) {

+            var s_FormattedTime = this.getTrafficTimeHours(i_time);

+            return s_FormattedTime.h * 3600 + s_FormattedTime.m * 60 + s_FormattedTime.s;

+        },			

+        // ͨ�����ƻ�ȡ������λ

+        getTrafficUnitByScale: function (i_scale) {

+            if (i_scale == '1024') {

+                return 'GB';

+            } else if (i_scale == '1048576') {

+                return 'TB';

+            } else {

+                return 'MB';

+            }

+        },			

+        // ��λ��Ӧֵ��ȡ

+        getTrafficValueByStatisticalUnit: function (i_unit) {

+            i_unit = i_unit.toLowerCase();

+            if(i_unit == 'minute'){

+				return '60';

+			} else if (i_unit == 'gb') {

+                return '1024';

+            } else if(i_unit == 'hour'){

+				return '3600';

+			} else if (i_unit == 'tb') {

+                return '1048576';

+            } else {

+                return '1';

+            }

+        },

+

+        // �������Ƿ�ɱ༭

+        isFormEditable: function (fwVm) {

+            var s_dataPageEditState = fwVm.dataLimitTypeChecked() == '1' && (fwVm.viewEditUsedData() || fwVm.viewEditAlertData() || fwVm.viewEditTotalData());

+            var s_timePageEditState = fwVm.dataLimitTypeChecked() == '0' && (fwVm.viewEditUsedTime() || fwVm.viewEditAlertTime() || fwVm.viewEditTotalTime());

+            if (s_dataPageEditState || s_timePageEditState) {

+                $('.border-color-transition:visible').addClass('attention-focus');

+                addTimeout(function () {

+                    $('.border-color-transition:visible').removeClass('attention-focus');

+                }, 1500);

+                return true;

+            } else {

+                var s_result = false;

+                if (fwVm.dataLimitTypeChecked() == 1) {

+                    if (fwVm.alertDataReach() == '0') {

+                        fwVm.editAlertDataHandler();

+                        s_result = true;

+                    }

+                    if (fwVm.limitDataMonth() == '0') {

+                        fwVm.editTotalDataHandler();

+                        s_result = true;

+                    }

+                } else {

+					if (fwVm.alertTimeReach() == '0') {

+                        fwVm.editAlertTimeHandler();

+                        s_result = true;

+                    }

+                    if (fwVm.limitTimeMonth() == '0') {

+                        fwVm.editTotalTimeHandler();

+                        s_result = true;

+                    }

+                }

+

+                if (s_result) {

+                    $('.border-color-transition:visible').addClass('attention-focus');

+                    addTimeout(function () {

+                        $('.border-color-transition:visible').removeClass('attention-focus');

+                    }, 1500);

+                }

+                return s_result;

+            }

+        },

+

+        // ˢ������ͼ��Ϣ�����������ֵ����ʾ���

+

+        refreshFlowDiagramInfo: function (fwVm) {

+            var s_alarm  = 0;

+            var s_left   = 0;

+            var s_left1  = 0;

+            var s_reach  = 0;	

+            var s_total  = 0;

+            var s_used   = 0;

+

+

+            var s_startName = $.i18n.prop("echarts_no");

+

+            if (sv_sourceData.dataLimitChecked == '1') { //if (fwVm.dataLimitChecked() == '1') { //����

+	        	s_startName = $.i18n.prop("echarts_used");

+	        	sv_trafficGraphOptions.series[0].data = [];    

+

+				if (fwVm.dataLimitTypeChecked() == '1') { // ����

+                    sv_trafficGraphOptions.title.text = "";

+                    sv_trafficGraphOptions.series[0].data = [];

+

+                    if (fwVm.limitDataMonth() == 0) {

+                        var s_usedData = sv_trafficStaticalInfo.data.used;

+                        s_usedData.value = 1;

+                        s_usedData.name = $.i18n.prop("echarts_used");

+                        s_usedData.selected = false;

+                        sv_trafficGraphOptions.series[0].data.push(s_usedData);

+                    } else {

+                        s_total = fwVm.limitDataMonth() * fwVm.selectedDataUnit() * 1048576;

+                        s_used  = parseInt(sv_sourceData.monthlySent, 10) + parseInt(sv_sourceData.monthlyReceived, 10);

+                        s_reach = s_total * fwVm.alertDataReach() / 100;

+

+                        if (s_used >= s_total) {

+                            var s_fullData    = sv_trafficStaticalInfo.data.full;

+                            s_fullData.value  = 100;

+                            s_fullData.name   = $.i18n.prop("echarts_full");

+                            sv_trafficGraphOptions.series[0].data.push(s_fullData);

+                            s_startName = $.i18n.prop("echarts_full");

+                        } else {

+                            if (s_reach > s_used) { 

+                                s_left1 = s_reach - s_used;

+                                s_left  = s_total - s_reach;

+                            } else { 

+                                s_alarm = s_used - s_reach;

+                                s_left  = s_total - s_used;

+                            }

+

+                            var s_usedData = sv_trafficStaticalInfo.data.used;

+                            if (s_reach - s_used > 0) {

+                                s_usedData.value = s_used;

+                            } else {

+                                s_usedData.value = s_reach;

+                            }

+                            s_usedData.name = $.i18n.prop("echarts_used");

+                            sv_trafficGraphOptions.series[0].data.push(s_usedData);

+

+                            if (s_left1 > 0) {

+                                var s_left1Data     = sv_trafficStaticalInfo.data.left1;

+                                s_left1Data.value   = s_left1;

+                                s_left1Data.name    = $.i18n.prop("echarts_left1");

+                                sv_trafficGraphOptions.series[0].data.push(s_left1Data);

+                            }

+

+                            var s_alertData         = sv_trafficStaticalInfo.data.alert;

+                            s_alertData.value       = s_total / 200;

+                            s_alertData.name        = $.i18n.prop("echarts_alert");

+                            sv_trafficGraphOptions.series[0].data.push(s_alertData);

+

+                            if (s_alarm > 0) {

+                                var s_alarmData     = sv_trafficStaticalInfo.data.alarm;

+                                s_alarmData.value   = s_alarm;

+                                s_alarmData.name    = $.i18n.prop("echarts_alarm");

+                                sv_trafficGraphOptions.series[0].data.push(s_alarmData);

+                            }

+

+                            var s_freeData          = sv_trafficStaticalInfo.data.free;

+                            s_freeData.value        = s_left;

+                            s_freeData.name         = $.i18n.prop("echarts_free");

+                            sv_trafficGraphOptions.series[0].data.push(s_freeData);

+                        }

+                    }	

+

+				}else{// ʱ��

+

+                    sv_trafficGraphOptions.series[0].data = [];

+

+                    if (fwVm.limitTimeMonth() == 0) {

+                        var s_usedData        = sv_trafficStaticalInfo.data.used;

+                        s_usedData.value      = 1;

+                        s_usedData.selected   = false;

+                        s_usedData.name       = $.i18n.prop("echarts_used");

+                        sv_trafficGraphOptions.series[0].data.push(s_usedData);

+                    } else {

+                        s_total  = fwVm.limitTimeMonth() * fwVm.selectedTimeUnit();

+                        s_used   = sv_sourceData.monthlyConnectedTime;

+                        s_reach  = s_total * fwVm.alertTimeReach() / 100;

+

+                        if (s_used >= s_total) {

+                            var fullTime   = sv_trafficStaticalInfo.data.full;

+                            fullTime.value = 100;

+                            fullTime.name  = $.i18n.prop("echarts_full");

+                            sv_trafficGraphOptions.series[0].data.push(fullTime);

+                            s_startName    = $.i18n.prop("echarts_full");

+                        } else {

+                            if (s_reach - s_used > 0) {

+                                s_left1 = s_reach - s_used;

+                                s_left  = s_total - s_reach;

+                            } else {

+                                s_alarm = s_used  - s_reach;

+                                s_left  = s_total - s_used;

+                            }

+

+                            var s_usedTime = sv_trafficStaticalInfo.data.used;

+                            if (s_reach - s_used > 0) {

+                                s_usedTime.value = s_used;

+                            } else {

+                                s_usedTime.value = s_reach;

+                            }

+                            s_usedTime.name = $.i18n.prop("echarts_used");

+                            sv_trafficGraphOptions.series[0].data.push(s_usedTime);

+

+                            if (s_left1 > 0) {

+                                var s_left1Time    = sv_trafficStaticalInfo.data.left1;

+                                s_left1Time.value  = s_left1;

+                                s_left1Time.name   = $.i18n.prop("echarts_left1");

+                                sv_trafficGraphOptions.series[0].data.push(s_left1Time);

+                            }

+

+                            var s_alertTime        = sv_trafficStaticalInfo.data.alert;

+                            s_alertTime.value      = s_total / 200;

+                            s_alertTime.name       = $.i18n.prop("echarts_alert");

+                            sv_trafficGraphOptions.series[0].data.push(s_alertTime);

+

+                            if (s_alarm > 0) {

+                                var s_alarmTime      = sv_trafficStaticalInfo.data.alarm;

+                                s_alarmTime.value    = s_alarm;

+                                s_alarmTime.name     = $.i18n.prop("echarts_alarm");

+                                sv_trafficGraphOptions.series[0].data.push(s_alarmTime);

+                            }

+

+                            var s_freeTime         = sv_trafficStaticalInfo.data.free;

+                            s_freeTime.value       = s_left;

+                            s_freeTime.name        = $.i18n.prop("echarts_free");

+                            sv_trafficGraphOptions.series[0].data.push(s_freeTime);

+                        }

+                    }		

+                } 

+            } else {

+                var s_usedData      = sv_trafficStaticalInfo.data.used;

+                s_usedData.value    = 1;

+                s_usedData.selected = false;

+                s_usedData.name     = $.i18n.prop("echarts_no");

+

+                sv_trafficGraphOptions.series[0].data = [s_usedData];

+                sv_trafficGraphOptions.title.text     = '';			

+            }

+            sv_trafficStaticalInfo.setFlowDiagramInfo(sv_trafficGraphOptions, s_startName);

+        },

+

+

+		// �ػ�����ͼ

+        setFlowDiagramInfo: function (i_options, i_startName) {

+            var s_startPart = sv_trafficStaticalInfo.data.start;

+

+            s_startPart.name     = i_startName;			

+            s_startPart.selected = false;

+            s_startPart.value    = 0;

+

+            var s_arr = [s_startPart].concat(i_options.series[0].data);

+            i_options.series[0].data = s_arr;

+            sv_trafficGraph.setOption(i_options, true);

+

+            addTimeout(function () {

+                sv_trafficGraph.resize();

+            }, 1000);

+        }

+    };

+

+

+    // ����ͼ��������

+    var sv_trafficGraphOptions = {

+        animation: false,

+        color: ['red', 'red', 'red', 'red', 'red'],

+        series: [

+            {

+                name: '��������',

+                radius: ['0', '75'],

+                selectedOffset: 3,				

+                type: 'pie',				

+                data: [

+

+                ],			

+                itemStyle: {

+                    normal: {

+                        labelLine: {

+                            show: false

+                        },

+                        label: {

+                            show: false

+                        }

+                    }

+                }				

+            }

+        ],		

+        title: {

+            itemGap: 0,

+			      text: '',

+            subtextStyle: {

+                color: '#FFF',

+                fontFamily: '΢���ź�',

+                fontSize: 16,

+                fontWeight: 'bolder'

+            },				  

+            textStyle: {

+                color: '#FFF',

+                fontFamily: '΢���ź�',

+                fontSize: 20,

+                fontWeight: 'bolder'

+            },

+            x: 'center',

+            y: 'center'			

+        },

+		tooltip: {

+            formatter: "{b}"

+        }      

+    };

+

+

+    // ��ȡ������������

+    function getTrafficAlertInfo() {

+        return service.getTrafficAlertInfo();

+    }

+

+

+

+    // ��������ViewModel

+

+    function trafficViewModel() {

+

+        var target         = this;

+

+        var info                    = sv_trafficStaticalInfo.fetchTrafficAlertInfo();	

+        var dataMonth               = info.limitDataMonth.split("_");

+

+        sv_usedDataModified         = false;

+        sv_usedTimeModified         = false;

+

+        target.alertDataReach               = ko.observable(info.alertDataReach || 0);		

+        target.alertTimeReach               = ko.observable(info.alertTimeReach || 0);

+        target.dataLimitChecked             = ko.observable(info.dataLimitChecked == '0' ? '0' : '1');

+        target.dataLimitTypeChecked         = ko.observable(info.dataLimitTypeChecked == '0' ? '0' : '1');

+        target.limitTimeMonth               = ko.observable(info.limitTimeMonth || 0);	

+

+

+        // ע��˳�� 

+        target.usedDataText                 = ko.observable(transUnit(parseInt(info.monthlySent, 10) + parseInt(info.monthlyReceived, 10), false));

+        var sv_staticalDataInfo             = sv_trafficStaticalInfo.getTrafficStatisticalDatalnfo(target.usedDataText());

+        var sv_staticalInfoData             = sv_staticalDataInfo.data;

+        target.dataUsed                     = ko.observable(sv_staticalInfoData);	

+        var sv_staticalInfoUnit             = sv_staticalDataInfo.unit;

+        target.selectedDataUsedUnit         = ko.observable(sv_trafficStaticalInfo.getTrafficValueByStatisticalUnit(sv_staticalInfoUnit));

+        target.usedDataTextDescData         = ko.observable("");

+

+        target.limitDataMonth               = ko.observable(dataMonth[0] || 0);		

+        target.selectedDataUnit             = ko.observable(dataMonth[1] || 1);		

+

+        var limitDataMonthTmp               = transUnit(target.limitDataMonth() * target.selectedDataUnit() * 1024 * 1024, false);

+        var limitDataMonthUnitTmp           = limitDataMonthTmp.substring(limitDataMonthTmp.length-2);

+        target.limitDataMonth(limitDataMonthTmp.substring(0, limitDataMonthTmp.length-2));

+        target.selectedDataUnit(sv_trafficStaticalInfo.getTrafficValueByStatisticalUnit(limitDataMonthUnitTmp));	

+

+        target.usedDataTextDesc             = ko.computed(sf_usedDataTextDesc);	

+        target.limitDataMonthDescData       = ko.observable("");

+        target.limitDataMonthDesc           = ko.computed(sf_limitDataMonthDesc);	

+        target.alertDataReachDescData       = ko.observable("");		

+        target.alertDataReachDesc           = ko.computed(sf_alertDataReachDesc);	

+        target.leftDataDescData             = ko.observable("");

+        target.leftDataDesc                 = ko.computed(sf_leftDataDesc);	

+        target.monthlyConnectedTime         = ko.observable(transSecond2Time(info.monthlyConnectedTime));

+

+		var sv_timeInfo1                    = sv_trafficStaticalInfo.getTrafficTimeInfo(transTimeUnit(info.monthlyConnectedTime));

+        target.usedTime                     = ko.observable(sv_timeInfo1.data);		

+		target.selectedTimeUsedUnit         = ko.observable(sv_trafficStaticalInfo.getTrafficValueByStatisticalUnit(sv_timeInfo1.unit));	

+

+        target.usedTimeTextDescData         = ko.observable("");

+        target.usedTimeTextDesc             = ko.computed(sf_usedTimeTextDesc);		

+

+		var  sv_timeInfoNew                 = sv_trafficStaticalInfo.getTrafficTimeInfo(transTimeUnit(parseFloat(target.limitTimeMonth()) * 3600));

+		target.selectedTimeUnit             = ko.observable(sv_trafficStaticalInfo.getTrafficValueByStatisticalUnit(sv_timeInfoNew.unit));

+		target.limitTimeMonth(sv_timeInfoNew.data);

+

+

+        target.limitTimeMonthDescData       = ko.observable("");

+		target.limitTimeMonthDescText       = ko.observable("traffic_limit_time_h");		        

+        target.limitTimeMonthDesc           = ko.computed(sf_limitTimeMonthDesc);

+        target.alertTimeReachDescData       = ko.observable("");       	

+        target.alertTimeReachDesc           = ko.computed(sf_alertTimeReachDesc);

+        target.leftTimeDescData             = ko.observable("");        

+        target.leftTimeDesc                 = ko.computed(sf_leftTimeDesc);

+        target.save                         = sf_save;		

+        target.viewEditUsedData             = ko.observable(false);

+        target.editUsedDataHandler          = sf_editUsedDataHandler;

+        target.editUsedDataSaveHandler      = sf_editUsedDataSaveHandler;		

+        target.saveUsedData                 = sf_saveUsedData;		

+        target.editUsedDataCancelHandler    = sf_editUsedDataCancelHandler;

+        target.viewEditTotalData            = ko.observable(false);

+		target.editTotalDataHandler         = sf_editTotalDataHandler;

+		target.editTotalDataSaveHandler     = sf_editTotalDataSaveHandler;

+        target.editTotalDataCancelHandler   = sf_editTotalDataCancelHandler;

+        target.viewEditAlertData            = ko.observable(false);

+		target.editAlertDataHandler         = sf_editAlertDataHandler;

+		target.editAlertDataSaveHandler     = sf_editAlertDataSaveHandler;

+		target.editAlertDataCancelHandler   = sf_editAlertDataCancelHandler;

+        target.viewEditUsedTime             = ko.observable(false);

+		target.editUsedTimeHandler          = sf_editUsedTimeHandler;	

+		target.saveUsedTime                 = sf_saveUsedTime;

+		target.editUsedTimeSaveHandler      = sf_editUsedTimeSaveHandler;

+		target.editUsedTimeCancelHandler    = sf_editUsedTimeCancelHandler;

+		target.viewEditTotalTime            = ko.observable(false);

+		target.editTotalTimeHandler         = sf_editTotalTimeHandler ;

+        target.editTotalTimeSaveHandler     = sf_editTotalTimeSaveHandler;	

+		target.editTotalTimeCancelHandler   = sf_editTotalTimeCancelHandler;

+		target.viewEditAlertTime            = ko.observable(false);

+        target.editAlertTimeHandler         = sf_editAlertTimeHandler;		

+        target.editAlertTimeSaveHandler     = sf_editAlertTimeSaveHandler;

+        target.editAlertTimeCancelHandler   = sf_editAlertTimeCancelHandler;

+        sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);		

+

+

+        // ��������������

+		function sf_alertDataReachDesc() {

+            if(isNaN(target.limitDataMonth() * target.selectedDataUnit() * target.alertDataReach())) {

+                target.alertDataReachDescData(target.alertDataReach() + ', ');

+                return $.i18n.prop('traffic_alert_reach_text', target.alertDataReach(), ' ');

+            }

+

+            var s_value = transUnit(target.limitDataMonth() * target.selectedDataUnit() * target.alertDataReach() * 1048576 / 100, false);

+            target.alertDataReachDescData(target.alertDataReach() + ',' + s_value);

+            return $.i18n.prop('traffic_alert_reach_text', target.alertDataReach(), s_value);

+        }

+		// ʱ������������

+        function sf_alertTimeReachDesc() {

+            if(isNaN(target.limitTimeMonth() * target.alertTimeReach())) {

+                target.alertTimeReachDescData(target.alertTimeReach() + ', ');

+                return $.i18n.prop('traffic_alert_reach_text', target.alertTimeReach(), ' ');

+            }

+            var s_value = transSecond2Time(target.limitTimeMonth() * target.selectedTimeUnit() * target.alertTimeReach() / 100);

+            target.alertTimeReachDescData(target.alertTimeReach() + ',' + s_value);

+            return $.i18n.prop('traffic_alert_reach_text', target.alertTimeReach(), s_value);

+        }	

+

+

+        // ��������ֵȡ���༭��ť�¼�

+		function sf_editAlertDataCancelHandler() {

+            target.alertDataReach(sv_trafficStaticalInfo.getEle('editAlertData').data('oldValue'));

+            target.viewEditAlertData(false);

+        }		

+

+        // ��������ֵ�༭��ť�¼�

+		function sf_editAlertDataHandler() {

+            sv_trafficStaticalInfo.getEle('editAlertData').data('oldValue', target.alertDataReach());

+            target.viewEditAlertData(true);

+        }

+

+        // ��������ֵ����༭��ť�¼�

+		function sf_editAlertDataSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('alertDataReach').valid()) {

+                target.viewEditAlertData(false);

+            }

+        }

+

+        // ʱ������ֵȡ���༭��ť�¼�

+		function sf_editAlertTimeCancelHandler() {

+            target.alertTimeReach(sv_trafficStaticalInfo.getEle('editAlertTime').data('oldValue'));

+            target.viewEditAlertTime(false);

+        }	 

+        // ʱ������ֵ�༭��ť�¼�

+		function sf_editAlertTimeHandler() {

+            sv_trafficStaticalInfo.getEle('editAlertTime').data('oldValue', target.alertTimeReach());

+            target.viewEditAlertTime(true);

+        } 		

+        // ʱ������ֵ����༭��ť�¼�

+		function sf_editAlertTimeSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('alertTimeReach').valid()) {

+                target.viewEditAlertTime(false);

+            }

+        }		

+

+        // �ײ������༭��ť�¼�

+		function sf_editTotalDataHandler() {

+            sv_trafficStaticalInfo.getEle('editTotalData').data('oldValue', target.limitDataMonth());

+            sv_trafficStaticalInfo.getEle('selectedDataUnit').data('oldValue', target.selectedDataUnit());

+            target.viewEditTotalData(true);

+        }

+

+        // �ײ���������༭��ť�¼�

+		function sf_editTotalDataSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('limitDataMonth').valid()) {

+                target.usedDataText(transUnit(target.limitDataMonth() * target.selectedDataUnit() * 1048576, false));

+                target.viewEditTotalData(false);

+            }

+        }

+

+        // �ײ�����ȡ���༭��ť�¼�

+		function sf_editTotalDataCancelHandler() {

+            target.limitDataMonth(sv_trafficStaticalInfo.getEle('editTotalData').data('oldValue'));

+            target.selectedDataUnit(sv_trafficStaticalInfo.getEle('selectedDataUnit').data('oldValue'));

+            target.viewEditTotalData(false);

+        }

+        // �ײ�ʱ��ȡ���༭��ť�¼�

+		function sf_editTotalTimeCancelHandler() {

+            target.limitTimeMonth(sv_trafficStaticalInfo.getEle('editTotalTime').data('oldValue'));

+            target.viewEditTotalTime(false);

+        }       

+        // �ײ�ʱ��༭��ť�¼�

+		function sf_editTotalTimeHandler() {

+            sv_trafficStaticalInfo.getEle('editTotalTime').data('oldValue', target.limitTimeMonth());

+            target.viewEditTotalTime(true);

+        }       

+        // �ײ�ʱ�䱣��༭��ť�¼�

+		function sf_editTotalTimeSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('limitTimeMonth').valid()) {

+                target.viewEditTotalTime(false);

+            }

+        }		

+

+        // ��������ȡ���༭��ť�¼�

+		function sf_editUsedDataCancelHandler() {

+            target.dataUsed(sv_trafficStaticalInfo.getEle('editUsedData').data('oldValue'));

+            target.selectedDataUsedUnit(sv_trafficStaticalInfo.getEle('selectedDataUsedUnit').data('oldValue'));

+            sv_trafficStaticalInfo.getEle('editUsedDataCancel').siblings('label.error').hide();

+            target.viewEditUsedData(false);

+        }	

+        // ���������༭��ť�¼�

+		function sf_editUsedDataHandler() {

+            sv_trafficStaticalInfo.getEle('editUsedData').data('oldValue', target.dataUsed());

+            sv_trafficStaticalInfo.getEle('selectedDataUsedUnit').data('oldValue', target.selectedDataUsedUnit());

+            target.dataUsed(target.dataUsed());

+            target.viewEditUsedData(true);

+        }	

+        // �����������水ť�¼�

+		function sf_editUsedDataSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('dataUsed').valid()) {

+                sv_usedDataModified = true;

+                target.viewEditUsedData(false);

+            }

+        }		

+        // ����ʱ��ȡ���༭��ť�¼�

+		function sf_editUsedTimeCancelHandler() {

+            target.usedTime(sv_trafficStaticalInfo.getEle('editUsedTime').data('oldValue'));

+            target.viewEditUsedTime(false);

+        }		

+        // ����ʱ��༭��ť�¼�

+		function sf_editUsedTimeHandler() {

+            sv_trafficStaticalInfo.getEle('editUsedTime').data('oldValue', target.usedTime());

+            target.viewEditUsedTime(true);

+        }

+

+        // ����ʱ�䱣��༭��ť�¼�

+		function sf_editUsedTimeSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('usedTime').valid()) {

+                target.monthlyConnectedTime(transSecond2Time(parseFloat(target.usedTime()) * target.selectedTimeUsedUnit()));

+                target.viewEditUsedTime(false);

+                sv_usedTimeModified = true;

+            }

+        }

+

+		// ʣ������������	

+        function sf_leftDataDesc() {

+            var s_left = (target.limitDataMonth() * target.selectedDataUnit() - target.dataUsed() * target.selectedDataUsedUnit()) * 1048576;

+            if(s_left < 0) {

+                s_left = 0;

+            }

+

+            if(isNaN(s_left)) {

+                target.leftDataDescData('');

+                return $.i18n.prop('traffic_data_left_text', ' ');

+            }

+

+            target.leftDataDescData(transUnit(s_left, false));

+            return $.i18n.prop('traffic_data_left_text', transUnit(s_left, false));

+        }	

+		//ʣ��ʱ��������

+		function sf_leftTimeDesc() {

+            var s_surplus = target.limitTimeMonth() * target.selectedTimeUnit() - sv_trafficStaticalInfo.getTrafficTimeToSeconds(target.monthlyConnectedTime());

+            if(s_surplus < 0) {

+                s_surplus = 0;

+            }

+

+            if(isNaN(s_surplus)) {

+                target.leftTimeDescData(' ');

+                return $.i18n.prop('traffic_data_left_text', ' ');

+            }

+            target.leftTimeDescData(transSecond2Time(s_surplus));

+            return $.i18n.prop('traffic_data_left_text', transSecond2Time(s_surplus));

+        }

+		// �ײ�����������

+		function sf_limitDataMonthDesc() {

+            if(isNaN(target.limitDataMonth())) {

+                target.limitDataMonthDescData("");

+                return $.i18n.prop('traffic_limit_data_text', ' ');

+            }else{

+			    // todo

+			}

+

+            target.limitDataMonthDescData(target.limitDataMonth() + sv_trafficStaticalInfo.getTrafficUnitByScale(target.selectedDataUnit()));

+            return $.i18n.prop('traffic_limit_data_text', target.limitDataMonth() + sv_trafficStaticalInfo.getTrafficUnitByScale(target.selectedDataUnit()));

+        }	

+		// �ײ�ʱ��������	

+		function sf_limitTimeMonthDesc() {

+            if(isNaN(target.limitTimeMonth())) {

+                target.limitTimeMonthDescData(' ');

+				target.limitTimeMonthDescText('traffic_limit_time_h');

+                return $.i18n.prop('traffic_limit_time_h', ' ');

+            }else{

+			    // todo:

+			}

+

+            target.limitTimeMonthDescData(target.limitTimeMonth());

+

+			if(target.selectedTimeUnit() == "60"){

+				target.limitTimeMonthDescText('traffic_limit_time_m');

+				return $.i18n.prop('traffic_limit_time_m', target.limitTimeMonth());

+			}else{

+				target.limitTimeMonthDescText('traffic_limit_time_h');

+				return $.i18n.prop('traffic_limit_time_h', target.limitTimeMonth());

+			}		

+        }

+

+        // Ӧ�ð�ť�¼�

+        function sf_save() {

+            if (sv_trafficStaticalInfo.isFormEditable(target) && target.dataLimitChecked() == '1') {

+                return false;

+            }

+

+            if (target.selectedDataUnit() == '1' && target.selectedDataUsedUnit() == '1048576' && target.dataLimitTypeChecked() == "1" && target.dataLimitChecked() == '1' && !(parseInt(target.dataUsed(), 10) < parseInt('4096', 10)) ) {

+                showAlert('traffic_over_note');

+				return false;

+            }

+

+            showLoading();

+            service.setTrafficAlertInfo({

+			    alertDataReach: parseInt(target.alertDataReach(), 10),

+				alertTimeReach: parseInt(target.alertTimeReach(), 10),

+                dataLimitChecked: target.dataLimitChecked(),

+                dataLimitTypeChecked: target.dataLimitTypeChecked(),

+                limitDataMonth: target.limitDataMonth() + "_" + target.selectedDataUnit(),             

+                limitTimeMonth: target.selectedTimeUnit() == "60" ? target.limitTimeMonth()/60 : target.limitTimeMonth()//save by hours               

+            }, function (data) {

+                if (data.result == 'success') {

+                    if(target.dataLimitTypeChecked() == "1" && sv_usedDataModified) {

+                        target.saveUsedData();

+                    } else if(target.dataLimitTypeChecked() == "0" && sv_usedTimeModified) {

+                        target.saveUsedTime();

+                    } else {

+                        sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                        sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                        status.setTrafficAlertPopuped(false);

+                        successOverlay();

+                    }

+                } else {

+                    errorOverlay();

+                }

+            }, function () {

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                errorOverlay();

+            });

+        }		

+

+        // ����������������	

+		function sf_saveUsedData() {

+            var val = target.dataUsed() * target.selectedDataUsedUnit();

+            service.trafficCalibration({

+                way: 'data',

+                value: val

+            }, function(){

+                sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                successOverlay();

+                target.viewEditUsedData(false);

+                status.setTrafficAlertPopuped(false);

+                sv_usedDataModified = false;

+            }, function(){

+                sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                errorOverlay();

+            });

+        }	

+

+

+

+		function sf_saveUsedTime() {

+            service.trafficCalibration({

+                way: 'time',

+                value: target.selectedTimeUsedUnit() == "60" ? parseFloat(target.usedTime())/60 : target.usedTime()

+            }, function(){

+                sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                successOverlay();

+                target.monthlyConnectedTime(transSecond2Time(parseFloat(target.usedTime()) * target.selectedTimeUsedUnit()));

+                target.viewEditUsedTime(false);

+                status.setTrafficAlertPopuped(false);

+                sv_usedTimeModified = false;

+            }, function(){

+                sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                errorOverlay();

+            });

+        }	

+

+

+        // ��������������	

+		function sf_usedDataTextDesc() {

+            if(isNaN(target.dataUsed())) {

+                target.usedDataTextDescData("");

+                return $.i18n.prop('traffic_used_text', ' ');

+            }

+            target.usedDataTextDescData(target.dataUsed() + sv_trafficStaticalInfo.getTrafficUnitByScale(target.selectedDataUsedUnit()));

+            return $.i18n.prop('traffic_used_text', target.dataUsed() + sv_trafficStaticalInfo.getTrafficUnitByScale(target.selectedDataUsedUnit()));

+        }		

+        // ����ʱ��������

+        function sf_usedTimeTextDesc() {

+            target.usedTimeTextDescData(target.monthlyConnectedTime());

+            return $.i18n.prop('traffic_used_text', target.monthlyConnectedTime());

+        }			

+

+

+    }

+

+    function init() {

+        sv_trafficGraph = echarts.init($("#traffic_graphic")[0]);

+        window.onresize = sv_trafficGraph.resize;

+        var s_container = $('#container');

+        ko.cleanNode(s_container[0]);

+        var fwVm = new trafficViewModel();

+        ko.applyBindings(fwVm, s_container[0]);

+        $('#trafficAlertForm').validate({

+            submitHandler: function () {

+                fwVm.save();

+            },

+

+

+            errorPlacement: function (error, para) {

+                if (para.attr("name") == "alertDataReach") {

+                    error.insertAfter("#editAlertDataDiv");

+                } else if (para.attr("name") == "alertTimeReach") {

+                    error.insertAfter("#editAlertTimeDiv");

+                } else if (para.attr("name") == "dataUsed") {

+                    error.insertAfter("#editUsedDataDiv");

+                } else if (para.attr("name") == "limitDataMonth") {

+                    error.insertAfter("#editTotalDataDiv");

+                } else if (para.attr("name") == "limitTimeMonth") {

+                    error.insertAfter("#editTotalTimeDiv");

+                } else if (para.attr("name") == "usedTime") {

+                    error.insertAfter("#editUsedTimeDiv");

+                } else {

+                    error.insertAfter(para);

+                }

+            },

+

+            rules: {

+			    alertDataReach: {

+                    range: [ 1, 100 ],

+					digits: true

+                },

+                alertTimeReach: {

+                    range: [ 1, 100 ],

+                    digits: true

+                },

+                dataUsed: {

+					range : [ 0, 9999 ],

+					decimalRange : true

+                },

+                limitDataMonth: {

+					range : [ 1, 9999 ],

+					decimalRange : true

+                },

+                limitTimeMonth: {

+					range : [ 1, 9999 ],

+					decimalRange : true

+                },

+				usedTime: {

+					range : [ 0, 9999 ],

+					decimalRange : true

+                }  

+            }			

+

+        });

+

+		var sv_originalLan = window.language;

+		window.setInterval(function(){			

+			if(sv_originalLan != window.language){

+				sv_originalLan = window.language;

+				sv_trafficStaticalInfo.refreshFlowDiagramInfo(fwVm);

+			}

+        }, 1000);

+

+    }

+

+    return {

+        init: init

+    };

+});

+

+// ״̬����ʾ��ʵ��

+define("tooltip",[ "jquery" ], 

+

+	function($) {	

+

+

+			// ����Ԫ��λ����Ϣ

+			// @method calculatePositionInfo

+			// @param trigger Ԫ��

+			// @param tooltip ״̬��

+			// @param {JSON} config �����

+

+			function calculatePositionInfo(trigger, tooltip, config) {

+				var top      = trigger.offset().top; 

+				var left     = trigger.offset().left; 

+				var position = config.position[0];

+				var height   = tooltip.outerHeight() + trigger.outerHeight();

+				var width    = tooltip.outerWidth() + trigger.outerWidth();

+

+				top         -= tooltip.outerHeight() - config.offset[0];

+				left        += trigger.outerWidth()  + config.offset[1];

+

+				if (/iPad/i.test(navigator.userAgent)) {

+					top -= $(window).scrollTop();

+				}

+

+				if (position == 'center') {

+					top += height / 2;

+				}

+				if (position == 'bottom') {

+					top += height;

+				}

+				position = config.position[1];

+				if (position == 'center') {

+					left -= width / 2;

+				}else if (position == 'left') {

+					left -= width;

+				}

+

+				return {

+					top : top,

+					left : left

+				};

+			}	

+

+			// ״̬����ʼ��

+			function init() {

+

+				$(".statusItem", "#statusBar").each(function(i, n){

+					var $this = $(this);

+					$this.attr("tipTitle", $this.attr("title")).removeAttr("title");

+				}).hover(

+						function() {

+							var $this = $(this);

+							var title = $this.attr("tipTitle");

+							var tooltip = $("<div>").addClass("tooltip in").appendTo(document.body).hide()

+									.append($this.attr("i18n") ? $.i18n.prop(title) : title);

+							if ($this.attr("i18n")) {

+								tooltip.attr("data-trans", title).attr("id", "tooltip_" + $this.attr("id"));

+							}

+							var pos = calculatePositionInfo($this, tooltip, {

+								position : [ 'bottom', 'center' ],

+								offset : [ 0, 0 ]

+							});

+							tooltip.css({

+								position : 'absolute',

+								top : pos.top,

+								left : pos.left

+							}).show();

+						}, function() {

+							$(".tooltip").hide().remove();

+						});

+			}

+

+			return {

+				init : init

+			};

+		});

+

+define("menu","set service knockout underscore jquery".split(" "),

+    function (set, fnc, libko, libus, libjq) {

+    var displayMenuWhenLogout = false;

+    var vmMenu;

+    var menu = [];

+    var menuResource = "";

+

+    function menuExistCheck(path) {

+        for (var i = 0; i < menu.length; i++) {

+            if (menu[i].path == path) {

+                return true;

+            }

+        }

+        return false;

+    }

+

+    function getIsLoggedin() {

+        var loginStatus = fnc.getLoginStatus();

+        return (loginStatus.status == "loggedIn");

+    }

+

+    function buildNew() {

+        var loggedIn = getIsLoggedin();

+        var menuMain = libus.filter(menu, function (param) {

+            return (param.level == '1' && ((param.requireLogin && loggedIn) || !param.requireLogin) && param.hash != "#entry");

+        });

+        vmMenu.menuMain(menuMain);

+        vmMenu.loggedIn(loggedIn);

+

+        getMainWth(vmMenu.menuMain().length);

+        vmMenu.showMenu(loggedIn || displayMenuWhenLogout);

+        libjq("#nav").translate();

+    }

+

+    function getMainWth(len) {

+        var width = 100 / len;

+        libjq('ul#list-nav li').each(function () {

+            libjq(this).css('width', width + '%');

+        });

+    }

+

+    function menuRefresh() {

+        var currentHash = window.location.hash;

+        var itmRoot = libus.find(menu, function (param) {

+            return param.hash == currentHash;

+        });

+        while (itmRoot.parent) {

+            itmRoot = libus.find(menu, function (param) {

+                return param.hash == itmRoot.parent;

+            });

+        }

+        if (!itmRoot.parent) {

+            libjq("#list-nav li").removeClass("active");

+            var mid = itmRoot.hash.substring(1, itmRoot.hash.length);

+            libjq("#list-nav li[mid=" + mid + "]").addClass("active");

+        }

+        vmMenu.changeMenu(itmRoot);

+    }

+

+    function menuSearch(hashVal) {

+        hashVal = hashVal || window.location.hash;

+        var loggedIn = getIsLoggedin();

+        return libus.filter(menu, function (param) {

+            return (hashVal == param.hash && ((param.requireLogin && loggedIn) || !param.requireLogin));

+        });

+    }

+

+    function menuRenderSub(level, baseItem) {

+        var levelItem = libus.find(menu, function (param) {

+            return param.parent == baseItem.hash && param.path == baseItem.path;

+        });

+        libjq(".menu-" + level + "-level").removeClass("active");

+        if (levelItem) {

+            if (level == "two") {

+                menuRenderSub("three", levelItem);

+                //forward/backward support

+                clickMenuTrig(levelItem.hash, level);

+            }

+            libjq(".menu-" + level + "-level." + levelItem.hash.substring(1)).addClass("active");

+        }

+    }

+

+    function menuActSub() {

+        var currentHash = window.location.hash;

+        var itmRoot = libus.find(menu, function (param) {

+            return param.hash == currentHash;

+        });

+        if (itmRoot.level == 1) {

+            menuRenderSub("two", itmRoot);

+        }

+        if (itmRoot.level == 2) {

+            menuRenderSub("three", itmRoot);

+            //forward/backward support

+            clickMenuTrig(itmRoot.hash, itmRoot.level);

+        }

+        if (itmRoot.level == 3) {

+            //forward/backward support

+            clickMenuTrig(itmRoot.parent, itmRoot.level);

+            libjq(".menu-three-level").removeClass("active");

+            libjq(".menu-three-level." + itmRoot.hash.substring(1)).addClass("active");

+        }

+    }

+

+    function clickMenuTrig(hash, level) {

+        libjqobj = libjq(".menu-two-level." + hash.substring(1));

+        var levelArr = ['3', 'three', '2', 'two'];

+        if (libus.indexOf(levelArr, level) != -1 && libjqobj.hasClass('active')) {

+            return;

+        }

+

+        libjqobj.siblings().removeClass('active');

+        libjqobj.addClass('active');

+

+        libjqobj.siblings().not('.menu-two-level').slideUp();

+        libjqobj.next().has('ul li').slideDown();

+    }

+

+    set.blc_wan_mode = fnc.getOpMode().blc_wan_mode;

+    if (!set.RJ45_SUPPORT) {

+        menuResource = "menu";

+    } else {

+        switch (set.blc_wan_mode) {

+        case "PPPOE":

+        case "AUTO_PPPOE":

+            menuResource = "menu_pppoe";

+            break;

+        default:

+            menuResource = "menu";

+            break;

+        }

+    }

+

+    require([set.DEVICE + '/' + menuResource], function (otherMenu) {

+        menu = otherMenu;

+        if (set.SD_CARD_SUPPORT) {

+            menu = menu.concat([{ hash: '#httpshare_guest', path: 'sd_httpshare', level: '', requireLogin: false, checkSIMStatus: false}, 

+						{ hash: '#sdcard', path: 'sd', level: '', requireLogin: true, checkSIMStatus: false}, 

+						{ hash: '#httpshare', path: 'sd_httpshare', level: '', requireLogin: true, checkSIMStatus: false}]);

+        }

+    });

+

+    function initialize() {

+        vmMenu = new Menu_vm();

+    }

+

+    function Menu_vm() {

+        var loginState = getIsLoggedin();

+		var target = this;

+        target.loggedIn = libko.observable(loginState);

+

+        target.showMenu = libko.observable(loginState || displayMenuWhenLogout);

+

+        var menuMain = libus.filter(menu, function (param) {

+            return (param.level == '1' && ((param.requireLogin && target.loggedIn()) || !param.requireLogin) && param.hash != "#entry");

+        });

+

+        target.menuMain = libko.observableArray(menuMain);

+        target.secondMenu = libko.observableArray([]);

+        //target.curThirdMenu; cov_2

+        target.changeMenu = function (data) {

+            var secondMenu = getSubMenu(data);

+            if (secondMenu.length == 0) {

+                libjq("#container").addClass("fixContainerWidth");

+            } else {

+                libjq("#container").removeClass("fixContainerWidth");

+            }

+

+            target.secondMenu(secondMenu);

+            return true;

+        };

+        target.thirdMenu = function () {

+            return target.curThirdMenu;

+        };

+        target.getThirdMenu = function (data) {

+            target.curThirdMenu = getSubMenu(data);

+        };

+        function getSubMenu(data) {

+            return libus.filter(menu, function (param) {

+                return ((param.parent && param.parent == data.hash) && ((param.requireLogin && target.loggedIn()) || !param.requireLogin));

+            });

+        }

+    }

+

+    return {

+        activeSubMenu: menuActSub,

+        checkIsMenuExist: menuExistCheck,

+        findMenu: menuSearch,

+        rebuild: buildNew,

+        refreshMenu: menuRefresh,

+		init: initialize

+    };

+});

diff --git a/lynq/S300/ap/app/zte_webui/js/ext/menu.js b/lynq/S300/ap/app/zte_webui/js/ext/menu.js
new file mode 100755
index 0000000..4eeb17f
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/ext/menu.js
@@ -0,0 +1,315 @@
+define(function () {

+    var needLogin = true;

+    var menu = [{

+            hash: '#tr069',

+            path: 'tr069',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#more',

+            path: 'adm_others',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_url',

+            path: 'firewall_url_filter',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin

+        }, {

+            hash: '#demilitarized_zone',

+            path: 'firewall_dmz_set',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#universal_plug_and_play',

+            path: 'firewall_upnp_set',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#map_port',

+            path: 'firewall_port_map',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#foward_port',

+            path: 'firewall_port_forward',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin

+        }, {

+            hash: '#filter_port',

+            path: 'firewall_port_filter',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_sleep',

+            path: 'wifi_sleep_mode',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pin_mode',

+            path: 'adm_pin',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#pwd_mode',

+            path: 'adm_management',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_mac',

+            path: 'wifi_mac_filter',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_wps',

+            path: 'wifi_wps',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_adv',

+            path: 'wifi_advance',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#conn_device',

+            path: 'wifi_station_info',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_guset',

+            path: 'wifi_guest',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_main',

+            path: 'wifi_main',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#fota',

+            path: 'ota_update',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#dynamic_dns',

+            path: 'ddns',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#cgdcont_set',

+            path: 'network_apn_set',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#network_choose',

+            path: 'network_net_select',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#conn_set',

+            path: 'network_dial_set',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        },

+        {

+            hash: '#wlan_station',

+            path: 'wifi_ap_station',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#msg_set',

+            path: 'sms_set',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#msg_sim',

+            path: 'sms_sim_messages',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#msg_list',

+            path: 'sms_list',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#flow_ctl',

+            path: 'status_traffic_alert',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_work_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_friend_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_family_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_com_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_all_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#usat',

+            path: 'ussd',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#route_set',

+            path: 'adm_lan',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_main',

+            path: 'firewall',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#local_set',

+            path: 'adm_management',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_basic',

+            path: 'wifi_basic',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#network_set',

+            path: 'network_dial_set_cpe',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#fast_set',

+            path: 'adm_quick_set',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        },

+        {

+            hash: '#child_ctl',

+            path: 'firewall_parental_control',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#normal_set',

+            path: 'adm_quick_set',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#pb_main',

+            path: 'phonebook',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#msg_main',

+            path: 'sms_list',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#main',

+            path: 'main',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#entry',

+            path: 'entry',

+            level: '1',

+            requireLogin: false,

+            checkSIMStatus: false

+        },

+    ];

+

+    return menu;

+});

diff --git a/lynq/S300/ap/app/zte_webui/js/ext/menu_pppoe.js b/lynq/S300/ap/app/zte_webui/js/ext/menu_pppoe.js
new file mode 100755
index 0000000..b50f29a
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/ext/menu_pppoe.js
@@ -0,0 +1,315 @@
+define(function () {

+    var needLogin = true;

+    var menu = [{

+            hash: '#tr069',

+            path: 'tr069',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#more',

+            path: 'adm_others',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_url',

+            path: 'firewall_url_filter',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin

+        }, {

+            hash: '#demilitarized_zone',

+            path: 'firewall_dmz_set',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#universal_plug_and_play',

+            path: 'firewall_upnp_set',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#map_port',

+            path: 'firewall_port_map',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#foward_port',

+            path: 'firewall_port_forward',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin

+        }, {

+            hash: '#filter_port',

+            path: 'firewall_port_filter',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_sleep',

+            path: 'wifi_sleep_mode',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pin_mode',

+            path: 'adm_pin',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#pwd_mode',

+            path: 'adm_management',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_mac',

+            path: 'wifi_mac_filter',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_wps',

+            path: 'wifi_wps',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_adv',

+            path: 'wifi_advance',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#conn_device',

+            path: 'wifi_station_info',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_guset',

+            path: 'wifi_guest',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_main',

+            path: 'wifi_main',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#fota',

+            path: 'ota_update',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#dynamic_dns',

+            path: 'ddns',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#cgdcont_set',

+            path: 'network_apn_set',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#network_choose',

+            path: 'network_net_select',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#conn_set',

+            path: 'network_dial_set',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        },

+        {

+            hash: '#wlan_station',

+            path: 'wifi_ap_station',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#msg_set',

+            path: 'sms_set',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#msg_sim',

+            path: 'sms_sim_messages',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#msg_list',

+            path: 'sms_list',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#flow_ctl',

+            path: 'status_traffic_alert',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_work_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_friend_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_family_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_com_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_all_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#usat',

+            path: 'ussd',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#route_set',

+            path: 'adm_lan',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_main',

+            path: 'firewall',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#local_set',

+            path: 'adm_management',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_basic',

+            path: 'wifi_basic',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#network_set',

+            path: 'network_dial_set_cpe',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#fast_set',

+            path: 'adm_quick_set',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        },

+        {

+            hash: '#child_ctl',

+            path: 'firewall_parental_control',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#normal_set',

+            path: 'adm_quick_set',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#pb_main',

+            path: 'phonebook',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#msg_main',

+            path: 'sms_list',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#main',

+            path: 'main',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#entry',

+            path: 'entry',

+            level: '1',

+            requireLogin: false,

+            checkSIMStatus: false

+        },

+    ];

+

+    return menu;

+});

diff --git a/lynq/S300/ap/app/zte_webui/js/ext/set_realtek.js b/lynq/S300/ap/app/zte_webui/js/ext/set_realtek.js
new file mode 100755
index 0000000..2313bab
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/ext/set_realtek.js
@@ -0,0 +1,87 @@
+define(function () {

+    var config = {

+        WEBUI_TITLE: '4G CPE',

+        PRODUCT_TYPE: 'CPE', // ��Ʒ����UFI��CPE

+        HAS_BLACK_AND_WHITE_FILTER: true, //�Ƿ�֧�ֺڰ�����

+        AP_STATION_SUPPORT: false,

+        MAX_STATION_NUMBER: 8,

+        STATION_BLOCK_SUPPORT: true, // �������豸�Ƿ�֧��Block����

+        HAS_MULTI_SSID: false, //��ssid����

+        WIFI_BANDWIDTH_SUPPORT_40MHZ: true, //Ƶ�������Ƿ�֧��40MHZ,reltekоƬ֧��

+        WIFI_BANDWIDTH_SUPPORT: true,

+        WIFI_BAND_SUPPORT: true,

+        SD_CARD_SUPPORT: false, //�Ƿ�֧��SD��

+        DDNS_SUPPORT: false, //DDNS

+        NETWORK_UNLOCK_SUPPORT: true,

+        NETWORK_MODES : [ {

+            name : '802.11 b/g/n',

+            value : '4'

+        } ],

+        WIFI_SUPPORT_QR_CODE: false,

+        HAS_PHONEBOOK: true,

+        HAS_BATTERY: true, //�Ƿ��е��

+		FAST_BOOT_SUPPORT: false, //�Ƿ�֧�ֿ��ٿ���

+        TURN_OFF_SUPPORT: false, //�Ƿ�֧�ֹػ�

+		WIFI_SLEEP_SUPPORT: false, // �Ƿ�֧��wifi����

+        HAS_USSD: true, // 是否支持USSD功能,

+        WIFI_WAP3_SUPPORT: false, //是否支持wifi WAP3加密

+        WIFI_WPA2_WAP3_SUPPORT: false, //是否支持wifi WPA2/WAP3兼容模式

+        //station����ģʽ

+        //wifi加密模式

+        AUTH_MODES: [{

+            name: 'NO ENCRYPTION',

+            value: 'OPEN'

+        }, {

+            name: 'WPA2(AES)-PSK',

+            value: 'WPA2PSK'

+        }, {

+            name: 'WPA-PSK/WPA2-PSK',

+            value: 'WPAPSKWPA2PSK'

+        }

+    ],

+    AUTH_MODES_WEP: [{

+            name: 'NO ENCRYPTION',

+            value: 'OPEN'

+        }, {

+            name: 'SHARED',

+            value: 'SHARED'

+        }, {

+            name: 'WPA2(AES)-PSK',

+            value: 'WPA2PSK'

+        }, {

+            name: 'WPA-PSK/WPA2-PSK',

+            value: 'WPAPSKWPA2PSK'

+        }

+    ],

+        AUTH_MODES_ALL: [{

+                name: 'NO ENCRYPTION',

+                value: 'OPEN'

+            }, {

+                name: 'SHARED',

+                value: 'SHARED'

+            }, {

+                name: 'WPA-PSK',

+                value: 'WPAPSK'

+            }, {

+                name: 'WPA2-PSK',

+                value: 'WPA2PSK'

+            }, {

+                name: 'WPA-PSK/WPA2-PSK',

+                value: 'WPAPSKWPA2PSK'

+            }

+        ],

+        AUTO_MODES: [{

+                name: 'Automatic',

+                value: 'NETWORK_auto'

+            }, {

+                name: '4G Only',

+                value: 'Only_LTE'

+            }, {

+                name: '3G Only',

+                value: 'Only_WCDMA'

+            }

+        ]

+    };

+

+    return config;

+});

diff --git a/lynq/S300/ap/app/zte_webui/js/lib.js b/lynq/S300/ap/app/zte_webui/js/lib.js
new file mode 100755
index 0000000..0703ce2
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/lib.js
@@ -0,0 +1,1168 @@
+function restartDevice(service) {

+    showLoading("restarting");

+    service.restart({}, function (data) {

+        if (data && data.result == "success") {

+            successOverlay();

+        } else {

+            errorOverlay();

+        }

+    }, $.noop);

+}

+function signalFormat(signal) {

+    if (signal) {

+        if (signal > 0) {

+            return "-" + signal + " dBm";

+        } else {

+            return signal + " dBm";

+        }

+    } else {

+        return "— —";

+    }

+}

+function convertSignal(data) {

+    var type_2g = ["GSM", "GPRS", "EDGE", "G", "E"];

+    var type_3g = ["UMTS", "HSDPA", "HSUPA", "HSPA", "HSPA+", "DC-HSPA+", "WCDMA", "TD-SCDMA", "TD", "3G", "TD_SCDMA"];

+    var type_4g = ["LTE", "4G", "FDD", "TDD", "TDD-LTE", "FDD-LTE", "TDD_LTE", "FDD_LTE"];

+    var network_type = data.sub_network_type ? data.sub_network_type : (data.network_type ? data.network_type : '');

+    if ($.inArray(network_type, type_2g) != -1) {

+        return data.rssi;

+    } else if ($.inArray(network_type, type_3g) != -1) {

+        return data.rscp;

+    } else if ($.inArray(network_type, type_4g) != -1) {

+        return data.lte_rsrp;

+    }

+}

+

+function verifyDeviceInfo(field) {

+    if (field && field != "" && field != "0.0.0.0") {

+        return field;

+    } else {

+        return "— —";

+    }

+}

+$(document).ready(function () {

+    $("body").click(function (evt) {

+        var $popover = $(".popover");

+        var $target = $(evt.target);

+        if ((evt.target.id != $popover.data('source') && $target.parents('.popover').length == 0) || $target.hasClass("popover-close")) {

+            popover.close();

+        }

+    });

+});

+var popover = {

+    popoverEle: null,

+    _init: function () {

+        if (this.popoverEle == null) {

+            $("body").append('<div class="popover"></div>');

+            this.popoverEle = $(".popover");

+        }

+    },

+    open: function (opt) {

+        this._init();

+        var offset = opt.target.offset();

+        var top = offset.top + opt.target.outerHeight();

+        this.popoverEle.html(opt.html).css({

+            width: opt.width,

+            left: offset.left,

+            top: top

+        }).data({

+            source: opt.target[0].id

+        }).translate();

+        setTimeout(function () {

+            popover.popoverEle.show();

+        }, 100);

+        this.popoverEle.translate();

+        opt.validation && opt.validation.apply();

+    },

+    close: function () {

+        this.popoverEle && this.popoverEle.fadeOut();

+    },

+    show: function () {

+        this.popoverEle && this.popoverEle.show();

+    },

+    hide: function () {

+        this.popoverEle && this.popoverEle.hide();

+    }

+};

+function isWifiConnected(user_ip_addr, station_list) {

+    return !!_.find(station_list, function (station) {

+        return station.ip_addr == user_ip_addr;

+    });

+}

+function trim(stringToTrim) {

+    return stringToTrim.replace(/^\s+|\s+$/g, "");

+}

+

+function renderCustomElement(container) {

+    if (!container) {

+        container = $("#container");

+    }

+    var radios = container.find("input[type='radio']");

+    var checkboxes = container.find("input[type='checkbox']");

+    $.each(radios, function (i, n) {

+        var $el = $(n),

+        ch = 'checked',

+        checkAction = $el.prop('checked') ? true : false;

+        $el.closest('.radio')[checkAction ? 'addClass' : 'removeClass'](ch) && checkAction ? $el.attr(ch, true) : $el.removeAttr(ch);

+    });

+    $.each(checkboxes, function (i, n) {

+        var $el = $(n),

+        ch = 'checked',

+        checkAction = $el.prop('checked') ? true : false;

+        $el.closest('.checkbox')[checkAction ? 'addClass' : 'removeClass'](ch) && checkAction ? $el.attr(ch, true) : $el.removeAttr(ch);

+    });

+}

+

+function getSelectValFromChosen(choices) {

+    var choicesNums = [];

+    $.each(choices, function (i, n) {

+        var arr = $(n).text().split('/');

+        choicesNums.push(arr[arr.length - 1]);

+    });

+    return choicesNums;

+}

+function syncSelectAndChosen(select, choices) {

+    var choicesNums = getSelectValFromChosen(choices);

+    select.val(choicesNums);

+    return choicesNums;

+}

+

+function getPercent(numerator, denominator, accuracy) {

+    if (accuracy) {

+        accuracy = accuracy * 10;

+    } else {

+        accuracy = 100;

+    }

+    return roundToTwoDecimalNumber(numerator / denominator * accuracy) + "%";

+}

+function checkConnectedStatus(modemConnStatus, rj45ConnStatus, apConnStatus) {

+    return modemConnStatus == "ppp_connected" || rj45ConnStatus == "working" || apConnStatus == "connect";

+}

+

+function enableBtn(ele) {

+    ele.removeAttr("disabled").removeClass("disabled");

+}

+function replaceSpaceWithNbsp(str) {

+    return str.replace(/ /g, '&nbsp;');

+}

+function URLEncodeComponent(url) {

+    return encodeURIComponent(url);

+}

+function URLEncode(url) {

+    return encodeURI(url);

+}

+function checkCableMode(currentMode) {

+    return currentMode == "PPPOE" || currentMode == "AUTO_PPPOE";

+}

+function disableBtn(ele) {

+    ele.attr("disabled", "disabled").removeClass("focusIn").addClass("disabled");

+}

+var Escape = {

+    html: function (string) {

+        return (string + '').replace(/[&<>"'\/`]/g, Escape._htmlReplacer);

+    },

+    regex: function (string) {

+        return (string + '').replace(/[\-$\^*()+\[\]{}|\\,.?\s]/g, '\\$&');

+    },

+    _htmlReplacer: function (match) {

+        return Escape.HTML_CHARS[match];

+    },

+    HTML_CHARS: {

+        '&': '&amp;',

+        '<': '&lt;',

+        '>': '&gt;',

+        '"': '&quot;',

+        "'": '&#x27;',

+        '/': '&#x2F;',

+        '`': '&#x60;'

+    }

+};

+function roundToTwoDecimalNumber(num) {

+    return Math.round(num * 100) / 100;

+}

+function HTMLEncode(html) {

+    return Escape.html(html);

+}

+function HTMLDecode(text) {

+    var temp = document.createElement("div");

+    temp.innerHTML = text;

+    var output = temp.innerText || temp.textContent;

+    output = output.replace(new RegExp("&nbsp;", "gm"), " ");

+    temp = null;

+    return output;

+}

+function getDisplayVolume1(volume, isSpeed) {

+    volume = parseInt(volume, 10);

+    if (volume == "" || volume == "0") {

+        return "";

+    }

+    var needReverse = false;

+    if (volume < 0) {

+        needReverse = true;

+        volume = 0 - volume;

+    }

+    var numberOfBytesInOneB = 1;

+    var numberOfBytesInOneKB = numberOfBytesInOneB * 1024;

+    var numberOfBytesInOneMB = numberOfBytesInOneKB * 1024;

+    var numberOfBytesInOneGB = numberOfBytesInOneMB * 1024;

+    var numberOfBytesInOneTB = numberOfBytesInOneGB * 1024;

+    var labelForOneB = isSpeed ? 'b' : 'B';

+    var labelForOneKB = isSpeed ? 'Kb' : 'KB';

+    var labelForOneMB = isSpeed ? 'Mb' : 'MB';

+    var labelForOneGB = isSpeed ? 'Gb' : 'GB';

+    var labelForOneTB = isSpeed ? 'Tb' : 'TB';

+    if (isSpeed) {

+        volume = volume * 8;

+    }

+    var vol = volume / numberOfBytesInOneTB;

+    var displayString = roundToTwoDecimalNumber(vol) + labelForOneTB;

+    if (vol < 0.5) {

+        vol = volume / numberOfBytesInOneGB;

+        displayString = roundToTwoDecimalNumber(vol) + labelForOneGB;

+        if (vol < 0.5) {

+            vol = volume / numberOfBytesInOneMB;

+            displayString = roundToTwoDecimalNumber(vol) + labelForOneMB;

+            if (isSpeed) {

+                if (vol < 0.5) {

+                    vol = volume / numberOfBytesInOneKB;

+                    displayString = roundToTwoDecimalNumber(vol) + labelForOneKB;

+                    if (vol < 0.5) {

+                        vol = volume;

+                        displayString = roundToTwoDecimalNumber(vol) + labelForOneB;

+                    }

+                }

+            }

+        }

+    }

+    if (needReverse) {

+        displayString = "-" + displayString;

+    }

+    return displayString;

+}

+function getDisplayVolume(volume, isSpeed) {

+    volume = parseInt(volume, 10);

+    if (volume == "" || volume == "0") {

+        return "";

+    }

+    var needReverse = false;

+    if (volume < 0) {

+        needReverse = true;

+        volume = 0 - volume;

+    }

+    var numberOfBytesInOneB = 1;

+    var numberOfBytesInOneKB = numberOfBytesInOneB * 1024;

+    var numberOfBytesInOneMB = numberOfBytesInOneKB * 1024;

+    var numberOfBytesInOneGB = numberOfBytesInOneMB * 1024;

+    var numberOfBytesInOneTB = numberOfBytesInOneGB * 1024;

+    var labelForOneB = isSpeed ? 'b' : 'B';

+    var labelForOneKB = isSpeed ? 'Kb' : 'KB';

+    var labelForOneMB = isSpeed ? 'Mb' : 'MB';

+    var labelForOneGB = isSpeed ? 'Gb' : 'GB';

+    var labelForOneTB = isSpeed ? 'Tb' : 'TB';

+    if (isSpeed) {

+        volume = volume * 8;

+    }

+    var vol = volume / numberOfBytesInOneTB;

+    var displayString = roundToTwoDecimalNumber(vol) + labelForOneTB;

+    if (vol < 0.5) {

+        vol = volume / numberOfBytesInOneGB;

+        displayString = roundToTwoDecimalNumber(vol) + labelForOneGB;

+        if (vol < 0.5) {

+            vol = volume / numberOfBytesInOneMB;

+            displayString = roundToTwoDecimalNumber(vol) + labelForOneMB;

+            if (vol < 0.5) {

+                vol = volume / numberOfBytesInOneKB;

+                displayString = roundToTwoDecimalNumber(vol) + labelForOneKB;

+                if (vol < 0.5) {

+                    vol = volume;

+                    displayString = roundToTwoDecimalNumber(vol) + labelForOneB;

+                }

+            }

+        }

+    }

+    if (needReverse) {

+        displayString = "-" + displayString;

+    }

+    return displayString;

+}

+function transUnit(data, isSpeed) {

+    var result = getDisplayVolume1(data, isSpeed);

+    if (result == "") {

+        result = isSpeed ? "0b" : "0MB";

+    }

+    if (isSpeed) {

+        result += "/s";

+    }

+    return result;

+}

+function transTimeUnit(data) {

+    data = parseFloat(data);

+    if (data == "") {

+        return result = "0hour";

+    }

+    var needReverse = false;

+    if (data < 0) {

+        needReverse = true;

+        data = 0 - data;

+    }

+    var labelForOneMinute = 'minute';

+    var labelForOneHour = 'hour';

+    var vol = data / 3600;

+    var result = roundToTwoDecimalNumber(vol) + labelForOneHour;

+    if (vol < 1) {

+        vol = data / 60;

+        result = roundToTwoDecimalNumber(vol) + labelForOneMinute;

+    }

+    if (needReverse) {

+        result = "-" + result;

+    }

+    return result;

+}

+function transSecond2Time(secs) {

+    secs = parseInt(secs, 10);

+    var isNegative = false;

+    if (secs < 0) {

+        isNegative = true;

+        secs = 0 - secs;

+    }

+    var hour = Math.floor(secs / 3600);

+    secs = secs % 3600;

+    var minu = Math.floor(secs / 60);

+    secs = secs % 60;

+    return (isNegative ? '-' : '') + leftInsert(hour, 2, '0') + ":" + leftInsert(minu, 2, '0') + ":" + leftInsert(secs, 2, '0');

+}

+function leftInsert(value, length, placeholder) {

+    var len = value.toString().length;

+    for (; len < length; len++) {

+        value = placeholder + value;

+    }

+    return value;

+}

+

+var _timeoutStack = [];

+var _intervalStack = [];

+function addTimeout(code, delay) {

+    var time = window.setTimeout(code, delay);

+    _timeoutStack.push(time);

+    return time;

+}

+function addInterval(code, delay) {

+    var time = window.setInterval(code, delay);

+    _intervalStack.push(time);

+    return time;

+}

+function clearTimer() {

+    clearTimeoutTimer();

+    clearIntervalTimer();

+}

+function clearTimeoutTimer() {

+    for (var i = 0; i < _timeoutStack.length; i++) {

+        window.clearTimeout(_timeoutStack[i]);

+    }

+    _timeoutStack = [];

+}

+function clearIntervalTimer() {

+    for (var i = 0; i < _intervalStack.length; i++) {

+        window.clearInterval(_intervalStack[i]);

+    }

+    _intervalStack = [];

+}

+$(document).ready(function () {

+    $("[manualControl!=true].checkbox").live("click", function (event) {

+        var $this = $(this);

+        if ($this.hasClass('disable')) {

+            return false;

+        }

+        var checkbox = $this.find("input:checkbox");

+        if (checkbox.attr("checked")) {

+            checkbox.removeAttr("checked");

+        } else {

+            checkbox.attr("checked", "checked");

+        }

+        checkCheckbox(checkbox);

+        event.stopPropagation();

+        return true;

+    });

+    $('input[type="text"][noAction!="true"],input[type="password"][noAction!="true"],select').live("focusin", function (event) {

+        $(this).addClass("focusIn");

+    }).live("focusout", function (event) {

+        $(this).removeClass("focusIn");

+    });

+    $(".form-note .notes-title").live('click', function () {

+        var $this = $(this);

+        $this.siblings("ul.notes-content:first").slideToggle();

+        $this.toggleClass("notes-dot");

+    });

+});

+var GSM7_Table = ["000A", "000C", "000D", "0020", "0021", "0022", "0023", "0024", "0025", "0026", "0027", "0028", "0029", "002A", "002B", "002C", "002D", "002E", "002F", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "003A", "003A", "003B", "003C", "003D", "003E", "003F", "0040", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "005B", "005C", "005D", "005E", "005F", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "007B", "007C", "007D", "007E", "00A0", "00A1", "00A3", "00A4", "00A5", "00A7", "00BF", "00C4", "00C5", "00C6", "00C7", "00C9", "00D1", "00D6", "00D8", "00DC", "00DF", "00E0", "00E4", "00E5", "00E6", "00E8", "00E9", "00EC", "00F1", "00F2", "00F6", "00F8", "00F9", "00FC", "0393", "0394", "0398", "039B", "039E", "03A0", "03A3", "03A6", "03A8", "03A9", "20AC"];

+var GSM7_Table_Extend = ["007B", "007D", "005B", "005D", "007E", "005C", "005E", "20AC", "007C"];

+function getEncodeType(strMessage) {

+    var encodeType = "GSM7_default";

+    var gsm7_extend_char_len = 0;

+    if (!strMessage) {

+        return {

+            encodeType: encodeType,

+            extendLen: gsm7_extend_char_len

+        };

+    }

+    for (var i = 0; i < strMessage.length; i++) {

+        var charCode = strMessage.charCodeAt(i).toString(16).toUpperCase();

+        while (charCode.length != 4) {

+            charCode = "0" + charCode;

+        }

+        if ($.inArray(charCode, GSM7_Table_Extend) != -1) {

+            gsm7_extend_char_len++;

+        }

+        if ($.inArray(charCode, GSM7_Table) == -1) {

+            encodeType = "UNICODE";

+            gsm7_extend_char_len = 0;

+            break;

+        }

+    }

+    return {

+        encodeType: encodeType,

+        extendLen: gsm7_extend_char_len

+    };

+}

+function encodeMessage(textString) {

+    var haut = 0;

+    var result = '';

+    if (!textString)

+        return result;

+    for (var i = 0; i < textString.length; i++) {

+        var b = textString.charCodeAt(i);

+        if (haut != 0) {

+            if (0xDC00 <= b && b <= 0xDFFF) {

+                result += dec2hex(0x10000 + ((haut - 0xD800) << 10) + (b - 0xDC00));

+                haut = 0;

+                continue;

+            } else {

+                haut = 0;

+            }

+        }

+        if (0xD800 <= b && b <= 0xDBFF) {

+            haut = b;

+        } else {

+            cp = dec2hex(b);

+            while (cp.length < 4) {

+                cp = '0' + cp;

+            }

+            result += cp;

+        }

+    }

+    return result;

+}

+var specialChars = ['000D', '000A', '0009', '0000'];

+var specialCharsIgnoreWrap = ['0009', '0000'];

+function decodeMessage(str, ignoreWrap) {

+    if (!str)

+        return "";

+    var specials = specialCharsIgnoreWrap;

+    return str.replace(/([A-Fa-f0-9]{1,4})/g, function (matchstr, parens) {

+        if ($.inArray(parens, specials) == -1) {

+            return hex2char(parens);

+        } else {

+            return '';

+        }

+    });

+}

+function dec2hex(textString) {

+    return (textString + 0).toString(16).toUpperCase();

+}

+function hex2char(hex) {

+    var result = '';

+    var n = parseInt(hex, 16);

+    if (n <= 0xFFFF) {

+        result += String.fromCharCode(n);

+    } else if (n <= 0x10FFFF) {

+        n -= 0x10000;

+        result += String.fromCharCode(0xD800 | (n >> 10)) + String.fromCharCode(0xDC00 | (n & 0x3FF));

+    }

+    return result;

+}

+function renderCheckbox() {

+    var checkboxToggle = $(".checkboxToggle");

+    checkboxToggle.each(function () {

+        checkBoxesSize($(this));

+    });

+    var checkboxes = $(".checkbox").not("[class*='checkboxToggle']").find("input:checkbox");

+    if (checkboxes.length == 0) {

+        disableCheckbox(checkboxToggle);

+    } else {

+        enableCheckbox(checkboxToggle);

+    }

+    checkboxes.each(function () {

+        checkCheckbox($(this));

+    });

+}

+function checkBoxesSize(selectAll) {

+    var target = selectAll.attr("target");

+    var boxSize = $("#" + target + " .checkbox input:checkbox").length;

+    var checkedBoxSize = $("#" + target + " .checkbox input:checkbox:checked").length;

+    var checkbox = selectAll.find("input:checkbox");

+    if (boxSize != 0 && boxSize == checkedBoxSize) {

+        checkbox.attr("checked", "checked");

+    } else {

+        checkbox.removeAttr("checked");

+    }

+    checkP(checkbox);

+}

+function checkSelectAll(selectAll, target) {

+    var theCheckbox = $("#" + target + " .checkbox input:checkbox");

+    if (selectAll.attr("checked")) {

+        theCheckbox.attr("checked", "checked");

+    } else {

+        theCheckbox.removeAttr("checked");

+    }

+    theCheckbox.each(function () {

+        checkCheckbox($(this));

+    });

+}

+function checkCheckbox(checkbox) {

+    if (checkbox.closest("p.checkbox").hasClass("checkboxToggle")) {

+        checkSelectAll(checkbox, checkbox.closest("p.checkbox").attr("target"));

+    }

+    checkP(checkbox);

+    checkBoxesSize($("#" + checkbox.attr("target")));

+}

+function checkP(checkbox) {

+    if (checkbox.attr("checked")) {

+        checkbox.closest("p.checkbox").addClass("checkbox_selected");

+    } else {

+        checkbox.closest("p.checkbox").removeClass("checkbox_selected");

+    }

+}

+function removeChecked(id) {

+    $("#" + id).removeClass("checkbox_selected").find("input:checkbox").removeAttr("checked");

+}

+function disableCheckbox(checkbox) {

+    var chk = checkbox.find("input:checkbox");

+    if (chk.attr("checked")) {

+        checkbox.addClass('checked_disable');

+    } else {

+        checkbox.addClass('disable');

+    }

+}

+function enableCheckbox(checkbox) {

+    checkbox.removeClass('disable').removeClass("checked_disable");

+}

+function tryToDisableCheckAll(checkbox, len) {

+    if (len == 0) {

+        disableCheckbox(checkbox);

+    } else {

+        enableCheckbox(checkbox);

+    }

+}

+

+function escapeMessage(msg) {

+    return msg;

+}

+function parseTime(date) {

+    if (date.indexOf("+") > -1) {

+        date = date.substring(0, date.lastIndexOf("+"));

+    }

+    var dateArr;

+    if (date.indexOf(",") > -1) {

+        dateArr = date.split(",");

+    } else {

+        dateArr = date.split(";");

+    }

+    if (dateArr.length == 0) {

+        return "";

+    } else {

+        var time = dateArr[0] + "-" + dateArr[1] + "-" + dateArr[2] + " " + leftInsert(dateArr[3], 2, '0') + ":" + leftInsert(dateArr[4], 2, '0') + ":"

+            +leftInsert(dateArr[5], 2, '0');

+        return time;

+    }

+}

+function transTime(data) {

+    var dateArr = data.split(",");

+    if (dateArr.length == 0 || ("," + data + ",").indexOf(",,") != -1) {

+        return "";

+    } else {

+        var time = dateArr[0] + "/" + dateArr[1] + "/" + dateArr[2] + " " + leftInsert(dateArr[3], 2, '0') + ":" + leftInsert(dateArr[4], 2, '0') + ":"

+            +leftInsert(dateArr[5], 2, '0');

+        return time;

+    }

+}

+function getSmsCount(str) {

+    var encodeType = getEncodeType(str);

+    var len = str.length,

+    gsm7 = encodeType.encodeType != "UNICODE",

+    needChunking = false,

+    chunkSize = 0;

+    if (gsm7) {

+        needChunking = (len + encodeType.extendLen) > 160;

+        chunkSize = 153;

+    } else {

+        needChunking = len > 70;

+        chunkSize = 67;

+    }

+    if (needChunking) {

+        return Math.ceil((len + encodeType.extendLen) / chunkSize);

+    } else {

+        return 1;

+    }

+}

+function getInsertPos(textbox) {

+    var iPos = 0;

+    if (textbox.selectionStart || textbox.selectionStart == "0") {

+        iPos = textbox.selectionStart;

+    } else if (document.selection) {

+        textbox.focus();

+        var range = document.selection.createRange();

+        var rangeCopy = range.duplicate();

+        rangeCopy.moveToElementText(textbox);

+        while (range.compareEndPoints("StartToStart", rangeCopy) > 0) {

+            range.moveStart("character", -1);

+            iPos++;

+        }

+    }

+    return iPos;

+}

+function setInsertPos(textbox, iPos) {

+    textbox.focus();

+    if (textbox.selectionStart || textbox.selectionStart == "0") {

+        textbox.selectionStart = iPos;

+        textbox.selectionEnd = iPos;

+    } else if (document.selection) {

+        var range = textbox.createTextRange();

+        range.moveStart("character", iPos);

+        range.collapse(true);

+        range.select();

+    }

+}

+function isIntNum(input, num) {

+    for (var i = 1; i < 6; i++) {

+        if (input == i * num) {

+            return true;

+        }

+    }

+    return false;

+}

+

+function transUnixTime(millisecond) {

+    var time = new Date(parseInt(millisecond, 10));

+    var year = time.getFullYear();

+    var month = leftPad(time.getMonth() + 1, 2, "0");

+    var date = leftPad(time.getDate(), 2, "0");

+    var hour = leftPad(time.getHours(), 2, "0");

+    var minute = leftPad(time.getMinutes(), 2, "0");

+    var second = leftPad(time.getSeconds(), 2, "0");

+    return year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;

+}

+function leftPad(value, length, placeholder) {

+    var len = value.toString().length;

+    for (; len < length; len++) {

+        value = placeholder + value;

+    }

+    return value;

+};

+function convertNumberToId(number) {

+    return number.replace(/[\+\*#]/g, '_');

+}

+function getLastNumber(number, len) {

+    if (number.length > len) {

+        return convertNumberToId(number.substring(number.length - len, number.length));

+    }

+    return convertNumberToId(number);

+}

+function fixTableHeight() {

+    if ($.browser.msie) {

+        var heightTimer = setInterval(function () {

+            var $table = $(".fixTableScroll")[0];

+            if ($table) {

+                var scrollHeight = $table.scrollHeight;

+                if (scrollHeight != 0) {

+                    $table.style.height = scrollHeight + 20;

+                    window.clearInterval(heightTimer);

+                }

+            } else {

+                window.clearInterval(heightTimer);

+            }

+        }, 300);

+    }

+}

+function refreshTableHeight() {

+    if ($.browser.msie) {

+        $(".fixTableScroll")[0].style.height = $(".fixTableScroll .ko-grid-container")[0].scrollHeight + 35;

+    }

+}

+

+function popup(option) {

+    $.modal.close();

+    var minHeight = option.minHeight || 140;

+    $('#confirm').modal({

+        zIndex: 3000,

+        position: ["30%"],

+        overlayId: 'confirm-overlay',

+        containerId: 'confirm-container',

+        escClose: false,

+        minHeight: minHeight

+    });

+    var $confirmDiv = $('div#confirm');

+    $('#confirmImg', $confirmDiv).attr('src', option.img);

+    $('#popTitle', $confirmDiv).html($.i18n.prop(option.title));

+    if (typeof option.msg != 'string') {

+        var params = [option.msg.msg];

+        params.push(option.msg.params);

+        $('.message', $confirmDiv).html($.i18n.prop.apply(null, _.flatten(params)));      

+    } else {

+		$('.message', $confirmDiv).html($.i18n.prop(option.msg));

+    }

+    var $promptDiv = $("div.promptDiv", $confirmDiv);

+    if (option.showInput === true) {

+        $promptDiv.show();

+        $("input#promptInput", $promptDiv).val(option.defaultValue ? option.defaultValue : "");

+        $(".promptErrorLabel", $promptDiv).empty();

+    } else {

+        $promptDiv.hide();

+    }

+    window.setTimeout(function () {

+        $(':input:enabled:visible:first', '#confirm-container').focus();

+    }, 0);

+}

+function showSettingWindow(title, htmlPath, jsPath, minWidth, minHeight, callback) {

+    var option = {

+        title: title,

+        htmlPath: htmlPath,

+        jsPath: jsPath,

+        minHeight: minHeight,

+        minWidth: minWidth

+    };

+    var callbackIsFunction = $.isFunction(callback);

+    var callbackIsPojo = $.isPlainObject(callback);

+    popupSettingWindow(option);

+}

+function popupSettingWindow(option) {

+    $.modal.close();

+    var minHeight = option.minHeight || 140;

+    var minWidth = option.minWidth || 400;

+    var subContainer = $("#htmlContainer");

+    var tmplPath = 'text!tmpl/' + option.htmlPath + '.html';

+    require([tmplPath, option.jsPath], function (tmpl, viewModel) {

+        subContainer.stop(true, true);

+        subContainer.hide();

+        subContainer.html(tmpl);

+        viewModel.init();

+        $('#htmlContainer').translate();

+        subContainer.show();

+        $('#htmlContainer').css("opacity", 50);

+    });

+    $('#popupSettingWindow').modal({

+        zIndex: 3000,

+        position: ["30%"],

+        escClose: false,

+        minWidth: minWidth,

+        minHeight: minHeight,

+        maxWidth: 400,

+        opacity: 50

+    });

+}

+function hidePopupSettingWindow() {

+    $("#popupSettingWindow").remove();

+    $.modal.close();

+}

+function showInfo(msgObj, minHeight) {

+    var option = {

+        title: 'info',

+        img: 'pic/res_info.png',

+        msg: msgObj,

+        minHeight: minHeight

+    };

+    popup(option);

+    $('#yesbtn, #nobtn').hide();

+    $('#okbtn').unbind('click').click(function () {

+        $.modal.close();

+    }).show();

+}

+function showPrompt(msgObj, callback, minHeight, defaultValue, checkPromptInput, NobtnCallback) {

+    var option = {

+        title: 'prompt',

+        img: 'pic/res_confirm.png',

+        msg: msgObj,

+        minHeight: minHeight,

+        showInput: true,

+        defaultValue: defaultValue

+    };

+    popup(option);

+    $('#yesbtn, #nobtn').unbind('click').show();

+    $('#okbtn').hide();

+    $('#yesbtn').click(function () {

+        if ($.isFunction(checkPromptInput)) {

+            if (!checkPromptInput()) {

+                return false;

+            };

+        }

+        if ($.isFunction(callback)) {

+            if (callback()) {

+                $.modal.close();

+            }

+        }

+    });

+    $('#nobtn').click(function () {

+        if ($.isFunction(NobtnCallback)) {

+            NobtnCallback();

+        }

+        $.modal.close();

+    });

+    if ($.isFunction(checkPromptInput)) {

+        $("#promptInput", "#confirm").unbind('input propertychange').bind('input propertychange', function () {

+            if ($.isFunction(checkPromptInput)) {

+                checkPromptInput();

+            }

+        });

+    }

+    $("#promptInput", "#confirm").unbind('keypress').bind('keypress', function (event) {

+        if (event.keyCode == 13) {

+            $('#yesbtn').trigger("click");

+        }

+    });

+}

+function showConfirm(msgObj, callback, minHeight, yesTrans, noTrans) {

+    if (yesTrans) {

+        $('#yesbtn').attr("data-trans", yesTrans);

+    } else {

+        $('#yesbtn').attr("data-trans", "yes");

+    }

+    if (noTrans) {

+        $('#nobtn').attr("data-trans", noTrans);

+    } else {

+        $('#nobtn').attr("data-trans", "no");

+    }

+    $('#yesbtn, #nobtn').translate();

+    var option = {

+        title: 'confirm',

+        img: 'pic/res_confirm.png',

+        msg: msgObj,

+        minHeight: minHeight

+    };

+    popup(option);

+    $('#yesbtn, #nobtn').show();

+    $('#okbtn').hide();

+    var callbackIsFunction = $.isFunction(callback);

+    var callbackIsPojo = $.isPlainObject(callback);

+    $('#yesbtn').unbind('click').click(function () {

+        $.modal.close();

+        if (callbackIsFunction) {

+            callback();

+        } else if (callbackIsPojo && $.isFunction(callback.ok)) {

+            callback.ok();

+        }

+    });

+    $('#nobtn').unbind('click').click(function () {

+        $.modal.close();

+        if (callbackIsPojo && $.isFunction(callback.no)) {

+            callback.no();

+        }

+    });

+}

+function showAlert(msgObj, callback, minHeight) {

+    var option = {

+        title: 'alert',

+        img: 'pic/res_alert.png',

+        msg: msgObj,

+        minHeight: minHeight

+    };

+    popup(option);

+    $('#yesbtn, #nobtn').hide();

+    $('#okbtn').unbind('click').click(function () {

+        $.modal.close();

+        if ($.isFunction(callback)) {

+            callback();

+        }

+    }).show();

+}

+function loadingMsgChange(msg) {

+    $('#loadMsg').html($.i18n.prop(msg));

+}

+function hideLoading() {

+    $('#confirm-overlay').css("cursor", "default");

+    $.modal.close();

+    $('#loadMsg').html('');

+}

+function getRandomInt(n) {

+    return Math.round(Math.random() * n);

+}

+function getCurrentDatetime() {

+    var d = new Date();

+    return d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate() + " " + d.getHours() + ":" + d.getMinutes()

+     + ":" + d.getSeconds();

+}

+function getRandomDatetime() {

+    var d = new Date();

+    return d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate() + " " + getRandomInt(24) + ":" + getRandomInt(60)

+     + ":" + getRandomInt(60);

+}

+function getRandomDatetimeSep() {

+    var d = new Date();

+    return d.getFullYear() + "," + (d.getMonth() + 1) + "," + d.getDate() + "," + getRandomInt(24) + "," + getRandomInt(60)

+     + "," + getRandomInt(60);

+}

+function getCurrentTimeString(theTime) {

+    var time = "";

+    var d = theTime ? theTime : new Date();

+    time += (d.getFullYear() + "").substring(2) + ";";

+    time += getTwoDigit((d.getMonth() + 1)) + ";" + getTwoDigit(d.getDate()) + ";" + getTwoDigit(d.getHours()) + ";"

+    +getTwoDigit(d.getMinutes()) + ";" + getTwoDigit(d.getSeconds()) + ";";

+    if (d.getTimezoneOffset() < 0) {

+        time += "+" + (0 - d.getTimezoneOffset() / 60);

+    } else {

+        time += (0 - d.getTimezoneOffset() / 60);

+    }

+    return time;

+}

+function getTwoDigit(num) {

+    num += "";

+    while (num.length < 2) {

+        num = "0" + num;

+    }

+    return num;

+}

+function showLoading(msg, content, contentAlert) {

+    if (msg) {

+        $('#loadMsg').html($.i18n.prop(msg));

+    } else {

+        $('#loadMsg').html('');

+    }

+    $('#loading').modal({

+        zIndex: 3000,

+        position: ['30%'],

+        overlayId: 'confirm-overlay',

+        containerId: 'confirm-container',

+        minHeight: 140,

+        persist: true,

+        focus: false,

+        escClose: false

+    });

+    var loading = $("#loading #loading_container");

+    var a = "<a href='javascript:void(0)'>&nbsp;</a>";

+    if (content) {

+        loading.html(content + a);

+    } else {

+        loading.html(a);

+    }

+    if (contentAlert) {

+        $('#loading #loading_wording').html($.i18n.prop(contentAlert));

+    } else {

+        $("#loading #loading_wording").html("");

+    }

+    $("a:last", loading).focus().hide();

+}

+function hideProgressBar() {

+    $.modal.close();

+    setProgressBar(0);

+    $('#barMsg').html('');

+}

+function setProgressBar(percents) {

+    jQuery("#bar").width(400 * percents / 100);

+    jQuery("#barValue").text(percents + "%");

+}

+

+function showProgressBar(msg, content) {

+    if (msg) {

+        $('#barMsg').html($.i18n.prop(msg));

+    }

+    $('#progress').modal({

+        zIndex: 3000,

+        position: ['30%'],

+        overlayId: 'confirm-overlay',

+        containerId: 'confirm-container',

+        minHeight: 140,

+        persist: true,

+        focus: false,

+        escClose: false

+    });

+    if (content) {

+        $("#progress #progress_container").html(content);

+    } else {

+        $("#progress #progress_container").html("");

+    }

+}

+

+function showInfoMsg(msg, nameText, tmp) {

+    $.modal.close();

+    if (msg) {

+        $('#result-image', '#result-overlay').removeClass().addClass(nameText);

+        $('#result_wording').html('<h2>' + $.i18n.prop(msg) + '</h2>');

+    }

+    $('#result-overlay').modal({

+        zIndex: 3000,

+        position: ['30%'],

+        overlayId: 'confirm-overlay',

+        containerId: 'confirm-container',

+        minHeight: 140,

+        persist: true,

+        focus: false,

+        escClose: false

+    });

+    var count = 3;

+    var overlayTimer = setInterval(function () {

+        count--;

+        if (count == 0) {

+            clearInterval(overlayTimer);

+            if ($('#result-overlay:visible').length > 0) {

+                $.modal.close();

+            }

+        }

+    }, 1000);

+}

+function errorOverlay(msg, isContinueLoading) {

+    showInfoMsg(msg ? msg : 'error_info', 'overlay-error', !isContinueLoading);

+}

+function successOverlay(msg, isContinueLoading) {

+    showInfoMsg(msg ? msg : 'success_info', 'overlay-success', !isContinueLoading);

+}

+function transOption(transid, isChannel) {

+    if (isChannel) {

+        return function (item) {

+            if (item.value != 0) {

+                var val = item.value.split("_");

+                return val[1] + "MHz " + $.i18n.prop(transid + '_' + val[0]);

+            } else {

+                return $.i18n.prop(transid + '_0');

+            }

+        };

+    }

+    return function (item) {

+        return $.i18n.prop(transid + '_' + item.value);

+    };

+}

+function getFileType(fileName) {

+    var ext = fileName.split('.').pop().toLowerCase();

+    for (type in extMap) {

+        if ($.inArray(ext, extMap[type]) != -1) {

+            return type;

+        }

+    }

+    return "file";

+}

+var extMap = {

+    mp3: ["mp3", "wma", "wav"],

+    film: ["mp4", "avi", "rm", "rmvb", "3gp", "mpeg"],

+    picture: ["jpeg", "jpg", "gif", "bmp", "png"],

+    pdf: ['pdf'],

+    rar: ['rar', '7z', 'zip', 'gzip', 'gz', 'tar'],

+    doc: ['doc', 'docx'],

+    ppt: ['ppt', 'pptx'],

+    xls: ['xls', 'xlsx'],

+    xml: ['xml']

+};

+function checkRange(str, min, max) {

+    var intVal = parseInt(str, 10);

+    return !(intVal > max || intVal < min);

+}

+function transProtocolValue(proto) {

+    switch (proto) {

+    case "TCP":

+    case "UDP":

+    case "ICMP":

+        return proto;

+    case "TCP&UDP":

+        return "TCP+UDP";

+    case "None":

+    default:

+        return "ALL";

+    }

+}

+function transProtocol(proto) {

+    var type = "ALL";

+    if ("1" == proto)

+        type = "TCP";

+    else if ("2" == proto)

+        type = "UDP";

+    else if ("3" == proto)

+        type = "TCP+UDP";

+    else if ("4" == proto)

+        type = "ICMP";

+    else if ("5" == proto)

+        type = "ALL";

+    return type;

+}

+function updateLength(sms_content) {

+    var length = 0;

+    var tmpchr;

+    var index = 0;

+    for (var i = 0; i < sms_content.length; i++) {

+        tmpchr = sms_content.charAt(i);

+        length = length + 1;

+        if ((tmpchr == "[") || (tmpchr == "]") || (tmpchr == "{") || (tmpchr == "}") || (tmpchr == "|") || (tmpchr == "\\") || (tmpchr == "^") || (tmpchr == "~") || (tmpchr == "€")) {

+            length = length + 1;

+        }

+        index = i;

+        if (length == 765) {

+            break;

+        }

+        if (length > 765) {

+            index = i - 1;

+            length = length - 2;

+            break;

+        }

+    }

+    return {

+        index: index,

+        length: length

+    };

+}

+function clearValidateMsg(areaId) {

+    areaId = areaId || '*';

+    $(areaId + ' label.error').remove();

+}

+function isErrorObject(object) {

+    return typeof object.errorType === 'string';

+}

+var manualLogout = false;

+

+// 新增TR069

+function validURLWithProtocol(str_url) {

+    var strRegex = '^((http|https)+://)'

+        + '((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])([.](25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])){3}'// IP范围1.0.0.0~255.255.255.255 

+        + '|'

+        + '([a-zA-Z0-9][-a-zA-Z0-9]{0,62}[.])*'

+        + '[a-zA-Z0-9][-a-zA-Z0-9]{0,62}[.]'

+        + '[a-zA-Z]{2,6})'

+        + '(:[0-9]{1,5})?'

+        + '((/?)|'

+        + '(/[0-9a-zA-Z_!~*\'().;?:@&=+$,%#-]+)+/?)$';

+    var ipv6Reg = '^((http|https)+://)\\[(([0-9a-fA-F]{0,4})([:]{0,1})){1,8}\\](:[0-9]{1,5})?((/?)|(/[0-9a-zA-Z_!~*\'().;?:@&=+$,%#-]+)+/?)$';

+    var rev6 = new RegExp(ipv6Reg);

+    var re = new RegExp(strRegex);

+    if (re.test(str_url)) {

+        if (excludedFTPSpclIp(str_url) == false)

+            return false;

+        return true;

+    }

+    else if ((rev6.test(str_url))) {

+        var istart = str_url.indexOf('[') + 1;

+        var iend = str_url.indexOf(']');

+        if (istart == -1 || iend == -1) {

+            return false;

+        }

+        var strIpv6 = str_url.substring(istart, iend);

+        if (!v6IpVerify(strIpv6)) {

+            return false;

+        }

+        return true;

+    }

+    else {

+        return false;

+    }

+};

+function excludedFTPSpclIp(str_url){

+    var ipstr='';

+    var strRegex = '^((ftp|ftps|http|https)+://)((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])([.](25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])){3})'

+        + '(:[0-9]{1,5})?((/?)|(/[0-9a-zA-Z_!~*\'().;?:@&=+$,%#-]+)+/?)$';

+    var re=new RegExp(strRegex); 

+    if (re.test(str_url)){

+        ipstr=str_url.substring(str_url.indexOf("://")+3);

+        if(ipstr.indexOf("/")!=-1){

+            ipstr=ipstr.substring(0,ipstr.indexOf("/"));

+        }

+        if(ipstr.indexOf(":")!=-1){

+            ipstr=ipstr.substring(0,ipstr.indexOf(":"));

+        }

+        if(ipstr!=""&&false==IpAddrVerify(ipstr))

+            return false;

+    }

+    return true;

+}

diff --git a/lynq/S300/ap/app/zte_webui/js/net.js b/lynq/S300/ap/app/zte_webui/js/net.js
new file mode 100755
index 0000000..22a9d2b
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/net.js
@@ -0,0 +1,4233 @@
+

+define("firewall_url_filter","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //system url filter setting VM

+     

+    function UrlFilterSettingVM() {

+        var target = this;

+        var urlFltInfo = service.getUrlFilterList();

+        var columnsTmpl = [{

+                columnType: "checkbox",

+                rowText: "index",

+                width: "30%"

+            }, {

+                headerTextTrans: "url",

+                rowText: "url",

+                width: "70%"

+            }

+        ];

+        target.rules = ko.observableArray(urlFltInfo.urlFilterRules);

+

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            data: target.rules(),

+            idName: "index",

+            columns: columnsTmpl,

+            tmplType: 'list',

+            pageSize: 10

+        });

+

+        target.clear = clearFunc;

+		

+        target.callback = callbackFunc;

+		//删除规则

+         

+        target.deleteRule = deleteRuleFunc;

+		

+        //添加规则

+         

+        target.addRule = addRuleFunc;

+		function callbackFunc(elem) {

+            if (elem.result != "success") {

+                errorOverlay();                

+            } else {

+				target.clear();

+                initialize(target);

+                successOverlay();

+                $("#urlFilters").translate();

+            }

+		}

+		

+		//添加规则

+		function addRuleFunc() {

+            if (target.rules().length >= config.urlFilterMax) {

+                showAlert({

+                    msg: "url_filter_max",

+                    params: config.urlFilterMax

+                });

+                return false;

+            }

+            var tmpArr = [];

+            for (var idx = 0; idx < target.rules().length; idx++) {

+                tmpArr.push(target.rules()[idx].url);

+            }

+            if ($.inArray($("#addURLFilter").val(), tmpArr) != -1) {

+                showAlert("url_repeated");

+                return false;

+            }

+

+            showLoading();

+            var urlFltParams = {

+                goformId: "URL_FILTER_ADD",

+                addURLFilter: $("#addURLFilter").val()

+            };

+            service.addUrlFilterRule(urlFltParams, target.callback);

+        }

+		//删除规则

+		function deleteRuleFunc() {

+            showConfirm('confirm_data_delete', function () {

+                showLoading();

+                var urlFltParams = {

+                    goformId: "URL_FILTER_DELETE",

+                    url_filter_delete_id: target.gridTemplate.selectedIds().join(";") + ";"

+                };

+                service.deleteSelectedRules(urlFltParams, target.callback);

+            });

+        }

+		

+    }

+	

+		function clearFunc() {

+            $("#addURLFilter").val("");

+        }

+		

+    //页面初始化

+     

+    function initialize() {

+       

+        var vm = new UrlFilterSettingVM();

+		bindContainer(vm);

+    }

+	function bindContainer(vm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+        $('#urlFilterForm').validate({

+            submitHandler: function () {

+                vm.addRule();

+            },

+            rules: {

+                addURLFilter: 'url_filter_check'

+            }

+        });

+

+        $("#urlFilterListForm").validate({

+            submitHandler: function () {

+                vm.deleteRule();

+            }

+        });

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall_upnp_set","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //system upnp setting VM

+     

+    function UpnpSettingVM() {

+        var target = this;

+        var upnpInfo = getUpnpSetting();

+

+        target.upnpSetting = ko.observable(upnpInfo.upnpSetting);

+

+        target.save = saveFunc;

+		function saveFunc() {

+            showLoading();

+            var upnpParams = {};

+            upnpParams.upnpSetting = target.upnpSetting();

+            service.setUpnpSetting(upnpParams, function (rlt) {

+                if (rlt.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+

+        }

+    }

+	

+		

+    //获取upnp 信息

+     

+    function getUpnpSetting() {

+        return service.getUpnpSetting();

+    }

+

+    //初始化UpnpSettingVM model

+     

+    function initialize() {

+        

+        var vm = new UpnpSettingVM();

+		bindContainer(vm);

+        

+    }

+	function bindContainer(vm) {

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+        $('#upnpSettingForm').validate({

+            submitHandler: function () {

+                vm.save();

+            }

+        });

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall_upnp_set","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //system upnp setting VM

+     

+    function UpnpSettingVM() {

+        var target = this;

+        var upnpInfo = getUpnpSetting();

+

+        target.upnpSetting = ko.observable(upnpInfo.upnpSetting);

+

+        target.save = saveFunc;

+		function saveFunc() {

+            showLoading();

+            var upnpParams = {};

+            upnpParams.upnpSetting = target.upnpSetting();

+            service.setUpnpSetting(upnpParams, function (rlt) {

+                if (rlt.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+

+        }

+    }

+	

+		

+    //获取upnp 信息

+     

+    function getUpnpSetting() {

+        return service.getUpnpSetting();

+    }

+

+    //初始化UpnpSettingVM model

+     

+    function initialize() {

+        

+        var vm = new UpnpSettingVM();

+		bindContainer(vm);

+        

+    }

+	function bindContainer(vm) {

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+        $('#upnpSettingForm').validate({

+            submitHandler: function () {

+                vm.save();

+            }

+        });

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+//端口映射

+ 

+define("firewall_port_map","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var protocolModes = _.map(config.MAP_PROTOCOL_MODES, function (ele) {

+        return new Option(ele.name, ele.value);

+    });

+

+    var columnsTmpl = [{

+            columnType: "checkbox",

+            rowText: "index",

+            width: "8%"

+        }, {

+            headerTextTrans: "source_port",

+            rowText: "sourcePort",

+            width: "20%"

+        }, {

+            headerTextTrans: "dest_ip_address",

+            rowText: "destIpAddress",

+            width: "20%"

+        }, {

+            headerTextTrans: "dest_port",

+            rowText: "destPort",

+            width: "20%"

+        }, {

+            headerTextTrans: "protocol",

+            rowText: "protocol",

+            width: "12%"

+        }, {

+            headerTextTrans: "comment",

+            rowText: "comment",

+            width: "20%"

+        }

+    ];

+

+    //prot_map VM

+     

+    function PortMapVM() {

+        var target = this;

+        var mapInfo = getPortMap();

+

+        target.oriPortMapEnable = ko.observable(mapInfo.portMapEnable);

+        target.rules = ko.observableArray(mapInfo.portMapRules);

+        target.portMapEnable = ko.observable(mapInfo.portMapEnable);

+

+		

+        target.comment = ko.observable('');

+        target.selectedMode = ko.observable('TCP&UDP');

+        target.modes = ko.observableArray(protocolModes);

+		

+        target.destPort = ko.observable('');

+        target.destIpAddress = ko.observable('');

+        target.sourcePort = ko.observable('');

+

+

+

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            data: target.rules(),

+            idName: "index",

+            columns: columnsTmpl,

+            tmplType: 'list',

+            pageSize: 10

+        });

+

+        //设定,新增,删除回调函数

+         

+        target.callback = callbackFunc;

+		

+		//删除规则

+         

+        target.deleteMapRules = deleteMapRulesFunc;

+		

+		//检查新增规则是否已经存在

+         

+        target.checkExist = checkExistFunc;

+		

+        //设定端口映射

+         

+        target.enablePortMap = enablePortMapFunc;

+

+        //保存规则

+         

+        target.save = saveFunc;

+		        

+		//保存规则

+		function saveFunc() {

+            if (target.rules().length >= config.portForwardMax) {

+                showAlert({

+                    msg: "rules_max",

+                    params: config.portForwardMax

+                });

+                return;

+            }

+

+            if (target.checkExist()) {

+                showAlert("rule_exist");

+                return;

+            }

+

+            showLoading();

+            var mapParams = {};

+            mapParams.portMapEnable = target.portMapEnable();

+            mapParams.sourcePort = target.sourcePort();

+            mapParams.destIpAddress = target.destIpAddress();

+            mapParams.destPort = target.destPort();

+            mapParams.protocol = target.selectedMode();

+            mapParams.comment = target.comment();

+            service.setPortMap(mapParams, target.callback);

+        }

+		

+		//检查新增规则是否已经存在

+		function checkExistFunc() {

+            var newMapRule = {

+                sourcePort: target.sourcePort(),

+                destIpAddress: target.destIpAddress(),

+                destPort: target.destPort(),

+                protocol: transProtocolValue(target.selectedMode())

+            };

+

+            var oldMapRule;

+            var mapRules = target.rules();

+            for (var idx = 0; idx < mapRules.length; idx++) {

+                oldMapRule = {

+                    sourcePort: mapRules[idx].sourcePort,

+                    destIpAddress: mapRules[idx].destIpAddress,

+                    destPort: mapRules[idx].destPort,

+                    protocol: mapRules[idx].protocol

+                };

+

+                if (_.isEqual(newMapRule, oldMapRule)) {

+                    return true;

+                }

+            }

+            return false;

+        }

+		

+		//设定端口映射

+		function enablePortMapFunc() {

+            showLoading();

+            var mapParams = {};

+            mapParams.portMapEnable = target.portMapEnable();

+            service.enablePortMap(mapParams, target.callback);

+        }

+		

+		//删除规则

+		function deleteMapRulesFunc() {

+            var ids = target.gridTemplate.selectedIds();

+            if (ids.length == 0) {

+                showAlert("no_data_selected");

+                return;

+            }

+

+            showConfirm("confirm_data_delete", function () {

+                showLoading();

+                var mapParams = {};

+                mapParams.indexs = ids;

+                service.deleteMapRules(mapParams, target.callback);

+            });

+        }

+		

+		//设定,新增,删除回调函数

+		function callbackFunc(ret) {

+            if (ret.result == "success") {

+                clear();

+                initialize(target);

+                successOverlay();

+            } else {

+                errorOverlay();

+            }

+        }

+

+        //情况添加规则输入

+         

+        function clear() {

+            target.sourcePort('');

+            target.destIpAddress('');

+            target.destPort('');

+            target.selectedMode('TCP&UDP');

+            target.comment('');

+        }

+    }

+

+    //获取port map信息

+     

+    function getPortMap() {

+        return service.getPortMap();

+    }

+

+	function bindingContainer(vm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+

+	}

+    //初始化port map view model

+     

+    function initialize(viewModel) {

+        var vm;

+        if (viewModel) {

+            vm = viewModel;

+            var mapInfo = getPortMap();

+            vm.portMapEnable(mapInfo.portMapEnable);

+            vm.oriPortMapEnable(mapInfo.portMapEnable);

+            vm.rules(mapInfo.portMapRules);

+            vm.gridTemplate.clearAllChecked();

+            vm.gridTemplate.data(mapInfo.portMapRules);

+            refreshTableHeight();

+            renderCheckbox();

+            return;

+        }

+

+        vm = new PortMapVM();

+        bindingContainer(vm);

+        fixTableHeight();

+

+        $('#mapBasicForm').validate({

+            submitHandler: function () {

+                vm.enablePortMap();

+            }

+        });

+

+        $('#portMapListForm').validate({

+            submitHandler: function () {

+                vm.deleteMapRules();

+            }

+        });

+

+        $('#portMapForm').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtDestIpAddress: {

+                    ip_check: true

+                },

+                txtSourcePort: {

+                    digits: true,

+                    range_except: [1, 65000]

+                },

+                txtDestPort: {

+                    digits: true,

+                    range_except: [1, 65000]

+                },

+                txtComment: {

+                    comment_check: true

+                }

+            },

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "txtDestIpAddress") {

+                    error.appendTo("#txtDestIpAddressErrorDiv");

+                } else if (element.attr("name") == "txtSourcePort") {

+                    error.appendTo("#txtSourcePortErrorDiv");

+                } else if (element.attr("name") == "txtDestPort") {

+                    error.appendTo("#txtDestPortErrorDiv");

+                } else

+                    error.insertAfter(element);

+            }

+        });

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+//端口转发

+ 

+define("firewall_port_forward","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var protocolModes = _.map(config.FORWARD_PROTOCOL_MODES, function (ele) {

+        return new Option(ele.name, ele.value);

+    });

+    //列表模板的columns项

+     

+    var columnsTmpl = [{

+            columnType: "checkbox",

+            rowText: "index",

+            width: "8%"

+        }, {

+            headerTextTrans: "ip_address",

+            rowText: "ipAddress",

+            width: "23%"

+        }, {

+            headerTextTrans: "port_range",

+            rowText: "portRange",

+            width: "23%"

+        }, {

+            headerTextTrans: "protocol",

+            rowText: "protocol",

+            width: "23%"

+        }, {

+            headerTextTrans: "comment",

+            rowText: "comment",

+            width: "23%"

+        }

+    ];

+

+    //prot_forward VM

+     

+    function PortForwardVM() {

+        var target = this;

+        var fwdinfo = getPortForward();

+

+        target.portForwardEnable = ko.observable(fwdinfo.portForwardEnable);

+        target.oriPortForwardEnable = ko.observable(fwdinfo.portForwardEnable);

+		

+        target.portEnd = ko.observable('');

+        target.portStart = ko.observable('');

+        target.ipAddress = ko.observable('');

+		

+        target.comment = ko.observable('');

+        target.selectedMode = ko.observable('3');

+        target.modes = ko.observableArray(protocolModes);

+

+        target.rules = ko.observableArray(fwdinfo.portForwardRules);

+		

+		//设定,新增,删除回调函数

+         

+        target.callback = callbackFunc;

+		

+        //创建列表模板

+         

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            data: target.rules(),

+            idName: "index",

+            columns: columnsTmpl,

+            tmplType: 'list',

+            pageSize: 10

+        });

+

+        //检查新增规则是否已经存在

+         

+        target.checkExist = checkExistFunc;

+				

+		//保存规则

+         

+        target.save = saveFunc;

+		

+		//删除规则

+         

+        target.deleteForwardRules = deleteForwardRulesFunc;

+		

+        //设定虚拟服务器

+         

+        target.enableVirtualServer = enableVirtualServerFunc;

+		

+		//设定虚拟服务器

+		function enableVirtualServerFunc() {

+            showLoading();

+            var fwdParams = {};

+            fwdParams.portForwardEnable = target.portForwardEnable();

+            service.enableVirtualServer(fwdParams, target.callback);

+        }

+		

+		//删除规则

+		function deleteForwardRulesFunc() {

+            var ids = target.gridTemplate.selectedIds();

+            if (ids.length == 0) {

+                showAlert("no_data_selected");

+                return;

+            }

+

+            showConfirm("confirm_data_delete", function () {

+                showLoading('deleting');

+                var fwdParams = {};

+                fwdParams.indexs = ids;

+                service.deleteForwardRules(fwdParams, target.callback);

+            });

+        }

+		

+		//保存规则

+		function saveFunc() {

+            if (target.rules().length >= config.portForwardMax) {

+                showAlert({

+                    msg: "rules_max",

+                    params: config.portForwardMax

+                });

+                return;

+            }

+

+            if (target.checkExist()) {

+                showAlert("rule_exist");

+                return;

+            }

+

+            showLoading();

+            var fwdParams = {};

+            fwdParams.comment = target.comment();

+            fwdParams.protocol = target.selectedMode();

+            fwdParams.portEnd = target.portEnd();

+            fwdParams.portStart = target.portStart();

+            fwdParams.ipAddress = target.ipAddress();

+            service.setPortForward(fwdParams, target.callback);

+        }

+         //情况添加规则输入

+        function clear() {

+            target.ipAddress('');

+            target.portStart('');

+            target.portEnd('');

+            target.selectedMode('TCP&UDP');

+            target.comment('');

+        }

+		

+		//设定,新增,删除回调函数

+		function callbackFunc(ret) {

+            if (ret.result == "success") {

+                clear();

+                initialize(target);

+                successOverlay();

+            } else {

+                errorOverlay();

+            }

+        }

+

+		//检查新增规则是否已经存在

+		function checkExistFunc() {

+            var newRule = {

+                ipAddress: target.ipAddress(),

+                portRange: target.portStart() + ' - ' + target.portEnd(),

+                protocol: transProtocolValue(target.selectedMode())

+            };

+

+            var oldRule;

+            var fwdrules = target.rules();

+            for (var ki = 0; ki < fwdrules.length; ki++) {

+                oldRule = {

+                    ipAddress: fwdrules[ki].ipAddress,

+                    portRange: fwdrules[ki].portRange,

+                    protocol: fwdrules[ki].protocol

+                };

+

+                if (_.isEqual(newRule, oldRule)) {

+                    return true;

+                }

+            }

+            return false;

+        }

+    }

+

+    //获取port forward信息

+     

+    function getPortForward() {

+        return service.getPortForward();

+    }

+

+    //初始化port forward view model

+     

+    function initialize(viewModel) {

+        var vm;

+        if (viewModel) {

+            vm = viewModel;

+            var fwdinfo = getPortForward();

+            vm.gridTemplate.clearAllChecked();

+            vm.gridTemplate.data(fwdinfo.portForwardRules);

+            vm.rules(fwdinfo.portForwardRules);

+            vm.portForwardEnable(fwdinfo.portForwardEnable);

+            vm.oriPortForwardEnable(fwdinfo.portForwardEnable);

+            refreshTableHeight();

+            return;

+        }

+

+        vm = new PortForwardVM();

+        bindContainer(vm);

+		

+        fixTableHeight();

+        renderCheckbox();

+

+        $('#virtualServerForm').validate({

+            submitHandler: function () {

+                vm.enableVirtualServer();

+            }

+        });

+

+        $('#portForwardListForm').validate({

+            submitHandler: function () {

+                vm.deleteForwardRules();

+            }

+        });

+

+        $('#portForwardForm').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtIpAddress: {

+                    ip_check: true

+                },

+                txtPortStart: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtPortEnd"

+                },

+                txtPortEnd: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtPortStart"

+                },

+                txtComment: {

+                    comment_check: true

+                }

+            },

+            groups: {

+                range: "txtPortStart txtPortEnd"

+            },

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "txtIpAddress") {

+                    error.appendTo("#ipErrorDiv");

+                } else if (element.attr("name") == "txtPortStart" || element.attr("name") == "txtPortEnd") {

+                    error.appendTo("#portRangeErrorDiv");

+                } else

+                    error.insertAfter(element);

+            }

+        });

+    }

+	

+	function bindContainer(vm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+

+	}

+	

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall_port_filter","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var PROTOCOLS = {

+        ICMP: 'ICMP',

+        NONE: 'None'

+    };

+

+    var columnsTmpl = [{

+            columnType: "checkbox",

+            rowText: "index",

+            width: "4%"

+        }, {

+            headerTextTrans: "mac_address",

+            rowText: "macAddress",

+            width: "12%"

+        }, {

+            headerTextTrans: "ip_type",

+            rowText: "ipType",

+            width: "5%",

+            display: config.IPV6_SUPPORT

+        }, {

+            headerTextTrans: "source_ip_address",

+            rowText: "sourceIpAddress",

+            width: "12%"

+        }, {

+            headerTextTrans: "dest_ip_address",

+            rowText: "destIpAddress",

+            width: "12%"

+        }, {

+            headerTextTrans: "protocol",

+            rowText: "protocol",

+            width: "12%",

+            needTrans: true

+        }, {

+            headerTextTrans: "source_port_range",

+            rowText: "sourcePortRange",

+            width: "12%"

+        }, {

+            headerTextTrans: "dest_port_range",

+            rowText: "destPortRange",

+            width: "12%"

+        }, {

+            headerTextTrans: "port_filter_action",

+            rowText: "action",

+            width: "12%",

+            needTrans: true

+        }, {

+            headerTextTrans: "comment",

+            rowText: "comment",

+            width: "12%"

+        }

+    ];

+

+    var protocolModes = _.map(config.FILTER_PROTOCOL_MODES, function (elem) {

+        return new Option(elem.name, elem.value);

+    });

+    //prot_filter VM

+     

+    function PortFilterVM() {

+        var target = this;

+        var info = getPortFilter();

+		

+        target.oriDefaultPolicy = ko.observable(info.defaultPolicy);

+        target.defaultPolicy = ko.observable(info.defaultPolicy);

+        target.oriPortFilterEnable = ko.observable(info.portFilterEnable);

+        target.portFilterEnable = ko.observable(info.portFilterEnable);

+        target.rules = ko.observableArray(info.portFilterRules);

+		

+        target.ipv6Support = ko.observable(config.IPV6_SUPPORT);

+        target.comment = ko.observable('');

+        target.selectedMode = ko.observable('5');

+        target.modes = ko.observableArray(protocolModes);

+        target.sourcePortEnd = ko.observable('');

+        target.sourcePortStart = ko.observable('');

+        target.destPortEnd = ko.observable('');

+        target.destPortStart = ko.observable('');

+        target.destIpv6Address = ko.observable('');

+        target.sourceIpv6Address = ko.observable('');

+        target.sourceIpAddress = ko.observable('');

+        target.destIpAddress = ko.observable('');

+        target.macAddress = ko.observable('');

+        target.portFilterAction = ko.observable('');

+

+        target.ipType = ko.observable('ipv4');

+

+        //设定,新增,删除回调函数

+         

+        target.callback = callbackFunc;

+		

+        //创建列表模板

+         

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            data: target.rules(),

+            idName: "index",

+            columns: columnsTmpl,

+            tmplType: 'list',

+            pageSize: 20

+        });

+        //default policy change handler

+         

+        target.policyChangeHandler = policyChangeHandlerFunc;

+

+        //保存规则

+         

+        target.save = saveFunc;

+	

+        //设定过滤基本信息

+         

+        target.setPortFilterBasic = setPortFilterBasicFunc;

+		

+		//清空添加规则输入

+         

+        target.clear = clearFunc;

+

+        //检查新增规则是否已经存在

+         

+        target.checkExist = checkExistFunc;

+

+		//ip类型变化事件监听

+         

+        target.ipTypeChangeHandler = ipTypeChangeHandlerFunc;

+		

+        //协议变化事件监听

+         

+        target.protocolChangeHandler = protocolChangeHandlerFunc;

+

+        //删除规则

+         

+        target.deleteFilterRules = deleteFilterRulesFunc;

+

+        //init to call

+        target.policyChangeHandler();

+		

+		//设定,新增,删除回调函数

+		function callbackFunc(ret) {

+            if (ret.result != "success") {

+                errorOverlay();

+            } else {

+                target.clear();

+                initialize(target);

+                successOverlay();

+            }

+        }

+		//default policy change handler

+		function policyChangeHandlerFunc() {

+            var action = target.defaultPolicy() != "1" ? "Drop" : "Accept";

+            target.portFilterAction(action);

+            return true;

+        }

+		

+		//保存规则

+		function saveFunc() {

+            target.sourceIpAddress(target.sourceIpAddress().replace(/\s+/g, ''));

+            target.destIpAddress(target.destIpAddress().replace(/\s+/g, ''));

+            target.sourceIpv6Address(target.sourceIpv6Address().replace(/\s+/g, ''));

+            target.destIpv6Address(target.destIpv6Address().replace(/\s+/g, ''));

+            target.macAddress(target.macAddress().replace(/\s+/g, ''));

+            if (target.ipv6Support() == false) {

+                if (target.rules().length >= config.portForwardMax) {

+                    showAlert({

+                        msg: "rules_max",

+                        params: config.portForwardMax

+                    });

+                    return;

+                }

+

+                if (target.checkExist()) {

+                    showAlert("rule_exist");

+                    return;

+                }

+

+            } else {

+				var type = target.ipType() == "ipv4" ? "IPv4" : "IPv6";

+                var oldRules = _.filter(target.rules(), function (item) {

+                    return item.ipType == type;

+                });

+

+                if (oldRules.length >= config.portForwardMax) {

+                    showAlert({

+                        msg: "rules_max_v4v6",

+                        params: [type, config.portForwardMax]

+                    });

+                    return;

+                }

+

+                if (target.checkExist()) {

+                    showAlert({

+                        msg: "rule_exist_v4v6",

+                        params: type

+                    });

+                    return;

+                }

+            }

+            showConfirm("confirm_data_effect", function () {

+                showLoading();

+                var fltParams = {};

+                fltParams.macAddress = target.macAddress();

+

+                if (target.ipv6Support() && target.ipType() != 'ipv6') {

+                    fltParams.destIpAddress = target.destIpAddress();

+                    fltParams.sourceIpAddress = target.sourceIpAddress();

+                } else {

+                    fltParams.destIpAddress = target.destIpv6Address();

+                    fltParams.sourceIpAddress = target.sourceIpv6Address();

+                }

+				

+                fltParams.ipType = target.ipType();

+                fltParams.comment = target.comment();

+                fltParams.protocol = target.selectedMode();

+                fltParams.action = target.portFilterAction();

+                fltParams.sourcePortEnd = target.sourcePortEnd();

+                fltParams.sourcePortStart = target.sourcePortStart();

+                fltParams.destPortEnd = target.destPortEnd();

+                fltParams.destPortStart = target.destPortStart();

+                service.setPortFilter(fltParams, target.callback);

+            });

+        }

+		

+		//设定过滤基本信息

+		function setPortFilterBasicFunc() {

+            showLoading();

+            var elems = {};

+            elems.defaultPolicy = target.defaultPolicy();

+            elems.portFilterEnable = target.portFilterEnable();

+            service.setPortFilterBasic(elems, target.callback);

+        }

+		//清空添加规则输入

+		function clearFunc() {

+            target.comment('');

+            target.selectedMode('None');

+            target.sourcePortEnd('0');

+            target.sourcePortStart('0');

+            target.destPortEnd('0');

+            target.destPortStart('0');

+            target.sourceIpv6Address('');

+            target.sourceIpAddress('');

+            target.destIpv6Address('');

+            target.destIpAddress('');

+            target.macAddress('');

+            clearValidateMsg();

+        }

+		

+		//检查新增规则是否已经存在

+		function checkExistFunc() {

+            target.macAddress(target.macAddress().toUpperCase());

+            var currIpType = target.ipType().toUpperCase();

+            var newRule = {

+                macAddress: target.macAddress(),

+                destIpAddress: currIpType == "IPV4" ? target.destIpAddress() : target.destIpv6Address(),

+                sourceIpAddress: currIpType == "IPV4" ? target.sourceIpAddress() : target.sourceIpv6Address(),

+                destPortRange: target.destPortStart() == '0' ? '' : target.destPortStart() + ' - ' + target.destPortEnd(),

+                sourcePortRange: target.sourcePortStart() == '0' ? '' : target.sourcePortStart() + ' - ' + target.sourcePortEnd(),

+                action: target.portFilterAction() == "Drop" ? "filter_drop" : "filter_accept",

+                protocol: transProtocolValue(target.selectedMode()),

+                ipType: currIpType

+            };

+

+            var oldRule;

+            var rules = target.rules();

+            for (var ki = 0; ki < rules.length; ki++) {

+                oldRule = {

+                    macAddress: rules[ki].macAddress,

+                    destIpAddress: rules[ki].destIpAddress,

+                    sourceIpAddress: rules[ki].sourceIpAddress,

+                    destPortRange: rules[ki].destPortRange,

+                    sourcePortRange: rules[ki].sourcePortRange,

+                    action: rules[ki].action,

+                    protocol: rules[ki].protocol,

+                    ipType: rules[ki].ipType.toUpperCase()

+                };

+

+                if (_.isEqual(newRule, oldRule)) {

+                    return true;

+                }

+            }

+            return false;

+        }

+		

+		//协议变化事件监听

+		function protocolChangeHandlerFunc() {

+            if (target.selectedMode() == PROTOCOLS.ICMP || target.selectedMode() == PROTOCOLS.NONE) {

+                target.sourcePortEnd('0');

+                target.sourcePortStart('0');

+                target.destPortEnd('0');

+                target.destPortStart('0');

+                clearValidateMsg('#portRangeArea');

+            } else {

+                target.sourcePortEnd('65535');

+                target.sourcePortStart('1');

+                target.destPortEnd('65535');

+                target.destPortStart('1');

+            }

+            return true;

+        }

+		

+		//删除规则

+		function deleteFilterRulesFunc() {

+            var ids = target.gridTemplate.selectedIds();

+            if (ids.length == 0) {

+                showAlert("no_data_selected");

+                return;

+            }

+

+            showConfirm("confirm_data_effect", function () {

+                showLoading('deleting');

+                var rules = {};

+                rules.indexs = ids;

+                service.deleteFilterRules(rules, target.callback);

+            });

+        }

+		

+    }

+

+    //获取port filter信息

+     

+    function getPortFilter() {

+        return service.getPortFilter();

+    }

+		

+	//ip类型变化事件监听

+	function ipTypeChangeHandlerFunc() {

+        clearValidateMsg();

+        return true;

+    }

+	

+    //初始化port filter view model

+     

+    function initialize(viewModel) {

+        var vm;

+        if (viewModel) {

+            vm = viewModel;

+            var fltinfo = getPortFilter();

+            vm.gridTemplate.clearAllChecked();

+            vm.gridTemplate.data(fltinfo.portFilterRules);

+			vm.defaultPolicy(fltinfo.defaultPolicy);

+            vm.oriDefaultPolicy(fltinfo.defaultPolicy);

+            vm.portFilterEnable(fltinfo.portFilterEnable);

+            vm.oriPortFilterEnable(fltinfo.portFilterEnable);

+            vm.rules(fltinfo.portFilterRules);

+            refreshTableHeight();

+            $('#portFilters').find('tbody').translate();

+            renderCheckbox();

+            $('.notes-content').translate();

+            return;

+        }

+

+        vm = new PortFilterVM();

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+

+        fixTableHeight();

+

+        $('#filterBasicForm').validate({

+            submitHandler: function () {

+                showConfirm("confirm_data_effect", function () {

+                    vm.setPortFilterBasic();

+                });

+            }

+        });

+

+        $('#portFilterListForm').validate({

+            submitHandler: function () {

+                vm.deleteFilterRules();

+            }

+        });

+

+        $('#portFilterForm').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtMacAddress: {

+                    filter_optional: true,

+                    mac_check: true

+                },

+                txtDestIpAddress: {

+                    ip_check: true

+                },

+                txtSourceIpAddress: {

+                    ip_check: true

+                },

+                txtSourceIpv6Address: {

+                    ipv6: true

+                },

+                txtDestIpv6Address: {

+                    ipv6: true

+                },

+                txtDestPortStart: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtDestPortEnd"

+                },

+                txtDestPortEnd: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtDestPortStart"

+                },

+                txtSourcePortStart: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtSourcePortEnd"

+                },

+                txtSourcePortEnd: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtSourcePortStart"

+                },

+

+                txtComment: {

+                    comment_check: true

+                }

+            },

+            groups: {

+                destPort: "txtDestPortStart txtDestPortEnd",

+                sourcePort: "txtSourcePortStart txtSourcePortEnd"

+            },

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "txtMacAddress") {

+                    error.appendTo("#macErrorDiv");

+                } else if (element.attr("name") == "txtDestPortStart" || element.attr("name") == "txtDestPortEnd") {

+                    error.appendTo("#destPortErrorDiv");

+                } else if (element.attr("name") == "txtSourcePortStart" || element.attr("name") == "txtSourcePortEnd") {

+                    error.appendTo("#sourcePortErrorDiv");

+                } else

+                    error.insertAfter(element);

+            }

+        });

+    }

+

+    $.validator.addMethod("filter_optional", function (value, element, param) {

+        var result = _.any(['#txtMacAddress', '#txtDestIpAddress', '#txtSourceIpAddress', '#txtSourceIpv6Address', '#txtDestIpv6Address'],

+                function (item) {

+            var tmp = $(item).val().replace(/\s+/g, '');

+            return $(item + ':visible').length > 0 && tmp != '';

+        });

+

+        var portResult = _.any(['#txtDestPortStart', '#txtDestPortEnd', '#txtSourcePortStart', '#txtSourcePortEnd'],

+                function (item) {

+            return $(item).val() != '0';

+        });

+

+        return result || portResult;

+    });

+

+    return {

+        init: initialize

+    };

+});

+

+//家长控制

+ 

+define("firewall_parental_control","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var maxItem = 10;

+    var pcVm = null;

+    var PAGES = {

+        MAIN: 0,

+        MANAGE: 1,

+        RULE: 2

+    };

+	

+	

+    function ParentalControlVM() {

+        var target = this;

+        var hostNameList = service.getHostNameList({}).devices;

+        target.currentPage = ko.observable(PAGES.MAIN);

+        target.pages = PAGES;

+

+

+        target.childGroupList = ko.observable([]);

+        target.childGroupMac = ko.computed(function () {

+            return _.map(target.childGroupList(), function (data) {

+                return data.mac;

+            });

+        });

+		

+        target.currentUserInChildGroup = ko.observable(true);

+        //获取儿童组设备列表

+         

+        target.fetchChildGroupList = fetchChildGroupListFunc;

+		

+        target.fetchChildGroupList();

+

+        target.manageHandler = manageHandlerFunc;

+		function manageHandlerFunc() {

+            target.currentPage(PAGES.MANAGE);

+            target.fetchAttachedDevices();

+        }

+        target.attachedDevices = ko.observable([]);

+        //获取已连接设备列表

+         

+        target.fetchAttachedDevices = fetchAttachedDevicesFunc;

+		

+

+		//儿童组设备 标签按钮事件

+         

+        target.backToMainHandler = backToMainHandlerFunc;

+		

+		

+        ko.computed(function () {

+            target.attachedDevices();

+            target.childGroupList();

+            $("#pc_children_group_form").translate();

+        }).extend({

+            notify: 'always',

+            throttle: 300

+        });

+        

+        //添加至儿童组

+         

+        function addChildGroupFun(flag, eleData) {

+            showLoading();

+            service.addChildGroup(eleData, function (data) {

+                target.fetchChildGroupList(function () {

+                    target.fetchAttachedDevices(function () {

+                        hideLoading();

+                        if (flag) {

+                            service.logout({}, function () {

+                                window.location = 'index.html';

+                            });

+                        }

+                    });

+                });

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+		

+        //移除按钮事件

+         

+        target.removeChildGroupHandler = removeChildGroupHandlerFunc;

+		

+		

+        //添加按钮事件

+         

+        target.addChildGroupHandler = addChildGroupHandlerFunc;

+		

+

+        target.dealElement = dealElementFunc;

+		

+		

+		

+        //取消编辑主机名按钮事件

+         

+        target.cancelEditHostNameHandler = cancelEditHostNameHandlerFunc;

+		

+        //主机名编辑保存按钮事件

+         

+        target.saveHostNameHandler = saveHostNameHandlerFunc;

+		

+        //主机名编辑按钮事件

+         

+        target.editHostNameHandler = editHostNameHandlerFunc;

+		

+		

+        target.selectedIds = ko.observableArray([]);

+        target.siteList = ko.observable([]);

+        /////////////////////////////////////////////////////////////////

+        target.disableAdd = ko.computed(function () {

+            return target.siteList().length == maxItem;

+        });

+        

+        ko.computed(function () {

+            target.siteList();

+            target.selectedIds();

+            setTimeout(function () {

+                renderCheckbox();

+            }, 100);

+            $("#pc_site_white_list_form").translate();

+        });

+		

+        //网站白名单添加按钮事件

+         

+        target.openAddSitePopoverHandler = openAddSitePopoverHandlerFunc;

+		

+        //网站白名单列表选择框点击事件

+         

+        target.checkboxClickHandler = checkboxClickHandlerFunc;

+		

+		//获取网站白名单列表

+         

+        target.fetchSiteWhiteList = fetchSiteWhiteListFunc;

+		

+		//网站白名单删除函数

+         

+        function removeSiteWhiteItem(ids) {

+            showConfirm('confirm_data_delete', function () {

+                showLoading();

+                service.removeSiteWhite({

+                    ids: ids

+                }, function (data) {

+                    target.fetchSiteWhiteList(function () {

+                        successOverlay();

+                    });

+                }, function (data) {

+                    target.fetchSiteWhiteList(function () {

+                        errorOverlay();

+                    });

+                });

+            });

+        }

+		//网站白名单删除所有按钮事件

+         

+        target.removeAllWhiteSite = removeAllWhiteSiteFunc;

+		

+        //网站白名单删除按钮事件

+         

+        target.removeSelectedWhiteSite = removeSelectedWhiteSiteFunc;

+		

+        //网站白名单移除按钮事件

+         

+        target.removeWhiteSite = removeWhiteSiteFunc;

+		

+        

+        

+        //网站白名单添加框保存按钮事件

+         

+        target.saveSiteWhite = saveSiteWhiteFunc;

+		

+        //////////////////////////////////////////////////////////////////

+        target.notSave = ko.observable(false);

+        //获取时间限制信息

+         

+        target.fetchTimeLimited = fetchTimeLimitedFunc;

+		

+        

+        //上网时间设置时间表格事件绑定

+         

+        target.bindEvent = bindEventFunc;

+		

+		//上网时间设置保存按钮事件

+         

+        target.saveTimeLimitedHandler = saveTimeLimitedHandlerFunc;

+		

+        //////////////////////////////////////////////////////////////////

+        var isBinded = false;

+        //上网规则标签点击事件

+         

+        target.openRulePage = openRulePageFunc;

+		function openRulePageFunc() {

+            if (target.currentPage() == PAGES.RULE) {

+                return;

+            }

+            target.currentPage(PAGES.RULE);

+            target.currentUserInChildGroup(service.checkCurrentUserInChildGroup().result);

+            initTableData();

+            if (!isBinded) {

+                if (!target.currentUserInChildGroup()) {

+                    target.bindEvent();

+                }

+                isBinded = true;

+            }

+            showLoading();

+            target.fetchTimeLimited();

+            target.fetchSiteWhiteList(function () {

+                hideLoading();

+            });

+        }

+		

+		//获取儿童组设备列表

+		function fetchChildGroupListFunc(cb) {

+            service.childGroupList({}, function (data) {

+                target.currentUserInChildGroup(service.checkCurrentUserInChildGroup(data.devices).result);

+                target.childGroupList([]);

+                _.map(data.devices, function (elem, idx) {

+                    elem.idx = idx;

+                    elem.hostname = pcUtil.getHostName(elem.hostname, elem.mac, hostNameList);

+                });

+                target.childGroupList(data.devices);

+                if (_.isFunction(cb)) {

+                    cb.apply(this);

+                }

+            });

+		}

+		

+		//获取已连接设备列表

+		function fetchAttachedDevicesFunc(cb) {

+            target.attachedDevices([]);

+            var counter = 0;

+            var currDevices = [];

+            //RJ45 已连接设备

+            service.getAttachedCableDevices({}, function (data) {

+                counter++;

+                var devs = _.map(data.attachedDevices, function (elem) {

+                    elem.idx = _.uniqueId('wireless_');

+                    elem.hostName = pcUtil.getHostName(elem.hostName, elem.macAddress, hostNameList);

+                    elem.inChildGroup = _.contains(target.childGroupMac(), elem.macAddress);

+                    return elem;

+                });

+                if (counter != 1) {

+                    target.attachedDevices(_.flatten([currDevices, devs]));

+                    if (_.isFunction(cb)) {

+                        cb.apply(this);

+                    }

+                } else {

+                    currDevices = devs;

+                }

+            });

+			

+            //wifi 已连接设备

+            service.getCurrentlyAttachedDevicesInfo({}, function (data) {

+                counter++;

+                var devs = _.map(data.attachedDevices, function (elem) {

+                    elem.idx = _.uniqueId('wireless_');

+                    elem.hostName = pcUtil.getHostName(elem.hostName, elem.macAddress, hostNameList);

+                    elem.inChildGroup = _.contains(target.childGroupMac(), elem.macAddress);

+                    return elem;

+                });

+                if (counter != 1) {

+                    target.attachedDevices(_.flatten([currDevices, devs]));

+                    if (_.isFunction(cb)) {

+                        cb.apply(this);

+                    }

+                } else {

+                    currDevices = devs;

+                }

+            });

+		}

+		//儿童组设备 标签按钮事件

+		function backToMainHandlerFunc() {

+			target.currentPage(PAGES.MAIN);

+		}

+		

+		//移除按钮事件

+		function removeChildGroupHandlerFunc(ele) {

+            showLoading();

+            service.removeChildGroup(ele, function (data) {

+                target.fetchChildGroupList(function () {

+                    target.fetchAttachedDevices(function () {

+                        hideLoading();

+                    });

+                });

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+		

+		//添加按钮事件

+		function addChildGroupHandlerFunc(data) {

+            var uMacAddr = service.getCurretnMAC();

+            if (uMacAddr != data.macAddress) {

+                addChildGroupFun(false, data);

+            } else {

+                showConfirm("parental_add_self", function () {

+                    addChildGroupFun(true, data);

+                })

+            }

+        }

+		

+		//取消编辑主机名按钮事件

+		function cancelEditHostNameHandlerFunc(eleData) {

+            target.dealElement(false, eleData.idx);

+        }

+		

+		//主机名编辑保存按钮事件

+		function saveHostNameHandlerFunc(ele) {

+            var $hostInput = $("#hostname_input_" + ele.idx);

+            var hostname = $.trim($hostInput.val());

+			if (hostname.indexOf(" ") == 0 || hostname.lastIndexOf(" ") == (hostname.length - 1) || /[\*\+\$\[&:,;<>'"\\`\]¥]{1,32}/.test(hostname)) {

+                showAlert('modify_hostname_invalid');

+                return false;

+            }else if (hostname == '') {

+                $(".promptErrorLabel", "#confirm-message-container").text($.i18n.prop("required"));

+                var $closestTD = $hostInput.closest('td').addClass('has-error');

+                addTimeout(function () {

+                    $closestTD.removeClass('has-error');

+                }, 5000);

+                showAlert('required');

+                return false;

+            }  

+            showLoading();

+            ele.hostname = hostname;

+            service.editHostName(ele, function () {

+                service.getHostNameList({}, function (hostNameData) {

+                    hostNameList = hostNameData.devices;

+                    target.fetchChildGroupList(function () {

+                        hideLoading();

+                    });

+                    target.fetchAttachedDevices();

+                });

+            }, function () {

+                errorOverlay();

+            });

+        }

+		

+		//主机名编辑按钮事件

+		function editHostNameHandlerFunc(ele) {

+            $("#hostname_input_" + ele.idx).val(ele.hostname);

+            target.dealElement(true, ele.idx);

+            return false;

+        }

+		//网站白名单添加按钮事件

+		function openAddSitePopoverHandlerFunc() {

+            var addNewSiteTmpl = $("#addNewSiteTmpl").html();

+            popover.open({

+                target: $("#openAddSiteBtn"),

+                html: addNewSiteTmpl,

+                width: "300px",

+                validation: addValidation

+            });

+        }

+		

+		//网站白名单列表选择框点击事件

+		function checkboxClickHandlerFunc(eleData, evt) {

+            addTimeout(function () {

+                target.selectedIds(getSelectedValues());

+            }, 100);

+        }

+		//获取网站白名单列表

+		function fetchSiteWhiteListFunc(cb) {

+            service.getSiteWhiteList({}, function (eledata) {

+                target.selectedIds([]);

+                target.siteList(eledata.siteList);

+                _.isFunction(cb) && cb.apply(this);

+            }, function () {

+                target.siteList([]);

+                _.isFunction(cb) && cb.apply(this);

+            });

+        }

+		

+		//网站白名单删除所有按钮事件

+		function removeAllWhiteSiteFunc() {

+            removeSiteWhiteItem(getAllCheckboxValues());

+        }

+		//网站白名单删除按钮事件

+		function removeSelectedWhiteSiteFunc() {

+            removeSiteWhiteItem(getSelectedValues());

+        }

+		//网站白名单移除按钮事件

+		function removeWhiteSiteFunc(ele, evt) {

+            removeSiteWhiteItem([ele.id]);

+        }

+		

+		//网站白名单添加框保存按钮事件

+		function saveSiteWhiteFunc(name, site) {

+            popover.hide();

+            var matched = _.find(target.siteList(), function (one) {

+                return one.site == site;

+            });

+            if (matched) {

+                showAlert("pc_link_exist", function () {

+                    setTimeout(function () {

+                        popover.show();

+                    }, 200);

+                });

+                return false;

+            }

+

+            showLoading();

+            service.saveSiteWhite({

+                name: name,

+                site: site

+            }, function () {

+                target.fetchSiteWhiteList(function () {

+                    popover.close();

+                    successOverlay();

+                });

+            }, function () {

+                target.fetchSiteWhiteList(function () {

+                    errorOverlay();

+                    popover.show();

+                });

+            });

+        }

+		

+		//上网时间设置时间表格事件绑定

+		function bindEventFunc() {

+            $("td:not('.col-head')", "#pc_time_limited_tbody").addClass('cursorhand').die().click(function () {

+                target.notSave(true);

+                $(this).toggleClass('active');

+            }).hover(function () {

+                var $this = $(this);

+                var w = $this.data('week');

+                var h = $this.data('hour');

+                $("tr:nth-child(" + (w + 1) + ") td:first-child", "#pc_time_limited_tbody").addClass('time_td_hover');

+                $("#col_" + h).addClass('time_td_hover');

+                if ($this.not('.active')) {

+                    $this.addClass('time_td_hover');

+                }

+            }, function () {

+                var $this = $(this);

+                var w = $this.data('week');

+                var h = $this.data('hour');

+                $("tr:nth-child(" + (w + 1) + ") td:first-child", "#pc_time_limited_tbody").removeClass('time_td_hover');

+                $("#col_" + h).removeClass('time_td_hover');

+                $this.removeClass('time_td_hover');

+            });

+        }

+		

+		//上网时间设置保存按钮事件

+		function saveTimeLimitedHandlerFunc() {

+            showLoading();

+            var tds = getSelectedTds();

+            var timeStr = getSavedData(tds);

+            service.saveTimeLimited({

+                time: timeStr

+            }, function () {

+                target.notSave(false);

+                successOverlay();

+            }, function () {

+                errorOverlay();

+            });

+        }

+		

+    }

+	

+		function dealElementFunc(flag, idx) {

+            if (flag == false) {

+                $("#edit_btn_" + idx + ",#hostname_txt_" + idx).show();

+                $("#save_btn_" + idx + ",#cancel_btn_" + idx + ",#hostname_input_" + idx).hide();

+            } else {

+                $("#edit_btn_" + idx + ",#hostname_txt_" + idx).hide();

+                $("#save_btn_" + idx + ",#cancel_btn_" + idx + ",#hostname_input_" + idx).show();

+            }

+        }

+

+		//获取时间限制信息

+		function fetchTimeLimitedFunc() {

+            service.getTimeLimited({}, function (ele) {

+                for (var ki in ele) {

+                    for (var idx = 0; idx < ele[ki].length; idx++) {

+                        var id = 'td_' + ki + '_' + ele[ki][idx];

+                        $("#" + id).addClass('active');

+                    }

+                }

+            }, function () {});

+        }

+

+    var pcUtil = {

+        getHostName: function (hostName, mac, hostNameList) {

+            var ele = _.find(hostNameList, function (ele) {

+                return ele.mac == mac;

+            });

+            return ele ? ele.hostname : hostName;

+        }

+    };

+	function getCheckboxValues(flag) {

+        var selectedValues = [];

+        $(":checkbox" + (flag ? ":checked" : ""), "#pb_white_list").each(function (i, n) {

+            selectedValues.push(n.value)

+        });

+        return selectedValues;

+    }

+    //获取列表中被选中项的value值

+     

+    function getSelectedValues() {

+        return getCheckboxValues(true);

+    }

+    function getAllCheckboxValues() {

+        return getCheckboxValues(false);

+    }

+    

+    //增加网站白名单表单提交函数绑定和校验规则设置

+     

+    function addValidation() {

+        $('#whiteSiteAddForm').validate({

+            submitHandler: function () {

+                var name = $("#siteName").val();

+                var site = $("#siteLink").val();

+                pcVm.saveSiteWhite(name, site);

+            },

+            rules: {

+                siteName: 'siteName_check',

+                siteLink: 'siteLink_check'

+            }

+        });

+    }

+	

+    function getSavedData(timeDatas) {

+        var ret = '';

+        for (var ki in timeDatas) {

+            var hours = _.sortBy(timeDatas[ki], function (n) {

+                return n;

+            });

+            if (timeDatas[ki].length) {

+                ret += ki + '+';

+                ret += hours.join(',');

+                ret += ';'

+            }

+        }

+        return ret.substring(0, ret.length - 1);

+    }

+    //获取时间表格选中的时间

+     

+    function getSelectedTds() {

+        var defaultValue = {

+            '0': [],

+            '1': [],

+            '2': [],

+            '3': [],

+            '4': [],

+            '5': [],

+            '6': []

+        };

+        $("td.active", "#pc_time_limited_tbody").each(function (i, n) {

+            var $this = $(n);

+            var week = $this.data('week');

+            var hour = $this.data('hour');

+            defaultValue[week].push(hour);

+        });

+        return defaultValue;

+    }

+

+	function convertHour(hour) {

+        if (hour <= 16) {

+            return hour + 7;

+        } else {

+            return hour - 17;

+        }

+    }

+    //初始化时间表格

+     

+    function initTableData() {

+        $("tr", "#pc_time_limited_tbody").each(function (idx, n) {

+            var $tr = $(n);

+            $("td:not(:first)", $tr).each(function (j, m) {

+                var $td = $(m);

+                var hour = convertHour(j);

+                $td.attr({

+                    id: 'td_' + idx + '_' + hour

+                }).data({

+                    week: idx,

+                    hour: hour

+                });

+            });

+        });

+        $("td.active", "#pc_time_limited_tbody").removeClass("active");

+        $("thead td:not(:first)", "#pc_time_limited_form").each(function (idx, n) {

+            var hour = convertHour(idx);

+            $(n).attr({

+                id: 'col_' + hour

+            });

+        });

+        pcVm.notSave(false);

+    }

+

+    

+    //页面初始化

+     

+    function initialize() {

+       

+        pcVm = new ParentalControlVM();

+		bindContainer(pcVm);

+    }

+	function bindContainer(pcVm)

+	{

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(pcVm, container[0]);

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall_dmz_set","underscore jquery knockout set service".split(" "),

+    function ( _, $, ko, config, service) {

+

+    //system dmz setting VM

+     

+    function DmzSettingVM() {

+        var target = this;

+        var dmzInfo = getDmzSetting();

+        target.dmzSetting = ko.observable(dmzInfo.dmzSetting);

+        target.ipAddress = ko.observable(dmzInfo.ipAddress);

+        target.isDataCard = config.PRODUCT_TYPE == 'DATACARD';

+

+        target.clear = clearFunc;

+        //应用按钮事件

+         

+        target.save = saveFunc;

+		

+		function saveFunc() {

+			showLoading();

+			var params = {};

+			params.dmzSetting = target.dmzSetting();

+			params.ipAddress = target.ipAddress();

+			service.setDmzSetting(params, function (result) {

+				if (result.result != "success") {

+					errorOverlay();

+				} else {

+					target.clear();

+					successOverlay();

+				}

+			});

+		}

+		

+    }

+	

+	function clearFunc() {

+		initialize();

+    }

+	

+	

+    //获取dmz 信息

+     

+    function getDmzSetting() {

+        return service.getDmzSetting();

+    }

+

+    //初始化DmzSettingVM model

+     

+    function initialize() {

+        

+        var dmzVm = new DmzSettingVM();

+        bindContainer(dmzVm);

+    }

+	function bindContainer(dmzVm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+		ko.applyBindings(dmzVm, container[0]);

+        $('#dmzSettingForm').validate({

+            submitHandler: function () {

+                dmzVm.save();

+            },

+            rules: {

+                txtIpAddress: 'dmz_ip_check'

+            }

+        });

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall","underscore jquery knockout set service".split(" "),

+

+function(_, $, ko, config, service) {

+

+    function FirewallVM() {

+        var target = this;

+		target.hasDdns = config.DDNS_SUPPORT;

+		target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+		target.hasUrlFilter = config.HAS_URL;

+		target.hasUssd = config.HAS_USSD;

+		target.hasUpnp = config.HAS_UPNP;

+    }

+

+	function initialize() {        

+        var fwVm = new FirewallVM();

+		bindingContainer(fwVm);

+    }

+	function bindingContainer(fwVm)

+	{

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(fwVm, container[0]);

+	}

+	return {

+		init : initialize

+	};

+});

+

+define("ddns","underscore jquery knockout set service".split(" "), function (_, $, ko, config, service) {

+    var ddnsSetModes = _.map(config.DDNSSetMode, newOption);

+    var ddnsProviderList = _.map(config.DDNSDDP, newOption);

+    var ddns_mode_select = _.map(config.ddns_Modeselect, newOption);

+    function newOption(optItem) {

+        return new Option(optItem.name, optItem.value);

+    }

+    function DdnsViewModel() {

+        var target = this;

+        target.hasUssd = config.HAS_USSD;

+        target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+        var data = service.getDdnsParams();

+        target.ddnsSetModes = ko.observableArray(ddnsSetModes);

+        target.ddnsProviderList = ko.observableArray(ddnsProviderList);

+        target.ddns_mode_select = ko.observableArray(ddns_mode_select);

+        target.currentMode = ko.observable(data.DDNS_Enable);

+        target.currentModeselect = ko.observable(data.DDNS_Mode);

+        target.currentProviderList = ko.observable("dyndns.org");

+        $.each(config.DDNSDDP, function (i, n) {

+            if (data.DDNSProvider == n.value) {

+                target.currentProviderList(data.DDNSProvider);

+            }

+        });

+        target.DDNSaccount = ko.observable(data.DDNSAccount);

+        target.DDNSpasswd = ko.observable(data.DDNSPassword);

+        target.DDNSname = ko.observable(data.DDNS);

+        target.DDNS_HashValue = ko.observable(data.DDNS_Hash_Value);

+        target.isddnsStatusTrans = ko.observable();

+        target.isEnableSet = ko.observable();

+        target.isHashValue = ko.observable();

+        target.isddnsaccount = ko.observable();

+        target.isddnspasswd = ko.observable();

+        target.isDDNSStatus = ko.observable();

+        target.isddnsdomainName = ko.observable();

+        target.isNone = ko.observable();

+        target.onStates = ko.observable();

+        target.showPassword_ddns = ko.observable(false);

+        target.showPasswordHandler_ddns = showPasswordHandler_ddns;

+        changeddnsProviderList();

+        target.changeDdnsProvider = changeDdnsProviderFunc;

+        changeSetDdnsMode();

+        target.changeSetDdnsMode = changeSetDdnsModeFunc;

+        updateScanDdnsStatus();

+        target.apply = applyFunc;

+        function updateScanDdnsStatus() {

+            var trans = "";

+            $.getJSON("/reqproc/proc_get", {

+                cmd: "getddns_status",

+                "_": new Date().getTime()

+            }, function (data) {

+                if (data.getddns_status == "0") {

+                    trans = "register successful";

+                    target.onStates(true);

+                } else if (data.getddns_status == "1") {

+                    trans = "login error";

+                    target.onStates(true);

+                } else if (data.getddns_status == "2") {

+                    trans = "network error";

+                    target.onStates(true);

+                } else if (data.getddns_status == "3") {

+                    trans = "registering";

+                    target.onStates(true);

+                } else if (data.getddns_status == "4") {

+                    trans = "not registered";

+                    target.onStates(true);

+                } else if (data.getddns_status == "5") {

+                    trans = "error registering";

+                    target.onStates(true);

+                } else if (data.getddns_status == "-1") {

+                    trans = "";

+                    target.onStates(true);

+                }

+                target.isddnsStatusTrans($.i18n.prop(trans));

+                addTimeout(updateScanDdnsStatus, 2000);

+            });

+        }

+        function changeSetDdnsMode() {

+            if (target.currentMode() != "1") {

+                target.isEnableSet(false);

+            } else {

+                target.isEnableSet(true);

+            }

+            return true;

+        }

+        function changeSetDdnsModeFunc() {

+            changeSetDdnsMode();

+        }

+        function showPasswordHandler_ddns() {

+            $("#ddns_secretcode_input").parent().find(".error").hide();

+            var checkbox = $("#showPassword_ddns:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword_ddns(true);

+            } else {

+                target.showPassword_ddns(false);

+            }

+        }

+        function changeDdnsProviderFunc() {

+            if (data.DDNSProvider != target.currentProviderList()) {

+                target.DDNSaccount("");

+                target.DDNSpasswd("");

+                target.DDNSname("");

+            } else {

+                target.DDNSaccount(data.DDNSAccount);

+                target.DDNSpasswd(data.DDNSPassword);

+                target.DDNSname(data.DDNS);

+            }

+            changeddnsProviderList();

+        }

+        function changeddnsProviderList() {

+            if (target.currentProviderList() != "none") {

+                target.isddnsaccount(true);

+                target.isddnspasswd(true);

+                target.isddnsdomainName(true);

+                target.isHashValue(true);

+                target.isDDNSStatus(true);

+            } else {

+                target.isddnsaccount(false);

+                target.isddnspasswd(false);

+                target.isddnsdomainName(false);

+                target.isHashValue(false);

+                target.isDDNSStatus(false);

+            }

+            if (target.currentProviderList() != "freedns.afraid.org") {

+                target.isHashValue(false);

+            } else {

+                target.isHashValue(true);

+            }

+            return true;

+        }

+        function applyFunc() {

+            showLoading();

+            var params = {};

+            params.goformId = "DDNS";

+            params.DDNS_Enable = target.currentMode();

+            if (target.currentMode() == "1") {

+                params.DDNS_Mode = target.currentModeselect();

+                params.DDNSProvider = target.currentProviderList();

+                if (target.currentProviderList() != "none") {

+                    params.DDNS = target.DDNSname();

+                    params.DDNSPassword = target.DDNSpasswd();

+                    params.DDNSAccount = target.DDNSaccount();

+                }

+                if (target.currentProviderList() == "freedns.afraid.org") {

+                    params.DDNS_Hash_Value = target.DDNS_HashValue();

+                }

+            }

+            service.setDDNSForward(params, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                    data = service.getDdnsParams();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+    }

+    function initialize() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new DdnsViewModel();

+        ko.applyBindings(vm, container[0]);

+        $("#ddnsForm").validate({

+            submitHandler: function () {

+                vm.apply();

+            },

+            rules: {

+                ddns_secretcode_input: "secretcode_check",

+                DDNS_Hash_Value: "ddns_hashvalue_check",

+                ddns_secretcode_inputshow: "secretcode_check"

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "ddns_secretcode_input" || id == "ddns_secretcode_inputshow") {

+                    error.insertAfter("#lblShowPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+    }

+    return {

+        init: initialize

+    };

+});

+

+

+//选网模块

+ 

+define("network_net_select","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var selectModes = _.map(config.AUTO_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    //选网功能view model

+     

+    function NetSelectVM() {

+        var target = this;

+

+        target.networkList = ko.observableArray([]);

+        target.selectNetwork = ko.observable('');

+        target.enableFlag = ko.observable(true);

+        target.types = ko.observableArray(selectModes);

+        target.selectedType = ko.observable();

+        target.selectMode = ko.observable();

+

+		target.networkText = networkTextFunc;

+		

+		target.networkStatusId = networkStatusIdFunc;

+		

+        target.networkStatus = networkStatusFunc;

+

+        target.subnetworkType = subnetworkTypeFunc;

+

+		target.networkType = networkTypeFunc;

+

+        target.operatorName = operatorNameFunc;

+

+        target.networkValue = networkValueFunc;

+

+        target.networkTypeId = networkTypeIdFunc;

+

+        target.subnetTypeId = subnetTypeIdFunc;

+       //手动搜网.

+         

+        target.search = searchFunc;

+

+        //自动选网时设置网络模式.

+         

+        target.save = saveFunc;

+

+        target.checkEnable = checkEnableFunc;

+

+        //注册选择的网络.

+         

+        target.register = registerFunc;

+

+        //init data

+        target.checkEnable();

+        var info = getNetSelectInfo();

+        if ("manual_select" == info.net_select_mode || "manual_select" == info.m_netselect_save) {

+            target.selectMode("manual_select");

+        } else {

+            target.selectMode("auto_select");

+        }

+

+        target.selectedType(info.net_select);

+		

+		//注册选择的网络.

+		function registerFunc() {

+            showLoading('registering_net');

+            var networkToSet = target.selectNetwork().split(',');

+            service.setNetwork(networkToSet[0], parseInt(networkToSet[1]), parseInt(networkToSet[2]), function (result) {

+                if (result) {

+                    target.networkList([]);

+                    var autoType = getNetSelectInfo();

+                    target.selectedType(autoType.net_select);

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+		

+		function checkEnableFunc() {

+            var status = service.getStatusInfo();

+            if (status.connectStatus == "ppp_connected" || status.connectStatus == "ppp_connecting") {

+                target.enableFlag(false);

+            } else {

+                target.enableFlag(true);

+            }

+        }

+		

+		//自动选网时设置网络模式.

+		function saveFunc() {

+            showLoading();

+

+            //AutoSelect call SetBearerPreference

+            var params = {};

+            params.strBearerPreference = target.selectedType();

+            service.setBearerPreference(params, function (result) {

+                if (result.result == "success") {

+                    target.networkList([]);

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+		

+		//手动搜网.

+		function searchFunc() {

+            showLoading('searching_net');

+            service.scanForNetwork(function (result, networkList) {

+                hideLoading();

+                if (result) {

+                    target.networkList(networkList);

+                    for (var i = 0; i < networkList.length; i++) {

+                        var n = networkList[i];

+                        if (n.nState == '2') {

+                            target.selectNetwork(n.strNumeric + ',' + n.nRat + ',' + n.SubAct);

+                            return;

+                        }

+                    }

+                } else {

+                    target.networkList([]);

+                }

+            });

+        }

+		

+		function subnetTypeIdFunc(data) {

+            return getSubNetworkTypeTog(data.nRat, data.SubAct);

+        }

+		

+		function networkTypeIdFunc(data) {

+            return getNetworkType(data.nRat);

+        }

+		

+		function networkValueFunc(data) {

+            var result = [];

+            result.push(data.strNumeric); //strNumeric

+            result.push(data.nRat); //nRat

+            result.push(data.SubAct);

+            return result.join(',');

+        }

+		

+		function operatorNameFunc(data) {

+            return data.strShortName;

+        }

+		

+		function networkTypeFunc(data) {

+            var result = getNetworkType(data.nRat);

+            if (result == "auto")

+                result = $.i18n.prop("auto");

+            return result;

+        }

+		

+		function subnetworkTypeFunc(data) {

+            var result = getSubNetworkTypeTog(data.nRat, data.SubAct);

+            return result;

+        }

+		

+		function networkStatusFunc(data) {

+            return $.i18n.prop(getNetworkStatusTog(data.nState));

+        }

+		

+		function networkStatusIdFunc(data) {

+            return getNetworkStatusTog(data.nState);

+        }

+		

+		function networkTextFunc(data) {

+            return data.strNumeric;

+        }

+

+    }

+

+    //获取网络选择信息.

+     

+    function getNetSelectInfo() {

+        return service.getNetSelectInfo();

+    }

+

+    //搜网结果中的状态转换为对应的语言项.

+     

+    function getNetworkStatusTog(status) {

+        if ("3" == status) {

+            return "forbidden";

+        } else if ("2" == status) {

+            return "current";

+        } else if ("1" == status) {

+            return "available";

+        }else if ("0" == status) {

+            return "unknown";

+        }

+    }

+	//子网络类型转换.

+     

+    function getSubNetworkTypeTog(type, subtype) {

+        var type_3g = [2, 4, 5, 6, 8];

+        if ("1" == subtype) {

+            if ("7" == type) {

+                subtype = "FDD-LTE";

+            } else if ($.inArray(type, type_3g) != -1) {

+                subtype = "WCDMA";

+            }else {

+                subtype = "GSM";

+            }

+        } else if ("0" == subtype) {

+            if ("7" == type) {

+                subtype = "TD-LTE";

+            } else if ($.inArray(type, type_3g) != -1) {

+                subtype = "TD-SCDMA";

+            } else {

+                subtype = "GSM";

+            }

+        } else {

+            subtype = "";

+        }

+        return subtype;

+    }

+    //网络类型转换.

+     

+    function getNetworkType(type) {

+        if ("7" == type) {

+            return "4G";

+        } else if ("2" == type) {

+            return "3G";

+        } else if ("0" == type) {

+            return "2G";

+        } else {

+            return "auto";

+        }

+    }

+

+    function bindContainer(vm){

+	

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+	}

+

+    //初始化选网功能view model.

+     

+    function initialize() {

+        var vm = new NetSelectVM();

+		bindContainer(vm);

+        addInterval(vm.checkEnable, 1000);

+    }

+

+    return {

+        init: initialize

+    };

+});

+define("locknet","jquery knockout service jquery set main".split(" "),

+    function ($, ko, service, config, home) {

+

+    function initialize() {

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        var vm = new locknetViewMode();

+        ko.applyBindings(vm, container);

+

+        $("#frmNetworkLock").validate({

+            submitHandler: function () {

+                vm.unlock();

+            },

+            rules: {

+                txtLockNumber: "unlock_code_check"

+            }

+        });

+    }

+

+    function locknetViewMode() {

+        var target = this;

+        var curCableMode = false;

+        target.isCPE = config.PRODUCT_TYPE == 'CPE';

+        target.hasRj45 = config.RJ45_SUPPORT;

+        target.hasSms = config.HAS_SMS;

+        target.hasPhonebook = config.HAS_PHONEBOOK;

+        target.isSupportSD = config.SD_CARD_SUPPORT;

+        if (config.WIFI_SUPPORT_QR_SWITCH == false) {

+            target.showQRCode = config.WIFI_SUPPORT_QR_CODE;

+        } else {

+            var wifiInfo = service.getWifiBasic();

+            target.showQRCode = config.WIFI_SUPPORT_QR_CODE && wifiInfo.show_qrcode_flag;

+        }

+        if(config.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_ssid_wifikey.png?_=' + $.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        target.hasParentalControl = ko.observable(config.HAS_PARENTAL_CONTROL && curCableMode);

+        target.deviceInfo = ko.observable([]);

+        target.isHomePage = ko.observable(false);

+        if (window.location.hash == "#main") {

+            target.isHomePage(true);

+        }

+

+        target.supportUnlock = config.NETWORK_UNLOCK_SUPPORT;

+        target.unlockCode = ko.observable();

+

+        var info = service.getNetworkUnlockTimes();

+        target.times = ko.observable(info.unlock_nck_time);

+

+        //显示工作模式设置窗口

+        target.showOpModeWindow = showOpModeWindowFunc;

+		

+        target.isLoggedIn = ko.observable(false);

+        target.enableFlag = ko.observable(false);

+        //解锁

+        target.unlock = unlockFunc;

+

+        //更新工作模式状态

+        target.refreshOpmodeInfo = refreshOpmodeInfoFunc;

+		

+        //定时检查工作模式状态

+        if (target.hasRj45) {

+            target.refreshOpmodeInfo();

+            addInterval(function () {

+                target.refreshOpmodeInfo();

+            }, 1000);

+        }

+		

+		//更新工作模式状态

+		function refreshOpmodeInfoFunc() {

+            var obj = service.getStatusInfo();

+            target.isLoggedIn(obj.isLoggedIn);

+

+            if (!curCableMode && checkCableMode(obj.blc_wan_mode)) { //如果有线,则重新加载

+                window.location.reload();

+                return;

+            }

+

+            curCableMode = checkCableMode(obj.blc_wan_mode);

+            target.hasParentalControl(config.HAS_PARENTAL_CONTROL && curCableMode);

+            if (curCableMode && obj.ethWanMode.toUpperCase() == "DHCP") {

+                target.enableFlag(true);

+            } else if ((!curCableMode && obj.connectStatus != "ppp_disconnected") || (curCableMode && obj.rj45ConnectStatus != "idle" && obj.rj45ConnectStatus != "dead")) {

+                target.enableFlag(false);

+            } else {

+                target.enableFlag(true);

+            }

+            var getMode = (obj.blc_wan_mode == "AUTO_PPP" || obj.blc_wan_mode == "AUTO_PPPOE") ? "AUTO" : obj.blc_wan_mode;

+            var currMode = "";

+            switch (getMode) {

+			case "PPP":

+                currMode = "opmode_gateway";

+                break;

+			case "PPPOE":

+                currMode = "opmode_cable";

+                break;

+            case "AUTO":

+                currMode = "opmode_auto";

+                break;

+            default:

+                break;

+            }

+            $("#opmode").attr("data-trans", currMode).text($.i18n.prop(currMode));

+        }

+		

+		//解锁

+		function unlockFunc() {

+            showLoading();

+            service.unlockNetwork({

+                unlock_network_code: target.unlockCode()

+            }, function (data) {

+                target.unlockCode("");

+                if (data && data.result == "success") {

+                    successOverlay();

+                    if (window.location.hash == "#main") {

+                        setTimeout(function () {

+                            window.location.reload();

+                        }, 500);

+                    } else {

+                        window.location.hash = "#main";

+                    }

+                } else {

+                    var info = service.getNetworkUnlockTimes();

+                    target.times(info.unlock_nck_time);

+                    errorOverlay();

+                }

+            })

+        }

+		

+		//显示工作模式设置窗口

+		function showOpModeWindowFunc() {

+            showSettingWindow("change_mode", "opmode_popup", "opmode_popup", 400, 300, function () {});

+        }

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+// RJ45联网设置模块

+ 

+define("network_dial_set_cpe","underscore jquery knockout set service".split(" "),

+function(_, $, ko, config, service) {

+	var dialActions = _.map(config.dialActions, function(elem){

+		return new Option(elem.name, elem.value);

+	});

+	

+	var dialModes = _.map(config.pppoeModes, function(elem) {

+		return new Option(elem.name, elem.value);

+	});

+		

+    var checkStatusTimer = 0;

+    var checkConCounter = 0;

+    var timeoutTipShowed = false;

+

+    // 联网设置view model.

+     

+	function PPPoEViewModel() {

+		var pppObj = service.getPppoeParams();

+        var ethParams = pppObj;

+		var target = this;

+		

+		target.staticNoticeShow = ko.observable();

+		target.dhcpNoticeShow = ko.observable();

+		target.pppoeNoticeShow = ko.observable();

+		target.autoNoticeShow = ko.observable();

+		target.staticNotice = ko.observable();

+		target.dhcpNotice = ko.observable();

+		target.pppoeNotice = ko.observable();

+		target.autoNotice = ko.observable();

+		target.dhcpNoticeText = ko.observable();

+		target.staticNoticeText = ko.observable();

+		target.pppoeNoticeText = ko.observable();

+        target.autoNoticeText = ko.observable();		

+		target.currentMode = ko.observable(pppObj.ethwan_mode);//auto dhcp pppoe static

+		target.showPassword = ko.observable(false);

+		target.modes = ko.observableArray(dialModes);

+		target.isPppoeMode = ko.observable(false);

+		target.isStaticMode = ko.observable(false);

+		target.isAutoMode = ko.observable(false);

+		target.action = ko.observable();

+		target.btnTrans = ko.observable();

+		target.enableFlag = ko.observable();

+		target.isShowDisbtn = ko.observable();

+		target.isShowCancelbtn = ko.observable();

+		

+		if(pppObj.rj45_state == "dead"){

+			checkRj45DeadTip();

+		} else if(pppObj.rj45_state == "connect"){

+			timeoutTipShowed = true;

+			setRj45CheckTimer("connect");

+		} else if(pppObj.rj45_state == "working"){

+			setRj45WorkingTip();

+		}

+		

+		target.user = ko.observable(pppObj.pppoe_username);

+		target.password = ko.observable(pppObj.pppoe_cc);

+		target.autoUser = ko.observable(pppObj.pppoe_username);

+		target.autoPassword = ko.observable(pppObj.pppoe_cc);

+		target.pppMode = ko.observable(pppObj.ethwan_dialmode);

+		initContronler();

+		

+

+		//下拉框选择改变下面DIV模块

+		target.changeModeDiv = changeModeDivFunc;

+				

+		target.radioHandler = radioHandlerFunc;

+				

+		target.primaryDNS = ko.observable(pppObj.static_wan_primary_dns);

+		target.secondaryDNS = ko.observable(pppObj.static_wan_secondary_dns);

+		target.ipAddress = ko.observable(pppObj.static_wan_ipaddr);

+		target.subnetMask = ko.observable(pppObj.static_wan_netmask);

+		target.defaultGateway = ko.observable(pppObj.static_wan_gateway);

+		

+		addInterval(function(){

+			ethParams = service.getPppoeParams();

+			pppObj.rj45_state = ethParams.rj45_state;

+			initContronler();

+		}, 1000);

+		

+        // 取消连接按钮事件.

+         					

+		target.cancelConnect = cancelConnectFunc;

+		

+        // 应用按钮事件.

+         		

+		target.save = saveFunc;

+		

+		 //密码显示事件

+        target.showPasswordHandler = function () {

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+		

+        // 更新当前界面状态、按钮、提示语等.

+         			

+		function initContronler() {	

+            checkRj45DeadTip();		

+			if(target.currentMode() == "PPPOE"){

+				target.isPppoeMode(true);

+				target.isStaticMode(false);

+				target.isAutoMode(false);

+				target.staticNoticeShow(false);

+				target.dhcpNoticeShow(false);	

+				target.autoNoticeShow(false);	

+			} else if(target.currentMode() == "AUTO"){

+				target.isStaticMode(false);

+				target.isPppoeMode(false);

+				target.isAutoMode(true);

+				target.dhcpNoticeShow(false);

+				target.pppoeNoticeShow(false);

+				target.staticNoticeShow(false);

+			} else if(target.currentMode() == "STATIC"){

+				target.isStaticMode(true);

+				target.isPppoeMode(false);

+				target.isAutoMode(false);

+				target.dhcpNoticeShow(false);

+				target.pppoeNoticeShow(false);

+				target.autoNoticeShow(false);

+			} else{

+				target.isStaticMode(false);

+				target.isPppoeMode(false);

+				target.isAutoMode(false);

+				target.staticNoticeShow(false);

+				target.pppoeNoticeShow(false);

+                target.autoNoticeShow(false);					

+			}

+			if(ethParams.ethwan_dialmode != "auto_dial" && (pppObj.rj45_state == "working" || pppObj.rj45_state =="connect") ){

+				target.enableFlag(false);

+			} else {

+				target.enableFlag(true);

+			}

+			if(pppObj.rj45_state == "connect"){

+				if(target.pppMode() == "auto_dial"){

+					target.action("connect");

+				}else{

+					target.action("disconnect");

+				}					

+			} else if(pppObj.rj45_state == "working"){

+				target.action("disconnect");

+			}else{

+				target.action("connect");

+			}

+			//应用/连接按钮

+			if(target.pppMode() != "auto_dial" && target.currentMode() == ethParams.ethwan_mode){

+				target.btnTrans("connect");

+			} else{

+				target.btnTrans("apply");

+			}

+			if(pppObj.rj45_state != "idle"){

+				$("#pppoeApply").attr("disabled", true);

+		    }else {

+				$("#pppoeApply").attr("disabled", false);

+            }

+			

+			//取消/断开按钮

+			target.isShowDisbtn(target.pppMode() != "auto_dial" && pppObj.rj45_state == "working");

+			target.isShowCancelbtn(target.pppMode() != "auto_dial" && pppObj.rj45_state == "connect");

+			

+			$("#pppoeApply").translate();

+		}

+        // 设置后通过定时检查rj45_state状态,判断连接或断开操作结果.

+         		

+	    function setRj45CheckTimer(action){

+            checkStatusTimer && window.clearInterval(checkStatusTimer);

+            if("connect" != action){				

+                checkStatusTimer = addInterval(function () {

+                    checkDisconnectStatus();

+                }, 2000);

+            }else{

+                if(target.currentMode() == "PPPOE"){

+                    target.pppoeNoticeShow(true);

+                    target.pppoeNotice("pppoe_processing");

+                    target.pppoeNoticeText($.i18n.prop("pppoe_processing"));

+                } else if(target.currentMode() == "STATIC"){

+                    target.staticNoticeShow(true);

+                    target.staticNotice("static_processing");

+                    target.staticNoticeText($.i18n.prop("static_processing"));

+                } else if(target.currentMode() == "DHCP"){

+                    target.dhcpNoticeShow(true);

+                    target.dhcpNotice("dyn_processing");

+                    target.dhcpNoticeText($.i18n.prop("dyn_processing"));

+                }else{

+                    target.autoNoticeShow(true);

+                    target.autoNotice("auto_processing");

+                    target.autoNoticeText($.i18n.prop("auto_processing"));

+                }

+                checkStatusTimer = addInterval(function () {

+                    checkConnectionStatus();

+                }, 2000);

+            }			

+        }

+        // 设置后通过定时检查rj45_state状态,判断连接操作结果.

+         			

+        function checkConnectionStatus(){

+            if(checkConCounter < 1){

+				checkConCounter++;

+				return;

+            }

+            if(pppObj.rj45_state == "connect"){

+                if(target.currentMode() != ethParams.ethwan_mode){

+                    if(target.currentMode() == "AUTO"){

+                        target.autoNoticeShow(true);

+                    }else if(target.currentMode() == "PPPOE"){

+                        target.pppoeNoticeShow(true);

+                    }else if(target.currentMode() == "STATIC"){

+                        target.staticNoticeShow(true);

+                    }else if(target.currentMode() == "DHCP"){

+                        target.dhcpNoticeShow(true);

+                    }

+                }

+                if(checkConCounter > 6){

+                    if(timeoutTipShowed == false){

+                        timeoutTipShowed = true;

+                        showAlert("ussd_operation_timeout");

+                    }

+                }

+                checkConCounter++;

+            } else if (pppObj.rj45_state == "working") {

+                hideLoading();

+                setRj45WorkingTip();

+                window.clearInterval(checkStatusTimer);						

+            } else if (pppObj.rj45_state == "dead") {

+				hideLoading();

+				checkRj45DeadTip();

+                window.clearInterval(checkStatusTimer);

+            } else if(pppObj.rj45_state == "idle"){

+                hideLoading();

+                if(target.currentMode() == "DHCP" && ethParams.ethwan_mode == "DHCP") {

+                    timeoutTipShowed == false && target.dhcpNoticeShow(true);

+                    target.dhcpNotice("dyn_fail");

+                    target.dhcpNoticeText($.i18n.prop("dyn_fail"));

+                }

+                if(target.currentMode() == "STATIC" && ethParams.ethwan_mode == "STATIC") {

+                    timeoutTipShowed == false && target.staticNoticeShow(true);

+                    target.staticNotice("static_fail");

+                    target.staticNoticeText($.i18n.prop("static_fail"));

+                }

+                if(target.currentMode() == "PPPOE" && ethParams.ethwan_mode == "PPPOE") {

+                    timeoutTipShowed == false && target.pppoeNoticeShow(true);

+                    target.pppoeNotice("pppoe_fail");

+                    target.pppoeNoticeText($.i18n.prop("pppoe_fail"));

+                }

+                if(target.currentMode() == "AUTO" && ethParams.ethwan_mode == "AUTO") {

+                    timeoutTipShowed == false && target.autoNoticeShow(true);

+                    target.autoNotice("auto_fail");

+                    target.autoNoticeText($.i18n.prop("auto_fail"));

+                }

+                window.clearInterval(checkStatusTimer);

+            }   else{

+                hideLoading();

+				window.clearInterval(checkStatusTimer);

+			}

+        }

+		// 设置连接成功时提示语状态.

+         		

+        function setRj45WorkingTip(){

+            if(target.currentMode() == ethParams.ethwan_mode){

+                if(target.currentMode() == "AUTO") {

+                    target.autoNoticeShow(true);

+                    target.autoNotice("auto_success");

+                    target.autoNoticeText($.i18n.prop("auto_success"));

+                }else if(target.currentMode() == "PPPOE") {

+                    target.pppoeNoticeShow(true);

+                    target.pppoeNotice("pppoe_success");

+                    target.pppoeNoticeText($.i18n.prop("pppoe_success"));

+                }else if(target.currentMode() == "STATIC") {

+                    target.staticNoticeShow(true);

+                    target.staticNotice("static_success");

+                    target.staticNoticeText($.i18n.prop("static_success"));

+                }else if(target.currentMode() == "DHCP" ) {

+                    target.dhcpNoticeShow(true);

+                    target.dhcpNotice("dyn_success");

+                    target.dhcpNoticeText($.i18n.prop("dyn_success"));

+                }

+            }

+        }

+		

+		// 设置网线断开提示语状态.

+         		

+        function checkRj45DeadTip(){

+            if(pppObj.rj45_state != "dead"){

+                if(target.currentMode() == "AUTO"  && target.autoNotice() == "pppoe_msg") {

+                    target.autoNoticeShow(false);

+                }else if(target.currentMode() == "PPPOE"  && target.pppoeNotice() == "pppoe_msg") {

+                    target.pppoeNoticeShow(false);

+                }else if(target.currentMode() == "STATIC"  && target.staticNotice() == "pppoe_msg") {

+                    target.staticNoticeShow(false);

+                }else if(target.currentMode() == "DHCP" && target.dhcpNotice() == "pppoe_msg") {

+                    target.dhcpNoticeShow(false);

+                }				

+                

+            } else{

+				target.dhcpNotice("pppoe_msg");

+                target.dhcpNoticeText($.i18n.prop("pppoe_msg"));

+                target.staticNotice("pppoe_msg");

+                target.staticNoticeText($.i18n.prop("pppoe_msg"));

+                target.pppoeNotice("pppoe_msg");

+                target.pppoeNoticeText($.i18n.prop("pppoe_msg"));

+                target.autoNotice("pppoe_msg");

+                target.autoNoticeText($.i18n.prop("pppoe_msg"));

+                if(target.currentMode() == "AUTO") {

+                    target.autoNoticeShow(true);

+                }else if(target.currentMode() == "PPPOE") {

+                    target.pppoeNoticeShow(true);

+                }else if(target.currentMode() == "STATIC") {

+                    target.staticNoticeShow(true);

+                }else if(target.currentMode() == "DHCP") {

+                    target.dhcpNoticeShow(true);

+                }

+            }            

+		}

+        // 设置后通过定时检查rj45_state状态,判断断开操作结果.

+         		

+        function checkDisconnectStatus(){

+            if(checkConCounter < 1){

+                checkConCounter++;

+            } else if (pppObj.rj45_state != "working" && pppObj.rj45_state != "connect") {

+                target.dhcpNoticeShow(false);

+                target.staticNoticeShow(false);

+                target.pppoeNoticeShow(false);

+                target.autoNoticeShow(false);

+                window.clearInterval(checkStatusTimer);

+                successOverlay();

+            } else if(checkConCounter > 6){

+                if(timeoutTipShowed == false){

+                    timeoutTipShowed = true;

+                    showAlert("ussd_operation_timeout");

+                }

+                window.clearInterval(checkStatusTimer);

+            } else if(checkConCounter < 7) {

+                checkConCounter++;

+            } else {

+                hideLoading();

+                window.clearInterval(checkStatusTimer);

+            }				

+        }

+        

+		//应用按钮事件.

+		function saveFunc(){

+			target.dhcpNoticeShow(false);

+			target.staticNoticeShow(false);

+			target.pppoeNoticeShow(false);

+			target.autoNoticeShow(false);

+			if(pppObj.rj45_state == "dead"){

+				showAlert("pppoe_msg");

+				return;

+			}

+			var requestParams = {};

+			if($("#pppoe_mode").val() == "PPPOE") {

+				requestParams = $.extend({}, {

+					goformId: "WAN_GATEWAYMODE_PPPOE",

+					pppoe_username: target.user(),

+					pppoe_cc: target.password()

+				});

+			} else if($("#pppoe_mode").val() == "AUTO") {

+				requestParams = $.extend({}, {

+					goformId: "WAN_GATEWAYMODE_AUTO",

+					pppoe_username: target.autoUser(),

+					pppoe_cc: target.autoPassword()

+				});

+			} else if($("#pppoe_mode").val() == "STATIC") {

+				if(target.ipAddress() == target.defaultGateway()){

+					showAlert("ip_gate_not_same");

+					return;

+				}

+				if(isStaticIPValid(target.ipAddress(), pppObj.lan_ipaddr, pppObj.lan_netmask)){

+					showAlert("ip_innergate_not_same");

+					return;

+				}

+				requestParams = $.extend({}, {

+					goformId: "WAN_GATEWAYMODE_STATIC",

+					static_wan_ipaddr: target.ipAddress(),

+					static_wan_netmask: target.subnetMask(),

+					static_wan_gateway: target.defaultGateway(),

+					static_wan_primary_dns: target.primaryDNS(),

+					static_wan_secondary_dns: target.secondaryDNS(),

+					WAN_MODE: "STATIC"

+				});

+			} else {

+				requestParams = $.extend({}, {

+					goformId: "WAN_GATEWAYMODE_DHCP"

+				});

+			}

+			requestParams.action_link = "connect";

+			requestParams.dial_mode = target.pppMode();

+			showLoading("waiting");

+			

+			service.setPppoeDialMode(requestParams, function(data){

+				if(data.result){

+					target.currentMode($("#pppoe_mode").val());

+					pppObj = service.getPppoeParams();

+					checkConCounter = 0;

+					timeoutTipShowed = false;

+					setRj45CheckTimer("connect");					

+					$("#pppoeApply").translate();

+                } else {

+					errorOverlay("pppoe_message_send_fail");

+                }

+			});

+			

+		}

+		

+		//取消连接按钮事件.

+		function cancelConnectFunc(){

+			target.dhcpNoticeShow(false);

+			target.staticNoticeShow(false);

+			target.pppoeNoticeShow(false);

+			target.autoNoticeShow(false);

+			if(pppObj.rj45_state == "dead"){

+				showAlert("pppoe_msg");

+				return;

+			}

+			var requestParams = {

+				dial_mode: target.pppMode(),

+				action_link: "disconnect"

+			};

+			if(pppObj.ethwan_mode == "PPPOE") {

+				requestParams = $.extend(requestParams, {

+					goformId: "WAN_GATEWAYMODE_PPPOE",

+					pppoe_username: pppObj.pppoe_username,

+					pppoe_cc: pppObj.pppoe_cc					

+				});

+			}else if(pppObj.ethwan_mode == "AUTO") {

+				requestParams = $.extend(requestParams, {

+					goformId: "WAN_GATEWAYMODE_AUTO",

+					pppoe_username: pppObj.pppoe_username,

+					pppoe_cc: pppObj.pppoe_cc					

+				});

+			}else if(pppObj.ethwan_mode == "STATIC") {

+				requestParams = $.extend(requestParams, {

+					goformId: "WAN_GATEWAYMODE_STATIC",

+					static_wan_ipaddr: pppObj.static_wan_ipaddr,

+					static_wan_netmask: pppObj.static_wan_netmask,

+					static_wan_gateway: pppObj.static_wan_gateway,

+					static_wan_primary_dns: pppObj.static_wan_primary_dns,

+					static_wan_secondary_dns: pppObj.static_wan_secondary_dns,

+					WAN_MODE: "STATIC"

+				});

+			}else {

+				requestParams = $.extend(requestParams, {

+					goformId: "WAN_GATEWAYMODE_DHCP"

+				});

+			}

+			showLoading("waiting");

+			service.setPppoeDialMode(requestParams, function(data){

+				if(data.result){

+                    checkConCounter = 0;

+					timeoutTipShowed = false;

+					setRj45CheckTimer("disconnect");

+					$("#pppoeApply").translate();

+                } else {

+					errorOverlay("pppoe_message_send_fail");

+                }

+			});

+			

+		}

+		

+		function radioHandlerFunc(){

+			initContronler();

+			return true;

+		}

+		

+		function changeModeDivFunc(){

+			initContronler();

+		}

+        

+    }

+

+	function bindContainer(vm){

+		var container = $('#container');

+		ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+	

+	}

+    // 联网设置初始化.

+     

+	function initialize() {

+		var vm = new PPPoEViewModel();

+		bindContainer(vm);

+		

+		$("#pppoeApply").translate();

+		

+		$('#pppoeForm').validate({

+			submitHandler : function() {

+				vm.save();

+			},

+            rules: {

+                txtPin: "wps_pin_check",

+				txtIpAddress: "dmz_ip_check",

+				txtSubnetMask: {

+					ipv4: true,

+                    subnetmask_check: true

+				},

+				txtDefaultGateway: {

+					ipv4: true,

+					gateway_check: true

+				},

+				txtPrimaryDNS: {

+					ipv4: true,

+					dns_check:true

+				},

+				txtSecondaryDNS: {

+					ipv4: true,

+					dns_check:true

+				}

+            }

+		});

+	}

+	

+	

+//from 4.0

+    // 有效DNS检查.

+     

+function validateDns(dns){

+	if ( "0.0.0.0" == dns || "255.255.255.255" == dns) {

+		return false;

+	}

+	return true;

+}

+    // 联网设置初始化.

+     

+function isStaticIPValid(ip, lanip, lanmask){

+	if(!ip || !lanip || !lanmask){//各参数不能为空

+        return false;

+    }

+	if(ip == lanip){// 与内网IP相等

+		return true;

+	}

+    var  res1 = [], res2 = [], mask = [];

+    addr1 = ip.split(".");

+    addr2 = lanip.split(".");

+    mask  = lanmask.split(".");

+    for(var i = 0; i < addr1.length; i += 1){

+        res1.push(parseInt(addr1[i]) & parseInt(mask[i]));

+        res2.push(parseInt(addr2[i]) & parseInt(mask[i]));

+    }

+    if(res1.join(".") == res2.join(".")){//在同一个网段

+        return true;

+    }else{//不在同一个网段

+        return false;

+    }

+}

+

+// 有效子网掩码验证.

+     

+function isNetmaskIPValid(ip) {

+	if (ip == 255 || ip == 254 || ip == 252 || ip == 248

+		|| ip == 240 || ip == 224 || ip == 192 || ip == 128 || ip == 0)

+	{

+		return true;

+	}

+	else

+	{

+		return false;

+	}

+}

+    // 有效子网掩码检查.

+     

+function validateNetmask(netmask) {

+	var array = new Array();

+	array = netmask.split(".");

+

+	if (array.length != 4) {

+		return false;

+	}

+

+	array[0] = parseInt(array[0]);

+	array[1] = parseInt(array[1]);

+	array[2] = parseInt(array[2]);

+	array[3] = parseInt(array[3]);

+

+	if (array[3] != 0) {

+		if (array[2] != 255 || array[1] != 255 || array[0] != 255) {

+			return false;

+		} else {

+			if (!isNetmaskIPValid(array[3])) {

+				return false;

+			}

+		}

+	}

+

+	if (array[2] != 0) {

+		if (array[1] != 255 || array[0] != 255) {

+			return false;

+		} else {

+			if (!isNetmaskIPValid(array[2])) {

+				return false;

+			}

+		}

+	}

+

+	if (array[1] != 0) {

+		if (array[0] != 255) {

+			return false;

+		} else{

+			if (!isNetmaskIPValid(array[1])) {

+				return false;

+			}

+		}

+	}

+	if(array[0]!=255) {

+		return false;

+	}

+	if ( "0.0.0.0" == netmask || "255.255.255.255" == netmask) {

+		return false;

+	}

+	return true;

+}

+    

+    // subnetmask_check校验规则

+     

+jQuery.validator.addMethod("subnetmask_check", function (value, element, param) {

+	var result = validateNetmask(value);

+    return this.optional(element) || result;

+});

+    // dns_check校验规则

+     

+jQuery.validator.addMethod("dns_check", function (value, element, param) {

+	var result = validateDns(value);

+    return this.optional(element) || result;

+});

+    // 有效网关检查.

+     

+function validateGateway(wanIp, netmaskIp, gatewayIp) {

+	if(myConcat(wanIp,netmaskIp) == myConcat(netmaskIp, gatewayIp)) {

+		return true;

+	} else {

+		return false;

+	}

+}

+    // IP和子网掩码转换成数组形式并相与,返回相与后的IP.

+     

+function myConcat(ip1,ip2){

+	var result = [];

+	var iplArr = ip1.split(".");

+	var ip2Arr = ip2.split(".");

+	for(var i = 0; i < iplArr.length;i++){

+		result[i] = (iplArr[i] & ip2Arr[i]);

+	}

+	return result.join(".");

+}

+    // gateway_check校验规则

+     

+jQuery.validator.addMethod("gateway_check", function (value, element, param) {

+	var result = validateGateway($('#txtIpAddress').val(), $('#txtSubnetMask').val(), $("#txtDefaultGateway").val());

+    return this.optional(element) || result;

+});

+	

+	return {

+		init: initialize

+	};

+});

+//联网设置模块

+define("network_dial_set","underscore jquery knockout set service".split(" "),

+function(_, $, ko, config, service) {

+

+    //联网设置view model

+	function DialVM() {

+		var dialMode = service.getConnectionMode();

+		var target = this;

+

+		target.selectMode = ko.observable(dialMode.connectionMode);

+        target.enableFlag = ko.observable(true);

+        target.isAllowedRoaming = ko.observable(dialMode.isAllowedRoaming);

+        var originalRoaming = dialMode.isAllowedRoaming;

+

+        target.setAllowedRoaming = setAllowedRoamingFunc;

+		

+		var checkboxFlag = $(".checkboxToggle");

+        target.checkEnable = checkEnableFunc;

+		

+        //修改联网模式

+        target.save = saveFunc;

+		

+		function saveFunc() {

+            showLoading();

+            var connMode = target.selectMode();

+            //当选择自动时,下发原先的勾选状态

+            if (connMode == 'auto_dial') {

+                originalRoaming = target.isAllowedRoaming();

+            } else {

+                target.isAllowedRoaming(originalRoaming);

+            }

+            service.setConnectionMode({

+                connectionMode: connMode,

+                isAllowedRoaming: target.isAllowedRoaming()

+            }, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+		

+		function setAllowedRoamingFunc() {

+            if(!$("#roamBtn").hasClass("disable")){

+                var checkbox = $("#isAllowedRoaming:checked");

+                if(checkbox && checkbox.length == 0 ){

+                    target.isAllowedRoaming("on");

+                }else{

+                    target.isAllowedRoaming("off");

+                }

+            }

+        }

+		

+		function checkEnableFunc() {

+            var status = service.getStatusInfo();

+

+            if (status.connectStatus == "ppp_connected" || status.connectStatus == "ppp_connecting") {

+                target.enableFlag(false);

+                disableCheckbox(checkboxFlag);

+            }

+            else {

+                target.enableFlag(true);

+                enableCheckbox(checkboxFlag);

+            }

+        }

+

+	}

+

+    //联网设置初始化.

+	function initialize() {

+		var vm = new DialVM();

+		bindContainer(vm);

+		

+        vm.checkEnable();

+        addInterval( vm.checkEnable, 1000);

+	}

+	

+	function bindContainer(vm){

+		var container = $('#container');

+		ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+	

+	}

+	

+	return {

+		init: initialize

+	};

+});

+// APN Setting 模块

+define("network_apn_set","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //获取鉴权方式

+     

+    function getAuthModes() {

+        return _.map(config.APN_AUTH_MODES, function (item) {

+            return new Option(item.name, item.value);

+        });

+    }

+

+    function getApnPdpTypes() {

+        var pdpTypesArray = [new Option('IPv4', 'IP')];

+        if (config.IPV6_SUPPORT) {

+            pdpTypesArray.push(new Option('IPv6', 'IPv6'));

+            if (config.IPV4V6_SUPPORT) {

+                pdpTypesArray.push(new Option('IPv4v6', 'IPv4v6'));

+            }

+            if (config.IPV4_AND_V6_SUPPORT) {

+                pdpTypesArray.push(new Option('IPv4 & IPv6', 'IPv4v6'));

+            }

+        }

+        return pdpTypesArray;

+    }

+

+    //获取apn相关信息

+     

+    function getApnSet() {

+        var apnInfo = service.getApnSettings();

+        apnInfo.ipv6ApnConfigs = getApnConfigs(apnInfo.ipv6APNs, true);

+        apnInfo.apnConfigs = getApnConfigs(apnInfo.APNs, false);

+        apnInfo.autoApnConfigs = getAutoApnsConfig(apnInfo.autoApns, apnInfo.autoApnsV6);

+        return apnInfo;

+    }

+    var apnConfigs = {};

+    var ipv6ApnConfigs = {};

+    var autoApnConfigs = {};

+

+    //解析自动apn信息

+     

+    function getAutoApnsConfig(autoApnV4, autoApnV6) {

+        var autoApnsV4 = [];

+        var autoApnsV6 = [];

+

+        if (autoApnV4 && autoApnV4.length > 5) {

+            var apnArr = autoApnV4.split("||");

+            for (var ki = 0; ki < apnArr.length; ki++) {

+                if (apnArr[ki] != "") {

+                    var apnItem = parseApnItem(apnArr[ki], false);

+                    autoApnsV4.push(apnItem);

+                }

+            }

+        }

+        if (autoApnV6 && autoApnV6.length > 5) {

+            var apnArr = autoApnV6.split("||");

+            for (var ki = 0; ki < apnArr.length; ki++) {

+                if (apnArr[ki] != "") {

+                    var apnItem = parseApnItem(apnArr[ki], false);

+                    autoApnsV6.push(apnItem);

+                }

+            }

+        }

+        return dealAutoApnsV4V6(autoApnsV4, autoApnsV6);

+    }

+    //解析apn信息

+     

+    function getApnConfigs(apnsStr, isIpv6) {

+        var apnCfgs = [];

+        var theApnConfigs = {};

+        if (apnsStr && apnsStr.length > 10) {

+            var apnArr = apnsStr.split("||");

+            for (var ki = 0; ki < apnArr.length; ki++) {

+                if (apnArr[ki] != "") {

+                    var apnItem = parseApnItem(apnArr[ki], isIpv6);

+                    apnCfgs.push(apnItem);

+                    theApnConfigs[apnItem.profileName] = apnItem;

+                }

+            }

+        }

+        if (isIpv6 == false) {

+            apnConfigs = theApnConfigs;

+        } else {

+            ipv6ApnConfigs = theApnConfigs;

+        }

+        return apnCfgs;

+    }

+

+	//解析单条apn信息

+     

+    function parseApnItem(apnStr, isIpv6) {

+        var apnItem = {};

+        var items = apnStr.split("($)");

+        for (var ki = 0; ki < items.length; ki++) {

+            apnItem.profileName = items[0];

+            apnItem.pdpType = items[7];

+            if (isIpv6 == false) {	

+                apnItem.dnsMode = items[10];

+                apnItem.dns1 = items[11];

+                apnItem.dns2 = items[12];

+                apnItem.wanApn = items[1];

+                apnItem.authMode = items[4].toLowerCase();

+                apnItem.username = items[5];

+                apnItem.password = items[6];

+            } else {		

+                apnItem.dnsModeV6 = items[10];

+                apnItem.dns1V6 = items[11];

+                apnItem.dns2V6 = items[12];

+                apnItem.wanApnV6 = items[1];

+                apnItem.authModeV6 = items[4].toLowerCase();

+                apnItem.usernameV6 = items[5];

+                apnItem.passwordV6 = items[6];

+            }

+        }

+        return apnItem;

+    }

+    //合并V4\V6自动apn信息

+     

+    function dealAutoApnsV4V6(v4, v6) {

+        autoApnConfigs = {};

+        var autoApns = [];

+        for (var ki = 0; ki < v4.length; ki++) {

+            var apnElem = v4[ki];

+            var itemsV6 = v6[ki];

+            if (itemsV6 && (itemsV6.pdpType == 'IPv6' || itemsV6.pdpType == 'IPv4v6')) {

+                apnElem.usernameV6 = itemsV6.username;

+                apnElem.passwordV6 = itemsV6.password;

+                apnElem.dns1V6 = itemsV6.dns1;

+                apnElem.dns2V6 = itemsV6.dns2;

+                apnElem.wanApnV6 = itemsV6.wanApn;

+                apnElem.authModeV6 = itemsV6.authMode;

+                apnElem.dnsModeV6 = itemsV6.dnsMode;

+            }

+            autoApns.push(apnElem);

+            autoApnConfigs[apnElem.profileName] = apnElem;

+        }

+        return autoApns;

+    }

+

+    function getProfileOptions(apns) {

+        return _.map(apns, function (item) {

+            return new Option(item.profileName, item.profileName);

+        });

+    }

+

+    //APNViewModel

+     

+    function APNViewModel() {

+        var target = this;

+        var apnSettings = getApnSet();

+        if (apnSettings.apnNumPreset) {

+            config.maxApnNumber = apnSettings.apnNumPreset;

+        }

+

+        target.defApn = ko.observable(apnSettings.profileName); //当前默认APN

+        target.apnMode = ko.observable(apnSettings.apnMode);

+        target.autoProfiles = ko.observableArray(getProfileOptions(apnSettings.autoApnConfigs));

+        target.profiles = ko.observableArray(getProfileOptions(apnSettings.apnConfigs));

+        target.wanDial = ko.observable(apnSettings.wanDial);

+		

+        target.showApnDns = ko.observable(config.SHOW_APN_DNS);

+        target.index = ko.observable(apnSettings.currIndex);

+        target.supportIPv6 = ko.observable(config.IPV6_SUPPORT);

+        target.supportIpv4AndIpv6 = ko.observable(config.IPV4_AND_V6_SUPPORT);

+

+        target.apn = ko.observable(apnSettings.wanApn);

+        target.dnsMode = ko.observable(apnSettings.dnsMode == 'manual' ? 'manual' : 'auto');

+        target.dns1 = ko.observable(apnSettings.dns1);

+        target.dns2 = ko.observable(apnSettings.dns2);

+        target.authModes = ko.observableArray(getAuthModes());

+        target.username = ko.observable(apnSettings.username);

+        target.password = ko.observable(apnSettings.password);

+		

+        target.pdpTypes = ko.observableArray(getApnPdpTypes());

+        target.selectedPdpType = ko.observable(apnSettings.pdpType);

+        target.selectedPdpTypeTmp = ko.observable(apnSettings.pdpType); //the PdpType select's value before chang

+        target.profileName = ko.observable(apnSettings.profileName); //当前编辑框中的

+        target.selectedProfile = ko.observable(apnSettings.profileName); //当前下拉框选择的APN

+

+        target.showPassword = ko.observable(false);

+

+        target.apnV6 = ko.observable(apnSettings.wanApnV6);

+        target.dnsModeV6 = ko.observable(apnSettings.dnsModeV6 == 'manual' ? 'manual' : 'auto');

+        target.dns1V6 = ko.observable(apnSettings.dns1V6);

+        target.dns2V6 = ko.observable(apnSettings.dns2V6);

+        target.authModesV6 = ko.observableArray(getAuthModes());

+        target.usernameV6 = ko.observable(apnSettings.usernameV6);

+        target.passwordV6 = ko.observable(apnSettings.passwordV6);

+        target.pdpTypeNote = ko.observable(true);

+        if (apnSettings.autoApnConfigs && apnSettings.autoApnConfigs.length > 0) {

+            target.selectedAutoProfile = ko.observable(apnSettings.autoApnConfigs[0].profileName);

+        } else {

+            target.selectedAutoProfile = ko.observable();

+        }

+

+        if (config.EMPTY_APN_SUPPORT == false) {

+            $("#apn_ipv4_apn").addClass("required");

+            $("#apn_ipv6_apn").addClass("required");

+        } else {

+            $("#apn_ipv4_apn").removeClass("required");

+            $("#apn_ipv6_apn").removeClass("required");

+        }

+		

+        target.disableProfile = ko.observable(false); //表示处于新增页面

+        target.addApnHide = ko.observable(true);

+        target.defaultCfg = ko.observable(true); //当前选中的是默认APN

+        target.predeterminedCfg = ko.observable(true); //当前选中的是预置的APN

+		

+        target.selectedAuthentication = ko.observable(apnSettings.authMode);

+        target.selectedAuthenticationV6 = ko.observable(apnSettings.authModeV6);

+

+

+        target.transApnV6 = ko.observable('apn');

+        target.transDnsModeV6 = ko.observable('apn_dns_mode');

+        target.transDns1V6 = ko.observable('apn_dns1');

+        target.transDns2V6 = ko.observable('apn_dns2');

+        target.transAuthV6 = ko.observable('apn_authentication');

+        target.transUserNameV6 = ko.observable('apn_user_name');

+        target.transPasswordV6 = ko.observable('apn_password');

+		

+        target.transApn = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_ipv4_apn' : 'apn');

+        target.transDnsMode = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_dns_mode_ipv4' : 'apn_dns_mode');

+        target.transDns1 = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_dns1_ipv4' : 'apn_dns1');

+        target.transDns2 = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_dns2_ipv4' : 'apn_dns2');

+        target.transAuth = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_authentication_ipv4' : 'apn_authentication');

+        target.transUserName = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_user_name_ipv4' : 'apn_user_name');

+        target.transPassword = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_password_ipv4' : 'apn_password');

+

+        target.setDefaultVisible = ko.observable(!isConnectedNetWork());

+

+        target.tmp1 = ko.computed(function () {

+             if (target.selectedPdpType() == "IPv6") {

+                target.transApnV6('apn');

+                target.transDnsModeV6('apn_dns_mode');

+                target.transDns1V6('apn_dns1');

+                target.transDns2V6('apn_dns2');

+                target.transAuthV6('apn_authentication');

+                target.transUserNameV6('apn_user_name');

+                target.transPasswordV6('apn_password');

+            } else if (config.IPV4_AND_V6_SUPPORT && target.selectedPdpType() == 'IPv4v6') {

+                target.transApn('apn_ipv4_apn');

+                target.transDnsMode('apn_dns_mode_ipv4');

+                target.transDns1('apn_dns1_ipv4');

+                target.transDns2('apn_dns2_ipv4');

+                target.transAuth('apn_authentication_ipv4');

+                target.transUserName('apn_user_name_ipv4');

+                target.transPassword('apn_password_ipv4');

+

+                target.transApnV6('apn_ipv6_apn');

+                target.transDnsModeV6('apn_dns_mode_ipv6');

+                target.transDns1V6('apn_dns1_ipv6');

+                target.transDns2V6('apn_dns2_ipv6');

+                target.transAuthV6('apn_authentication_ipv6');

+                target.transUserNameV6('apn_user_name_ipv6');

+                target.transPasswordV6('apn_password_ipv6');

+            } else if (target.selectedPdpType() == "IP" || target.selectedPdpType() == "IPv4") {

+                target.transApn('apn');

+                target.transDnsMode('apn_dns_mode');

+                target.transDns1('apn_dns1');

+                target.transDns2('apn_dns2');

+                target.transAuth('apn_authentication');

+                target.transUserName('apn_user_name');

+                target.transPassword('apn_password');

+            } else { //config.IPV4V6_SUPPORT && target.selectedPdpType() == 'IPv4v6'

+                target.transApn('apn');

+                target.transDnsMode('apn_dns_mode');

+                target.transDns1('apn_dns1');

+                target.transDns2('apn_dns2');

+                target.transAuth('apn_authentication');

+                target.transUserName('apn_user_name');

+                target.transPassword('apn_password');

+            }

+            $("#apn_setting_form").translate();

+        });

+

+        target.autoApnChecked = ko.computed(function () {

+            return target.apnMode() == "auto";

+        });

+		

+        target.hasCapacity = ko.computed(function () {

+            if (target.profiles().length < config.maxApnNumber) {

+                return true;

+            } else {

+                return false;

+            }

+        });

+

+        target.showDnsV6 = ko.computed(function () {

+            return target.dnsModeV6() == "manual";

+        });

+		

+        target.showDns = ko.computed(function () {

+            return target.dnsMode() == "manual";

+        });

+

+

+        checkDefaultProfileStatus();

+        target.checkInputDisable = ko.computed(function () {

+            if (target.apnMode() != "auto"  && (target.predeterminedCfg() == false && target.defaultCfg() == true) && !isConnectedNetWork()) {

+                return false;

+            }

+            if (((target.apnMode() != "auto" && (target.predeterminedCfg() || target.defaultCfg()) && !target.disableProfile())) || target.apnMode() == "auto") {

+                return true;

+            }

+            if ((!target.disableProfile() || !(target.predeterminedCfg() || target.defaultCfg())) && target.apnMode() != "auto") {

+                return false;

+            }

+            return false;

+        });

+

+        var data = service.getDeviceInfo();

+        target.pdpTypeChangeAlert = pdpTypeChangeAlertFunc;

+		

+

+        target.showAutoApnDetail = ko.computed(function () {

+            if (target.apnMode() != "auto") {

+                return true;

+            } else {

+                return target.autoProfiles().length > 0;

+            }

+        });

+		//密码显示事件

+        target.showPasswordHandler = function () {

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+		//auto apn profile change 事件处理

+         

+        target.autoProfileChangeHandler = autoProfileChangeHandlerFunc;

+		

+		

+        //profile change 事件处理

+         

+        target.profileChangeHandler = profileChangeHandlerFunc;

+		

+        

+        //切换profile时重置下面的显示项

+        target.setUIData = setUIDataFunc;

+		

+

+        //设置默认apn状态

+         

+        function checkDefaultProfileStatus() {

+            var index = getApnIndex();

+            //默认apn不允许编辑

+            if (target.apnMode() != "auto") { //当前选中与实际不一致的话

+                if (target.selectedProfile() != target.defApn()) {

+                    target.defaultCfg(false);

+                } else {

+                    target.defaultCfg(true); //默认APN

+                }

+            } else {

+                if (target.selectedAutoProfile() != target.defApn()) {

+                    target.defaultCfg(false);

+                } else {

+                    target.defaultCfg(true); //默认APN

+                }

+            }

+

+            if (index >= config.defaultApnSize) {

+                target.predeterminedCfg(false);

+            } else {

+                target.predeterminedCfg(true); //预置APN

+            }

+        }

+

+

+        //设置为默认apn

+         

+        target.setDefaultAct = setDefaultActFunc;

+		

+

+		

+        //APN mode change 事件处理

+         

+        target.apnModeChangeHandler = apnModeChangeHandlerFunc;

+		

+		

+        function doSetDefaultAct() {

+            var index = 0;

+            if (target.apnMode() != 'auto') {

+                index = getApnIndex();

+                target.selectedProfile($("#profile").val());

+            } else {

+                index = getAutoApnIndex();

+                target.selectedAutoProfile($("#autoProfile").val());

+            }

+            var selectedProfileDetail = target.getSelectedManualProfile();

+            service.setDefaultApn({

+                index: index,

+                apnMode: target.apnMode(),

+                pdpType: selectedProfileDetail.pdpType,

+

+                profileName: selectedProfileDetail.profileName,

+                wanApn: selectedProfileDetail.wanApn,

+                authMode: selectedProfileDetail.authMode,

+                username: selectedProfileDetail.username,

+                password: selectedProfileDetail.password,

+                dnsMode: config.SHOW_APN_DNS ? selectedProfileDetail.dnsMode : 'auto',

+                dns1: config.SHOW_APN_DNS ? selectedProfileDetail.dns1 : '',

+                dns2: config.SHOW_APN_DNS ? selectedProfileDetail.dns2 : ''

+            }, function (data) {

+                if (data.result) {

+                    //showLoading("apn_alert_restart");

+                    //restartDevice(service);

+                    addTimeout(function () {

+                        initialize(true);

+                        target.apnModeChangeHandler();

+                        successOverlay();

+                    }, 500);

+                } else {

+                    errorOverlay();

+                }

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+

+        target.getSelectedManualProfile = getSelectedManualProfileFunc;

+		

+

+        //获取自动apn索引

+         

+        function getAutoApnIndex() {

+            var configs = $("#autoProfile option");

+            for (var ki = 0; ki < configs.length; ki++) {

+                if (configs[ki].value == target.selectedAutoProfile()) {

+                    return ki;

+                }

+            }

+            return configs.length - 1;

+        }

+		

+		//获取apn索引

+         

+        function getApnIndex() {

+            var configs = $("#profile option");

+            if (configs.length == 0) {

+                configs = target.profiles();

+            }

+            var ki = 0;

+            for (; ki < configs.length; ki++) {

+                if (configs[ki].value == target.selectedProfile()) {

+                    break;

+                }

+            }

+            return ki;

+        }

+

+        //保存APN设置信息

+         

+        target.saveAct = saveActFunc;

+		

+		//编辑APN信息

+         

+        function editApnSetting(preAct) { //默认设置按钮触发为TRUE

+            showLoading();

+            var apnIndex = getApnIndex();

+            var sameInfo = false;

+            if (config.IPV4V6_SUPPORT && target.selectedPdpType() == 'IPv4v6') {

+                sameInfo = true;

+            }

+            var needDoDefault = false;

+            if (preAct || (target.predeterminedCfg() || target.defaultCfg())) {

+                needDoDefault = true;

+            }

+            service.addOrEditApn({

+                profileName: target.profileName(),

+                pdpType: target.selectedPdpType(),

+                index: apnIndex,

+

+                wanApn: target.apn(),

+                authMode: target.selectedAuthentication(),

+                username: target.username(),

+                password: target.password(),

+                dnsMode: config.SHOW_APN_DNS ? target.dnsMode() : 'auto',

+                dns1: config.SHOW_APN_DNS ? target.dns1() : '',

+                dns2: config.SHOW_APN_DNS ? target.dns2() : '',

+

+                wanApnV6: sameInfo ? target.apn() : target.apnV6(),

+                authModeV6: sameInfo ? target.selectedAuthentication() : target.selectedAuthenticationV6(),

+                usernameV6: sameInfo ? target.username() : target.usernameV6(),

+                passwordV6: sameInfo ? target.password() : target.passwordV6(),

+                dnsModeV6: config.SHOW_APN_DNS ? (sameInfo ? target.dnsMode() : target.dnsModeV6()) : 'auto',

+                dns1V6: config.SHOW_APN_DNS ? (sameInfo ? target.dns1() : target.dns1V6()) : '',

+                dns2V6: config.SHOW_APN_DNS ? (sameInfo ? target.dns2() : target.dns2V6()) : ''

+            }, function (data) {

+                if (data.result) {

+                    apnSettings = getApnSet();

+                    if (target.profileName() != target.selectedProfile()) {

+                        var newProfileName = target.profileName();

+                        target.profiles(getProfileOptions(apnSettings.apnConfigs));

+                        $('#profile').val(newProfileName).trigger('change');

+                    }

+                    if (needDoDefault == false) {

+                        successOverlay();

+                    } else {

+                        doSetDefaultAct();

+                    }

+                } else {

+                    errorOverlay();

+                }

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+		

+        //新增APN信息

+         

+        function addNewApnSetting() {

+            showLoading("waiting");

+            var optionLen = $("option", "#profile").length;

+            if (optionLen < config.defaultApnSize) {

+                errorOverlay();

+                return;

+            }

+            // 支持IPv4v6,并且选择IPv4v6时,IPv4 与 IPv6下发相同的信息

+            // 支持IPv4 & v6,并且选择IPv4v6时,IPv4 与 IPv6下发各自的信息

+            var sameInfo = false;

+            if (config.IPV4V6_SUPPORT && target.selectedPdpType() == 'IPv4v6') {

+                sameInfo = true;

+            }

+

+            service.addOrEditApn({

+                profileName: target.profileName(),

+                pdpType: target.selectedPdpType(),

+                index: optionLen,

+

+                wanApn: target.apn(),

+                authMode: target.selectedAuthentication(),

+                username: target.username(),

+                password: target.password(),

+                dnsMode: config.SHOW_APN_DNS ? target.dnsMode() : 'auto',

+                dns1: config.SHOW_APN_DNS ? target.dns1() : '',

+                dns2: config.SHOW_APN_DNS ? target.dns2() : '',

+

+                wanApnV6: sameInfo ? target.apn() : target.apnV6(),

+                authModeV6: sameInfo ? target.selectedAuthentication() : target.selectedAuthenticationV6(),

+                usernameV6: sameInfo ? target.username() : target.usernameV6(),

+                passwordV6: sameInfo ? target.password() : target.passwordV6(),

+                dnsModeV6: config.SHOW_APN_DNS ? (sameInfo ? target.dnsMode() : target.dnsModeV6()) : 'auto',

+                dns1V6: config.SHOW_APN_DNS ? (sameInfo ? target.dns1() : target.dns1V6()) : '',

+                dns2V6: config.SHOW_APN_DNS ? (sameInfo ? target.dns2() : target.dns2V6()) : ''

+            }, function (data) {

+                if (data.result) {

+                    apnSettings = getApnSet();

+                    if (target.profileName() != target.selectedProfile()) {

+                        var newProfileName = target.profileName();

+                        target.profiles(getProfileOptions(apnSettings.apnConfigs));

+                        $('#profile').val(newProfileName).trigger('change');

+                    }

+                    doSetDefaultAct();

+                } else {

+                    errorOverlay();

+                }

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+

+        

+

+        var tempApn = {};

+		//删除APN

+         

+        target.deleteAct = deleteActFunc;

+		

+		//取消新增APN

+         

+        target.cancelAddAct = cancelAddActFunc;

+		

+        //进入新增APN页面

+         

+        target.addAct = addActFunc;

+		//进入新增APN页面

+		function addActFunc() {

+            clearValidateMsg('#apn_setting_form');

+            target.pdpTypeNote(true);

+            target.disableProfile(true);

+            target.addApnHide(true);

+            tempApn = {

+                profileName: target.profileName(),

+                selectedPdpType: target.selectedPdpType(),

+

+                wanApnV6: target.apnV6(),

+                dnsModeV6: config.SHOW_APN_DNS ? target.dnsModeV6() : 'auto',

+                dns1V6: config.SHOW_APN_DNS ? target.dns1V6() : '',

+                dns2V6: config.SHOW_APN_DNS ? target.dns2V6() : '',

+                authModeV6: target.selectedAuthenticationV6(),

+                usernameV6: target.usernameV6(),

+                passwordV6: target.passwordV6(),

+				

+                wanApn: target.apn(),

+                dnsMode: config.SHOW_APN_DNS ? target.dnsMode() : 'auto',

+                dns1: config.SHOW_APN_DNS ? target.dns1() : '',

+                dns2: config.SHOW_APN_DNS ? target.dns2() : '',

+                authMode: target.selectedAuthentication(),

+                username: target.username(),

+                password: target.password(),

+

+            };

+            target.profileName("");

+            target.selectedPdpType("IP");

+            target.selectedPdpTypeTmp("IP");

+

+            target.apnV6("");

+            target.dnsModeV6("auto");

+            target.dns1V6("");

+            target.dns2V6("");

+            target.selectedAuthenticationV6("none");

+            target.usernameV6("");

+            target.passwordV6("");

+			

+            target.apn("");

+            target.dnsMode("auto");

+            target.dns1("");

+            target.dns2("");

+            target.selectedAuthentication("none");

+            target.username("");

+            target.password("");

+

+        }

+		

+		//取消新增APN

+		function cancelAddActFunc() {

+            clearValidateMsg('#apn_setting_form');

+            target.pdpTypeNote(false);

+            target.disableProfile(false);

+            target.addApnHide(false);

+            target.profileName(tempApn.profileName);

+            target.selectedPdpType(tempApn.selectedPdpType);

+            target.selectedPdpTypeTmp(tempApn.selectedPdpType);

+

+            target.apnV6(tempApn.wanApnV6);

+            target.dnsModeV6(tempApn.dnsModeV6);

+            target.dns1V6(tempApn.dns1V6);

+            target.dns2V6(tempApn.dns2V6);

+            target.selectedAuthenticationV6(tempApn.authModeV6);

+            target.usernameV6(tempApn.usernameV6);

+            target.passwordV6(tempApn.passwordV6);

+			

+            target.apn(tempApn.wanApn);

+            target.dnsMode(tempApn.dnsMode);

+            target.dns1(tempApn.dns1);

+            target.dns2(tempApn.dns2);

+            target.selectedAuthentication(tempApn.authMode);

+            target.username(tempApn.username);

+            target.password(tempApn.password);

+

+        }

+		

+		//删除APN

+		function deleteActFunc() {

+            if (!target.selectedProfile()) {

+                showAlert("apn_no_select_alert");

+                return false;

+            }

+            if (target.predeterminedCfg()) { //预置的apn不允许删除

+                errorOverlay("apn_delete_cant_delete_default");

+                return false;

+            }

+            if (getApnSet().profileName == target.profileName()) {

+                errorOverlay("apn_cant_delete_current");

+                return false;

+            }

+

+            showConfirm("apn_delete_confirm", function () {

+                showLoading('deleting');

+                service.deleteApn({

+                    index: getApnIndex()

+                }, function (data) {

+                    if (data.result) {

+                        target.profiles(getProfileOptions(getApnSet().apnConfigs));

+                        target.selectedProfile(target.defApn());

+                        target.profileChangeHandler();

+                        successOverlay();

+                    } else {

+                        errorOverlay();

+                    }

+                }, function (data) {

+                    errorOverlay();

+                });

+            });

+        }

+		

+		//保存APN设置信息

+		function saveActFunc() {

+            if (!$('#apn_setting_form').valid()) {

+                return false;

+            }

+            if (!target.selectedProfile() && !target.disableProfile()) { //不是增加时的设置需要判断是否选择了Profile

+                showAlert("apn_no_select_alert");

+                return false;

+            }

+            var exist = false;

+            $.each(target.profiles(), function (i, e) {

+                if (e.value == target.profileName()) {

+                    exist = true;

+                }

+            });

+

+            if (target.disableProfile() == false) {

+                if (exist && target.selectedProfile() != target.profileName()) {

+                    showInfo("apn_save_profile_exist");

+                    return false;

+                }

+                if (target.predeterminedCfg()) { //预置的APN不可以修改

+                    errorOverlay();

+                    return false;

+                }

+                if (target.predeterminedCfg() || target.defaultCfg()) {

+                    //showConfirm("apn_alert", function () {

+                    editApnSetting(false);

+                    //});

+                } else {

+                    editApnSetting(false);

+                }

+            } else {

+				

+                if ($("#profile option").length >= config.maxApnNumber) {

+                    showInfo({

+                        msg: "apn_profile_full",

+                        params: [config.maxApnNumber]

+                    });

+                    return false;

+                }

+                if (exist) {

+                    showInfo("apn_save_profile_exist");

+                    return false;

+                }

+                var info = service.getStatusInfo();

+                if (info.connectStatus != "ppp_connected") {

+                    //showConfirm("apn_alert", function () {

+                    addNewApnSetting();

+                    //});

+                    

+                } else {

+					showConfirm("apn_diconneted_network_confirm", function () {

+                        showLoading('disconnecting');

+                        service.disconnect({}, function (data) {

+                            if (data.result) {

+                                config.connect_flag = true;

+                                addNewApnSetting();

+                            } else {

+                                errorOverlay();

+                            }

+                        });

+                    });

+                }

+            }

+        }

+		

+		function getSelectedManualProfileFunc() {

+            var cfg = {};

+            var profileVal = $("#profile").val();

+            if (typeof target.selectedProfile() == 'undefined') {

+                target.selectedProfile(profileVal);

+            }

+            var cfgV4 = apnConfigs[profileVal];

+            var cfgV6 = ipv6ApnConfigs[profileVal];

+            if (cfgV4 && !cfgV6) {

+                $.extend(cfg, cfgV4);

+            } else if (cfgV4 && cfgV6) {

+                if (!!cfgV4.pdpType) {

+                    $.extend(cfg, cfgV6);

+                    $.extend(cfg, cfgV4);

+                } else {

+                    $.extend(cfg, cfgV4);

+                    $.extend(cfg, cfgV6);

+                }

+            }

+            return cfg;

+        }

+		

+		//APN mode change 事件处理

+		function apnModeChangeHandlerFunc(data, event) {

+            if (target.apnMode() != 'auto') {

+                target.profileChangeHandler();

+            } else {

+                if (target.showAutoApnDetail()) {

+                    target.autoProfileChangeHandler();

+                }

+            }

+            return true;

+        }

+		

+		//设置为默认apn

+		function setDefaultActFunc() {

+            if (!target.selectedProfile()) {

+                showAlert("apn_no_select_alert");

+                return false;

+            }

+            var connectStatus = service.getConnectionInfo().connectStatus;

+             if (connectStatus == "ppp_connecting") {

+                showAlert({

+                    msg: "apn_cant_modify_status",

+                    params: [$.i18n.prop("connecting").toLowerCase()]

+                });

+                return false;

+            } else if (connectStatus == "ppp_disconnecting") {

+                showAlert({

+                    msg: "apn_cant_modify_status",

+                    params: [$.i18n.prop("disconnecting").toLowerCase()]

+                });

+                return false;

+            } else if (connectStatus == "ppp_connected") {

+                showAlert({

+                    msg: "apn_cant_modify_status",

+                    params: [$.i18n.prop("connected").toLowerCase()]

+                });

+                return false;

+            }

+            if (target.apnMode() == 'auto' || target.predeterminedCfg()) {

+                //showConfirm("apn_alert", function () {

+                showLoading("waiting");

+                doSetDefaultAct();

+                //});

+            } else {

+                if ($('#apn_setting_form').valid() == false) {

+                    $(".error:first", "#apn_setting_form").focus();                    

+                } else {

+					var exist = false;

+                    $.each(target.profiles(), function (i, e) {

+                        if (e.value == target.profileName()) {

+                            exist = true;

+                        }

+                    });

+                    if (exist && target.selectedProfile() != target.profileName()) {

+                        showInfo("apn_save_profile_exist");

+                        return false;

+                    }

+                    //showLoading("waiting");

+                    //showConfirm("apn_alert", function () {

+                    editApnSetting(true);

+                    //});

+                }

+            }

+        }

+		

+		//切换profile时重置下面的显示项

+		function setUIDataFunc(data) {

+            clearValidateMsg('#apn_setting_form');

+            if (!data) {

+                return;

+            }

+            target.selectedPdpType(data.pdpType || 'IP');

+            target.selectedPdpTypeTmp(data.pdpType || 'IP');

+            target.profileName(data.profileName);

+

+            target.apn(data.wanApn);

+            target.dnsMode(data.dnsMode != 'manual' ? 'auto' : 'manual');

+            target.dns1(data.dns1);

+            target.dns2(data.dns2);

+            target.username(data.username);

+            target.password(data.password);

+            target.selectedAuthentication(data.authMode || 'none');

+

+            target.apnV6(data.wanApnV6);

+            target.dnsModeV6(data.dnsModeV6 != 'manual' ? 'auto' : 'manual');

+            target.dns1V6(data.dns1V6);

+            target.dns2V6(data.dns2V6);

+            target.usernameV6(data.usernameV6);

+            target.passwordV6(data.passwordV6);

+            target.selectedAuthenticationV6(data.authModeV6 || 'none');

+        }

+		

+		//profile change 事件处理

+		function profileChangeHandlerFunc(data, event) {

+            target.pdpTypeNote(true);

+            if (target.apnMode() != 'manual') {

+                return true;

+            }

+            var cfg = target.getSelectedManualProfile();

+            target.setUIData(cfg);

+            checkDefaultProfileStatus();

+            return true;

+        }

+		

+		//auto apn profile change 事件处理

+		function autoProfileChangeHandlerFunc(data, event) {

+            if (target.apnMode() != 'auto') {

+                return true;

+            }

+            var cfg = autoApnConfigs[target.selectedAutoProfile()];

+            target.setUIData(cfg);

+            checkDefaultProfileStatus();

+            return true;

+        }

+		

+		function pdpTypeChangeAlertFunc() {

+            if (target.pdpTypeNote()) {

+                showAlert({

+                    msg: "apn_pdptype_change_note",

+                    params: [data.lanDomain, data.ipAddress]

+                });

+            }

+            if (target.apnMode() != "auto" && !target.disableProfile()) { //如果是手动非ADD状态,切换PDP类型时,不改变界面显示的各项值

+                if ((config.IPV4_AND_V6_SUPPORT && target.selectedPdpTypeTmp() != 'IPv4v6' && target.selectedPdpType() != 'IPv4v6') || !config.IPV4_AND_V6_SUPPORT) { //

+                    if (target.selectedPdpTypeTmp() == 'IPv6') { //V6 -> V4 / V4V6

+                        target.apn(target.apnV6());

+                        target.dnsMode(target.dnsModeV6());

+                        target.dns1(target.dns1V6());

+                        target.dns2(target.dns2V6());

+                        target.username(target.usernameV6());

+                        target.password(target.passwordV6());

+                        target.selectedAuthentication(target.selectedAuthenticationV6());

+                    } else if (target.selectedPdpType() == 'IPv6') { //V4 / V4V6 -> V6

+                        target.apnV6(target.apn());

+                        target.dnsModeV6(target.dnsMode());

+                        target.dns1V6(target.dns1());

+                        target.dns2V6(target.dns2());

+                        target.usernameV6(target.username());

+                        target.passwordV6(target.password());

+                        target.selectedAuthenticationV6(target.selectedAuthentication());

+                    }

+                }

+            }

+            target.selectedPdpTypeTmp(target.selectedPdpType());

+        }

+       

+

+    }

+

+    //是否已联网

+     

+    function isConnectedNetWork() {

+        var info = service.getConnectionInfo();

+        return info.connectStatus == "ppp_connected";

+    }

+

+    function initVar() {

+        apnConfigs = {};

+        ipv6ApnConfigs = {};

+        autoApnConfigs = {};

+    }

+	function bindContainer(vm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+	}

+    //初始化ViewModel

+     

+    function initialize(formInit) {

+        initVar();

+        

+        var vm = new APNViewModel();

+		bindContainer(vm);

+

+        if (!formInit) {

+            addInterval(function () {

+                vm.setDefaultVisible(!isConnectedNetWork());

+            }, 1000);

+        }

+        $('#apn_setting_form').validate({

+            submitHandler: function () {

+                vm.saveAct();

+            },

+            rules: {

+                profile_name: 'apn_profile_name_check',

+                apn_ipv4_apn: 'apn_check',

+                apn_dns1_ipv4: "ipv4",

+                apn_dns2_ipv4: "ipv4",

+                apn_ipv6_apn: 'apn_check',

+                apn_dns1_ipv6: "ipv6",

+                apn_dns2_ipv6: "ipv6",

+                apn_user_name_ipv4: 'ppp_username_check',

+                apn_secretcode_ipv4: 'ppp_secretcode_check',

+                apn_user_name_ipv6: 'ppp_username_check',

+                apn_secretcode_ipv6: 'ppp_secretcode_check'

+            }

+        });

+    }

+

+    return {

+        init: initialize

+    };

+});
\ No newline at end of file
diff --git a/lynq/S300/ap/app/zte_webui/js/set.js b/lynq/S300/ap/app/zte_webui/js/set.js
new file mode 100755
index 0000000..f2dc0cc
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/set.js
@@ -0,0 +1,959 @@
+define(function () {

+    var config = {

+        WEBUI_TITLE: '4G Hostless Modem', //title配置, 具体参考各设备下的配置

+        ALREADY_NOTICE: false, //是否已经提醒,有在线升级信息

+        ALREADY_OTA_NOTICE: false, //是否OTA升级提醒过

+        dbMsgs: [], //数据库中全部的短消息

+        listMsgs: [], //经解析关联后的所有短消息

+        currentChatObject: null, //当前聊天对象的手机号

+        smsMaxId: 0, //短消息最大编号

+        phonebook: [], //电话本记录

+        smsIsReady: false, //缓存短信初始化状态

+        portForwardMax: 10, //端口转发最大规则数

+        urlFilterMax: 10, //URL filter最大规则数

+        defaultApnSize: 1, //出厂设置默认APN的个数

+        maxApnNumber: 10, //最大APN个数

+        RJ45_SUPPORT: false, //是否支持rj45

+        TSW_SUPPORT: false, // 是否支持定时休眠唤醒

+        WIFI_SLEEP_SUPPORT: true, // 是否支持wifi休眠

+        HAS_BATTERY: true, //是否有电池

+        FAST_BOOT_SUPPORT: true, //是否支持快速开机

+        TURN_OFF_SUPPORT: true, //是否支持关机

+        PRODUCT_TYPE: 'UFI', // 产品类型UFI、CPE

+        IS_TEST: false, //配置是否是模拟数据

+        NATIVE_UPDATE_FILE_SIZE: 64, //支持的本地升级文件大小上限,单位为M

+        DDNS_SUPPORT: false, //DDNS

+        MAX_LOGIN_COUNT: 5, //最大登录次数,密码输入错误次数到了以后会账户冻结一定时间

+        LOGIN_SECURITY_SUPPORT: true, //是否支持登录安全

+        LOGIN_THEN_CHECK_PIN: true, //是否先登录后验证PIN,PUK

+        GUEST_HASH: ['#httpshare_guest'],

+        DEVICE: 'ext', //各个型号机配置文件路径

+        connect_flag: false,

+        defaultRoute: '#entry',

+        IPV4_AND_V6_SUPPORT: false, //是否支持IPv4 & v6。 双PDP双栈

+        IPV4V6_SUPPORT: true, //是否支持ipv4v6。 IPV4V6_SUPPORT和IPV4_AND_V6_SUPPORT不可同时为true.单PDP双栈

+        IPV6_SUPPORT: true, //是否支持ipv6

+        EMPTY_APN_SUPPORT: false, //是否支持空apn

+        SHOW_APN_DNS: false, //APN设置页面是否显示DNS,不显示则dnsMode默认设置为auto

+        TRAFFIC_SUPPORT: true, //是否支持流量功能

+        CLEAR_DATA_SUPPORT: false, //是否支持流量和时间清空功能

+        NETWORK_UNLOCK_SUPPORT: false, //是否支持解锁

+        SHOW_MAC_ADDRESS: false, //是否显示mac地址

+        PASSWORD_ENCODE: true, //登录密码和WIFI密码是否加密

+        AP_STATION_SUPPORT: false, //是否支持AP Station功能

+        AP_STATION_LIST_LENGTH: 10,

+        WIFI_WEP_SUPPORT: false, //是否支持wifi WEP加密

+        WIFI_WAP3_SUPPORT: true, //是否支持wifi WAP3加密

+        WIFI_WPA2_WAP3_SUPPORT: true, //是否支持wifi WPA2/WAP3兼容模式

+        WIFI_HAS_5G: false,

+        WIFI_BAND_SUPPORT: false, //是否支持wifi频段设置

+        WIFI_BANDWIDTH_SUPPORT: false, //是否支持频带宽度

+        WIFI_BANDWIDTH_SUPPORT_40MHZ: false, //频带宽度是否支持40MHZ,reltek芯片支持

+        WIFI_SUPPORT_QR_CODE: true, //是否支持wifi二维码显示

+        WIFI_SUPPORT_QR_SWITCH: false, //是否支持wifi二维码显示控制

+        WIFI_SWITCH_SUPPORT: true, //是否支持wifi开关

+        MAX_STATION_NUMBER: 32, //CPE WIFI最大连接数为32

+        SHOW_WIFI_AP_ISOLATED: false, // 是否显示AP隔离

+        STATION_BLOCK_SUPPORT: false, // 已连接设备是否支持Block功能

+        UPGRADE_TYPE: "FOTA", //取值有"NONE","OTA","FOTA","TWO_PORTION"

+        SMS_UNREAD_NUM_INCLUDE_SIM: false, //未读短息数量是否包含SIM侧

+        SMS_DATABASE_SORT_SUPPORT: true, //短信是否支持DB排序

+        SMS_MATCH_LENGTH: 11, //短信联系人号码匹配位数,11国内项目,8国际项目

+        SHOW_UN_COMPLETE_CONCAT_SMS: true, //级联短信未接收完是否显示相关级联短信

+        SMS_SET_READ_WHEN_COMPLETE: false, //聊天过程中,级联短信只有接受完成后才能自动设置为已读

+        SD_CARD_SUPPORT: false, //是否支持SD卡

+        SD_BASE_PATH: '/mmc2', //SD 卡根目录

+        //modem_main_state的临时状态,一般需要界面轮询等待

+        TEMPORARY_MODEM_MAIN_STATE: ["modem_undetected", "modem_detected", "modem_sim_state", "modem_handover", "modem_imsi_lock", "modem_online", "modem_offline"],

+        ISNOW_NOTICE: false, //FOTA是否正在提示有新版本

+        INCLUDE_MOBILE: true,

+        HAS_USSD: false, // 是否支持USSD功能,

+        HAS_URL: false, // 是否支持URL过滤,

+        HAS_CASCADE_SMS: true, //是否支持级联短信

+        HAS_FOTA: true, //是否支持FOTA

+        HAS_UPDATE_CHECK: true, //是否支持升级检测设置

+        HAS_PHONEBOOK: true, //是否有电话本功能

+        HAS_SMS: true, //是否有短信功能

+        HAS_PARENTAL_CONTROL: false, // 是否支持家长控制功能

+        HAS_MULTI_SSID: false, //多ssid功能

+        HAS_WIFI: true, //是否包含wifi功能

+        HAS_QUICK_SETTING: true, //是否支持快速设置

+        HAS_SNTP: true, //是否支持时间管理

+        HAS_BLACK_AND_WHITE_FILTER: false, //是否支持黑白名单

+        HAS_LOGIN: true, //是否有登录页面

+        HAS_UPNP: true, //是否支持UPNP

+        BAUD_RATES: [{

+                name: '9600',

+                value: '9600'

+            }, {

+                name: '19200',

+                value: '19200'

+            }, {

+                name: '38400',

+                value: '38400'

+            }, {

+                name: '57600',

+                value: '57600'

+            }, {

+                name: '115200',

+                value: '115200'

+            }, {

+                name: '230400',

+                value: '230400'

+            }, {

+                name: '460800',

+                value: '460800'

+            }, {

+                name: '921600',

+                value: '921600'

+            }

+        ],

+        FORWARDING_MODES: [{

+                name: 'Unconditional forwarding',

+                value: '1'

+            }, {

+                name: 'When busy',

+                value: '2'

+            }, {

+                name: 'When no answer',

+                value: '3'

+            }, {

+                name: 'Cancel all forwarding',

+                value: '0'

+            }

+        ],

+        wdsModes: [{

+                name: "Disable",

+                value: "0"

+            }, {

+                name: "RootAP Mode",

+                value: "1"

+            }, {

+                name: "Bridge Mode",

+                value: "2"

+            }, {

+                name: "Repeater Mode",

+                value: "3"

+            }

+        ],

+        daylightSave: [{

+                name: "Disable",

+                value: "0"

+            }, {

+                name: "Enable",

+                value: "1"

+            }

+        ],

+        sntpTimeSetMode: [{

+                name: 'manual',

+                value: 'manual'

+            }, {

+                name: 'auto',

+                value: 'auto'

+            }

+        ],

+        //时区

+        timeZone: [{

+                name: "(GMT-12:00) Dateline West",

+                value: "<-12>12_0"

+            }, {

+                name: "(GMT-11:00) Midway Islands, Samoa",

+                value: "SST11_0"

+            }, {

+                name: "(GMT-10:00) Hawaii",

+                value: "<-10>10_0"

+            }, {

+                name: "(GMT-09:00) Alaska",

+                value: "<-09>9_0"

+            }, {

+                name: "(GMT-08:00) Pacific time (USA and Canada), Tijuana",

+                value: "PST8PDT,M3.2.0,M11.1.0_0"

+            }, {

+                name: "(GMT-07:00) Mountain time (USA and Canada)",

+                value: "<-07>7_0"

+            }, {

+                name: "(GMT-07:00) Arizona",

+                value: "<-07>7_1"

+            }, {

+                name: "(GMT-07:00) Chihuahua, La Paz, Mazza Tran",

+                value: "MST7MDT,M4.1.0,M10.5.0_2"

+            }, {

+                name: "(GMT-06:00) Saskatchewan",

+                value: "<-06>6_0"

+            }, {

+                name: "(GMT-06:00) Central time (USA and Canada)",

+                value: "<-06>6_1"

+            }, {

+                name: "(GMT-06:00) Central America",

+                value: "<-06>6_2"

+            }, {

+                name: "(GMT-06:00) Guadalajara City, Mexico City, Monterey",

+                value: "<-06>6_3"

+            }, {

+                name: "(GMT-05:00) Bogota, Lima, Quito",

+                value: "<-05>5_0"

+            }, {

+                name: "(GMT-05:00) Eastern time (USA and Canada)",

+                value: "<-05>5_1"

+            }, {

+                name: "(GMT-05:00) Indiana (East)",

+                value: "EST5EDT,M3.2.0,M11.1.0_2"

+            }, {

+                name: "(GMT-04:00) Atlantic time (Canada)",

+                value: "AST4ADT,M3.2.0,M11.1.0_0"

+            }, {

+                name: "(GMT-04:00) Caracas, La Paz",

+                value: "<-04>4_1"

+            }, {

+                name: "(GMT-04:00) Santiago",

+                value: "<-04>4<-03>,M8.2.6/24,M5.2.6/24_2"

+            }, {

+                name: "(GMT-03:30) Newfoundland",

+                value: "NST3:30NDT,M3.2.0,M11.1.0_0"

+            }, {

+                name: "(GMT-03:00) Brasilia",

+                value: "<-03>3_0"

+            }, {

+                name: "(GMT-03:00) Buenos Aires, Georgetown",

+                value: "<-03>3_1"

+            }, {

+                name: "(GMT-03:00) Greenland",

+                value: "<-03>3_2"

+            }, {

+                name: "(GMT-02:00) Mid-Atlantic",

+                value: "<-02>2_0"

+            }, {

+                name: "(GMT-01:00) Cape Verde Islands",

+                value: "<-01>1_0"

+            }, {

+                name: "(GMT-01:00) Azores",

+                value: "<-01>1<+00>,M3.5.0/0,M10.5.0/1_1"

+            }, {

+                name: "(GMT) GMT: Dublin, Edinburgh, London, Lisbon",

+                value: "GMT0IST,M3.5.0/1,M10.5.0_0"

+            }, {

+                name: "(GMT) Casablanca, Monrovia",

+                value: "WET0WEST,M3.5.0,M10.5.0/3_1"

+            }, {

+                name: "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",

+                value: "CET-1CEST,M3.5.0,M10.5.0/3_0"

+            }, {

+                name: "(GMT+01:00) Belgrad, Bratislava, Budapest, Ljubljana, Prague",

+                value: "CET-1CEST,M3.5.0,M10.5.0/3_1"

+            }, {

+                name: "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris",

+                value: "CET-1CEST,M3.5.0,M10.5.0/3_2"

+            }, {

+                name: "(GMT+01:00) Sarajevo, Skopje,Warsaw, Zagreb",

+                value: "CET-1CEST,M3.5.0,M10.5.0/3_3"

+            }, {

+                name: "(GMT+01:00) Western Central African",

+                value: "<+01>-1_4"

+            }, {

+                name: "(GMT+02:00) Bucharest",

+                value: "EET-2EEST,M3.5.0/3,M10.5.0/4_0"

+            }, {

+                name: "(GMT+02:00) Pretoria, Harare",

+                value: "CAT-2_1"

+            }, {

+                name: "(GMT+02:00) Helsinki, Kiev, Riga, Sofia, Tallinn, Vilnius",

+                value: "EET-2EEST,M3.5.0/3,M10.5.0/4_2"

+            }, {

+                name: "(GMT+02:00) Cairo",

+                value: "EET-2_3"

+            }, {

+                name: "(GMT+02:00) Athens, Beirut, Istanbul, Minsk",

+                value: "EET-2EEST,M3.5.0/3,M10.5.0/4_4"

+            }, {

+                name: "(GMT+02:00) Jerusalem",

+                value: "IST-2IDT,M3.4.5/02:00:00,M10.5.0/02:00:00_5"

+            }, {

+                name: "(GMT+03:00) Baghdad",

+                value: "<+03>-3_0"

+            }, {

+                name: "(GMT+03:00) Riyadh, Kuwait",

+                value: "<+03>-3_1"

+            }, {

+                name: "(GMT+03:00) Moscow, St Petersburg, Volgograd",

+                value: "<+03>-3_2"

+            }, {

+                name: "(GMT+03:00) Nairobi",

+                value: "EAT-3_3"

+            }, {

+                name: "(GMT+03:30) Teheran",

+                value: "<+0330>-3:30<+0430>,J80/0,J264/0_0"

+            }, {

+                name: "(GMT+04:00) Abu Zabi, Muscat",

+                value: "<+04>-4_0"

+            }, {

+                name: "(GMT+04:00) Baku, Tbilisi, Yerevan",

+                value: "<+04>-4_1"

+            }, {

+                name: "(GMT+04:30) Kabul",

+                value: "<+0430>-4:30_0"

+            }, {

+                name: "(GMT+05:00) Yekaterinburg",

+                value: "<+05>-5_0"

+            }, {

+                name: "(GMT+05:00) Islamabad, Karachi, Tashkent",

+                value: "PKT-5_1"

+            }, {

+                name: "(GMT+05:30) Madras, Calcutta, Mumbai, New Delhi",

+                value: "<+0530>-5:30_0"

+            }, {

+                name: "(GMT+05:45) Kathmandu",

+                value: "<+0545>-5:45_0"

+            }, {

+                name: "(GMT+06:00) Ala Mutu, Novosibirsk",

+                value: "<+06>-6_0"

+            }, {

+                name: "(GMT+06:00) Dhaka, Astana",

+                value: "<+06>-6_1"

+            }, {

+                name: "(GMT+06:00) Sri Haya Ed Denny Pla",

+                value: "<+06>-6_2"

+            }, {

+                name: "(GMT+06:30) Yangon",

+                value: "<+0630>-6:30_0"

+            }, {

+                name: "(GMT+07:00) Krasnoyarsk",

+                value: "<+07>-7_0"

+            }, {

+                name: "(GMT+07:00) Bangkok, Hanoi, Jakarta",

+                value: "<+07>-7_1"

+            }, {

+                name: "(GMT+08:00) Beijing, Chongqing, Hongkong Special Administrative Region, Urumqi",

+                value: "CST-8_0"

+            }, {

+                name: "(GMT+08:00) Kuala Lumpur, Singapore",

+                value: "<+08>-8_1"

+            }, {

+                name: "(GMT+08:00) Perth",

+                value: "AWST-8_2"

+            }, {

+                name: "(GMT+08:00) Taipei",

+                value: "CST-8_3"

+            }, {

+                name: "(GMT+08:00) Irkutsk, Ulam Batu",

+                value: "<+08>-8_4"

+            }, {

+                name: "(GMT+09:00) Osaka, Sapporo, Tokyo",

+                value: "JST-9_0"

+            }, {

+                name: "(GMT+09:00) Seoul",

+                value: "KST-9_1"

+            }, {

+                name: "(GMT+09:00) Yakutsk",

+                value: "<+09>-9_2"

+            }, {

+                name: "(GMT+09:30) Adelaide",

+                value: "ACST-9:30ACDT,M10.1.0,M4.1.0/3_0"

+            }, {

+                name: "(GMT+09:30) Darwin",

+                value: "ACST-9:30_1"

+            }, {

+                name: "(GMT+10:00) Brisbane",

+                value: "AEST-10_0"

+            }, {

+                name: "(GMT+10:00) Vladivostok",

+                value: "<+10>-10_1"

+            }, {

+                name: "(GMT+10:00) Guam, Port Moresby",

+                value: "<+10>-10_2"

+            }, {

+                name: "(GMT+10:00) Hobart",

+                value: "AEST-10AEDT,M10.1.0,M4.1.0/3_3"

+            }, {

+                name: "(GMT+10:00) Canberra, Melbourne, Sydney",

+                value: "AEST-10AEDT,M10.1.0,M4.1.0/3_4"

+            }, {

+                name: "(GMT+11:00) Magadan, Solomon islands, New Caledonia",

+                value: "<+11>-11_0"

+            }, {

+                name: "(GMT+12:00) Wellington, Oakland",

+                value: "<+12>-12_0"

+            }, {

+                name: "(GMT+12:00) Fiji, Kamchatka, Marshall Islands",

+                value: "<+12>-12_1"

+            }, {

+                name: "(GMT+13:00) Nukualofa",

+                value: "<+13>-13_0"

+            }

+        ],

+

+        //短信保存时间

+        SMS_VALIDITY: [{

+                name: '12 hours',

+                value: 'twelve_hours'

+            }, {

+                name: 'A day',

+                value: 'one_day'

+            }, {

+                name: 'A week',

+                value: 'one_week'

+            }, {

+                name: 'The longest period',

+                value: 'largest'

+            }

+        ],

+        MAP_PROTOCOL_MODES: [{

+                name: "TCP+UDP",

+                value: "TCP&UDP"

+            }, {

+                name: "TCP",

+                value: "TCP"

+            }, {

+                name: "UDP",

+                value: "UDP"

+            }

+        ],

+        //端口转发协议

+        FORWARD_PROTOCOL_MODES: [{

+                name: "TCP+UDP",

+                value: "TCP&UDP"

+            }, {

+                name: "TCP",

+                value: "TCP"

+            }, {

+                name: "UDP",

+                value: "UDP"

+            }

+        ],

+        FILTER_PROTOCOL_MODES: [{

+                name: "NONE",

+                value: "None"

+            }, {

+                name: "TCP",

+                value: "TCP"

+            }, {

+                name: "UDP",

+                value: "UDP"

+            }, {

+                name: "ICMP",

+                value: "ICMP"

+            }

+        ],

+

+        //HTTPSHARE模式

+        SD_SHARE_ENABLE: [{

+                name: "Enable",

+                value: "1"

+            }, {

+                name: "Disable",

+                value: "0"

+            }

+        ],

+

+        SD_ACCESS_TYPE: [{

+                name: "entire_sd_card",

+                value: "1"

+            }, {

+                name: "custom_setting",

+                value: "0"

+            }

+        ],

+

+        SD_FILE_TO_SHARE: [{

+                name: "entire_sd_card",

+                value: "1"

+            }, {

+                name: "custom_setting",

+                value: "0"

+            }

+        ],

+

+        //国家码所述类型

+        countryCodeType: {

+            world: 3,

+            mkkc: 3,

+            apld: 7,

+            etsic: 3,

+            fcca: 1

+        },

+

+        countries_5g: {

+            NONE: "NONE",

+            AR: "ARGENTIA",

+            AM: "ՀԱՅԱՍՏԱՆ",

+            AU: "AUSTRILIA",

+            AT: "ÖSTERREICH",

+            AZ: "AZƏRBAYCAN",

+            BH: "البحرين",

+            BY: "БЕЛАРУСЬ",

+            BE: "BELGIË",

+            BA: "БОСНА И ХЕРЦЕГОВИНА",

+            BR: "BRASIL",

+            BN: "BRUNEI DARUSSALAM",

+            BG: "БЪЛГАРИЯ",

+            CL: "CHILE",

+            CN: "中国",

+            CR: "COSTA RICA",

+            HR: "HRVATSKA",

+            CY: "ΚΎΠΡΟΣ",

+            CZ: "ČESKÁ REPUBLIKA",

+            DK: "DANMARK",

+            EC: "ECUADOR",

+            EG: "مصر",

+            SV: "EL SALVADOR",

+            EE: "EESTI",

+            FI: "SUOMI",

+            FR: "FRANCE",

+            GE: "საქართველო",

+            DE: "DEUTSCHLAND",

+            GR: "ΕΛΛΆΔΑ",

+            HK: "香港",

+            HU: "MAGYARORSZÁG",

+            IS: "ÍSLAND",

+            IN: "INDIA",

+            ID: "INDONESIA",

+            IR: "ایران",

+            IE: "ÉIRE",

+            IL: "إسرائيل",

+            IT: "ITALIA",

+            JM: "JAMAICA",

+            JO: "الأردن",

+            KP: "조선민주주의인민공화국",

+            KR: "한국 ROK",

+            LV: "LATVIJA",

+            LI: "LIECHTENSTEIN",

+            LT: "LIETUVA",

+            LU: "LUXEMBOURG",

+            MO: "澳門",

+            MY: "MALAYSIA",

+            MT: "MALTA",

+            MC: "MONACO",

+            NL: "NEDERLAND",

+            AN: "Netherlands Antilles",

+            NO: "NORGE",

+            OM: "سلطنة عمان",

+            PE: "PERÚ",

+            PH: "PHILIPPINES",

+            PL: "POLSKA",

+            PT: "PORTUGAL",

+            SA: "السعودية",

+            SG: "SINGAPORE",

+            SK: "SLOVENSKÁ REPUBLIKA",

+            SI: "SLOVENIJA",

+            ZA: "SOUTH AFRICA",

+            ES: "ESPAÑA",

+            LK: "SRILANKA",

+            SE: "SVERIGE",

+            CH: "SCHWEIZ",

+            TT: "TRINIDAD AND TOBAGO",

+            TN: "تونس",

+            TR: "TÜRKİYE",

+            GB: "UNITED KINGDOM",

+            UY: "URUGUAY",

+            JP: "日本",

+            BZ: "BELIZE",

+            BO: "BOLIVIA",

+            NZ: "NEW ZEALAND",

+            VE: "VENEZUELA",

+            CA: "CANADA",

+            CO: "COLOMBIA",

+            DO: "REPÚBLICA DOMINICANA",

+            GT: "GUATEMALA",

+            MX: "MEXICO",

+            PA: "PANAMÁ",

+            PR: "PUERTO RICO",

+            TW: "台灣",

+            US: "UNITED STATES",

+            UZ: "O’zbekiston"

+        },

+

+        //国家码与语言匹配表

+        countries: {

+            NONE: "NONE",

+            AL: "SHQIPERI",

+            DZ: "الجزائر",

+            AR: "ARGENTIA",

+            AM: "ՀԱՅԱՍՏԱՆ",

+            AU: "AUSTRALIA",

+            AT: "ÖSTERREICH",

+            AZ: "AZƏRBAYCAN",

+            BD: "বাংলাদেশ",

+            BH: "البحرين",

+            BY: "БЕЛАРУСЬ",

+            BE: "BELGIË",

+            BA: "БОСНА И ХЕРЦЕГОВИНА",

+            BR: "BRASIL",

+            BN: "BRUNEI DARUSSALAM",

+            BG: "БЪЛГАРИЯ",

+            CL: "CHILE",

+            CN: "中国",

+            CR: "COSTA RICA",

+            HR: "HRVATSKA",

+            CY: "ΚΎΠΡΟΣ",

+            CZ: "ČESKÁ REPUBLIKA",

+            DK: "DANMARK",

+            EC: "ECUADOR",

+            EG: "مصر",

+            SV: "EL SALVADOR",

+            EE: "EESTI",

+            FI: "SUOMI",

+            FR: "FRANCE",

+            GE: "საქართველო",

+            DE: "DEUTSCHLAND",

+            GR: "ΕΛΛΆΔΑ",

+            HN: "HONDURAS",

+            HK: "香港",

+            HU: "MAGYARORSZÁG",

+            IS: "ÍSLAND",

+            IN: "INDIA",

+            ID: "INDONESIA",

+            IR: "ایران، جمهوری اسلامی",

+            IE: "ÉIRE",

+            IL: "إسرائيل",

+            IT: "ITALIA",

+            JM: "JAMAICA",

+            JO: "الأردن",

+            KZ: "КАЗАХСТАН",

+            KE: "KENYA",

+            KP: "조선민주주의인민공화국",

+            KR: "한국 ROK",

+            KW: "الكويت",

+            LV: "LATVIJA",

+            LB: "لبنان",

+            LI: "LIECHTENSTEIN",

+            LT: "LIETUVA",

+            LU: "LUXEMBOURG",

+            MO: "澳門",

+            MK: "МАКЕДОНИЈА",

+            MY: "MALAYSIA",

+            MT: "MALTA",

+            MC: "MONACO",

+            MA: "المغرب",

+            NL: "NEDERLAND",

+            AN: "NETHERLANDS ANTILLES",

+            NO: "NORGE",

+            OM: "سلطنة عمان",

+            PK: "PAKISTAN",

+            PE: "PERÚ",

+            PH: "PHILIPPINES",

+            PL: "POLSKA",

+            PT: "PORTUGAL",

+            QA: "قطر",

+            RO: "ROMÂNIA",

+            RU: "Российская Федерация",

+            SA: "السعودية",

+            SG: "SINGAPORE",

+            SK: "SLOVENSKÁ REPUBLIKA",

+            SI: "SLOVENIJA",

+            ZA: "SOUTH AFRICA",

+            ES: "ESPAÑA",

+            LK: "SRILANKA",

+            SE: "SVERIGE",

+            CH: "SCHWEIZ",

+            SY: "الجمهورية العربية السورية",

+            TH: "ประเทศไทย",

+            TT: "TRINIDAD AND TOBAGO",

+            TN: "تونس",

+            TR: "TÜRKİYE",

+            UA: "Україна",

+            AE: "الإمارات العربية المتحدة",

+            GB: "UNITED KINGDOM",

+            UY: "URUGUAY",

+            VN: "VIỆT NAM",

+            YE: "اليمن",

+            ZW: "ZIMBABWE",

+            JP: "日本",

+            BZ: "BELIZE",

+            BO: "BOLIVIA",

+            NZ: "NEW ZEALAND",

+            VE: "REPÚBLICA BOLIVARIANA DE VENEZUELA",

+            CA: "CANADA",

+            CO: "COLOMBIA",

+            DO: "REPÚBLICA DOMINICANA",

+            GT: "GUATEMALA",

+            MX: "MEXICO",

+            PA: "PANAMÁ",

+            PR: "PUERTO RICO",

+            TW: "台灣",

+            US: "UNITED STATES",

+            UZ: "O’zbekiston"

+        },

+        //国家码与类型匹配表

+        countryCode_5g: {

+            //88 countries of world【36 40 44 48】

+            one: {

+                codes: ["AL", "AI", "AW", "AT", "BY", "BM", "BA", "BW", "IO", "BG",

+                    "CV", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "GF", "PF",

+                    "TF", "GI", "DE", "GR", "GP", "GG", "HU", "IS", "IE", "IT",

+                    "KE", "LA", "LV", "LS", "LI", "LT", "LU", "MK", "MT", "IM",

+                    "MQ", "MR", "MU", "YT", "MC", "MS", "NL", "AN", "NO",

+                    "OM", "PL", "PT", "RE", "RO", "SM", "SN", "RS", "SK", "SI",

+                    "ZA", "ES", "SE", "CH", "TC", "UG", "GB", "VG", "WF", "ZM",

+                    "AF", "JO", "MA", "EH", "EU", "DZ", "IL", "MX", "PM", "TN",

+                    "TR", "JP"],

+                channels: [36, 40, 44, 48]

+            },

+            //60 countrys of world【36 40 44 48 149 153 157 161 165】

+            two: {

+                codes: ["AS", "AG", "AZ", "BR", "KH", "KY", "CO", "CR", "DM", "DO",

+                    "EC", "GH", "GD", "HK", "KZ", "KI", "FM", "MZ", "NA", "NZ",

+                    "NI", "NE", "PW", "PE", "PH", "PR", "VC", "TH", "TT", "UY",

+                    "ZW", "AU", "BH", "BB", "CA", "CL", "CX", "EG", "SV", "GT",

+                    "HT", "IN", "MY", "NF", "PA", "PG", "SG", "US", "VN"],

+                channels: [36, 40, 44, 48, 149, 153, 157, 161, 165]

+            },

+            //9 countrys of world【149 153 157 161】

+            three: {

+                codes: ["CU", "IR", "KR", "SY", "LB", "MW", "MO", "QA"],

+                channels: [149, 153, 157, 161]

+            },

+            //12 countrys of world【149 153 157 161 165】

+            four: {

+                codes: ["BD", "BF", "CN", "HN", "JM", "PK", "PY", "KN", "AR", "TW", "NG"],

+                channels: [149, 153, 157, 161, 165]

+            },

+            //1 country of world【36 40 44 48 149 153 157 161】

+            five: {

+                codes: ["SA"],

+                channels: [36, 40, 44, 48, 149, 153, 157, 161]

+            }

+        },

+        countryCode: {

+            world: ["AL", "DZ", "AR", "AM", "AU", "AT", "AZ", "BH", "BY",

+                "BE", "BA", "BR", "BN", "BG", "CL", "CN", "CR", "HR", "CY",

+                "CZ", "DK", "EC", "EG", "SV", "EE", "FI", "FR", "GE",

+                "DE", "GR", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IE",

+                "IL", "IT", "JM", "JO", "KZ", "KE", "KP", "KR", "KW", "LV",

+                "LB", "LI", "LT", "LU", "MO", "MK", "MY", "MT", "MC", "MA",

+                "NL", "AN", "NO", "OM", "PK", "PE", "PH", "PL", "PT", "QA",

+                "RO", "RU", "SA", "SG", "SK", "SI", "ZA", "ES", "LK",

+                "SE", "CH", "SY", "TH", "TT", "TN", "TR", "UA", "AE", "GB",

+                "UY", "VN", "YE", "ZW", "BD"],

+            mkkc: ["JP"],

+            apld: [],

+            etsic: ["BZ", "BO", "NZ", "VE"],

+            fcca: ["CA", "CO", "DO", "GT", "MX", "PA", "PR", "TW", "US", "UZ"]

+        },

+        //休眠时间

+        SLEEP_MODES: [{

+                name: "Always on",

+                value: "-1"

+            }, {

+                name: "5 minutes",

+                value: "5"

+            }, {

+                name: "10 minutes",

+                value: "10"

+            }, {

+                name: "20 minutes",

+                value: "20"

+            }, {

+                name: "30 minutes",

+                value: "30"

+            }, {

+                name: "1 hour",

+                value: "60"

+            }, {

+                name: "2 hours",

+                value: "120"

+            }

+        ],

+        DDNSSetMode: [{

+                name: 'Enable',

+                value: '1'

+            }, {

+                name: 'Disable',

+                value: '0'

+            }

+        ],

+        ddns_Modeselect: [{

+                name: 'manual',

+                value: 'manual'

+            }, {

+                name: 'auto',

+                value: 'auto'

+            }

+        ],

+        DDNSDDP: [{

+                name: 'dyndns.org',

+                value: 'dyndns.org'

+            }, {

+                name: 'freedns.afraid.org',

+                value: 'freedns.afraid.org'

+            }, {

+                name: 'zoneedit.com',

+                value: 'zoneedit.com'

+            }, {

+                name: 'no-ip.com',

+                value: 'no-ip.com'

+            }, {

+                name: 'None',

+                value: 'none'

+            }

+        ],

+        //RJ45连接模式

+        pppoeModes: [{

+                name: "PPPoE",

+                value: "PPPOE"

+            }, {

+                name: "Static",

+                value: "STATIC"

+            }, {

+                name: "DHCP",

+                value: "DHCP"

+            }, {

+                name: "AUTO",

+                value: "AUTO"

+            }

+        ],

+        //联网模式

+        AUTO_MODES: [{

+                name: 'Automatic',

+                value: 'NETWORK_auto'

+            }, {

+                name: '4G Only',

+                value: 'Only_LTE'

+            }, {

+                name: '3G Only',

+                value: 'Only_WCDMA'

+            }, {

+                name: '2G Only',

+                value: 'Only_GSM'

+            }

+        ],

+        //APN鉴权模式

+        APN_AUTH_MODES: [{

+                name: "NONE",

+                value: "none"

+            }, {

+                name: "CHAP",

+                value: "chap"

+            }, {

+                name: "PAP",

+                value: "pap"

+            }

+        ],

+        //语言

+        LANGUAGES: [{

+                name: 'English',

+                value: 'en'

+            }, {

+                name: '中文',

+                value: 'zh-cn'

+            }

+        ],

+        //wifi加密模式

+        AUTH_MODES: [{

+                name: 'NO ENCRYPTION',

+                value: 'OPEN'

+            }, {

+                name: 'WPA2(AES)-PSK',

+                value: 'WPA2PSK'

+            }, {

+                name: 'WPA-PSK/WPA2-PSK',

+                value: 'WPAPSKWPA2PSK'

+            }, {

+                name: 'WPA3-Personal',

+                value: 'WPA3Personal'

+            }, {

+                name: 'WPA2(AES)/WPA3-Personal',

+                value: 'WPA2WPA3'

+            }

+        ],

+        AUTH_MODES_WEP: [{

+                name: 'NO ENCRYPTION',

+                value: 'OPEN'

+            }, {

+                name: 'SHARED',

+                value: 'SHARED'

+            }, {

+                name: 'WPA2(AES)-PSK',

+                value: 'WPA2PSK'

+            }, {

+                name: 'WPA-PSK/WPA2-PSK',

+                value: 'WPAPSKWPA2PSK'

+            }, {

+                name: 'WPA3-Personal',

+                value: 'WPA3Personal'

+            }, {

+                name: 'WPA2(AES)/WPA3-Personal',

+                value: 'WPA2WPA3'

+            }

+        ],

+        AUTH_MODES_ALL: [{

+                name: 'NO ENCRYPTION',

+                value: 'OPEN'

+            }, {

+                name: 'SHARED',

+                value: 'SHARED'

+            }, {

+                name: 'WPA-PSK',

+                value: 'WPAPSK'

+            }, {

+                name: 'WPA2-PSK',

+                value: 'WPA2PSK'

+            }, {

+                name: 'WPA-PSK/WPA2-PSK',

+                value: 'WPAPSKWPA2PSK'

+            }, /*{

+                name: 'WPA3-Personal',

+                value: 'WPA3Personal'

+            }, {

+                name: 'WPA2(AES)/WPA3-Personal',

+                value: 'WPA2WPA3'

+            }, */{

+                name: 'EAP-SIM/AKA',

+                value: 'EAP-SIM/AKA'

+            }

+        ],

+

+        NETWORK_MODES: [{

+                name: '802.11 b/g/n',

+                value: '4'

+            }, {

+                name: '802.11 n only',

+                value: '2'

+            }

+        ],

+        NETWORK_MODES_BAND: [{

+                name: '802.11 a only',

+                value: '5'

+            }, {

+                name: '802.11 n only',

+                value: '2'

+            }, {

+                name: '802.11 a/n',

+                value: '4'

+            }

+        ],

+        resetContentModifyValue: function () {

+            this.CONTENT_MODIFIED.checkChangMethod = function () {

+                return false;

+            };

+            this.CONTENT_MODIFIED.modified = false;

+            this.CONTENT_MODIFIED.message = 'leave_page_info';

+            this.CONTENT_MODIFIED.callback = {

+                ok: $.noop,

+                no: function () {

+                    return true;

+                }

+            }; //如果no返回true,页面则保持原状

+            this.CONTENT_MODIFIED.data = {};

+        },

+        CONTENT_MODIFIED: {

+            modified: false,

+            message: 'leave_page_info',

+            data: {},

+            checkChangMethod: function () {

+                return false;

+            },

+            callback: {

+                ok: $.noop,

+                no: function () {

+                    return true;

+                }

+            } //如果no返回true,页面则保持原状

+        }, //当前页面内容是否已经修改

+

+    };

+

+    require([config.DEVICE + '/set'], function (otherConf) {

+        $.extend(config, otherConf);

+    });

+

+    return config;

+});

diff --git a/lynq/S300/ap/app/zte_webui/js/sim_device.js b/lynq/S300/ap/app/zte_webui/js/sim_device.js
new file mode 100755
index 0000000..633e2e6
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/sim_device.js
@@ -0,0 +1,5028 @@
+define("sim_abnormal","jquery knockout service set main opmode".split(" "),

+    function ($, ko, service, config, home, opmode) {

+

+    function init() {

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        var vm = new simViewMode();

+        ko.applyBindings(vm, container);

+

+        $('#frmPUK').validate({

+            submitHandler: function () {

+                vm.enterPUK();

+            },

+            rules: {

+                txtNewPIN: "pin_check",

+                txtConfirmPIN: {

+                    equalToPin: "#txtNewPIN"

+                },

+                txtPUK: "puk_check"

+            }

+        });

+

+        $('#frmPIN').validate({

+            submitHandler: function () {

+                vm.enterPIN();

+            },

+            rules: {

+                txtPIN: "pin_check"

+            }

+        });

+    }

+

+    function simViewMode() {

+        var target = this;

+        var staInfo = service.getStatusInfo();

+        var curCableMode = "PPPOE" == staInfo.blc_wan_mode || "AUTO_PPPOE" == staInfo.blc_wan_mode;

+        target.hasRj45 = config.RJ45_SUPPORT;

+        target.hasSms = config.HAS_SMS;

+        target.hasPhonebook = config.HAS_PHONEBOOK;

+        target.isSupportSD = config.SD_CARD_SUPPORT;

+        if (config.WIFI_SUPPORT_QR_SWITCH) {

+            var wifiInfo = service.getWifiBasic();

+            target.showQRCode = config.WIFI_SUPPORT_QR_CODE && wifiInfo.show_qrcode_flag;

+        } else {

+            target.showQRCode = config.WIFI_SUPPORT_QR_CODE;

+        }

+        if(config.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_ssid_wifikey.png?_=' + $.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        target.hasParentalControl = ko.observable(config.HAS_PARENTAL_CONTROL && curCableMode);

+        target.pageState = {

+            NO_SIM: 0,

+            WAIT_PIN: 1,

+            WAIT_PUK: 2,

+            PUK_LOCKED: 3,

+            LOADING: 4

+        };

+        target.isHomePage = ko.observable(false);

+        if (window.location.hash == "#main") {

+            target.isHomePage(true);

+        }

+

+        var info = service.getLoginData();

+        target.PIN = ko.observable();

+        target.newPIN = ko.observable();

+        target.confirmPIN = ko.observable();

+        target.PUK = ko.observable();

+        target.pinNumber = ko.observable(info.pinnumber);

+        target.pukNumber = ko.observable(info.puknumber);

+

+        var state = computePageState(info);

+        target.page = ko.observable(state);

+        if (state == target.pageState.LOADING) {

+            addTimeout(refreshPage, 500);

+        }

+        target.showOpModeWindow = function () {

+            showSettingWindow("change_mode", "opmode_popup", "opmode_popup", 400, 300, function () {});

+        };

+        target.isLoggedIn = ko.observable(false);

+        target.enableFlag = ko.observable(false);

+        //更新当前工作模式状态信息

+        target.refreshOpmodeInfo = function () {

+            var staInfo = service.getStatusInfo();

+            target.isLoggedIn(staInfo.isLoggedIn);

+

+            if (!curCableMode && checkCableMode(staInfo.blc_wan_mode)) { //如果有线,则重新加载

+                if (target.page() == target.pageState.NO_SIM || target.page() == target.pageState.WAIT_PIN || target.page() == target.pageState.WAIT_PUK || target.page() == target.pageState.PUK_LOCKED) {

+                    window.location.reload();

+                }

+            }

+

+            curCableMode = checkCableMode(staInfo.blc_wan_mode);

+            target.hasParentalControl(config.HAS_PARENTAL_CONTROL && curCableMode);

+            if (curCableMode && staInfo.ethWanMode.toUpperCase() == "DHCP") {

+                target.enableFlag(true);

+            } else if ((!curCableMode && staInfo.connectStatus != "ppp_disconnected") || (curCableMode && staInfo.rj45ConnectStatus != "idle" && staInfo.rj45ConnectStatus != "dead")) {

+                target.enableFlag(false);

+            } else {

+                target.enableFlag(true);

+            }

+            var mode = (staInfo.blc_wan_mode == "AUTO_PPP" || staInfo.blc_wan_mode == "AUTO_PPPOE") ? "AUTO" : staInfo.blc_wan_mode;

+            var currentOpMode = "";

+            switch (mode) {

+            case "PPP":

+                currentOpMode = "opmode_gateway";

+                break;

+            case "PPPOE":

+                currentOpMode = "opmode_cable";

+                break;

+            case "AUTO":

+                currentOpMode = "opmode_auto";

+                break;

+            default:

+                break;

+            }

+            $("#opmode").attr("data-trans", currentOpMode).text($.i18n.prop(currentOpMode));

+        }

+        //刷新页面状态

+        function refreshPage() {

+            var data = service.getLoginData();

+            var state = computePageState(data);

+            if (state == target.pageState.LOADING) {

+                addTimeout(refreshPage, 500);

+            } else {

+                target.page(state);

+                target.pinNumber(data.pinnumber);

+                target.pukNumber(data.puknumber);

+            }

+        }

+        //输入PUK设置新PIN事件处理

+        target.enterPUK = function () {

+            showLoading();

+            target.page(target.pageState.LOADING);

+            var newPIN = target.newPIN();

+            var confirmPIN = target.confirmPIN();

+            var params = {};

+            params.PinNumber = newPIN;

+            params.PUKNumber = target.PUK();

+            service.enterPUK(params, function (data) {

+                if (!data.result) {

+                    hideLoading();

+                    if (target.pukNumber() == 2) {

+                        showAlert("last_enter_puk", function () {

+                            refreshPage();

+                        });

+                    } else {

+                        showAlert("puk_error", function () {

+                            refreshPage();

+                            if (target.page() == target.pageState.PUK_LOCKED) {

+                                hideLoading();

+                            }

+                        });

+                    }

+                    target.PUK('');

+                    target.newPIN('');

+                    target.confirmPIN('');

+                } else {

+                    refreshPage();

+                    if (target.page() == target.pageState.PUK_LOCKED) {

+                        hideLoading();

+                    }

+                }

+            });

+        };

+        //验证输入PIN事件处理

+        target.enterPIN = function () {

+            showLoading();

+            target.page(target.pageState.LOADING);

+            var pin = target.PIN();

+            service.enterPIN({

+                PinNumber: pin

+            }, function (data) {

+                if (!data.result) {

+                    hideLoading();

+                    if (target.pinNumber() == 2) {

+                        showAlert("last_enter_pin", function () {

+                            refreshPage();

+                        });

+                    } else {

+                        showAlert("pin_error", function () {

+                            refreshPage();

+                        });

+                    }

+                    target.PIN('');

+                }

+                refreshPage();

+                if (target.page() == target.pageState.WAIT_PUK) {

+                    hideLoading();

+                }

+            });

+        };

+

+        if (target.hasRj45) {

+            target.refreshOpmodeInfo();

+            addInterval(function () {

+                target.refreshOpmodeInfo();

+            }, 1000);

+        }

+        //根据登录状态和SIM卡状态设置页面状态

+        function computePageState(data) {

+            var state = data.modem_main_state;

+            if (state == "modem_undetected" || state == "modem_sim_undetected" || state == "modem_sim_destroy") {

+                return target.pageState.NO_SIM;

+            } else if (state == "modem_waitpin") {

+                return target.pageState.WAIT_PIN;

+            } else if ((state == "modem_waitpuk" || data.pinnumber == 0) && (data.puknumber != 0)) {

+                return target.pageState.WAIT_PUK;

+            } else if ((data.puknumber == 0 || state == "modem_sim_destroy") && state != "modem_sim_undetected" && state != "modem_undetected") {

+                return target.pageState.PUK_LOCKED;

+            } else if ($.inArray(state, config.TEMPORARY_MODEM_MAIN_STATE) != -1) {

+                return target.pageState.LOADING;

+            } else {

+                location.reload();

+            }

+        }

+

+    }

+

+    return {

+        init: init

+    };

+});

+

+define("ota_update", "jquery jq_fileinput service knockout set statusBar".split(" "), 

+

+    function ($, fileinput, service, ko, config, status) {

+

+    function FotaUpdateViewModel() {

+        var target    = this;

+        var setting = service.getOTAUpdateSetting();		

+        var upgUrl = service.getManualOTAUpdateSetting();

+

+        target.allowRoamingUpdate = ko.observable(setting.allowRoamingUpdate);		

+		target.hasDdns            = config.DDNS_SUPPORT;

+		target.hasUpdateCheck     = config.HAS_UPDATE_CHECK;	

+		target.hasUssd            = config.HAS_USSD;		

+        target.isDataCard         = config.PRODUCT_TYPE == 'DATACARD';

+        target.lastCheckTime      = ko.observable('');	

+        target.updateIntervalDay  = ko.observable(setting.updateIntervalDay);		

+        target.updateMode         = ko.observable(setting.updateMode);

+		target.updateType         = ko.observable(service.getUpdateType().update_type);

+        target.updateURL          = ko.observable(upgUrl.updateURL);

+

+        // 手动ota升级事件

+        target.ota_upgrade_apply = function () {

+            var otaUpdateURLInfo = {

+                updateURL: target.updateURL()

+            };

+            showLoading();

+            service.setManualOTAUpdateSetting(otaUpdateURLInfo, function (settingInfo) {

+                if (settingInfo && settingInfo.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+

+        // 自动检测设置按钮事件

+        target.apply = function () {

+            var updateSettingInfo = {

+                updateMode: target.updateMode(),

+                updateIntervalDay: target.updateIntervalDay(),

+                allowRoamingUpdate: target.allowRoamingUpdate()

+            };

+            showLoading();

+            service.setOTAUpdateSetting(updateSettingInfo, function (settingInfo) {

+                if (settingInfo && settingInfo.result == "success") {

+                    setting.allowRoamingUpdate = target.allowRoamingUpdate();

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+

+        // 按钮【检测】点击事件处理接口

+        target.checkNewVersion = function () {

+            var newVersionState = service.getNewVersionState();

+			if(newVersionState.fota_package_already_download == "yes"){

+				showAlert("fota_package_already_download");

+				return;

+			}

+

+            if(config.UPGRADE_TYPE=="FOTA"){

+                var checkingState = ["checking"];

+                if ($.inArray(newVersionState.fota_current_upgrade_state, checkingState) != -1) {

+                    showAlert("ota_update_running");

+                    return;

+                }

+            }

+

+			// FOTA开始下载前,判断当前是否已经在下载过程中,防止错误清空fota_new_version_state状态

+            var statusInfo = service.getStatusInfo();

+            if (newVersionState.fota_current_upgrade_state == "prepare_install") {

+                showInfo('ota_download_success');

+                return;

+            }

+

+            var upgradingState = ["downloading", "confirm_dowmload"];

+            if ($.inArray(newVersionState.fota_current_upgrade_state, upgradingState) != -1) {

+                status.showOTAAlert();

+                return;

+            }

+

+            if (statusInfo.roamingStatus) {

+                showConfirm("ota_check_roaming_confirm", function () {

+                    checkNewVersion();

+                });

+            } else {

+                checkNewVersion();

+            }

+            // 检测是否有新版本

+            function checkNewVersion() {

+                showLoading("ota_new_version_checking");

+                function checkNewVersionResult() {

+                    var result = service.getNewVersionState();

+                    if (result.hasNewVersion) {

+						if(result.fota_new_version_state == "already_has_pkg"&&result.fota_current_upgrade_state !="prepare_install"&&result.fota_current_upgrade_state !="low_battery")

+						{

+							addTimeout(checkNewVersionResult, 1000);

+						}

+						else

+						{

+							status.showOTAAlert();

+						}

+                    } else if (result.fota_new_version_state == "no_new_version") {

+                        showAlert("ota_no_new_version");

+                    }else if (result.fota_new_version_state == "check_failed" ) {

+                        errorOverlay("ota_check_fail");

+                    } else if ( result.fota_new_version_state == "bad_network"){

+                     	errorOverlay("ota_connect_server_failed");

+                    }else {

+                        addTimeout(checkNewVersionResult, 1000);

+                    }

+                }

+

+                service.setUpgradeSelectOp({selectOp: 'check'}, function (result) {

+                    if (result.result == "success") {

+                        checkNewVersionResult();

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            }

+        };

+

+

+

+        // 确认按钮状态:可用/灰化

+        target.fixPageEnable = function () {

+            var connectStatusInfo = service.getStatusInfo();

+			var opModeData = service.getOpMode();

+            if (checkConnectedStatus(connectStatusInfo.connectStatus, opModeData.rj45_state, connectStatusInfo.connectWifiStatus)) {

+                enableBtn($("#btnCheckNewVersion"));

+            } else {

+                disableBtn($("#btnCheckNewVersion"));

+            }

+        };

+

+        target.clickAllowRoamingUpdate = function () {

+            var checkedbox = $("#chkUpdateRoamPermission:checked");

+            if (checkedbox && checkedbox.length == 0) {

+                target.allowRoamingUpdate("1");

+            } else {

+                target.allowRoamingUpdate("0");

+            }

+        };

+

+        service.getOTAlastCheckTime({}, function(info){

+            target.lastCheckTime(info.dm_last_check_time);

+        });

+

+	}

+    // 获取升级文件大小

+	function getFileSize(object){

+		var fileLenth = 0;

+		var isIE = /msie/i.test(navigator.userAgent) && !window.opera; 

+		if (isIE) {  //如果是ie

+			var objectValue = object.value;

+			try {  

+				var fso = new ActiveXObject("Scripting.FileSystemObject");  

+				fileLenth = parseInt(fso.GetFile(objectValue).size);

+				} catch (e) {  

+				fileLenth = 1;					

+			} 

+		}else{  //对于非IE获得要上传文件的大小			

+			try{			

+				fileLenth = parseInt(object.files[0].size);

+			}catch (e) {

+				fileLenth = 1;  //获取不到取-1

+			}

+		}

+		return fileLenth/1024/1024;

+	} 

+

+    function init() {

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        var fwVm = new FotaUpdateViewModel();

+        ko.applyBindings(fwVm, container);		

+

+        if(fwVm.updateType() == "mifi_fota"){

+            fwVm.fixPageEnable();

+            addInterval(function () {            

+                fwVm.fixPageEnable();          

+            }, 1000);

+		}else{			

+	        if ($(".customfile").length == 0) {

+			    $("#fileField").customFileInput();

+		    }

+		}

+

+        $('#frmOTAUpdate').validate({

+            submitHandler: function () {

+                fwVm.apply();

+            }

+        });

+    }

+

+    return {

+        init: init

+    };

+});

+

+// SD卡 模块

+

+define("sd", "jquery set service knockout".split(" ") , function($, config, service, ko) {

+

+	// 基目录。感觉此根目录不显示给用户会更友好

+	var basePath = config.SD_BASE_PATH;

+

+	function SDCardViewModel() {

+		var target = this;

+		var SDConfiguration      = service.getSDConfiguration();

+

+        target.selectedMode        = ko.observable(SDConfiguration.sd_mode);

+        target.orignalMode         = ko.observable(SDConfiguration.sd_mode);

+        target.sdStatus            = ko.observable(SDConfiguration.sd_status);

+		target.orignalSdStatus     = ko.observable(SDConfiguration.sd_status);

+        target.sdStatusInfo        = ko.observable("sd_card_status_info_" + SDConfiguration.sd_status);

+        target.selectedShareEnable = ko.observable(SDConfiguration.share_status);

+        target.selectedFileToShare = ko.observable(SDConfiguration.file_to_share);

+        target.selectedAccessType  = ko.observable(SDConfiguration.share_auth);

+

+		var path = SDConfiguration.share_file.substring(basePath.length);

+

+        target.pathToShare         = ko.observable(path);

+        target.isInvalidPath       = ko.observable(false);

+		target.checkEnable         = ko.observable(true);

+

+

+	    addInterval(function(){

+			target.refreshSimStatus();

+		}, 3000);

+

+        // 检查共享路径是否有效

+        target.checkPathIsValid = ko.computed(function () {

+            if (target.orignalMode() == 0 && target.selectedShareEnable() == '1' && target.selectedFileToShare() == '0'

+                && target.pathToShare() != '' && target.pathToShare() != '/') {

+                service.checkFileExists({

+                    "path": basePath + target.pathToShare()

+                }, function (info) {

+                    if (info.status != "exist") {

+                        target.isInvalidPath(true);

+                    } else {

+                        target.isInvalidPath(false);

+                    }

+                });

+            } else {

+                target.isInvalidPath(false);

+            }

+        });	

+

+

+        target.disableApplyBtn = ko.computed(function(){

+            return target.selectedMode() == target.orignalMode() && target.selectedMode() == '1';

+        });

+

+		// 文件共享方式radio点击事件

+		target.fileToShareClickHandle = function(){

+			if(target.selectedFileToShare() == "1"){

+				target.pathToShare("/");

+			}

+			return true;

+		};		

+

+		// T卡热插拔时状态监控,拔插卡重刷界面

+		target.refreshSimStatus = function(){

+			if(target.checkEnable()){

+				var SDConfiguration = service.getSDConfiguration();

+			    if(SDConfiguration.sd_status && (SDConfiguration.sd_status != target.orignalSdStatus())){

+				    if(SDConfiguration.sd_status != '1'){

+						target.sdStatusInfo("sd_card_status_info_" + SDConfiguration.sd_status);

+						target.sdStatus(SDConfiguration.sd_status);

+		                target.orignalSdStatus(SDConfiguration.sd_status);

+						$("#sd_card_status_info").translate();

+					}else{

+						clearTimer();

+					    clearValidateMsg();

+					    init();

+					}

+			    }

+			}			

+		}

+

+

+

+

+

+		// 表单submit事件处理

+		target.save = function(){

+			showLoading('waiting');

+			target.checkEnable(false);

+			if(target.orignalMode() == target.selectedMode()){

+				showAlert("setting_no_change");

+			} else {

+				service.setSdCardMode({

+					mode : target.selectedMode()

+				}, function(info) {

+					if(info.result){

+                        target.orignalMode(target.selectedMode());

+						if(info.result == "processing"){

+							errorOverlay("sd_usb_forbidden");

+						}else{								

+						    successOverlay();

+						}

+					} else {

+						if (target.selectedMode() == "0") {

+							errorOverlay("sd_not_support");

+						} else {

+						    errorOverlay();

+						}

+					}

+				}, function(error) {

+					if (target.selectedMode() == "0") {

+						errorOverlay("sd_not_support");

+					} else {

+					    errorOverlay();

+					}

+				});

+			}

+			target.checkEnable(true);

+			return true;

+		};

+

+

+

+		// 保存详细配置信息

+        target.saveShareDetailConfig = function() {

+            showLoading('waiting');

+            target.checkEnable(false);			

+            var param = {

+                share_status : target.selectedShareEnable(),

+                share_auth : target.selectedAccessType(),

+                share_file : basePath + target.pathToShare()

+            };

+

+            if (target.selectedShareEnable() == "0") {

+                setSdCardSharing(param);

+            } else {

+                service.checkFileExists({

+                    "path" : param.share_file

+                }, function(info) {

+                    if (info.status != "exist" && info.status != "processing") {

+                        errorOverlay("sd_card_share_setting_" + info.status);

+                    } else {

+                        setSdCardSharing(param);

+                    }

+                }, function(){

+                    errorOverlay();

+                });

+            }

+

+            target.checkEnable(true);

+            return true;

+		}

+

+		// 设置SD卡共享信息

+        function setSdCardSharing(param){

+			service.setSdCardSharing(param, function(result) {

+				if (isErrorObject(result)) {

+					if (result.errorType == "no_sdcard") {

+						errorOverlay("sd_card_share_setting_no_sdcard");

+					} else {

+						errorOverlay();

+					}

+				} else {

+					successOverlay();

+				}

+			});

+		}

+	}

+

+	// 将配置的option项转换成Option数组

+	// {Array} configItem [{name: "name1", value: "val1"},{name: "name2", value: "val2"}]

+	function getOptionArray(configItem) {

+		var arr = [];

+		for ( var i = 0; i < configItem.length; i++) {

+			arr.push(new Option(configItem.name, configItem.value));

+		}

+		return arr;

+	}

+

+	function init() {

+		var container = $('#container')[0];

+		ko.cleanNode(container);

+		var fwVm = new SDCardViewModel();

+		ko.applyBindings(fwVm, container);

+		$("#sd_card_status_info").translate();

+		$('#sdmode_form').validate({

+			submitHandler : function() {

+				fwVm.save();

+			}

+		});

+		$('#httpshare_form').validate({

+			submitHandler : function() {

+				fwVm.saveShareDetailConfig();

+			},

+			rules : {

+				path_to_share : "check_file_path"

+			}

+		});

+	}

+

+	return {

+		init : init

+	};

+});

+

+// SD卡 HttpShare模块

+

+define("sd_httpshare","jquery underscore jq_fileinput set service knockout".split(" ") , 

+

+	function($, _, fileinput, config, service, ko) {

+

+	// 每页记录条数

+	// 不能够设置每页数据个数,默认:10

+	// 默认值不可修改

+	var perPage = 10;

+

+	// 当前页

+	var activePage = 1;

+

+	// 当前目录,默认根目录""

+	var currentPath = "";

+

+	// 基目录。是否需要显示给用户?用户友好度

+	var basePath = config.SD_BASE_PATH;

+

+	// 前置路径,发现有的设备会将sd卡数据显示在web目录

+	// prePath = "/usr/conf/web";

+	var prePath = "";

+

+	// 是否隐藏重命名按钮

+	var readwrite = true;

+

+	// 文件列表模板

+	var sdFileItemTmpl = null;

+

+	// 分页模板

+	var pagerTmpl = null;

+    // 配置信息原始状态

+    var originalStatus = null;

+

+    var zoneOffsetSeconds = new Date().getTimezoneOffset() * 60;

+

+    var shareFilePath = '';

+

+	var sdIsUploading = false;//SD卡是否正在上传文件

+

+	// 生成分页数据数组

+	// @method generatePager

+	// @param {Integer} totalSize 总记录数

+	// @param {Integer} perPageNum 每页记录条数

+	// @param {Integer} currentPage 当前页

+	// @return {Array} 分页数据数组

+	function generatePager(totalSize, perPageNum, currentPage) {

+        if (totalSize == 0) {

+            return [];

+        }

+        var pagersArr = [];

+        var totalPages = getTotalPages(totalSize, perPageNum);

+        pagersArr.push({

+            pageNum: currentPage - 1,

+            isActive: false,

+            isPrev: true,

+            isNext: false,

+            isDot: false

+        });

+        if (currentPage == 6) {

+            pagersArr.push({

+                pageNum: 1,

+                isActive: false,

+                isPrev: false,

+                isNext: false,

+                isDot: false

+            });

+        } else if (currentPage > 5) {

+            pagersArr.push({

+                pageNum: 1,

+                isActive: false,

+                isPrev: false,

+                isNext: false,

+                isDot: false

+            });

+            pagersArr.push({

+                pageNum: 0,

+                isPrev: false,

+                isNext: false,

+                isActive: false,

+                isDot: true

+            });

+        }

+        var i;

+        var startPage = currentPage - 4 > 0 ? currentPage - 4 : 1;

+        var endPage = currentPage + 4;

+        for (i = startPage; i <= endPage && i <= totalPages; i++) {

+            pagersArr.push({

+                pageNum: i,

+                isActive: i == currentPage,

+                isPrev: false,

+                isNext: false,

+                isDot: false

+            });

+        }

+        if (currentPage + 5 == totalPages) {

+            pagersArr.push({

+                pageNum: totalPages,

+                isPrev: false,

+                isNext: false,

+                isActive: false,

+                isDot: false

+            });

+        } else if (currentPage + 3 <= totalPages && i - 1 != totalPages) {

+            pagersArr.push({

+                pageNum: 0,

+                isPrev: false,

+                isNext: false,

+                isActive: false,

+                isDot: true

+            });

+            pagersArr.push({

+                pageNum: totalPages,

+                isPrev: false,

+                isNext: false,

+                isActive: false,

+                isDot: false

+            });

+        }

+        pagersArr.push({

+            pageNum: parseInt(currentPage, 10) + 1,

+            isPrev: false,

+            isNext: true,

+            isActive: false,

+            isDot: false

+        });

+        return pagersArr;

+	}

+

+	function getTotalPages(total, perPage){

+		var totalPages = Math.floor(total / perPage);

+		if (total % perPage != 0) {

+			totalPages++;

+		}

+		return totalPages;

+	}

+

+	// 整理文件列表数据,并用模板显示

+	function showFileSet(files) {

+		var i = 0;

+		var shownFiles = $.map(files, function(n) {

+			var obj = {

+				fileName : HTMLEncode(n.fileName),

+				fileType : n.attribute == 'document' ? 'folder' : getFileType(n.fileName),

+				fileSize : getDisplayVolume(n.size, false),

+				filePath : basePath + getCurrentPath() + "/" + n.fileName,

+                lastUpdateTime : transUnixTime((parseInt(n.lastUpdateTime, 10) + zoneOffsetSeconds) * 1000),

+				trClass : i % 2 == 0 ? "even" : "",

+				readwrite : readwrite

+			};

+			i++;

+			return obj;

+		});

+

+		if(sdFileItemTmpl == null){

+			sdFileItemTmpl = $.template("sdFileItemTmpl", $("#sdFileItemTmpl"));

+		}

+		$("#fileList_container").html($.tmpl("sdFileItemTmpl", {data: shownFiles}));

+	}

+

+	// HttpShareViewModel

+	function HttpShareViewModel() {

+		var isGuest = false;

+		if(window.location.hash == "#httpshare_guest"){

+			isGuest = true;

+		}

+		readwrite = true;

+		activePage = 1;

+        setCurrentPath('');

+		basePath = config.SD_BASE_PATH;

+		showLoading('waiting');

+		service.getSDConfiguration({}, function(data){

+            originalStatus = data;

+            shareFilePath = data.share_file;

+            if(shareFilePath.charAt(shareFilePath.length - 1) == '/'){//如果路径中有/,则去掉

+            	shareFilePath = shareFilePath.substring(0, shareFilePath.length - 1);

+            }

+

+			if(data.sd_status == '1' && data.sd_mode == '0'){ //共享

+				if(isGuest && data.share_status == '1'){// guest and share

+					basePath = shareFilePath;

+					if(data.share_auth == '0'){ // readonly

+						readwrite = false;

+						$("#uploadSection, #delete_file_button, .sd_guest_hide_th", "#httpshare_form").hide();

+					}else{

+                        $("#uploadSection, #delete_file_button, .sd_guest_hide_th", "#httpshare_form").show();

+                    }

+					$("#go_to_login_button").removeClass("hide");

+					$('#sd_menu').hide();

+					$('.form-note').hide();

+					if ($(".customfile").length == 0) {

+						$("#fileField").customFileInput();

+					}

+					pagerItemClickHandler(1);

+				} else if(isGuest && data.share_status == '0'){ // guest not share

+					$(".form-body .content", "#httpshare_form").hide().remove();

+					$(".form-title", "#httpshare_form").attr("data-trans", "httpshare").html($.i18n.prop("httpshare"));

+					$(".form-note", "#httpshare_form").attr("data-trans", "note_http_share_cannot_access").html($.i18n.prop("note_http_share_cannot_access"));

+                    hideLoading();

+				} else {

+					if ($(".customfile").length == 0) {

+						$("#fileField").customFileInput();

+					}

+					pagerItemClickHandler(1);

+				}

+			} else { // usb

+				$(".form-body .content", "#httpshare_form").hide().remove();

+				$(".form-title", "#httpshare_form").attr("data-trans", "httpshare").html($.i18n.prop("httpshare"));

+				$(".form-note", "#httpshare_form").attr("data-trans", "note_http_share_usb_access").html($.i18n.prop("note_http_share_usb_access"));

+                $(".form-note", "#httpshare_form").addClass("margintop10");

+				hideLoading();

+			}

+		}, function(){

+            errorOverlay();

+            $(".form-body .content", "#httpshare_form").hide().remove();

+            $(".form-title", "#httpshare_form").attr("data-trans", "httpshare").html($.i18n.prop("httpshare"));

+            $(".form-note", "#httpshare_form").attr("data-trans", "note_http_share_cannot_access").html($.i18n.prop("note_http_share_cannot_access"));

+        });

+

+		addInterval(function(){

+			!sdIsUploading && self.checkSdStatus();

+		}, 3000);

+

+		// T卡热插拔时状态监控,拔插卡重刷界面

+		self.checkSdStatus = function(){			

+			var data = service.getSDConfiguration();

+			if(data.sd_status && (data.sd_status != originalStatus.sd_status)){

+				if(data.sd_status == '1'){

+					window.location.reload();

+				}else{

+					clearTimer();

+					clearValidateMsg();

+					init();

+				}

+			}			

+		}

+	}

+

+	// 页码点击事件处理

+	pagerItemClickHandler = function(num) {

+		activePage = num;

+		refreshFileList(getCurrentPath(), activePage);

+	};

+

+    function checkConfiguration(){

+        var data = service.getSDConfiguration();

+        if(!_.isEqual(originalStatus, data)){

+            showAlert('sd_config_changed_reload', function(){

+                init();

+            });

+            return false;

+        }

+        return true;

+    }

+

+    //检查操作路径是否为共享路径,如果是共享路径,给用户提示

+    function inSharePath(path, wording) {

+        var tmpShareFilePath = shareFilePath + '/';

+        var tmpPath = path + '/';

+        if (originalStatus.share_status == '1' && shareFilePath != '' && shareFilePath != '/' && tmpShareFilePath.indexOf(tmpPath) != -1) {

+            showAlert(wording);

+            return true;

+        }

+        return false;

+    }

+

+	// 进入文件夹

+	enterFolder = function(name) {

+        if(!checkConfiguration()){

+            return false;

+        }

+		var path;

+		if (name == "") {

+			path = "";

+		} else {

+			path = getCurrentPath() + '/' + name;

+		}

+		refreshFileList(path, 1);

+        return true;

+	};

+

+	// 回到上一级目录

+	backFolder = function() {

+        if(!checkConfiguration()){

+            return false;

+        }

+		var path = getCurrentPath().substring(0, getCurrentPath().lastIndexOf("/"));

+		refreshFileList(path, 1);

+        return true;

+	};

+

+	// 更新按钮状态

+	refreshBtnsStatus = function() {

+		if (getCurrentPath() == "") {

+			$("#rootBtnLi, #backBtnLi").hide();

+		} else {

+			$("#rootBtnLi, #backBtnLi").show();

+		}

+		if (readwrite) {

+            $("#createNewFolderLi").hide();

+            $("#createNewFolderLi").find(".error").hide();

+            $("#newFolderBtnLi").show();

+            $("#newFolderName").val('');

+            $("#createNewFolderErrorLabel").removeAttr('data-trans').text('');

+		} else {

+            $("#newFolderBtnLi, #createNewFolderLi").hide().remove();

+		}

+        checkDeleteBtnStatus();

+	};

+

+

+	// 刷新文件列表

+	refreshFileList = function(path, index, alertShown) {

+		if(!alertShown){

+            showLoading('waiting');

+        }

+		service.getFileList({

+			path : prePath + basePath + path,

+			index : index

+		}, function(data) {

+			if (isErrorObject(data)) {

+				showAlert(data.errorType);

+				return;

+            }

+            setCurrentPath(path);

+			$("#sd_path").val(path);

+			activePage = index;

+			totalSize = data.totalRecord;

+			showFileSet(data.details);

+			pagination(totalSize); //测试分页时可以将此处totalSize调大

+			refreshBtnsStatus();

+			updateSdMemorySizes();

+            if(!alertShown){

+			    hideLoading();

+            }

+		});

+	};

+

+

+	// 显示新建文件夹按钮点击事件

+	openCreateNewFolderClickHandler = function() {

+		$("#newFolderBtnLi").hide();

+		$("#newFolderName").show();

+		$("#createNewFolderLi").show();

+	};

+

+	// 取消显示新建文件夹按钮点击事件

+	cancelCreateNewFolderClickHandler = function() {

+		$("#createNewFolderLi").hide();

+        $("#newFolderName").val('');

+		$("#newFolderBtnLi").show();

+		$("#createNewFolderLi").find(".error").hide();

+	};

+

+	// 新建文件夹按钮点击事件

+	createNewFolderClickHandler = function() {

+        if(!checkConfiguration()){

+            return false;

+        }

+		var newFolderName = $.trim($("#newFolderName").val());

+		var newPath = prePath + basePath + getCurrentPath() + "/" + newFolderName;

+        showLoading('creating');

+		service.checkFileExists({

+			path : newPath

+		}, function(data1) {

+			if (data1.status == "noexist" || data1.status == "processing") {

+				service.createFolder({

+					path : newPath

+				}, function(data) {

+					if (isErrorObject(data)) {

+						showAlert(data.errorType);

+						return false;

+					} else {

+                        successOverlay();

+                        refreshFileList(getCurrentPath(), 1);

+                    }

+				});

+			} else if (data1.status == "no_sdcard") {

+                showAlert("no_sdcard", function(){

+                    window.location.reload();

+                });

+			} else if (data1.status == "exist") {

+				$("#createNewFolderErrorLabel").attr('data-trans', 'sd_card_share_setting_exist').text($.i18n.prop("sd_card_share_setting_exist"));

+				hideLoading();

+			}

+		}, function(){

+            errorOverlay();

+        });

+        return true;

+	};

+

+	// 重命名按钮点击事件

+	renameBtnClickHandler = function(oldName) {

+        var oldPath = prePath + basePath + getCurrentPath() + "/" + oldName;

+        if(inSharePath(oldPath, 'sd_share_path_cant_rename')){

+            return false;

+        }

+		showPrompt("sd_card_folder_name_is_null", function() {

+            renamePromptCallback(oldName);

+        }, 160, oldName, checkPromptInput);

+    };

+

+    function renamePromptCallback(oldName){

+        if(!checkConfiguration()){

+            return false;

+        }

+        var promptInput = $("div#confirm div.promptDiv input#promptInput");

+        var newFolderName = $.trim(promptInput.val());

+        var newPath = prePath + basePath + getCurrentPath() + "/" + newFolderName;

+        service.checkFileExists({

+                path : newPath

+            }, function(data1) {

+				if (data1.status == "noexist" || data1.status == "processing") {

+					hideLoadingButtons();

+					var oldPath = prePath + basePath + getCurrentPath() + "/" + oldName;

+					service.fileRename({

+						oldPath : oldPath,

+						newPath : newPath,

+						path : prePath + basePath + getCurrentPath()

+					}, function(data) {

+						if (isErrorObject(data)) {							

+							showAlert($.i18n.prop(data.errorType));

+							if(data.errorType == "no_exist"){

+								var alertShown = true;

+								refreshFileList(getCurrentPath(), 1, alertShown);

+							} else if(data.errorType == "processing"){

+								//

+							}							

+						} else {

+                            refreshFileList(getCurrentPath(), 1);

+                            successOverlay();

+                        }

+                        showLoadingButtons();

+						return true;

+					});

+				} else if (data1.status == "no_sdcard") {

+					showAlert("no_sdcard", function(){

+                        window.location.reload();

+                    });

+					return false;

+				} else if (data1.status == "exist") {

+					$(".promptErrorLabel").text($.i18n.prop("sd_card_share_setting_exist"));

+					return false;

+				}

+                return true;

+            }, function(){

+                errorOverlay();

+        });

+        return false;

+    }

+

+    // Prompt弹出框INPUT校验函数

+    function checkPromptInput(){

+        var promptInput = $("div#confirm div.promptDiv input#promptInput");

+        var newFileName = $.trim(promptInput.val());

+        var newPath = (prePath + basePath + getCurrentPath() + "/" + newFileName).replace("//", "/");

+        var checkResult = checkFileNameAndPath(newFileName, newPath);

+        if (1 == checkResult) {

+            $(".promptErrorLabel").text($.i18n.prop("sd_upload_rename_null"));//tip filena is null

+            return false;

+        }else if (2 == checkResult) {

+            $(".promptErrorLabel").text($.i18n.prop("sd_card_path_too_long"));

+            return false;

+        }else if (3 == checkResult) {

+            $(".promptErrorLabel").text($.i18n.prop("check_file_path"));

+            return false;

+        }else{

+            $(".promptErrorLabel").text("");

+            return true;

+        }

+        return true;;

+    }

+

+    hideLoadingButtons = function () {

+        $(".buttons", "#confirm").hide();

+    };

+

+    showLoadingButtons = function () {

+        $(".buttons", "#confirm").show();

+    };

+

+	// 删除按钮点击事件

+	deleteBtnClickHandler = function() {

+        if(!checkConfiguration()){

+            return false;

+        }

+		var files = $("input:checkbox:checked", "#fileList_container");

+		var fileNames = "";

+		if (!files || files.length == 0) {

+			return false;

+		}

+        var hasSharePath = false;

+        $.each(files, function (i, n) {

+            var theFile = $(n).val();

+            if (inSharePath(prePath + basePath + getCurrentPath() + "/" + theFile, {msg: 'sd_share_path_cant_delete', params: [theFile]})) {

+                hasSharePath = true;

+                return false;

+            }

+            return true;

+        });

+        if (hasSharePath) {

+            return false;

+        }

+		showConfirm("confirm_data_delete", function(){

+			$.each(files, function(i, n) {

+				fileNames += $(n).val() + "*";

+			});

+			var thePath = prePath + basePath + getCurrentPath();

+			service.deleteFilesAndFolders({

+				path : thePath,

+				names : fileNames

+			}, function(data) {

+				if (data.status == "failure") {

+					showAlert("delete_folder_failure");

+				}

+				else if(data.status == "no_sdcard"){

+					showAlert("no_sdcard");

+				}

+				else if(data.status == "processing"){

+					showAlert("sd_file_processing_cant_delete");

+				}

+				else if(data.status == "success"){

+					successOverlay();

+				}

+				refreshFileList(getCurrentPath(), 1);

+			}, function(){

+                errorOverlay();

+            });

+		});

+        return true;

+	};

+

+    // 文件上传按钮点击事件

+    fileUploadSubmitClickHandler = function(ifReName) {        

+        if(ifReName){

+            var fileName = $.trim($("div#confirm div.promptDiv input#promptInput").val());

+        }else{

+            var fileName = $(".customfile").attr('title');

+        }

+        var newPath = (basePath + getCurrentPath() + "/" + fileName).replace("//", "/");

+        var fileSize = getFileSize($("#fileField")[0]);

+        if(!checkuploadFileNameAndPath(fileName, newPath, fileSize)){

+            return false;

+        }		

+        doCheckAndUpload(fileName, newPath, fileSize);

+    };

+

+    function doCheckAndUpload(fileName, newPath, fileSize){

+        service.getSdMemorySizes({}, function(data) {

+			if (isErrorObject(data)) {

+				showAlert(data.errorType);

+				return false;

+			}

+			if (data.availableMemorySize < fileSize) {

+				showAlert("sd_upload_space_not_enough");

+				return false;

+			}

+			$.modal.close();

+			showLoading('uploading', '<span data-trans="note_uploading_not_refresh">' + $.i18n.prop('note_uploading_not_refresh') + '</span>');

+			service.checkFileExists({

+				path : newPath

+			}, function(data1) {

+				if (data1.status == "noexist") {

+					$("#fileUploadForm").attr("action", "/cgi-bin/httpshare/" + URLEncodeComponent(fileName));

+					var currentTime = new Date().getTime();

+					$("#path_SD_CARD_time").val(transUnixTime(currentTime));

+					$("#path_SD_CARD_time_unix").val(Math.round((currentTime - zoneOffsetSeconds * 1000) / 1e3));

+					if(!iframeLoadBinded){

+						bindIframeLoad();

+					}

+					sdIsUploading = true;

+					$("#fileUploadForm").submit();

+				} else if (data1.status == "no_sdcard") {

+					showAlert("no_sdcard", function(){

+						window.location.reload();

+					});

+				} else if (data1.status == "processing") {

+					showAlert("sd_upload_file_is_downloading");//("system is downloading,try later!");

+				}else if (data1.status == "exist") {

+					showPrompt("sd_upload_rename",function(){

+						fileUploadSubmitClickHandler(true);

+					},160, fileName, checkPromptInput, clearUploadInput);

+				}

+			}, function(){

+				errorOverlay();

+			});

+        		return true;

+		});

+	}

+

+    var iframeLoadBinded = false;

+    function bindIframeLoad(){

+        iframeLoadBinded = true;

+        $('#fileUploadIframe').load(function() {

+			sdIsUploading = false;

+            var txt = $('#fileUploadIframe').contents().find("body").html().toLowerCase();

+            var alertShown = false;

+            if (txt.indexOf('success') != -1) {

+                successOverlay();

+            } else if (txt.indexOf('space_not_enough') != -1) {

+                alertShown = true;

+                showAlert('sd_upload_space_not_enough');

+            } else if (txt.indexOf('data_lost') != -1) {

+                alertShown = true;

+                showAlert('sd_upload_data_lost');

+            } else {

+                errorOverlay();

+            }

+

+            clearUploadInput();

+            refreshFileList(getCurrentPath(), 1, alertShown);

+        });

+    }

+

+	// 更新SD卡容量显示数据

+	updateSdMemorySizes = function() {

+		service.getSdMemorySizes({}, function(data) {

+			if (isErrorObject(data)) {

+				showAlert(data.errorType);

+				return false;

+			}

+			var total = getDisplayVolume(data.totalMemorySize, false);

+			var used = getDisplayVolume(data.totalMemorySize - data.availableMemorySize, false);

+			$("#sd_volumn_used").text(used);

+			$("#sd_volumn_total").text(total);

+            return true;

+		});

+	};

+

+	// 翻页

+	pagination = function(fileTotalSize) {

+		var pagers = generatePager(fileTotalSize, perPage, parseInt(activePage, 10));

+		if(pagerTmpl == null){

+			pagerTmpl = $.template("pagerTmpl", $("#pagerTmpl"));

+		}

+		$(".pager", "#fileListButtonSection").html($.tmpl("pagerTmpl", {data: {pagers : pagers, total : getTotalPages(fileTotalSize, perPage)}}));

+		renderCheckbox();

+		$(".content", "#httpshare_form").translate();

+	};

+

+	// 下载文件是检查文件路径是否包含特殊字符

+	checkFilePathForDownload = function(path){

+        if(!checkConfiguration()){

+            return false;

+        }

+		var idx = path.lastIndexOf('/');

+		var prePath = path.substring(0, idx+1);

+		var name = path.substring(idx+1, path.length);

+		if(checkFileNameChars(prePath, true) && checkFileNameChars(name, false)){

+			return true;

+		}

+		showAlert('sd_card_invalid_chars_cant_download');

+		return false;

+	};

+

+	gotoLogin = function(){

+		window.location.href="#entry";

+	};

+

+	// 事件绑定

+    function bindEvent(){

+		$('#createNewFolderForm').validate({

+			submitHandler : function() {

+				createNewFolderClickHandler();

+			},

+			rules : {

+				newFolderName : {sd_card_path_too_long:true,check_filefold_name: true}

+			}

+		});

+        $("p.checkbox", "#httpshare_form").die().live('click', function () {

+            addTimeout(function () {

+                checkDeleteBtnStatus();

+            }, 100);

+        });

+        $(".icon-download", "#httpshare_form").die().live("click", function () {

+            return checkFilePathForDownload($(this).attr("filelocal"));

+        });

+        $(".folderTd", "#httpshare_form").die().live("click", function () {

+            return enterFolder($(this).attr("filename"));

+        });

+        $(".fileRename", "#httpshare_form").die().live("click", function () {

+            return renameBtnClickHandler($(this).attr("filename"));

+        });

+        iframeLoadBinded = false;

+    }

+

+

+	// 刷新删除按钮状态

+    function checkDeleteBtnStatus(){

+        var checkedItem = $("p.checkbox.checkbox_selected", '#fileListSection');

+        if(checkedItem.length > 0){

+            enableBtn($('#delete_file_button'));

+        } else {

+            disableBtn($('#delete_file_button'));

+        }

+    }

+

+

+    // 文件名和路径检查

+    function checkFileNameAndPath(filename, path) {

+        if (filename == "" || filename.length > 25) {

+            return 1;

+        }

+        if (path.length >= 200) {

+            return 2;

+        }

+        if (!checkFileNameChars(filename, false)) {

+            return 3;

+        }

+    }

+

+	// 文件名特殊字符检查

+	function checkFileNameChars(filename, isIncludePath) {

+		var ASCStringInvalid = '+/:*?<>\"\'\\|#&`~';

+		if(isIncludePath){

+			ASCStringInvalid = '+:*?<>\"\'\\|#&`~';

+		}

+		var flag = false;

+		var dotFlag = false;

+		var reg = /^\.+$/;

+		for ( var filenamelen = 0; filenamelen < filename.length; filenamelen++) {

+			for ( var ACSlen = 0; ACSlen < ASCStringInvalid.length; ACSlen++) {

+				if (filename.charAt(filenamelen) == ASCStringInvalid.charAt(ACSlen)) {

+					flag = true;

+					break;

+				}

+			}

+			if (reg.test(filename)) {

+				dotFlag = true;

+			}

+			if (flag || dotFlag) {

+				return false;

+			}

+		}

+		return true;

+	}

+

+

+    function checkuploadFileNameAndPath(fileName, newPath, fileSize){

+        if(!checkConfiguration()){

+            return false;

+        }

+

+		if (typeof fileName == "undefined" || fileName == '' || fileName == $.i18n.prop("no_file_selected")) {

+            showAlert("sd_no_file_selected");

+			return false;

+		}

+		if (newPath.length >= 200) {

+			showAlert("sd_card_path_too_long");

+			return false;

+		}

+

+		if (fileSize/1024/1024/1024 > 2){  //no more than 2G

+			showAlert("sd_file_size_too_big");

+			return false;

+		}		

+

+		if (fileName.indexOf('*') >= 0){  //no *

+			showAlert("sd_file_name_invalid");

+			return false;

+		}

+		return true;

+	}

+

+

+	//清空上传控件

+    function clearUploadInput(){

+        $("#fileField").closest('.customfile').before('<input id="fileField" name="filename" maxlength="200" type="file" dir="ltr"/>').remove();

+        addTimeout(function(){

+            $("#fileField").customFileInput();

+        }, 0);

+        $("#uploadBtn", "#uploadSection").attr("data-trans", "browse_btn").html($.i18n.prop('browse_btn'));

+        $(".customfile", "#uploadSection").removeAttr("title");

+        $(".customfile span.customfile-feedback", "#uploadSection")

+            .html('<span data-trans="no_file_selected">'+$.i18n.prop('no_file_selected')+'</span>')

+            .attr('class', 'customfile-feedback');

+    }

+

+

+    function getCurrentPath(){

+        return currentPath;

+    }

+

+    function setCurrentPath(path){

+        if(path.lastIndexOf("/") == path.length - 1){

+            currentPath = path.substring(0, path.length - 1);

+        } else {

+            currentPath = path;

+        }

+    }

+

+

+    function getFileSize(object){

+        var isIE = /msie/i.test(navigator.userAgent) && !window.opera; 

+        if (isIE) {  //如果是ie

+            var objValue = object.value;

+            try {  

+                var fileSysObj = new ActiveXObject("Scripting.FileSystemObject");  

+                fileLenth = parseInt(fileSysObj.GetFile(objValue).size);

+                } catch (e) {  //('IE内核取不到长度'); 

+                fileLenth	= 1;					

+            } 

+        }else{  //其他

+            try{//对于非IE获得要上传文件的大小

+                fileLenth = parseInt(object.files[0].size);

+                }catch (e) {

+                fileLenth=1;  //获取不到取-1

+            }

+        }

+        return fileLenth;

+    } 

+

+	function init() {

+		var container = $('#container')[0];

+		ko.cleanNode(container);

+		var fwVm = new HttpShareViewModel();

+		ko.applyBindings(fwVm, container);

+        bindEvent();

+	}

+

+

+    jQuery.validator.addMethod("check_filefold_name", function(value, element, param) {

+        var result = checkFileNameChars(value, false);

+        return this.optional(element) || result;

+    });

+

+    jQuery.validator.addMethod("sd_card_path_too_long", function(value, element, param) {

+        var newFolderName = $.trim($("#newFolderName").val());

+        var newPath = prePath + basePath + getCurrentPath() + "/" + newFolderName;

+        var result = true;

+        if (newPath.length >= 200) {

+            result = false;

+        }

+        return this.optional(element) || result;

+    });

+

+	return {

+		init : init

+	};

+});

+

+define("ussd","set service knockout jquery".split(" "), function (set, fnc, libko, libjq) {

+    var time_interval = 0;

+    var initFlg = true;

+    var numTimeout = 0;

+    var replyFlg = false;

+    var ussd_action = 1;

+

+    function init() {

+        var container = libjq('#container')[0];

+        libko.cleanNode(container);

+        var vm = new vmUSSD();

+        libko.applyBindings(vm, container);

+

+    }

+    var USSDLocation = {

+        SEND: 0,

+        REPLY: 1

+    };

+    function vmUSSD() {

+        var target = this;

+

+        target.hasUpdateCheck = set.HAS_UPDATE_CHECK;

+        target.ussd_action = libko.observable(ussd_action);

+        target.USSDLocation = libko.observable(USSDLocation.SEND);

+        target.USSDReply = libko.observable("");

+        target.USSDSend = libko.observable("");

+        target.hasDdns = set.DDNS_SUPPORT;

+

+        function checkTimeout() {

+            if (replyFlg) {

+                replyFlg = true;

+                window.clearInterval(time_interval);

+                numTimeout = 0;

+            } else {

+                if (numTimeout > 28) {

+                    replyFlg = true;

+                    window.clearInterval(time_interval);

+                    showAlert("ussd_operation_timeout");

+                    target.USSDReply("");

+                    target.USSDSend("");

+                    target.USSDLocation(USSDLocation.SEND);

+                    numTimeout = 0;

+

+                } else {

+                    numTimeout++;

+                }

+

+            }

+        };

+

+        target.sendToNet = function () {

+            numTimeout = 0;

+            window.clearInterval(time_interval);

+            var command = target.USSDSend();

+

+            var idx_t = 0;

+            var indexChar;

+            for (idx_t = 0; idx_t < command.length; ) { //corem0418, delte left blanks and right blanks

+                indexChar = command.charAt(idx_t);

+                if (indexChar == ' ') {

+                    if (command.length > 1) {

+                        command = command.substr(idx_t + 1);

+                    } else {

+                        command = ''; // string is filled with blank

+                        break;

+                    }

+                } else {

+                    break;

+                }

+            }

+

+            for (idx_t = command.length - 1; idx_t >= 0 && command.length > 0; --idx_t) {

+                indexChar = command.charAt(idx_t);

+                if (indexChar == ' ') {

+                    if (command.length > 1) {

+                        command = command.substr(0, idx_t);

+                    } else {

+                        command = ''; // string is filled with blank

+                        break;

+                    }

+                } else {

+                    break;

+                }

+            }

+

+            if (('string' != typeof(command)) || ('' == command)) {

+                showAlert("ussd_error_input");

+                return;

+            }

+

+            showLoading('waiting');

+

+            var tmp = {};

+            tmp.operator = "ussd_send";

+            tmp.strUSSDCommand = command;

+            tmp.sendOrReply = "send";

+

+            fnc.getUSSDResponse(tmp, function (result, content) {

+                hideLoading();

+                if (result) {

+                    USSD_reset();

+                    target.USSDLocation(USSDLocation.REPLY);

+                    target.ussd_action(content.ussd_action);

+                    libjq("#USSD_Content").val(decodeMessage(content.data, true));

+                    replyFlg = false;

+                    numTimeout = 0;

+                } else {

+                    showAlert(content);

+                }

+            });

+        };

+

+        target.replyToNet = function () {

+            numTimeout = 0;

+            window.clearInterval(time_interval);

+            var command = target.USSDReply();

+

+            var idx_t = 0;

+            var indexChar;

+            for (idx_t = 0; idx_t < command.length; ) { //corem0418, delte left blanks and right blanks

+                indexChar = command.charAt(idx_t);

+                if (indexChar == ' ') {

+                    if (command.length > 1) {

+                        command = command.substr(idx_t + 1);

+                    } else {

+                        command = ''; // string is filled with blank

+                        break;

+                    }

+                } else {

+                    break;

+                }

+            }

+

+            for (idx_t = command.length - 1; idx_t >= 0 && command.length > 0; --idx_t) {

+                indexChar = command.charAt(idx_t);

+                if (indexChar == ' ') {

+                    if (command.length > 1) {

+                        command = command.substr(0, idx_t);

+                    } else {

+                        command = ''; // string is filled with blank

+                        break;

+                    }

+                } else {

+                    break;

+                }

+            }

+

+            if (('string' != typeof(command)) || ('' == command)) {

+                showAlert("ussd_error_input");

+                return;

+            }

+

+            showLoading('waiting');

+

+            var tmp = {};

+            tmp.operator = "ussd_reply";

+            tmp.strUSSDCommand = command;

+            tmp.sendOrReply = "reply";

+

+            fnc.getUSSDResponse(tmp, function (result, content) {

+                hideLoading();

+                if (result) {

+                    target.ussd_action(content.ussd_action);

+                    libjq("#USSD_Content").val(decodeMessage(content.data, true));

+                    replyFlg = false;

+                    USSD_reset();

+                    numTimeout = 0;

+                } else {

+                    showAlert(content);

+                }

+            });

+        };

+

+        USSD_reset = function () {

+            target.USSDReply("");

+            target.USSDSend("");

+        };

+        USSD_cancel = function () {

+            fnc.USSDReplyCancel(function (result) {});

+        };

+

+        target.noReplyCancel = function () {

+            numTimeout = 0;

+            replyFlg = true;

+            window.clearInterval(time_interval);

+            fnc.USSDReplyCancel(function (result) {

+                if (result) {

+                    USSD_reset();

+                    target.USSDLocation(USSDLocation.SEND);

+                } else {

+                    showAlert("ussd_fail");

+                }

+            });

+        };

+

+        //如果首次进入USSD菜单,先发送USSD取消命令,进行初始化

+        if (initFlg) {

+            USSD_cancel();

+            initFlg = false;

+        }

+    }

+

+    return {

+        init: init

+    };

+});

+

+

+define("phonebook","underscore jquery knockout set service jq_chosen".split(" "),

+

+    function (_, $, ko, config, service, chosen) {

+

+    var locationValue = {

+        SIM: "0",

+        DEVICE: "1"

+    };

+    var pageState = {

+        LIST: 0,

+        NEW: 1,

+        EDIT: 2,

+        VIEW: 3,

+        SEND_MSM: 4

+    };

+    //存储位置选项

+    var saveLocationOpts = function (hasSIMCard) {

+        var opts = [];

+        opts.push(new Option($.i18n.prop("device_book"), locationValue.DEVICE));

+        if (hasSIMCard) {

+            opts.push(new Option($.i18n.prop("sim_book"), locationValue.SIM));

+        }

+        return opts;

+    };

+

+    function getCurrentGroup() {

+        return $("#selectedFilterGroup").val();

+    }

+    //列表模板对应的Columns

+    var templateColumns = {

+        cardColumns: [{

+                rowText: "index",

+                display: false

+            }, {

+                rowText: "name"

+            }, {

+                rowText: "mobile_phone_number"

+            }, {

+                rowText: "home_phone_number"

+            }

+        ],

+        listColumns: [{

+                columnType: "checkbox",

+                headerTextTrans: "number",

+                rowText: "index",

+                width: "10%"

+            }, {

+                headerTextTrans: "name",

+                rowText: "name",

+                width: "25%",

+                sortable: true

+            }, {

+                columnType: "image",

+                headerTextTrans: "save_location",

+                rowText: "imgLocation",

+                width: "20%",

+                sortable: true

+            }, {

+                headerTextTrans: "mobile_phone_number",

+                rowText: "mobile_phone_number",

+                width: "30%",

+                sortable: true

+            }, {

+                headerTextTrans: "group",

+                rowText: "transGroup",

+                width: "15%",

+                sortable: true,

+                needTrans: true

+            }

+        ]

+    };

+    //分组选项

+    var groupOpts = function () {

+        var opts = [];

+        opts.push(new Option($.i18n.prop("common"), "common"));

+        opts.push(new Option($.i18n.prop("family"), "family"));

+        opts.push(new Option($.i18n.prop("friend"), "friend"));

+        opts.push(new Option($.i18n.prop("colleague"), "colleague"));

+        return opts;

+    };

+

+    var _phoneBookStopSMSSending = false;

+

+    function pbViewMode() {

+        var target = this;

+

+        //property for common

+        target.pageState = ko.observable(pageState.LIST);

+        target.initFail = ko.observable(true);

+        target.hasSms = ko.observable(config.HAS_SMS);

+

+        var smsHasCapability = true;

+        var smsLeftCount = 0;

+

+        //property for list

+        var capacity = {

+            simMaxNameLen: 0,

+            simMaxNumberLen: 0,

+            IsSimCardFull: true,

+            IsDeviceFull: true,

+            Used: 0,

+            Capacity: 0,

+            Ratio: "(0/0)"

+        };

+        target.capacity = ko.observable(capacity);

+        target.phoneBookCapacity = ko.observable(capacity.Ratio);

+        target.books = ko.observableArray();

+        //列表模板创建

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            tableClass: "table-fixed",

+            data: target.books(),

+            idName: "index",

+            columns: templateColumns.listColumns,

+            defaultSortField: "name",

+            defaultSortDirection: "ASC",

+            pageSize: 10,

+            tmplType: 'list',

+            searchColumns: ["name", "mobile_phone_number"],

+            primaryColumn: "mobile_phone_number",

+            showPager: true,

+            rowClickHandler: function (dataId) {

+                target.editBooks(dataId, 'view');

+            },

+            deleteHandler: function (dataId) {

+                target.deleteOneBook(dataId);

+            },

+            changeTemplateHandler: function () {

+                target.changeTemplate();

+            }

+        });

+

+        //property for edit or new

+        target.locations = ko.observableArray();

+        target.originLocation = "";

+        target.selectedLocation = ko.observable(locationValue.DEVICE);

+        target.locationTrans = ko.observable();

+        target.locationTransText = ko.observable();

+        target.index = ko.observable(-1);

+        target.name = ko.observable("");

+        target.nameMaxLength = ko.computed(function () {

+            var max = getNameMaxLength();

+            var name = target.name().substring(0, max);

+            target.name(name);

+            return getNameMaxLength();

+        });

+        function getNameMaxLength() {

+            var max = 22;

+            if (target.selectedLocation() == locationValue.DEVICE) {

+                var encodeType = getEncodeType(target.name());

+                if ("UNICODE" == encodeType.encodeType || encodeType.extendLen > 0) {

+                    max = 11;

+                } else {

+                    max = 22;

+                }

+                //max = 22;

+            } else {

+                //对"^"需要按照2个字符处理

+                var encodeType = getEncodeType(target.name());

+                if ("UNICODE" == encodeType.encodeType || encodeType.extendLen > 0) {

+                    max = (target.capacity().simMaxNameLen / 2) - 1;

+                } else {

+                    max = target.capacity().simMaxNameLen;

+                }

+            }

+            return max;

+        }

+

+        target.mobile_phone_number = ko.observable("");

+        target.mobileMaxLength = ko.computed(function () {

+            var max = getMobileMaxLength();

+            var mobileNumber = target.mobile_phone_number().substring(0, max);

+            target.mobile_phone_number(mobileNumber);

+            return getMobileMaxLength();

+        });

+        function getMobileMaxLength() {

+            var max = 40;

+            if (target.selectedLocation() == locationValue.DEVICE) {

+                max = 40;

+            } else {

+                max = target.capacity().simMaxNumberLen;

+            }

+            return max;

+        }

+

+        target.home_phone_number = ko.observable("");

+        target.office_phone_number = ko.observable("");

+        target.mail = ko.observable("");

+        target.transEditAreaTitle = ko.dependentObservable(function () {

+            var state = target.pageState();

+            if (state == pageState.EDIT) {

+                return "edit";

+            } else if (state == pageState.NEW) {

+                return "new";

+            } else if (state == pageState.VIEW) {

+                return "view";

+            }

+        });

+        var groups = groupOpts();

+        target.groups = ko.observableArray(groups);

+        target.selectedGroup = ko.observable();

+        target.groupTrans = ko.observable();

+        target.groupTransText = ko.observable();

+

+        target.selectedFilterGroup = ko.observable('all');

+        target.selectedFilterGroupChangeHandler = function () {

+            target.selectedFilterGroup($("#selectedFilterGroup").val());

+            getPhoneBookReady();

+        };

+

+        //property for sendMessage

+        target.showErrorInfo = ko.observable(false);

+        target.messageContent = ko.observable("");

+        target.messageCount = ko.computed(function () {

+            var msgInput = $("#txtSmsContent", "#sendMessage");

+            var msgInputDom = msgInput[0];

+            target.messageContent();

+            var strValue = msgInput.val();

+            var encodeType = getEncodeType(strValue);

+            var maxLength = encodeType.encodeType == 'UNICODE' ? 335 : 765;

+            if (strValue.length + encodeType.extendLen > maxLength) {

+                var scrollTop = msgInputDom.scrollTop;

+                var insertPos = getInsertPos(msgInputDom);

+                var moreLen = strValue.length + encodeType.extendLen - maxLength;

+                var insertPart = strValue.substr(insertPos - moreLen > 0 ? insertPos - moreLen : 0, moreLen);

+                var reversed = insertPart.split('').reverse();

+                var checkMore = 0;

+                var cutNum = 0;

+                for (var i = 0; i < reversed.length; i++) {

+                    if (getEncodeType(reversed[i]).extendLen > 0) {

+                        checkMore += 2;

+                    } else {

+                        checkMore++;

+                    }

+                    if (checkMore >= moreLen) {

+                        cutNum = i + 1;

+                        break;

+                    }

+                }

+                var iInsertToStartLength = insertPos - cutNum;

+

+                target.messageContent(strValue.substr(0, iInsertToStartLength) + strValue.substr(insertPos));

+                if (target.messageContent().length > maxLength) {

+                    target.messageContent(target.messageContent().substr(0, maxLength));

+                }

+                setInsertPos(msgInputDom, iInsertToStartLength);

+                msgInputDom.scrollTop = scrollTop;

+            }

+            pbDraftListener();

+            var newValue = $(msgInputDom).val();

+            var newEncodeType = getEncodeType(newValue);

+            var newMaxLength = newEncodeType.encodeType == 'UNICODE' ? 335 : 765;

+            if (newValue.length + newEncodeType.extendLen >= newMaxLength) {

+                $("#msgCount").addClass("colorRed");

+            } else {

+                $("#msgCount").removeClass("colorRed");

+            }

+            return "(" + (newValue.length + newEncodeType.extendLen) + "/" + newMaxLength + ")" + "(" + getSmsCount(newValue) + "/5)";

+        });

+

+        target.clear = function (isNeedInit) {

+            if (target.pageState() == pageState.SEND_MSM) {

+                smsPageCheckDraft(clearPhonebookForm, isNeedInit);

+            } else {

+                clearPhonebookForm(isNeedInit);

+            }

+            config.resetContentModifyValue();

+        };

+

+        //通过按钮返回列表状态事件处理

+        target.btnClear = function (isNeedInit) {

+            if (target.pageState() == pageState.SEND_MSM) {

+                smsPageCheckDraft(clearPhonebookForm, isNeedInit);

+                config.resetContentModifyValue();

+            } else if ((target.pageState() == pageState.NEW || target.pageState() == pageState.EDIT) && (target.preContent.location != target.selectedLocation()

+                     || target.preContent.name != target.name()

+                     || target.preContent.mobile_phone_number != target.mobile_phone_number()

+                     || target.preContent.home_phone_number != target.home_phone_number()

+                     || target.preContent.office_phone_number != target.office_phone_number()

+                     || target.preContent.mail != target.mail()

+                     || target.preContent.group != target.selectedGroup())) {

+                showConfirm("leave_page_info", {

+                    ok: function () {

+                        clearPhonebookForm(isNeedInit);

+                        config.resetContentModifyValue();

+                    },

+                    no: function () {

+                        return false;

+                    }

+                });

+            } else {

+                clearPhonebookForm(isNeedInit);

+                config.resetContentModifyValue();

+            }

+        };

+

+        function clearPhonebookForm(isNeedInit) {

+            $("#frmPhoneBook").hide();

+            target.pageState(pageState.LIST);

+            target.index(-1);

+            target.name("");

+            target.mobile_phone_number("");

+            target.home_phone_number("");

+            target.office_phone_number("");

+            target.mail("");

+            target.messageContent("");

+            if (true == isNeedInit) {

+                refreshPage();

+            }

+            target.gridTemplate.clearAllChecked();

+            clearValidateMsg();

+            $("#books ").translate();

+            $("#frmPhoneBook").show();

+        }

+

+        //检查SIM卡状态

+        target.checkHasSIMCard = function (showMsg) {

+            var status = service.getStatusInfo();

+            if (status.simStatus != "modem_init_complete") {

+                if (showMsg) {

+                    showAlert("sim_removed", function () {

+                        target.pageState(pageState.LIST);

+                        target.clear(true);

+                    });

+                }

+                return false;

+            }

+            return true;

+        };

+

+        //保存电话本事件

+        target.save = function () {

+            var saveBook = function (index) {

+                var isSaveInSIM = (location == locationValue.SIM);

+                if (isSaveInSIM) {

+                    if (!target.checkHasSIMCard(true)) {

+                        return;

+                    }

+                }

+                if (target.pageState() == pageState.NEW || (target.pageState() == pageState.EDIT && location != target.originLocation)) {

+                    if (isSaveInSIM) {

+                        if (target.capacity().IsSimCardFull) {

+                            showAlert("sim_full");

+                            return;

+                        }

+                    } else {

+                        if (target.capacity().IsDeviceFull) {

+                            showAlert("device_full");

+                            return;

+                        }

+                    }

+                }

+                var name = target.name();

+                var mobile_phone_number = target.mobile_phone_number();

+                if ($.trim(name) == "" || $.trim(mobile_phone_number) == "") {

+                    return;

+                }

+                showLoading('saving');

+                var params = {};

+                params.location = location;

+                params.index = index;

+                params.name = name;

+                params.mobile_phone_number = mobile_phone_number;

+                if (!isSaveInSIM) {

+                    params.home_phone_number = target.home_phone_number();

+                    params.office_phone_number = target.office_phone_number();

+                    params.mail = target.mail();

+                    params.group = target.selectedGroup();

+                }

+                if (target.selectedLocation() != target.originLocation) {

+                    params.delId = target.index();

+                }

+                service.savePhoneBook(params, target.callback);

+            }

+            var location = target.selectedLocation();

+            var editIndex = (location == target.originLocation) ? target.index() : -1;

+            if (location == locationValue.SIM && target.originLocation == locationValue.DEVICE) {

+                showConfirm("change_device_to_sim_confirm", function () {

+                    saveBook(editIndex);

+                });

+            } else {

+                saveBook(editIndex);

+            }

+        };

+        //打开添加电话本记录页面事件

+        target.openNewPage = function () {

+            if (target.pageState() == pageState.SEND_MSM) {

+                pbDraftListener();

+                smsPageCheckDraft(openNewPageAct, false);

+            } else if (target.pageState() == pageState.EDIT && (target.preContent.location != target.selectedLocation()

+                     || target.preContent.name != target.name()

+                     || target.preContent.mobile_phone_number != target.mobile_phone_number()

+                     || target.preContent.home_phone_number != target.home_phone_number()

+                     || target.preContent.office_phone_number != target.office_phone_number()

+                     || target.preContent.mail != target.mail()

+                     || target.preContent.group != target.selectedGroup())) {

+                showConfirm("leave_page_info", {

+                    ok: function () {

+                        openNewPageAct(false);

+                    },

+                    no: function () {

+                        return false;

+                    }

+                });

+            } else {

+                openNewPageAct(false);

+            }

+        };

+        function openNewPageAct(isNeedInit) {

+            target.pageState(pageState.NEW);

+            target.selectedLocation(locationValue.DEVICE);

+            target.originLocation = "";

+            if (target.checkHasSIMCard(false)) {

+                target.locations(saveLocationOpts(true));

+            } else {

+                target.locations(saveLocationOpts(false));

+            }

+            var group = getCurrentGroup();

+            if (group != "all") {

+                target.selectedGroup(group);

+            } else {

+                target.selectedGroup("common");

+            }

+            target.name("");

+            target.mobile_phone_number("");

+            target.home_phone_number("");

+            target.office_phone_number("");

+            target.mail("");

+            target.index(-1);

+            target.dynamicTranslate();

+            preOpenEditPage();

+        }

+        //打开添加电话本记录编辑页面事件

+        target.openPage = function (option) {

+            var index;

+            if (target.pageState() == pageState.LIST) {

+                var result = target.checkSelect(option);

+                if (!result.isCorrectData)

+                    return;

+                index = result.selectedIds[0];

+            } else {

+                index = target.index();

+            }

+            target.editBooks(index, option);

+        };

+        //打开添加电话本记录查看页面事件

+        target.openViewPage = function () {

+            target.openPage("view");

+        };

+        //打开添加电话本记录查看页面事件

+        target.openEditPage = function () {

+            target.openPage("edit");

+            if ($.browser.mozilla) {

+                $("#txtName, #txtMobile").removeAttr('maxlength');

+            }

+            preOpenEditPage();

+        };

+        //编辑电话本事件处理

+        target.editBooks = function (selectedId, option) {

+            if (!selectedId)

+                return;

+

+            if (target.checkHasSIMCard(false)) {

+                target.locations(saveLocationOpts(true));

+            } else {

+                target.locations(saveLocationOpts(false));

+            }

+            var data = target.books();

+            for (var i = 0; i < data.length; i++) {

+                var n = data[i];

+                if (n.index == selectedId) {

+                    target.index(n.index);

+                    target.selectedLocation(n.location);

+                    target.originLocation = n.location;

+                    var trans = (n.location == locationValue.DEVICE) ? "device" : "sim";

+                    target.locationTrans(trans);

+                    var transText = $.i18n.prop("trans");

+                    target.locationTransText(transText);

+                    target.name(n.name);

+                    target.mobile_phone_number(n.mobile_phone_number);

+                    target.home_phone_number(n.home_phone_number);

+                    target.office_phone_number(n.office_phone_number);

+                    target.mail(n.mail);

+                    target.selectedGroup(n.group);

+                    target.groupTrans("group_" + n.group);

+                    target.groupTransText($.i18n.prop(target.groupTrans()));

+                    if (option == "edit") {

+                        target.pageState(pageState.EDIT);

+                    } else {

+                        target.pageState(pageState.VIEW);

+                    }

+                    break;

+                }

+            }

+            target.dynamicTranslate();

+

+            if (target.selectedLocation() == locationValue.SIM) {

+                target.checkHasSIMCard(true)

+            }

+        };

+        //翻译编辑区域

+        target.dynamicTranslate = function () {

+            $("#container").translate();

+        };

+        //删除一条电话本事件处理(card模式使用)

+        target.deleteOneBook = function (index) {

+            showConfirm("confirm_pb_delete", function () {

+                showLoading('deleting');

+                var params = {};

+                params.indexs = [String(index)];

+                service.deletePhoneBooks(params, target.callback);

+            });

+            return false;

+        };

+        //删除一条电话本事件处理

+        target.deleteBook = function () {

+            target.deleteOneBook(target.index());

+        };

+        //删除一条或多条电话本事件处理

+        target.deleteBooks = function () {

+            var result = target.checkSelect("delete");

+            if (!result.isCorrectData)

+                return;

+            showConfirm("confirm_pb_delete", function () {

+                showLoading('deleting');

+                var params = {};

+                params.indexs = result.selectedIds;

+                service.deletePhoneBooks(params, target.callback);

+            });

+        };

+        //判断电话本选中

+        target.checkSelect = function (pState) {

+            var ids;

+            if ("send" == pState) {

+                ids = target.gridTemplate.selectedPrimaryValue();

+            } else {

+                ids = target.gridTemplate.selectedIds();

+            }

+

+            var isCorrectData = true;

+            if (ids.length == 0) {

+                showAlert("no_data_selected");

+                isCorrectData = false;

+            } else if ("edit" == pState || "view" == pState) {

+                if (ids.length > 1) {

+                    showAlert("too_many_data_selected");

+                    isCorrectData = false;

+                }

+            } else if ("send" == pState) {

+                if (ids.length > 5) {

+                    showAlert("max_send_number");

+                    isCorrectData = false;

+                }

+            }

+            return {

+                selectedIds: ids,

+                isCorrectData: isCorrectData

+            };

+        };

+        //全部删除电话本事件处理

+        target.deleteAllBooks = function () {

+            showConfirm("confirm_data_delete", function () {

+                showLoading('deleting');

+                var group = getCurrentGroup();

+                var params = {};

+                if (group == "all") {

+                    params.location = 2;

+                    service.deleteAllPhoneBooks(params, target.callback);

+                } else {

+                    params.location = 3;

+                    params.group = group;

+                    service.deleteAllPhoneBooksByGroup(params, target.callback);

+                }

+            });

+        };

+

+        target.callback = function (data) {

+            if (data && data.result == "success") {

+                target.clear(true);

+                $("#books ").translate();

+                renderCheckbox();

+                successOverlay(null, true);

+            } else {

+                errorOverlay();

+            }

+        };

+        //变换显示方式事件处理

+        target.changeTemplate = function () {

+            if (target.gridTemplate.tmplType == "card") {

+                target.gridTemplate.tmplType = "list";

+                target.gridTemplate.pageSize = 10;

+                target.gridTemplate.columns = templateColumns.listColumns;

+            } else {

+                target.gridTemplate.tmplType = "card";

+                target.gridTemplate.pageSize = 10;

+                target.gridTemplate.columns = templateColumns.cardColumns;

+            }

+            refreshPage();

+            $("#books ").translate();

+        };

+        //显示发送短信页面

+        target.openSendMessagePage = function () {

+            if (pageState.SEND_MSM == target.pageState()) {

+                return;

+            }

+            if ((target.pageState() == pageState.EDIT || pageState.NEW == target.pageState()) && (target.preContent.location != target.selectedLocation()

+                     || target.preContent.name != target.name()

+                     || target.preContent.mobile_phone_number != target.mobile_phone_number()

+                     || target.preContent.home_phone_number != target.home_phone_number()

+                     || target.preContent.office_phone_number != target.office_phone_number()

+                     || target.preContent.mail != target.mail()

+                     || target.preContent.group != target.selectedGroup())) {

+                showConfirm("leave_page_info", {

+                    ok: function () {

+                        openSendMessagePageAct();

+                    },

+                    no: function () {

+                        return false;

+                    }

+                });

+            } else {

+                openSendMessagePageAct();

+            }

+        };

+

+        function openSendMessagePageAct() {

+            if (pageState.NEW == target.pageState()) {

+                target.pageState(pageState.SEND_MSM);

+                showAlert("no_data_selected");

+                target.clear();

+                return;

+            }

+            var selectedNumber = null;

+            if (pageState.LIST == target.pageState()) {

+                var result = target.checkSelect("send");

+                if (!result.isCorrectData)

+                    return;

+                selectedNumber = result.selectedIds;

+            } else {

+                selectedNumber = target.mobile_phone_number();

+            }

+

+            var select = $("#chosenUserList .chosen-select-deselect");

+            select.empty();

+            var options = [];

+            var tmp = [];

+            for (var j = 0; j < config.phonebook.length; j++) {

+                var book = config.phonebook[j];

+                if ($.inArray(book.pbm_number, tmp) == -1) {

+                    options.push(new Option(book.pbm_name + "/" + book.pbm_number, book.pbm_number, false, true));

+                    tmp.push(book.pbm_number);

+                } else {

+                    for (var i = 0; i < options.length; i++) {

+                        if (options[i].value == book.pbm_number) {

+                            options[i].text = book.pbm_name + "/" + book.pbm_number;

+                            break;

+                        }

+                    }

+                }

+            }

+            var opts = "";

+            $.each(options, function (i, e) {

+                opts += "<option value='" + HTMLEncode(e.value) + "'>" + HTMLEncode(e.text) + "</option>";

+            });

+            select.append(opts);

+            select.chosen({

+                max_selected_options: 5,

+                search_contains: true,

+                width: '545px'

+            });

+            $("#chosenUserSelect").val(selectedNumber);

+            $("#chosenUserSelect").trigger("chosen:updated.chosen");

+            config.resetContentModifyValue();

+            pbDraftListener();

+            target.pageState(pageState.SEND_MSM);

+        }

+

+        //发送短信

+        target.sendMessage = function () {

+            service.getSmsCapability({}, function (capability) {

+                var hasCapability = capability.nvUsed < capability.nvTotal;

+                if (!hasCapability) {

+                    showAlert("sms_capacity_is_full_for_send");

+                    return false;

+                }

+                var numbers = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+                if (numbers.length + capability.nvUsed > capability.nvTotal) {

+                    showAlert({

+                        msg: "sms_capacity_will_full_just",

+                        params: [capability.nvTotal - capability.nvUsed]

+                    });

+                    return false;

+                }

+                target.sendMessageAction();

+                return true;

+            });

+        };

+

+        target.sendMessageAction = function () {

+            var numbers = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+

+            if (!numbers || numbers.length == 0) {

+                target.showErrorInfo(true);

+                var timer = addTimeout(function () {

+                    target.showErrorInfo(false);

+                    window.clearTimeout(timer);

+                }, 5000);

+                return;

+            }

+            var content = target.messageContent();

+            var sentCount = 0;

+            var failCount = 0;

+            if (numbers.length > 1) {

+                showLoading("sending", "<button id='btnStopSending' onclick='phoneBookStopSMSSending();' class='btn btn-primary'>"

+                     + $.i18n.prop("sms_stop_sending")

+                     + "</button>");

+            } else {

+                showLoading('sending');

+            }

+            var callback = function (data) {

+                sentCount++;

+                if (sentCount == numbers.length) {

+                    $("#chosenUserSelect").val("");

+                    target.messageContent("");

+                    config.CONTENT_MODIFIED.modified = false;

+                    if (failCount == 0) {

+                        successOverlay();

+                        location.hash = "#msg_list";

+                    } else {

+                        var msg = $.i18n.prop("success_info") + $.i18n.prop("colon") + (sentCount - failCount)

+                             + "<br/>" + $.i18n.prop("error_info") + $.i18n.prop("colon") + (failCount);

+                        showAlert(msg, function () {

+                            location.hash = "#msg_list";

+                        });

+                    }

+

+                } else {

+                    sendSMS();

+                }

+            }

+            _phoneBookStopSMSSending = false;

+            var sendSMS = function () {

+                if (_phoneBookStopSMSSending) {

+                    hideLoading();

+                    return;

+                }

+                if ((sentCount + 1) == numbers.length) {

+                    $("#loading #loading_container").html("");

+                }

+                service.sendSMS({

+                    number: numbers[sentCount],

+                    message: content,

+                    id: -1

+                }, function (data) {

+                    callback(data);

+                }, function (data) {

+                    failCount++;

+                    callback(data);

+                });

+            };

+            sendSMS();

+        };

+        //清除搜索关键字事件

+        target.clearSearchKey = function () {

+            target.gridTemplate.searchInitStatus(true);

+            target.gridTemplate.searchKey($.i18n.prop("search"));

+            $("#ko_grid_search_txt").addClass("ko-grid-search-txt-default").attr("data-trans", "search");

+        };

+        //点击搜索输入框事件

+        target.searchTextClick = function () {

+            var searchText = $("#ko_grid_search_txt");

+            if (searchText.hasClass("ko-grid-search-txt-default")) {

+                target.gridTemplate.searchKey("");

+                target.gridTemplate.searchInitStatus(false);

+                searchText.removeClass("ko-grid-search-txt-default").removeAttr("data-trans");

+            }

+        };

+        //离开搜索输入框事件

+        target.searchTextBlur = function () {

+            var txt = $.trim(target.gridTemplate.searchKey()).toLowerCase();

+            if (txt == "") {

+                target.clearSearchKey();

+            }

+        };

+        //当前表格是否有数据

+        target.hasData = ko.computed(function () {

+            return target.gridTemplate.afterSearchData().length > 0;

+        });

+        //当前表格是否有选中的数据

+        target.hasChecked = ko.computed(function () {

+            return target.gridTemplate.checkedCount() > 0;

+        });

+        //是否可以点击发送按钮

+        target.canSend = ko.computed(function () {

+            var checked = target.gridTemplate.checkedCount();

+            if (!target.checkHasSIMCard(false)) {

+                return false;

+            }

+            return (checked > 0 && checked <= 5);

+        });

+

+        //发送短信时,选择用户变化的监控事件

+        target.draftListenerEvent = function () {

+            pbDraftListener();

+        };

+        //文档内容监听,判断是否修改过

+        function pbDraftListener() {

+            var smsHasCapability = true;

+            if (smsHasCapability) {

+                var content = target.messageContent();

+                var hasContent = false;

+                var numbers = getSelectValFromChosen($('.search-choice', '#chosenUserSelect_chosen'));

+                var noContactSelected = !(numbers && numbers.length > 0);

+                if (typeof content == "undefined" || content == '') {

+                    config.resetContentModifyValue();

+                    return false;

+                } else {

+                    hasContent = true;

+                }

+                if (hasContent && !noContactSelected) {

+                    config.CONTENT_MODIFIED.modified = true;

+                    config.CONTENT_MODIFIED.message = 'sms_to_save_draft';

+                    config.CONTENT_MODIFIED.callback.ok = saveDraftAction;

+                    config.CONTENT_MODIFIED.callback.no = $.noop;

+                    config.CONTENT_MODIFIED.data = {

+                        content: content,

+                        numbers: numbers

+                    };

+                    return false;

+                }

+                if (hasContent && noContactSelected) {

+                    config.CONTENT_MODIFIED.modified = true;

+                    config.CONTENT_MODIFIED.message = 'sms_no_recipient';

+                    config.CONTENT_MODIFIED.callback.ok = $.noop;

+                    config.CONTENT_MODIFIED.callback.no = function () {

+                        // 返回true,页面保持原状

+                        return true;

+                    };

+                    return false;

+                }

+            }

+            /*else { cov_2

+            config.resetContentModifyValue();

+            }*/

+        }

+

+        function saveDraftAction(data) {

+            var datetime = new Date();

+            var params = {

+                index: -1,

+                currentTimeString: getCurrentTimeString(datetime),

+                groupId: data.numbers.length > 1 ? datetime.getTime() : '',

+                message: data.content,

+                numbers: data.numbers

+            };

+            service.saveSMS(params, function () {

+                successOverlay('sms_save_draft_success');

+            }, function () {

+                errorOverlay("sms_save_draft_failed")

+            });

+        }

+        function smsPageCheckDraft(clearCallback, isNeedInit) {

+            if (config.CONTENT_MODIFIED.message != 'sms_to_save_draft') {

+                if (config.CONTENT_MODIFIED.modified) {

+                    showConfirm(config.CONTENT_MODIFIED.message, {

+                        ok: function () {

+                            config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                            clearCallback(isNeedInit);

+                        },

+                        no: function () {

+                            if (config.CONTENT_MODIFIED.message == 'sms_to_save_draft') {

+                                clearCallback(isNeedInit);

+                            }

+                            return false;

+                        }

+                    });

+                    return false;

+                } else {

+                    clearCallback(isNeedInit);

+                }

+            } else {

+                config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                clearCallback(isNeedInit);

+            }

+        }

+

+        //重新获取页面数据并显示

+        function getPhoneBookReady() {

+            service.getPhoneBookReady({}, function (data) {

+                if (data.pbm_init_flag == "6") {

+                    target.initFail(true);

+                    hideLoading();

+                    showAlert("phonebook_init_fail");

+                } else if (data.pbm_init_flag != "0") {

+                    addTimeout(getPhoneBookReady, 1000);

+                } else {

+                    target.initFail(false);

+                    var capacity = getCapacity();

+                    target.capacity(capacity);

+                    target.phoneBookCapacity(capacity.Ratio);

+                    var phoneBooks = getBooks(capacity.Used);

+                    target.books(phoneBooks);

+                    target.gridTemplate.data(phoneBooks);

+                    $('#books').find('tbody').translate();

+                    hideLoading();

+                }

+            });

+        }

+

+        showLoading('waiting');

+        addTimeout(getPhoneBookReady, 200);

+

+        //重新获取页面数据并显示

+        function refreshPage() {

+            showLoading();

+            var capacity = getCapacity();

+            target.phoneBookCapacity(capacity.Ratio);

+            target.capacity(capacity);

+            var books = getBooks(capacity.Used);

+            target.books(books);

+            target.gridTemplate.data(books);

+            hideLoading();

+        }

+

+        target.preContent = {};

+        //保存编辑前的内容

+        function setPreContent() {

+            target.preContent.location = target.selectedLocation();

+            target.preContent.name = target.name();

+            target.preContent.mobile_phone_number = target.mobile_phone_number();

+            target.preContent.home_phone_number = target.home_phone_number();

+            target.preContent.office_phone_number = target.office_phone_number();

+            target.preContent.mail = target.mail();

+            target.preContent.group = target.selectedGroup();

+        }

+

+        //检测数据是否改变

+        function checkContentChang() {

+            var changed = (target.preContent.location != target.selectedLocation()

+                 || target.preContent.name != target.name()

+                 || target.preContent.mobile_phone_number != target.mobile_phone_number()

+                 || target.preContent.home_phone_number != target.home_phone_number()

+                 || target.preContent.office_phone_number != target.office_phone_number()

+                 || target.preContent.mail != target.mail()

+                 || target.preContent.group != target.selectedGroup());

+            config.CONTENT_MODIFIED.modified = changed;

+        }

+

+        function preOpenEditPage() {

+            config.resetContentModifyValue();

+            setPreContent();

+            config.CONTENT_MODIFIED.checkChangMethod = checkContentChang;

+        }

+    }

+

+    //设置停止发送标志为true

+    phoneBookStopSMSSending = function () {

+        _phoneBookStopSMSSending = true;

+        $("#loading #loading_container").html($.i18n.prop("sms_cancel_sending"));

+    }

+

+    //获取电话本

+    function getBooks(capacity) {

+        var para = {};

+        para.page = 0;

+        para.data_per_page = capacity;

+        para.orderBy = "name";

+        para.isAsc = true;

+        var books = [];

+        var group = getCurrentGroup();

+        if (config.HAS_SMS) {

+            books = service.getPhoneBooks(para);

+            config.phonebook = books.pbm_data;

+            if (group != "all") {

+                books = {

+                    "pbm_data": _.filter(books.pbm_data, function (item) {

+                        return item.pbm_group == group;

+                    })

+                };

+            }

+        } else {

+            if (group != "all") {

+                para.group = group;

+                books = service.getPhoneBooksByGroup(para);

+            } else {

+                books = service.getPhoneBooks(para);

+            }

+        }

+        return translateData(books.pbm_data);

+    }

+

+    //获取电话本容量信息

+    function getCapacity() {

+        var sim = service.getSIMPhoneBookCapacity();

+        var device = service.getDevicePhoneBookCapacity();

+        return {

+            simUsed: sim.simPbmUsedCapacity,

+            deviceUsed: device.pcPbmUsedCapacity,

+            simCapacity: sim.simPbmTotalCapacity,

+            deviceCapacity: device.pcPbmTotalCapacity,

+            simMaxNameLen: sim.maxNameLen,

+            simMaxNumberLen: sim.maxNumberLen,

+            IsSimCardFull: (sim.simPbmUsedCapacity == sim.simPbmTotalCapacity),

+            IsDeviceFull: (device.pcPbmUsedCapacity == device.pcPbmTotalCapacity),

+            Used: sim.simPbmUsedCapacity + device.pcPbmUsedCapacity,

+            Capacity: sim.simPbmTotalCapacity + device.pcPbmTotalCapacity,

+            Ratio: "(" + (sim.simPbmUsedCapacity + device.pcPbmUsedCapacity) + "/" + (sim.simPbmTotalCapacity + device.pcPbmTotalCapacity) + ")"

+        };

+    }

+

+    function translateData(books) {

+        var ret = [];

+        var group = getCurrentGroup();

+        var hasFilter = (group != "all");

+        if (books) {

+            for (var i = 0; i < books.length; i++) {

+                if (hasFilter) {

+                    var currentGroup = books[i].pbm_group;

+                    if (books[i].pbm_location == locationValue.SIM || currentGroup != group) {

+                        continue;

+                    }

+                }

+                var temp = {

+                    index: books[i].pbm_id,

+                    location: books[i].pbm_location,

+                    imgLocation: books[i].pbm_location == locationValue.SIM ? "pic/simcard.png" : "pic/res_device.png",

+                    name: books[i].pbm_name,

+                    mobile_phone_number: books[i].pbm_number,

+                    home_phone_number: books[i].pbm_anr,

+                    office_phone_number: books[i].pbm_anr1,

+                    mail: books[i].pbm_email,

+                    group: books[i].pbm_group,

+                    transGroup: (!books[i].pbm_group) ? "group_null" : "group_" + books[i].pbm_group

+                };

+                ret.push(temp);

+            }

+        }

+        return ret;

+    }

+    //初始化ViewModel并进行绑定

+    function init() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new pbViewMode();

+        ko.applyBindings(vm, container[0]);

+        $("#txtSmsContent").die().live("contextmenu", function () {

+            return false;

+        });

+        $('#frmPhoneBook').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtMail: "email_check",

+                txtName: "name_check",

+                txtMobile: "phonenumber_check",

+                txtHomeNumber: "phonenumber_check",

+                txtOfficeNumber: "phonenumber_check"

+            }

+        });

+

+    }

+

+    return {

+        init: init

+    };

+});

+

+define("sms_list","underscore jquery knockout set service jq_chosen".split(" "),

+    function (_, $, ko, config, service, chosen) {

+

+    var currentPage = 1;

+    //数据是否加载完成

+    var ready = false,

+    //聊天室信息正在加载中

+    chatRoomInLoading = false;

+    //快速添加联系人模板

+    var addPhonebookTmpl = null,

+    //短消息模板

+    smsTableTmpl = null,

+    //接收短消息模板

+    smsOtherTmpl = null,

+    //发送短消息模板

+    smsMeTmpl = null,

+    //群聊草稿

+    groupDrafts = [],

+    //短消息列表显示群聊草稿

+    groupDraftItems = [],

+    //短消息列表显示群聊草稿及其草稿群聊细节

+    groupedDraftsObject = {},

+    //短消息容量信息

+    smsCapability = {},

+    //短消息是否还有存储空间

+    hasCapability = true;

+    //获取全部短消息,并将短信通过回调函数getPhoneBooks,与电话本进行关联

+    function getSMSMessages(callback) {

+        return service.getSMSMessages({

+            page: 0,

+            smsCount: 500,

+            nMessageStoreType: 1,

+            tags: 10,

+            orderBy: "order by id desc"

+        }, function (data) {

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), data.messages.length);

+            config.dbMsgs = data.messages;

+            config.listMsgs = groupSms(config.dbMsgs);

+            callback();

+        }, function () {

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), 0);

+            config.dbMsgs = [];

+            config.listMsgs = [];

+            cleanSmsList();

+        });

+    }

+

+    //清楚短消息列表内容

+    cleanSmsList = function () {

+        $("#smslist-table").empty();

+    };

+

+    //关联后的短消息根据电话号码进行分组

+    function groupSms(messages) {

+        var peoples = {},

+        theSortedPeoples = [];

+        config.listMsgs = [];

+        groupDrafts = [];

+        $.each(messages, function (i, e) {

+            if (e.tag == '4' && e.groupId != '') { // 群聊草稿

+                groupDrafts.push(e);

+                return;

+            }

+            e.target = e.number;

+            if (parseInt(e.id, 10) > config.smsMaxId) {

+                config.smsMaxId = e.id;

+            }

+            var last8 = getLastNumber(e.number, config.SMS_MATCH_LENGTH);

+            if (last8 in peoples) {

+                peoples[last8].push(e);

+            } else {

+                peoples[last8] = [e];

+                theSortedPeoples.push(e);

+            }

+        });

+        theSortedPeoples = _.sortBy(theSortedPeoples, function (ele) {

+            return 0 - parseInt(ele.id + "", 10);

+        });

+        $.each(theSortedPeoples, function (s_i, sp) {

+            var people = getLastNumber(sp.number, config.SMS_MATCH_LENGTH);

+            var newCount = 0;

+            var hasDraft = false;

+            for (var i = 0; i < peoples[people].length; i++) {

+                if (peoples[people][i].isNew) {

+                    newCount++;

+                }

+                if (peoples[people][i].tag == '4' && peoples[people][i].groupId == '') { // 单条草稿

+                    hasDraft = true;

+                }

+            }

+            config.listMsgs.push({

+                id: peoples[people][0].id,

+                name: "",

+                number: peoples[people][0].number,

+                latestId: peoples[people][0].id,

+                totalCount: peoples[people].length,

+                newCount: newCount,

+                latestSms: peoples[people][0].content,

+                latestTime: peoples[people][0].time,

+                checked: false,

+                itemId: getLastNumber(people, config.SMS_MATCH_LENGTH),

+                groupId: peoples[people][0].groupId,

+                hasDraft: hasDraft

+            });

+        });

+        return config.listMsgs;

+    }

+

+    //获取电话本信息,并与短消息关联

+    function getPhoneBooks() {

+        var books = service.getPhoneBooks({

+            page: 0,

+            data_per_page: 2000,

+            orderBy: "name",

+            isAsc: true

+        });

+        if ($.isArray(books.pbm_data) && books.pbm_data.length > 0) {

+            config.phonebook = books.pbm_data;

+        }

+        dealPhoneBooks();

+    }

+

+    //双异步获取设备侧和sim卡侧的短信息,并将其合并

+    function dealPhoneBooks() {

+        var select = $("#chosenUserList .chosen-select-deselect");

+        select.empty();

+        var options = [];

+        var tmp = [];

+        var pbTmp = [];

+        for (var j = 0; j < config.phonebook.length; j++) {

+            var book = config.phonebook[j];

+            var last8Num = getLastNumber(book.pbm_number, config.SMS_MATCH_LENGTH);

+            if (last8Num && $.inArray(last8Num, pbTmp) == -1) {

+                options.push(new Option(book.pbm_name + "/" + book.pbm_number, last8Num, false, true));

+                if ($.inArray(last8Num, tmp) == -1) {

+                    tmp.push(last8Num);

+                }

+                pbTmp.push(last8Num);

+            } else {

+                for (var i = 0; i < options.length; i++) {

+                    if (options[i].value == last8Num) {

+                        options[i].text = book.pbm_name + "/" + book.pbm_number;

+                        break;

+                    }

+                }

+            }

+        }

+        var groupIds = [];

+        for (var k = 0; k < groupDrafts.length; k++) { // 将草稿做对象Map封装,供草稿组点击后的草稿分解

+            if ($.inArray(groupDrafts[k].groupId, groupIds) == -1) {

+                groupIds.push(groupDrafts[k].groupId);

+                var draft = groupDrafts[k];

+                groupedDraftsObject[groupDrafts[k].groupId] = [draft];

+            } else {

+                var draft = groupDrafts[k];

+                groupedDraftsObject[groupDrafts[k].groupId].push(draft);

+            }

+            var itemId = getLastNumber(groupDrafts[k].number, config.SMS_MATCH_LENGTH);

+            if ($.inArray(itemId, tmp) == -1) {

+                options.push(new Option(groupDrafts[k].number, itemId));

+                tmp.push(itemId);

+            }

+        }

+        for (var g in groupedDraftsObject) { // 处理列表显示的草稿信息

+            var drafts = groupedDraftsObject[g];

+            var draftItem = drafts[drafts.length - 1];

+            draftItem.draftShowName = '';

+            draftItem.draftShowNameTitle = '';

+            $.each(drafts, function (i, n) {

+                var showName = getShowNameByNumber(n.number);

+                draftItem.draftShowName += (i == 0 ? '' : ';') + showName;

+                draftItem.draftShowNameTitle += (i == 0 ? '' : ';') + showName;

+            });

+

+            var len = 10;

+            if (getEncodeType(draftItem.draftShowName).encodeType == "UNICODE") {

+                len = 10;

+            }

+            draftItem.draftShowName = draftItem.draftShowName.length > len ? draftItem.draftShowName.substring(0, len) + "..." : draftItem.draftShowName;

+            draftItem.totalCount = drafts.length;

+            draftItem.hasDraft = true;

+            draftItem.latestTime = draftItem.time;

+            groupDraftItems.push(draftItem);

+        }

+        for (var i = 0; i < config.listMsgs.length; i++) {

+            var smsItem = config.listMsgs[i];

+            for (var j = config.phonebook.length; j > 0; j--) {

+                var book = config.phonebook[j - 1];

+                var last8Num = getLastNumber(book.pbm_number, config.SMS_MATCH_LENGTH);

+                if (smsItem.itemId == last8Num) {

+                    smsItem.name = book.pbm_name;

+                    for (var k = 0; k < options.length; k++) {

+                        if (last8Num == options[k].value) {

+                            options[k].value = getLastNumber(smsItem.number, config.SMS_MATCH_LENGTH);

+                            options[k].text = book.pbm_name + '/' + smsItem.number;

+                            break;

+                        }

+                    }

+                    break;

+                }

+            }

+            if ($.inArray(smsItem.itemId, tmp) == -1) {

+                options.push(new Option(smsItem.number, getLastNumber(smsItem.number, config.SMS_MATCH_LENGTH)));

+                tmp.push(smsItem.itemId);

+            }

+        }

+

+        var opts = "";

+        $.each(options, function (i, e) {

+            opts += "<option value='" + HTMLEncode(e.value) + "'>" + HTMLEncode(e.text) + "</option>";

+        });

+        select.append(opts);

+        select.chosen({

+            max_selected_options: 5,

+            search_contains: true,

+            width: '740px'

+        });

+        showSmsListData();

+        showMultiDraftListData();

+        //changeShownMsgs();

+        ready = true;

+    }

+

+    function showSmsListData() {

+        if (smsTableTmpl == null) {

+            smsTableTmpl = $.template("smsTableTmpl", $("#smsTableTmpl"));

+        }

+        cleanSmsList();

+        $.tmpl("smsTableTmpl", {

+            data: config.listMsgs

+        }).translate().appendTo("#smslist-table");

+

+        if (config.HAS_PHONEBOOK) {

+            $(".sms-add-contact-icon").removeClass("hide");

+        } else {

+            $(".sms-add-contact-icon").addClass("hide");

+        }

+    }

+    //群组草稿列表显示

+    function showMultiDraftListData() {

+        if (groupDraftItems.length == 0) {

+            return false;

+        }

+        if (smsTableTmpl == null) {

+            smsTableTmpl = $.template("smsTableTmpl", $("#smsTableTmpl"));

+        }

+        $.tmpl("smsTableTmpl", {

+            data: groupDraftItems

+        }).translate().prependTo("#smslist-table");

+    }

+

+    // 页面发生滚动后,改变页面显示的短消息

+    function changeShownMsgs() {

+        var shownMsgsTmp = [];

+        var range = _.range((currentPage - 1) * 5, currentPage * 5);

+        $.each(range, function (i, e) {

+            if (config.listMsgs[e]) {

+                shownMsgsTmp.push(config.listMsgs[e]);

+            }

+        });

+        //shownMsgsTmp = config.listMsgs;

+        currentPage++;

+

+        if (smsTableTmpl == null) {

+            smsTableTmpl = $.template("smsTableTmpl", $("#smsTableTmpl"));

+        }

+        $.tmpl("smsTableTmpl", {

+            data: shownMsgsTmp

+        }).translate().appendTo("#smslist-table");

+

+        renderCheckbox();

+        if (shownMsgsTmp.length == 0) {

+            disableBtn($("#smslist-delete-all"));

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), 0);

+        } else {

+            enableBtn($("#smslist-delete-all"));

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), 1);

+        }

+        if (currentPage == 2 && window.innerHeight == $("body").height()) {

+            changeShownMsgs();

+        }

+        return shownMsgsTmp;

+    }

+

+    //将被checked的条目添加到self.checkedItem中,用于在滚动还原checkbox

+    checkboxClickHandler = function (id) {

+        checkDeleteBtnStatus();

+    };

+

+    //获取已选择的条目

+    getSelectedItem = function () {

+        var selected = [];

+        var checkedItem = $("#smslist-table input:checkbox:checked");

+        checkedItem.each(function (i, e) {

+            selected.push($(e).val());

+        });

+        return selected;

+    };

+

+    //删除按钮是否禁用

+    checkDeleteBtnStatus = function () {

+        var size = getSelectedItem().length;

+        if (size == 0) {

+            disableBtn($("#smslist-delete"));

+        } else {

+            enableBtn($("#smslist-delete"));

+        }

+    };

+

+    //刷新短消息列表

+    refreshClickHandler = function () {

+        $("#smslist-table").empty();

+        disableBtn($("#smslist-delete"));

+        disableCheckbox($("#smslist-checkAll", "#smsListForm"));

+        init();

+        renderCheckbox();

+    };

+

+    //删除全部短消息

+    deleteAllClickHandler = function () {

+        showConfirm("confirm_data_delete", function () {

+            showLoading('deleting');

+            service.deleteAllMessages({

+                location: "native_inbox"

+            }, function (data) {

+                cleanSmsList();

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), 0);

+                successOverlay();

+            }, function (error) {

+                errorOverlay(error.errorText);

+            });

+        });

+    };

+

+    //删除选中的短消息

+    deleteSelectClickHandler = function () {

+        showConfirm("confirm_sms_delete", function () {

+            showLoading('deleting');

+            var items = getIdsBySelectedIds();

+            service.deleteMessage({

+                ids: items.ids

+            }, function (data) {

+                renderAfterDelete(items);

+                disableBtn($("#smslist-delete"));

+                $("#checkbox-all").removeAttr("checked");

+                renderCheckbox();

+                successOverlay();

+            }, function (error) {

+                errorOverlay(error.errorText);

+            });

+        });

+

+        function renderAfterDelete(items) {

+            var ids = items.ids;

+            var nums = [];

+            $.each(config.dbMsgs, function (i, e) {

+                if ($.inArray(e.id, items.normalIds) != -1) {

+                    nums.push(e.number);

+                }

+            });

+            nums = _.uniq(nums);

+            $.each(nums, function (i, e) {

+                $("#smslist-item-" + getLastNumber(e, config.SMS_MATCH_LENGTH)).hide().remove();

+            });

+            $.each(items.groups, function (i, e) {

+                $("#smslist-item-" + e).hide().remove();

+            });

+            synchSmsList(nums, ids);

+        }

+

+        function getIdsBySelectedIds() {

+            var nums = [];

+            var resultIds = [];

+            var normalIds = [];

+            var groups = [];

+            var selectedItem = getSelectedItem();

+            $.each(selectedItem, function (i, e) {

+                var checkbox = $("#checkbox" + e);

+                if (checkbox.attr("groupid")) {

+                    groups.push(checkbox.attr("groupid"));

+                } else {

+                    nums.push(getLastNumber(checkbox.attr("number"), config.SMS_MATCH_LENGTH));

+                }

+            });

+

+            $.each(config.dbMsgs, function (i, e) {

+                if ($.inArray(getLastNumber(e.number, config.SMS_MATCH_LENGTH), nums) != -1 && (typeof e.groupId == "undefined" || _.isEmpty(e.groupId + ''))) {

+                    resultIds.push(e.id);

+                    normalIds.push(e.id);

+                } else if ($.inArray(e.groupId + '', groups) != -1) { //删除草稿组

+                    resultIds.push(e.id);

+                }

+            });

+            resultIds = _.uniq(resultIds);

+            return {

+                ids: resultIds,

+                groups: groups,

+                normalIds: normalIds

+            };

+        }

+    };

+

+    //新短信按钮点击

+    newMessageClickHandler = function () {

+        $("#chosenUser1", "#smsChatRoom").addClass("hide");

+        $("#chosenUser", "#smsChatRoom").show();

+

+        cleanChatInput();

+        checkSmsCapacityAndAlert();

+        $("select.chosen-select-deselect").val("").trigger("chosen:updated.chosen");

+        switchPage('chat');

+        gotoBottom();

+        clearChatList();

+    };

+

+    //返回聊天室列表

+    chatCancelClickHandler = function () {

+        if (config.CONTENT_MODIFIED.modified) {

+            var confirmMessage = 'sms_to_save_draft';

+            var selectedContact = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+            var noContactSelected = !selectedContact || selectedContact.length == 0;

+            if (noContactSelected) {

+                confirmMessage = 'sms_no_recipient';

+            }

+            if (noContactSelected) {

+                showConfirm(confirmMessage, {

+                    ok: function () {

+                        if (!noContactSelected) {

+                            saveDraftAction({

+                                content: $("#chat-input", "#smsChatRoom").val(),

+                                numbers: selectedContact,

+                                isFromBack: true

+                            });

+                        }

+                        config.resetContentModifyValue();

+                        backToSmsListMainPage();

+                    },

+                    no: function () {

+                        if (noContactSelected) {

+                            return true;

+                        }

+                        config.resetContentModifyValue();

+                        backToSmsListMainPage();

+                    }

+                });

+            } else {

+                saveDraftAction({

+                    content: $("#chat-input", "#smsChatRoom").val(),

+                    numbers: selectedContact,

+                    isFromBack: true

+                });

+                config.resetContentModifyValue();

+                backToSmsListMainPage();

+            }

+            return false;

+        }

+        backToSmsListMainPage();

+    };

+

+    //跳转页面至SIM卡侧、设置界面

+    toOtherClickHandler = function (href) {

+        config.CONTENT_MODIFIED.checkChangMethod();

+        if (config.CONTENT_MODIFIED.modified) {

+            draftListener();

+            if (config.CONTENT_MODIFIED.message == 'sms_to_save_draft') {

+                config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                config.resetContentModifyValue();

+                window.location.hash = href;

+            } else {

+                showConfirm(config.CONTENT_MODIFIED.message, {

+                    ok: function () {

+                        config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                        config.resetContentModifyValue();

+                        window.location.hash = href;

+                    },

+                    no: function () {

+                        var result = config.CONTENT_MODIFIED.callback.no(config.CONTENT_MODIFIED.data);

+                        if (!result) {

+                            window.location.hash = href;

+                            config.resetContentModifyValue();

+                        }

+                    }

+                });

+            }

+            return false;

+        } else {

+            window.location.hash = href;

+        }

+    };

+

+    function backToSmsListMainPage() {

+        $("select.chosen-select-deselect").val("").trigger("chosen:updated.chosen");

+        config.currentChatObject = null;

+        $(".smslist-btns", "#smslist-main").removeClass('smsListFloatButs');

+        switchPage('list');

+    }

+

+    function switchPage(page) {

+        if (page == 'chat') {

+            $("#smslist-main").hide();

+            $("#smsChatRoom").show();

+        } else {

+            $("#smsChatRoom").hide();

+            $("#smslist-main").show();

+        }

+    }

+

+    var sendSmsErrorTimer = null;

+    //添加发送错误消息

+    addSendSmsError = function (msg) {

+        if (sendSmsErrorTimer) {

+            window.clearTimeout(sendSmsErrorTimer);

+            sendSmsErrorTimer = null;

+        }

+        $("#sendSmsErrorLi").text($.i18n.prop(msg));

+        sendSmsErrorTimer = addTimeout(function () {

+            $("#sendSmsErrorLi").text("");

+        }, 5000);

+    };

+

+    //发送短消息

+    sendSmsClickHandler = function () {

+        if (!hasCapability) {

+            showAlert("sms_capacity_is_full_for_send");

+            return;

+        }

+        var inputVal = $("#chat-input", "#smsChatRoom");

+        var msgContent = inputVal.val();

+        if (msgContent == $.i18n.prop("chat_input_placehoder")) {

+            inputVal.val("");

+            msgContent = "";

+        }

+        var nums = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+        if ($.isArray(nums)) {

+            nums = $.grep(nums, function (n, i) {

+                return !_.isEmpty(n);

+            });

+        }

+        if (!nums || nums.length == 0) {

+            addSendSmsError("sms_contact_required");

+            return;

+        }

+        if (nums.length + smsCapability.nvUsed > smsCapability.nvTotal) {

+            showAlert({

+                msg: "sms_capacity_will_full_just",

+                params: [smsCapability.nvTotal - smsCapability.nvUsed]

+            });

+            return;

+        }

+        if (nums.length == 1) {

+            config.currentChatObject = getLastNumber(nums[0], config.SMS_MATCH_LENGTH);

+            showLoading('sending');

+        } else if (nums.length > 1) {

+            showLoading("sending", "<button id='sms_cancel_sending' onclick='cancelSending()' class='btn btn-primary'>"

+                 + $.i18n.prop("sms_stop_sending")

+                 + "</button>");

+            config.currentChatObject = null;

+        }

+        var i = 0;

+        var leftNum = nums.length;

+        couldSend = true;

+        disableBtn($("#btn-send", "#inputpanel"));

+        sendSms = function () {

+            if (!couldSend) {

+                hideLoading();

+                return;

+            }

+            var newMsg = {

+                id: -1,

+                number: nums[i],

+                content: msgContent,

+                isNew: false

+            };

+

+            if (leftNum == 1) {

+                $("#loading #loading_container").html("");

+            }

+

+            leftNum--;

+            service.sendSMS({

+                number: newMsg.number,

+                message: newMsg.content,

+                id: -1

+            }, function (data) {

+                var latestMsg = getLatestMessage() || {

+                    id: parseInt(config.smsMaxId, 10) + 1,

+                    time: transUnixTime($.now()),

+                    number: newMsg.number

+                };

+                config.smsMaxId = latestMsg.id;

+                newMsg.id = config.smsMaxId;

+                newMsg.time = latestMsg.time;

+                newMsg.tag = 2;

+                newMsg.hasDraft = false;

+                if (nums.length > 1) {

+                    newMsg.targetName = getNameOrNumberByNumber(newMsg.number);

+                }

+                addSendMessage(newMsg, i + 1 != nums.length);

+                updateDBMsg(newMsg);

+                updateMsgList(newMsg);

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+                gotoBottom();

+                if (i + 1 == nums.length) {

+                    updateChatInputWordLength();

+                    enableBtn($("#btn-send", "#inputpanel"));

+                    hideLoading();

+                    return;

+                }

+                i++;

+                sendSms();

+            }, function (error) {

+                var latestMsg = getLatestMessage() || {

+                    id: parseInt(config.smsMaxId, 10) + 1,

+                    time: transUnixTime($.now()),

+                    number: newMsg.number

+                };

+                config.smsMaxId = latestMsg.id;

+                newMsg.id = config.smsMaxId;

+                newMsg.time = latestMsg.time;

+                newMsg.errorText = $.i18n.prop(error.errorText);

+                newMsg.tag = 3;

+                newMsg.target = newMsg.number;

+                newMsg.hasDraft = false;

+                if (nums.length > 1) {

+                    newMsg.targetName = getNameOrNumberByNumber(newMsg.number);

+                }

+                addSendMessage(newMsg, i + 1 != nums.length);

+                updateDBMsg(newMsg);

+                updateMsgList(newMsg);

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+                gotoBottom();

+                if (i + 1 == nums.length) {

+                    updateChatInputWordLength();

+                    enableBtn($("#btn-send", "#inputpanel"));

+                    hideLoading();

+                    return;

+                }

+                i++;

+                sendSms();

+            });

+        };

+        sendSms();

+    };

+

+    var couldSend = true;

+

+    //取消剩余短信发送操作

+    cancelSending = function () {

+        couldSend = false;

+        $("#loading #loading_container").html($.i18n.prop('sms_cancel_sending'));

+    };

+

+    //获取最新的短消息

+    getLatestMessage = function () {

+        var data = service.getSMSMessages({

+            page: 0,

+            smsCount: 5,

+            nMessageStoreType: 1,

+            tags: 10,

+            orderBy: "order by id desc"

+        });

+        if (data.messages.length > 0) {

+            for (var i = 0; i < data.messages.length; i++) {

+                if (data.messages[i].tag == '2' || data.messages[i].tag == '3') {

+                    return data.messages[i];

+                }

+            }

+            return null;

+        } else {

+            return null;

+        }

+    };

+

+    //发送短信后,更新短信数据对象

+    function updateDBMsg(msg) {

+        if (config.dbMsgs.length == 0) {

+            config.dbMsgs = [msg];

+        } else {

+            /* cov_2

+            for(var j = 0; j < config.dbMsgs.length; j++){

+            if(config.dbMsgs[j].id == msg.id){

+            config.dbMsgs[j] = msg;

+            return;

+            } else {

+            var newMsg = [msg];

+            $.merge(newMsg, config.dbMsgs);

+            config.dbMsgs = newMsg;

+            return;

+            }

+            }

+             */

+            if (config.dbMsgs[0].id == msg.id) {

+                config.dbMsgs[0] = msg;

+                return;

+            } else {

+                var newMsg = [msg];

+                $.merge(newMsg, config.dbMsgs);

+                config.dbMsgs = newMsg;

+                return;

+            }

+        }

+    }

+

+    //发送短信后,更新短信列表, number不为空做删除处理,为空做增加处理

+    function updateMsgList(msg, number, counter) {

+        if ((!msg || !msg.number) && !number) {

+            return;

+        }

+        var itemId = '';

+        if (msg && typeof msg.groupId != "undefined" && msg.groupId != '') {

+            itemId = msg.groupId;

+        } else {

+            itemId = getLastNumber((number || msg.number), config.SMS_MATCH_LENGTH);

+        }

+        var item = $("#smslist-item-" + itemId);

+        if (item && item.length > 0) {

+            var totalCountItem = item.find(".smslist-item-total-count");

+            var count = totalCountItem.text();

+            count = Number(count.substring(1, count.length - 1));

+            if (number) {

+                if (count == 1 || msg == null) {

+                    item.hide().remove();

+                    return;

+                } else {

+                    totalCountItem.text("(" + (count - (counter || 1)) + ")");

+                    item.find(".smslist-item-draft-flag").addClass('hide');

+                }

+            } else {

+                totalCountItem.text("(" + (count + 1) + ")");

+                if (msg.tag == '4') {

+                    item.find(".smslist-item-draft-flag").removeClass('hide');

+                }

+            }

+            item.find(".smslist-item-checkbox p.checkbox").attr("id", msg.id);

+            item.find(".smslist-item-checkbox input:checkbox").val(msg.id).attr("id", "checkbox" + msg.id);

+            var contentHtml = msg.content;

+			var msgContent;

+            if (msg.tag == '4') {

+                //contentHtml = '<span class="smslist-item-draft-flag colorRed" data-trans="draft"></span>: ' + contentHtml;

+				msgContent = item.find(".smslist-item-msg").html('<span class="smslist-item-draft-flag colorRed" data-trans="draft"></span>: ' + HTMLEncode(contentHtml)); //.addClass("font-weight-bold");

+            } else {

+				msgContent = item.find(".smslist-item-msg").html(HTMLEncode(contentHtml)); //.addClass("font-weight-bold");

+			}

+            //var msgContent = item.find(".smslist-item-msg").html(HTMLEncode(contentHtml)); //.addClass("font-weight-bold");

+            msgContent.closest('td').prop('title', msg.content);

+            item.find(".smslist-item-repeat span").die().click(function () {

+                forwardClickHandler(msg.id);

+            });

+            item.find("span.clock-time").text(msg.time);

+            var tmpItem = item;

+            item.hide().remove();

+            $("#smslist-table").prepend(tmpItem.show());

+        } else {

+            if (smsTableTmpl == null) {

+                smsTableTmpl = $.template("smsTableTmpl", $("#smsTableTmpl"));

+            }

+            msg.checked = false;

+            msg.newCount = 0;

+            msg.latestId = msg.id;

+            msg.latestSms = msg.content;

+            msg.latestTime = msg.time;

+            if (msg.groupId == '' || typeof msg.groupId == "undefined") {

+                msg.totalCount = 1;

+            }

+            if (!msg.hasDraft) {

+                msg.hasDraft = false;

+            }

+            msg.itemId = itemId;

+            msg.name = getNameByNumber(msg.number);

+            $.tmpl("smsTableTmpl", {

+                data: [msg]

+            }).translate().prependTo("#smslist-table");

+        }

+        if (config.HAS_PHONEBOOK) {

+            $(".sms-add-contact-icon").removeClass("hide");

+        } else {

+            $(".sms-add-contact-icon").addClass("hide");

+        }

+        $("#smslist-table").translate();

+        renderCheckbox();

+    }

+

+    //增加发送内容到聊天室, notCleanChatInput 是否清除输入框内容

+    addSendMessage = function (sms, notCleanChatInput) {

+        if (smsMeTmpl == null) {

+            smsMeTmpl = $.template("smsMeTmpl", $("#smsMeTmpl"));

+        }

+        $.tmpl("smsMeTmpl", sms).appendTo("#chatlist");

+        $("#chatlist").translate();

+        if (!notCleanChatInput) {

+            cleanChatInput();

+        }

+        clearMySmsErrorMessage(sms.id);

+    };

+

+    //清楚错误消息,避免翻译问题

+    clearMySmsErrorMessage = function (id) {

+        addTimeout(function () {

+            $("div.error", "#talk-item-" + id).text("");

+        }, 3000);

+    };

+

+    //快速添加联系人overlay是否打开

+    var isPoped = false;

+

+    //关闭快速添加联系人overlay

+    hidePopup = function () {

+        $(".tagPopup").remove();

+        isPoped = false;

+    };

+

+    //清空聊天室内容

+    clearChatList = function () {

+        $("#chatlist").empty();

+        updateChatInputWordLength();

+    };

+

+    //过滤短消息内容

+    dealContent = function (content) {

+        if (config.HAS_PHONEBOOK) {

+            return HTMLEncode(content).replace(/(\d{3,})/g, function (word) {

+                var r = (new Date().getTime() + '').substring(6) + (getRandomInt(1000) + 1000);

+                return "<a id='aNumber" + r + "' href='javascript:openPhoneBook(\"" + r + "\", \"" + word + "\")'>" + word + "</a>";

+            });

+        } else {

+            return HTMLEncode(content);

+        }

+

+    };

+

+    //打开快速添加联系人overlay

+    openPhoneBook = function (id, num) {

+        var target = null;

+        var outContainer = "";

+        var itemsContainer = null;

+        var isChatRoom = false;

+        if (!id) {

+            target = $("#listNumber" + getLastNumber(num, config.SMS_MATCH_LENGTH));

+            outContainer = ".smslist-item";

+            itemsContainer = $("#addPhonebookContainer");

+        } else {

+            target = $("#aNumber" + id);

+            outContainer = ".msg_container";

+            itemsContainer = $("#chatlist");

+            isChatRoom = true;

+        }

+        if (isPoped) {

+            hidePopup();

+        }

+        isPoped = true;

+        $("#tagPopup").remove();

+

+        if (addPhonebookTmpl == null) {

+            addPhonebookTmpl = $.template("addPhonebookTmpl", $("#addPhonebookTmpl"));

+        }

+        $.tmpl("addPhonebookTmpl", {

+            number: num

+        }).appendTo(itemsContainer);

+        var p = target.position();

+        var msgContainer = target.closest(outContainer);

+        var msgP = msgContainer.position();

+        var _left = 0,

+        _top = 0;

+        if (isChatRoom) {

+            var containerWidth = itemsContainer.width();

+            var containerHeight = itemsContainer.height();

+            var pop = $("#innerTagPopup");

+            _left = msgP.left + p.left;

+            _top = msgP.top + p.top + 20;

+            if (pop.width() + _left > containerWidth) {

+                _left = containerWidth - pop.width() - 20;

+            }

+            if (containerHeight > 100 && pop.height() + _top > containerHeight) {

+                _top = containerHeight - pop.height() - 5;

+            }

+        } else {

+            _left = p.left;

+            _top = p.top;

+        }

+        $("#innerTagPopup").css({

+            top: _top + "px",

+            left: _left + "px"

+        });

+        $('#quickSaveContactForm').translate().validate({

+            submitHandler: function () {

+                quickSaveContact(isChatRoom);

+            },

+            rules: {

+                name: "name_check",

+                number: "phonenumber_check"

+            }

+        });

+    };

+

+    //快速添加联系人

+    quickSaveContact = function () {

+        var name = $(".tagPopup #innerTagPopup #name").val();

+        var number = $(".tagPopup #innerTagPopup #number").val();

+        var newContact = {

+            index: -1,

+            location: 1,

+            name: name,

+            mobile_phone_number: number,

+            home_phone_number: "",

+            office_phone_number: "",

+            mail: ""

+        };

+        var device = service.getDevicePhoneBookCapacity();

+        if (device.pcPbmUsedCapacity >= device.pcPbmTotalCapacity) {

+            showAlert("device_full");

+            return false;

+        }

+        showLoading('waiting');

+        service.savePhoneBook(newContact, function (data) {

+            if (data.result == "success") {

+                config.phonebook.push({

+                    pbm_name: name,

+                    pbm_number: number

+                });

+                updateItemShowName(name, number);

+                hidePopup();

+                successOverlay();

+            } else {

+                errorOverlay();

+            }

+        }, function (data) {

+            errorOverlay();

+        });

+    };

+

+    function updateItemShowName(name, number) {

+        var lastNum = getLastNumber(number, config.SMS_MATCH_LENGTH);

+        $("span.smslist-item-name2", "#smslist-item-" + lastNum).text(name);

+        $("#listNumber" + lastNum).hide();

+    }

+

+    //聊天室删除单条消息

+    deleteSingleItemClickHandler = function (id, resendCallback) {

+        if (resendCallback) {

+            deleteTheSingleItem(id);

+        } else {

+            showConfirm("confirm_sms_delete", function () {

+                showLoading('deleting');

+                deleteTheSingleItem(id);

+            });

+        }

+

+        function deleteTheSingleItem(id) {

+            service.deleteMessage({

+                ids: [id]

+            }, function (data) {

+                var target = $(".smslist-item-delete", "#talk-item-" + id).attr("target");

+                $("#talk-item-" + id).hide().remove();

+

+                synchSmsList(null, [id]);

+                updateMsgList(getPeopleLatestMsg(target), target);

+                if (resendCallback) {

+                    resendCallback();

+                } else {

+                    hideLoading();

+                }

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+            }, function (error) {

+                if (resendCallback) {

+                    resendCallback();

+                } else {

+                    hideLoading();

+                }

+            });

+        }

+    };

+

+    //删除草稿

+    function deleteDraftSms(ids, numbers) {

+        stopNavigation();

+        service.deleteMessage({

+            ids: ids

+        }, function (data) {

+            updateSmsCapabilityStatus(null, function () {

+                draftListener();

+                restoreNavigation();

+            });

+            for (var i = 0; i < numbers.length; i++) {

+                updateMsgList(getPeopleLatestMsg(numbers[i]), numbers[i], ids.length);

+            }

+            synchSmsList(null, ids);

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+        }, function (error) {

+            restoreNavigation();

+            // Do nothing

+        });

+    }

+

+    //删除群聊草稿草稿

+    function deleteMultiDraftSms(ids, groupId) {

+        service.deleteMessage({

+            ids: ids

+        }, function (data) {

+            synchSmsList(null, ids);

+            $("#smslist-item-" + groupId).hide().remove();

+            checkSmsCapacityAndAlert();

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+        }, function (error) {

+            // Do nothing

+        });

+    }

+

+    getCurrentChatObject = function () {

+        var nums = $("select.chosen-select-deselect").val();

+        if (!nums) {

+            config.currentChatObject = null;

+        } else if (nums.length == 1) {

+            config.currentChatObject = getLastNumber(nums, config.SMS_MATCH_LENGTH);

+        } else if (nums.length > 1) {

+            config.currentChatObject = null;

+        }

+        return config.currentChatObject;

+    };

+

+    //获取当前聊天对象最新的短消息

+    getPeopleLatestMsg = function (number) {

+        for (var j = 0; j < config.dbMsgs.length; j++) {

+            if (!config.dbMsgs[j].groupId && getLastNumber(config.dbMsgs[j].number, config.SMS_MATCH_LENGTH) == getLastNumber(number, config.SMS_MATCH_LENGTH)) {

+                return config.dbMsgs[j];

+            }

+        }

+        return null;

+    };

+

+    //重新发送,复制消息到发送框

+    resendClickHandler = function (id) {

+        if (!hasCapability) {

+            showAlert("sms_capacity_is_full_for_send");

+            return;

+        }

+        showLoading('sending');

+        $("div.error", "#talk-item-" + id).text($.i18n.prop("sms_resending"));

+        var targetNumber = $("div.smslist-item-resend", "#talk-item-" + id).attr("target");

+        var content = $("div.J_content", "#talk-item-" + id).text();

+        for (var j = 0; j < config.dbMsgs.length; j++) {

+            if (config.dbMsgs[j].id == id) {

+                content = config.dbMsgs[j].content;

+            }

+        }

+

+        disableBtn($("#btn-send", "#inputpanel"));

+        var newMsg = {

+            id: -1,

+            number: targetNumber,

+            content: content,

+            isNew: false

+        };

+        service.sendSMS({

+            number: newMsg.number,

+            message: newMsg.content,

+            id: -1

+        }, function (data) {

+            var latestMsg = getLatestMessage() || {

+                id: parseInt(config.smsMaxId, 10) + 1,

+                time: transUnixTime($.now()),

+                number: newMsg.number

+            };

+            config.smsMaxId = latestMsg.id;

+            newMsg.id = config.smsMaxId;

+            newMsg.time = latestMsg.time;

+            newMsg.tag = 2;

+            newMsg.target = latestMsg.number;

+            newMsg.targetName = getNameOrNumberByNumber(targetNumber);

+            updateDBMsg(newMsg);

+            updateMsgList(newMsg);

+            deleteSingleItemClickHandler(id, function () {

+                addSendMessage(newMsg, true);

+                updateChatInputWordLength();

+                enableBtn($("#btn-send", "#inputpanel"));

+                hideLoading();

+                gotoBottom();

+            });

+        }, function (error) {

+            var latestMsg = getLatestMessage() || {

+                id: parseInt(config.smsMaxId, 10) + 1,

+                time: transUnixTime($.now()),

+                number: newMsg.number

+            };

+            config.smsMaxId = latestMsg.id;

+            newMsg.id = config.smsMaxId;

+            newMsg.time = latestMsg.time;

+            newMsg.errorText = $.i18n.prop("sms_resend_fail");

+            newMsg.tag = 3;

+            newMsg.target = latestMsg.number;

+            newMsg.targetName = getNameOrNumberByNumber(targetNumber);

+            updateDBMsg(newMsg);

+            updateMsgList(newMsg);

+            deleteSingleItemClickHandler(id, function () {

+                addSendMessage(newMsg, true);

+                updateChatInputWordLength();

+                enableBtn($("#btn-send", "#inputpanel"));

+                hideLoading();

+                gotoBottom();

+            });

+        });

+    };

+

+    //滚动到底部

+    gotoBottom = function () {

+        $("#chatpanel .clear-container").animate({

+            scrollTop: $("#chatlist").height()

+        });

+    };

+

+    //最后一条短消息距离顶部的距离

+    var lastItemOffsetTop = 0;

+    //页面是否处于滚动中

+    var scrolling = false;

+    //初始化页面状态信息

+    function initStatus() {

+        currentPage = 1;

+        ready = false;

+        shownMsgs = [];

+        scrolling = false;

+        lastItemOffsetTop = 0;

+        groupDrafts = groupDraftItems = [];

+        groupedDraftsObject = {};

+		config.dbMsgs = [];

+        config.listMsgs = null;

+        config.smsMaxId = 0;

+        config.phonebook = [];

+    }

+

+    function getReadyStatus() {

+        showLoading('waiting');

+        config.currentChatObject = null;

+        var getSMSReady = function () {

+            service.getSMSReady({}, function (data) {

+                if (data.sms_cmd_status_result == "2") {

+                    $("input:button", "#smsListForm .smslist-btns").attr("disabled", "disabled");

+                    hideLoading();

+                    showAlert("sms_init_fail");

+                } else if (data.sms_cmd_status_result == "1") {

+                    addTimeout(getSMSReady, 1000);

+                } else {

+                    if (config.HAS_PHONEBOOK) {

+                        getPhoneBookReady();

+                    } else {

+                        initSMSList(false);

+                    }

+                }

+            });

+        };

+

+        var getPhoneBookReady = function () {

+            service.getPhoneBookReady({}, function (data) {

+                if (data.pbm_init_flag == "6") {

+                    initSMSList(false);

+                } else if (data.pbm_init_flag != "0") {

+                    addTimeout(getPhoneBookReady, 1000);

+                } else {

+                    initSMSList(true);

+                }

+            });

+        };

+

+        var initSMSList = function (isPbmInitOK) {

+            initStatus();

+            if (isPbmInitOK) {

+                getSMSMessages(function () {

+                    getPhoneBooks();

+                    hideLoading();

+                });

+            } else {

+                getSMSMessages(function () {

+                    config.phonebook = [];

+                    //if(config.HAS_PHONEBOOK){

+                    dealPhoneBooks();

+                    //}

+                    hideLoading();

+                });

+            }

+            bindingEvents();

+            fixScrollTop();

+            window.scrollTo(0, 0);

+            initSmsCapability();

+        };

+

+        getSMSReady();

+    }

+

+    //初始化短信容量状态

+    function initSmsCapability() {

+        var capabilityContainer = $("#smsCapability");

+        updateSmsCapabilityStatus(capabilityContainer);

+        checkSimStatusForSend();

+        addInterval(function () {

+            updateSmsCapabilityStatus(capabilityContainer);

+            checkSimStatusForSend();

+        }, 5000);

+    }

+

+    //SIM卡未准备好时,禁用发送按钮

+    function checkSimStatusForSend() {

+        var data = service.getStatusInfo();

+        if (data.simStatus != 'modem_init_complete') {

+            disableBtn($("#btn-send"));

+            $("#sendSmsErrorLi").html('<span data-trans="no_sim_card_message">' + $.i18n.prop('no_sim_card_message') + '</span>');

+            $("#chatpanel .smslist-item-resend:visible").hide();

+        } else {

+            enableBtn($("#btn-send"));

+            $("#chatpanel .smslist-item-resend:hidden").show();

+        }

+    }

+

+    //更新短信容量状态

+    function updateSmsCapabilityStatus(capabilityContainer, callback) {

+        service.getSmsCapability({}, function (capability) {

+            if (capabilityContainer != null) {

+                capabilityContainer.text("(" + (capability.nvUsed > capability.nvTotal ? capability.nvTotal : capability.nvUsed) + "/" + capability.nvTotal + ")");

+            }

+            hasCapability = capability.nvUsed < capability.nvTotal;

+            smsCapability = capability;

+            if ($.isFunction(callback)) {

+                callback();

+            }

+        });

+    }

+

+    //初始化页面及VM

+    function init() {

+        getReadyStatus();

+    }

+

+    //事件绑定

+    bindingEvents = function () {

+        var $win = $(window);

+        var $smsListBtns = $("#smslist-main .smslist-btns");

+        var offsetTop = $("#mainContainer").offset().top;

+        $win.unbind("scroll").scroll(function () {

+            if ($win.scrollTop() > offsetTop) {

+                $smsListBtns.addClass("smsListFloatButs marginnone");

+            } else {

+                $smsListBtns.removeClass("smsListFloatButs marginnone");

+            }

+            //loadData(); //由于目前数据显示是全显示,不做动态加载,因此暂时注释掉

+        });

+

+        $("#smslist-table p.checkbox").die().live("click", function () {

+            checkboxClickHandler($(this).attr("id"));

+        });

+

+        $("#smslist-checkAll", "#smsListForm").die().live("click", function () {

+            checkDeleteBtnStatus();

+        });

+

+        $("#chat-input", "#smsChatRoom").die().live("drop", function () {

+            $("#inputpanel .chatform").addClass("chatformfocus");

+            var $this = $(this);

+            $this.removeAttr("data-trans");

+            if ($this.val() == $.i18n.prop("chat_input_placehoder")) {

+                $this.val("");

+            }

+            updateChatInputWordLength();

+        }).live("focusin", function () {

+            $("#inputpanel .chatform").addClass("chatformfocus");

+            var $this = $(this);

+            $this.removeAttr("data-trans");

+            if ($this.val() == $.i18n.prop("chat_input_placehoder")) {

+                $this.val("");

+            }

+            updateChatInputWordLength();

+        }).live("focusout", function () {

+            $("#inputpanel .chatform").removeClass("chatformfocus");

+            var $this = $(this);

+            if ($this.val() == "" || $this.val() == $.i18n.prop("chat_input_placehoder")) {

+                $this.val($.i18n.prop("chat_input_placehoder")).attr("data-trans", "chat_input_placehoder");

+            }

+            updateChatInputWordLength();

+        }).live("keyup", function () {

+            updateChatInputWordLength();

+        }).live("paste", function () {

+            window.setTimeout(function () {

+                updateChatInputWordLength();

+            }, 0);

+        }).live("cut", function () {

+            window.setTimeout(function () {

+                updateChatInputWordLength();

+            }, 0);

+        }).live("drop", function () {

+            window.setTimeout(function () {

+                updateChatInputWordLength();

+            }, 0);

+        }).live("contextmenu", function () {

+            return false;

+        });

+

+        $("#name").die().live("drop", function () {

+            updateNameInputWordLength();

+        }).live("focusin", function () {

+            updateNameInputWordLength();

+        }).live("focusout", function () {

+            updateNameInputWordLength();

+        }).live("keyup", function () {

+            updateNameInputWordLength();

+        }).live("paste", function () {

+            updateNameInputWordLength();

+        }).live("cut", function () {

+            updateNameInputWordLength();

+        }).live("dragend", function () {

+            updateNameInputWordLength();

+        }).live("contextmenu", function () {

+            return false;

+        });

+

+        $("select.chosen-select-deselect", "#smsChatRoom").die().live('change', function () {

+            draftListener();

+        });

+        $("#searchInput").die().live('blur', function () {

+            searchTextBlur();

+        }).live('keyup', function () {

+            updateSearchValue($("#searchInput").val());

+        });

+    };

+

+    //更新剩余字数

+    updateNameInputWordLength = function () {

+

+        var msgInput = $("#name", "#quickSaveContactForm");

+        var msgInputDom = msgInput[0];

+        var strValue = msgInput.val();

+        var encodeType = getEncodeType(strValue);

+        var maxLength = encodeType.encodeType == 'UNICODE' ? 11 : 22;

+        while (strValue.length + encodeType.extendLen > maxLength) {

+            strValue = strValue.substring(0, strValue.length - 1);

+            msgInputDom.value = strValue;

+            encodeType = getEncodeType(strValue);

+            maxLength = encodeType.encodeType == 'UNICODE' ? 11 : 22;

+        }

+    };

+

+//获取聊天对象的名字

+    getNameByNumber = function (num) {

+        for (var i = config.phonebook.length; i > 0; i--) {

+            if (getLastNumber(config.phonebook[i - 1].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(num, config.SMS_MATCH_LENGTH)) {

+                return config.phonebook[i - 1].pbm_name;

+            }

+        }

+        return "";

+    };

+    //获取聊天对象的名字和号码

+    getShowNameByNumber = function (num) {

+        for (var i = config.phonebook.length; i > 0; i--) {

+            if (getLastNumber(config.phonebook[i - 1].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(num, config.SMS_MATCH_LENGTH)) {

+                return config.phonebook[i - 1].pbm_name /* + "/" + num*/;

+            }

+        }

+        return num;

+    };

+

+    //获取聊天对象的名字,如果没有名字,则显示号码

+    getNameOrNumberByNumber = function (num) {

+        for (var i = config.phonebook.length; i > 0; i--) {

+            if (config.phonebook[i - 1].pbm_number == num) {

+                return config.phonebook[i - 1].pbm_name;

+            }

+        }

+        for (var i = config.phonebook.length; i > 0; i--) {

+            if (getLastNumber(config.phonebook[i - 1].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(num, config.SMS_MATCH_LENGTH)) {

+                return config.phonebook[i - 1].pbm_name;

+            }

+        }

+        return num;

+    };

+

+    //点击短信列表条目,进入聊天室页面

+    smsItemClickHandler = function (num) {

+        if (chatRoomInLoading) {

+            return false;

+        }

+        chatRoomInLoading = true;

+        if (smsOtherTmpl == null) {

+            smsOtherTmpl = $.template("smsOtherTmpl", $("#smsOtherTmpl"));

+        }

+        if (smsMeTmpl == null) {

+            smsMeTmpl = $.template("smsMeTmpl", $("#smsMeTmpl"));

+        }

+

+        var name = getShowNameByNumber(num);

+        $("#chosenUser", "#smsChatRoom").hide();

+        $("#chosenUser1", "#smsChatRoom").addClass("hide");

+

+        config.currentChatObject = getLastNumber(num, config.SMS_MATCH_LENGTH);

+        setAsRead(num);

+        cleanChatInput();

+        clearChatList();

+        var userSelect = $("select.chosen-select-deselect", "#smsChatRoom");

+        var ops = $("option", userSelect);

+        var numberExist = false;

+        for (var i = 0; i < ops.length; i++) {

+            var n = ops[i];

+            if (getLastNumber(n.value, config.SMS_MATCH_LENGTH) == config.currentChatObject) {

+                num = n.value;

+                numberExist = true;

+                break;

+            }

+        }

+        if (!numberExist) {

+            userSelect.append("<option value='" + HTMLEncode(num) + "' selected='selected'>" + HTMLEncode(num) + "</option>");

+        }

+        $("select.chosen-select-deselect").val(num).trigger("chosen:updated.chosen");

+        switchPage('chat');

+        config.dbMsgs = _.sortBy(config.dbMsgs, function (e) {

+            return 0 - e.id;

+        });

+        var draftIds = [];

+        var dbMsgsTmp = [];

+        var dbMsgsTmpIds = [];

+        var chatHasDraft = false;

+        for (var i = config.dbMsgs.length - 1; i >= 0; i--) {

+            var e = config.dbMsgs[i];

+            if (_.indexOf(dbMsgsTmpIds, e.id) != -1) {

+                continue;

+            }

+            if (getLastNumber(e.number, config.SMS_MATCH_LENGTH) == config.currentChatObject && _.isEmpty(e.groupId)) {

+                e.isNew = false;

+                e.errorText = '';

+                e.targetName = '';

+                if (e.tag == "0" || e.tag == "1") {

+                    $.tmpl("smsOtherTmpl", e).appendTo("#chatlist");

+                    dbMsgsTmpIds.push(e.id);

+                    dbMsgsTmp.push(e);

+                } else if (e.tag == "2" || e.tag == "3") {

+                    $.tmpl("smsMeTmpl", e).appendTo("#chatlist");

+                    dbMsgsTmpIds.push(e.id);

+                    dbMsgsTmp.push(e);

+                } else if (e.tag == "4") {

+                    draftIds.push(e.id);

+                    $("#chat-input", "#smsChatRoom").val(e.content).removeAttr('data-trans');

+                    updateChatInputWordLength();

+                    chatHasDraft = true;

+                }

+            } else {

+                dbMsgsTmpIds.push(e.id);

+                dbMsgsTmp.push(e);

+            }

+        }

+        $("#chatlist").translate();

+        if (chatHasDraft) {

+            $("#chosenUser", "#smsChatRoom").show();

+            $("#chosenUser1", "#smsChatRoom").addClass("hide");

+        } else {

+            $("#chosenUser", "#smsChatRoom").hide();

+            $("#chosenUser1", "#smsChatRoom").removeClass("hide").html(HTMLEncode(name));

+        }

+        config.dbMsgs = dbMsgsTmp.reverse();

+        if (draftIds.length > 0) {

+            deleteDraftSms(draftIds, [num]);

+        } else {

+            checkSmsCapacityAndAlert();

+        }

+

+        checkSimStatusForSend();

+        gotoBottom();

+        chatRoomInLoading = false;

+    };

+

+    function checkSmsCapacityAndAlert() {

+        var capabilityContainer = $("#smsCapability");

+        updateSmsCapabilityStatus(capabilityContainer);

+        addTimeout(function () {

+            if (!hasCapability) {

+                showAlert("sms_capacity_is_full_for_send");

+            }

+        }, 2000);

+    }

+

+    cleanChatInput = function () {

+        $("#chat-input", "#smsChatRoom").val($.i18n.prop("chat_input_placehoder")).attr("data-trans", "chat_input_placehoder");

+    };

+

+    //设置为已读

+    setAsRead = function (num) {

+        var ids = [];

+        $.each(config.dbMsgs, function (i, e) {

+            if (getLastNumber(e.number, config.SMS_MATCH_LENGTH) == getLastNumber(num, config.SMS_MATCH_LENGTH) && e.isNew) {

+                ids.push(e.id);

+                e.isNew = false;

+            }

+        });

+        if (ids.length > 0) {

+            service.setSmsRead({

+                ids: ids

+            }, function (data) {

+                if (data.result) {

+                    $("#smslist-item-" + getLastNumber(num, config.SMS_MATCH_LENGTH) + " .smslist-item-new-count").text("").addClass("hide");

+                    $("#smslist-item-" + getLastNumber(num, config.SMS_MATCH_LENGTH)).removeClass("font-weight-bold");

+                    $("#smslist-item-" + getLastNumber(num, config.SMS_MATCH_LENGTH) + " td:nth-child(2)").removeClass("font-weight-bold");

+                }

+                $.each(config.listMsgs, function (i, e) {

+                    if (e.number == num && e.newCount > 0) {

+                        e.newCount = 0;

+                    }

+                });

+            });

+        }

+    };

+

+    //转发按钮点击事件

+    forwardClickHandler = function (id) {

+        var selectedContact = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+        var content = $("#chat-input", "#smsChatRoom").val();

+        var hasContent = typeof content != "undefined" && content != '' && content != $.i18n.prop('chat_input_placehoder');

+        if (hasContent) {

+            saveDraftAction({

+                content: content,

+                numbers: selectedContact,

+                isFromBack: true,

+                noLoading: true

+            });

+        }

+

+        clearChatList();

+        config.currentChatObject = null;

+

+        $("#chosenUser1", "#smsChatRoom").addClass("hide");

+        $("#chosenUser", "#smsChatRoom").show();

+        for (var j = 0; j < config.dbMsgs.length; j++) {

+            if (config.dbMsgs[j].id == id) {

+                var theChatInput = $("#chat-input", "#smsChatRoom");

+                theChatInput.val(config.dbMsgs[j].content);

+                setInsertPos(theChatInput[0], config.dbMsgs[j].content.length);

+            }

+        }

+        updateChatInputWordLength();

+        $("select.chosen-select-deselect").val("").trigger("chosen:updated.chosen");

+        addTimeout(function () {

+            $("#chosen-search-field-input").focus();

+        }, 300);

+        switchPage('chat');

+        gotoBottom();

+    };

+

+    //更新剩余字数

+    updateChatInputWordLength = function () {

+        var msgInput = $("#chat-input", "#smsChatRoom");

+        var msgInputDom = msgInput[0];

+        var strValue = msgInput.val();

+        var encodeType = getEncodeType(strValue);

+        var maxLength = encodeType.encodeType == 'UNICODE' ? 335 : 765;

+        if (strValue.length + encodeType.extendLen > maxLength) {

+            var scrollTop = msgInputDom.scrollTop;

+            var insertPos = getInsertPos(msgInputDom);

+            var moreLen = strValue.length + encodeType.extendLen - maxLength;

+            var insertPart = strValue.substr(insertPos - moreLen > 0 ? insertPos - moreLen : 0, moreLen);

+            var reversed = insertPart.split('').reverse();

+            var checkMore = 0;

+            var cutNum = 0;

+            for (var i = 0; i < reversed.length; i++) {

+                if (getEncodeType(reversed[i]).extendLen > 0) {

+                    checkMore += 2;

+                } else {

+                    checkMore++;

+                }

+                if (checkMore >= moreLen) {

+                    cutNum = i + 1;

+                    break;

+                }

+            }

+            var iInsertToStartLength = insertPos - cutNum;

+            msgInputDom.value = strValue.substr(0, iInsertToStartLength) + strValue.substr(insertPos);

+            if (msgInputDom.value.length > maxLength) {

+                msgInputDom.value = msgInputDom.value.substr(0, maxLength);

+            }

+            setInsertPos(msgInputDom, iInsertToStartLength);

+            msgInputDom.scrollTop = scrollTop;

+        }

+        var textLength = 0;

+        var newValue = $(msgInputDom).val();

+        var newEncodeType = {

+            encodeType: 'GSM7_default',

+            extendLen: 0

+        };

+        if (newValue != $.i18n.prop('chat_input_placehoder')) {

+            newEncodeType = getEncodeType(newValue);

+        }

+        var newMaxLength = newEncodeType.encodeType == 'UNICODE' ? 335 : 765;

+        var $inputCount = $("#inputcount", "#inputpanel");

+        var $inputItemCount = $("#inputItemCount", "#inputpanel");

+        if (newValue.length + newEncodeType.extendLen >= newMaxLength) {

+            $inputCount.addClass("colorRed");

+            $inputItemCount.addClass("colorRed");

+        } else {

+            $("#inputcount", "#inputpanel").removeClass("colorRed");

+            $("#inputItemCount", "#inputpanel").removeClass("colorRed");

+        }

+        if ("" != newValue && $.i18n.prop('chat_input_placehoder') != newValue) {

+            textLength = newValue.length + newEncodeType.extendLen;

+        }

+        $inputCount.html("(" + textLength + "/" + newMaxLength + ")");

+        $inputItemCount.html("(" + getSmsCount(newValue) + "/5)");

+        draftListener();

+    };

+

+    //文档内容监听,判断是否修改过

+    function draftListener() {

+        var content = $("#chat-input", "#smsChatRoom").val();

+        if (hasCapability) {

+            var selectedContact = getSelectValFromChosen($('.search-choice', '#chosenUserSelect_chosen'));

+            var noContactSelected = !selectedContact || selectedContact.length == 0;

+            var hasContent = typeof content != "undefined" && content != '' && content != $.i18n.prop('chat_input_placehoder');

+

+            if (!hasContent) {

+                config.resetContentModifyValue();

+                return;

+            }

+            if (hasContent && !noContactSelected) {

+                config.CONTENT_MODIFIED.modified = true;

+                config.CONTENT_MODIFIED.message = 'sms_to_save_draft';

+                config.CONTENT_MODIFIED.callback.ok = saveDraftAction;

+                config.CONTENT_MODIFIED.callback.no = $.noop;

+                config.CONTENT_MODIFIED.data = {

+                    content: $("#chat-input", "#smsChatRoom").val(),

+                    numbers: selectedContact

+                };

+                return;

+            }

+            if (hasContent && noContactSelected) {

+                config.CONTENT_MODIFIED.modified = true;

+                config.CONTENT_MODIFIED.message = 'sms_no_recipient';

+                config.CONTENT_MODIFIED.callback.ok = $.noop;

+                config.CONTENT_MODIFIED.callback.no = function () {

+                    // 返回true,页面保持原状

+                    return true;

+                }; //$.noop;

+                return;

+            }

+        } else {

+            config.resetContentModifyValue();

+        }

+    }

+

+    //保存草稿回调动作

+    function saveDraftAction(data) {

+        var datetime = new Date();

+        var params = {

+            index: -1,

+            currentTimeString: getCurrentTimeString(datetime),

+            groupId: data.numbers.length > 1 ? datetime.getTime() : '',

+            message: data.content,

+            numbers: data.numbers

+        };

+        !data.noLoading && showLoading('waiting');

+        service.saveSMS(params, function () {

+            if (data.isFromBack) {

+                getLatestDraftSms(data.numbers);

+                !data.noLoading && successOverlay('sms_save_draft_success');

+                window.location.reload();

+            } else {

+                !data.noLoading && successOverlay('sms_save_draft_success');

+                window.location.reload();

+            }

+        }, function () {

+            !data.noLoading && errorOverlay("sms_save_draft_failed")

+        });

+

+        //获取最新的草稿信息

+        function getLatestDraftSms(numbers) {

+            service.getSMSMessages({

+                page: 0,

+                smsCount: 5,

+                nMessageStoreType: 1,

+                tags: 4,

+                orderBy: "order by id desc"

+            }, function (data) {

+                if (data.messages && data.messages.length > 0) {

+                    var theGroupId = '',

+                    draftShowName = '',

+                    draftShowNameTitle = '',

+                    i = 0,

+                    drafts = [];

+                    for (; i < data.messages.length; i++) {

+                        var msg = data.messages[i];

+                        for (var k = 0; k < numbers.length; k++) {

+                            var num = numbers[k];

+                            if (getLastNumber(num, config.SMS_MATCH_LENGTH) == getLastNumber(msg.number, config.SMS_MATCH_LENGTH)) { //if (num.indexOf(msg.number) == 0) {

+                                msg.number = num;

+                            }

+                        }

+                        if (theGroupId != '' && theGroupId != msg.groupId) {

+                            break;

+                        }

+                        updateDBMsg(msg);

+                        if (msg.groupId == '') { // 单条草稿

+                            break;

+                        } else { // 多条草稿

+                            theGroupId = msg.groupId;

+                            var showName = getShowNameByNumber(msg.number);

+                            draftShowName += (i == 0 ? '' : ';') + showName;

+                            draftShowNameTitle += (i == 0 ? '' : ';') + showName;

+                        }

+                        drafts.push(msg);

+                    }

+                    if (theGroupId == '') { // 单条草稿

+                        var msg = data.messages[0];

+                        msg.hasDraft = true;

+                        updateMsgList(msg);

+                    } else { // 多条草稿

+                        var msg = data.messages[0];

+                        var len = 10;

+                        if (getEncodeType(draftShowName).encodeType == "UNICODE") {

+                            len = 10;

+                        }

+                        msg.draftShowNameTitle = draftShowNameTitle;

+                        msg.draftShowName = draftShowName.length > len ? draftShowName.substring(0, len) + "..." : draftShowName;

+                        msg.hasDraft = true;

+                        msg.totalCount = i;

+                        groupedDraftsObject[theGroupId] = drafts;

+                        updateMsgList(msg);

+                    }

+                    tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+                }

+            }, function () {

+                // do nothing

+            });

+        }

+    }

+

+    //点击群聊草稿进入草稿发送页面 在进入的过程中会先删掉草稿

+    draftSmsItemClickHandler = function (groupId) {

+        if (chatRoomInLoading) {

+            return false;

+        }

+        chatRoomInLoading = true;

+        var msgs = groupedDraftsObject[groupId];

+        var numbers = [];

+        var ids = [];

+        for (var i = 0; msgs && i < msgs.length; i++) {

+            numbers.push(getLastNumber(msgs[i].number, config.SMS_MATCH_LENGTH));

+            ids.push(msgs[i].id + '');

+        }

+        $("#chosenUser", "#smsChatRoom").show();

+        $("#chosenUser1", "#smsChatRoom").addClass("hide").html('');

+        $("select.chosen-select-deselect").val(numbers).trigger("chosen:updated.chosen");

+        $("#chat-input", "#smsChatRoom").val(msgs[0].content);

+        updateChatInputWordLength();

+        clearChatList();

+        switchPage('chat');

+        draftListener();

+        gotoBottom();

+        chatRoomInLoading = false;

+        deleteMultiDraftSms(ids, groupId);

+    };

+

+    //按列表条目删除短消息

+    deletePhoneMessageClickHandler = function (num) {

+        showConfirm("confirm_sms_delete", function () {

+            showLoading('deleting');

+            var ids = [];

+            $.each(config.dbMsgs, function (i, e) {

+                if (e.number == num) {

+                    ids.push(e.id);

+                }

+            });

+            service.deleteMessage({

+                ids: ids

+            }, function (data) {

+                $("#smslist-item-" + getLastNumber(num, config.SMS_MATCH_LENGTH)).hide().remove();

+                synchSmsList([num], ids);

+                successOverlay();

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+            }, function (error) {

+                errorOverlay(error.errorText);

+            });

+        });

+    };

+

+    //同步短信列表数据

+    synchSmsList = function (nums, ids) {

+        if (nums && nums.length > 0) {

+            config.listMsgs = $.grep(config.listMsgs, function (n, i) {

+                return $.inArray(n.number, nums) == -1;

+            });

+        }

+        if (ids && ids.length > 0) {

+            var dbMsgsTmp = [];

+            $.each(config.dbMsgs, function (i, e) {

+                if ($.inArray(e.id, ids) == -1) {

+                    dbMsgsTmp.push(e);

+                }

+            });

+            config.dbMsgs = dbMsgsTmp;

+        }

+    };

+

+    //确定最后一条短消息距离顶部的距离

+    function fixScrollTop() {

+        var items = $(".smslist-item");

+        var lastOne;

+        if (items.length > 0) {

+            lastOne = items[items.length - 1];

+        } else {

+            lastOne = items[0];

+        }

+        lastItemOffsetTop = lastOne ? lastOne.offsetTop : 600;

+    }

+

+    function loadData() {

+        if (ready && !scrolling && lastItemOffsetTop < ($(window).scrollTop() + $(window).height())

+             && $(".smslist-item").length != config.listMsgs.length) {

+            scrolling = true;

+            addTimeout(function () {

+                removeChecked("smslist-checkAll");

+                changeShownMsgs();

+                fixScrollTop();

+                scrolling = false;

+            }, 100);

+        }

+    }

+

+    function stopNavigation() {

+        disableBtn($('#btn-back'));

+        $('a', '#left').bind("click", function () {

+            return false;

+        });

+        $('a', '#list-nav').bind("click", function () {

+            return false;

+        });

+    }

+

+    function restoreNavigation() {

+        enableBtn($('#btn-back'));

+        $('a', '#left').unbind("click");

+        $('a', '#list-nav').unbind("click");

+    }

+

+    function searchTable(key) {

+        key = $.trim(key);

+        var $trs = $('tr', '#smslist-table'),

+        trLength = $trs.length;

+        if (key == '') {

+            $trs.show();

+            return false;

+        }

+        $trs.hide();

+        while (trLength) {

+            var $tr = $($trs[trLength - 1]),

+            $tds = $('td', $tr),

+            tdLength = $tds.length;

+            while (tdLength - 1) {

+                var $td = $($tds[tdLength - 1]);

+                if ($td.text().toLowerCase().indexOf(key.toLowerCase()) != -1) {

+                    $tr.show();

+                    break;

+                }

+                tdLength--;

+            }

+            trLength--;

+        }

+

+        addTimeout(function () {

+            $(":checkbox:checked", "#addPhonebookContainer").removeAttr('checked');

+            vm.selectedItemIds([]);

+            vm.freshStatus($.now());

+            renderCheckbox();

+        }, 300);

+        return true;

+    }

+	updateSearchValue = function (key) {

+        if (key == "" || key == $.i18n.prop("search")) {

+            return true;

+        }

+        searchTable(key);

+    };

+	//清除搜索关键字事件

+    clearSearchKey = function () {

+        updateSearchValue($.i18n.prop("search"));

+        $("#searchInput").addClass("ko-grid-search-txt-default").attr("data-trans", "search");

+    };

+    //点击搜索输入框事件

+    searchTextClick = function () {

+        var searchText = $("#searchInput");

+        if (searchText.hasClass("ko-grid-search-txt-default")) {

+            updateSearchValue("");

+            searchText.val("");

+            searchText.removeClass("ko-grid-search-txt-default").removeAttr("data-trans");

+        }

+    };

+    //离开搜索输入框事件

+    searchTextBlur = function () {

+        var txt = $.trim($("#searchInput").val()).toLowerCase();

+        if (txt == "") {

+            clearSearchKey();

+        }

+    };

+

+    window.smsUtil = {

+        changeLocationHandler: function (ele) {

+            if ($(ele).val() == 'sim') {

+                window.location.hash = '#msg_sim';

+            } else {

+                window.location.hash = '#msg_main';

+            }

+        }

+    };

+

+    return {

+        init: init

+    };

+});

+

+define("sms_set","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var validityModes = _.map(config.SMS_VALIDITY, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    function SmsSetViewMode() {

+        var target = this;

+        var setting = getSmsSetting();

+        target.modes = ko.observableArray(validityModes);

+        target.selectedMode = ko.observable(setting.validity);

+        target.centerNumber = ko.observable(setting.centerNumber);

+        target.deliveryReport = ko.observable(setting.deliveryReport);

+

+        target.clear = function () {

+            init();

+            clearValidateMsg();

+        };

+

+        target.save = function () {

+            showLoading('waiting');

+            var params = {};

+            params.validity = target.selectedMode();

+            params.centerNumber = target.centerNumber();

+            params.deliveryReport = target.deliveryReport();

+            service.setSmsSetting(params, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+    }

+

+    //获取短信设置参数

+

+    function getSmsSetting() {

+        return service.getSmsSetting();

+    }

+

+    function init() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new SmsSetViewMode();

+        ko.applyBindings(vm, container[0]);

+        $('#smsSettingForm').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtCenterNumber: "sms_service_center_check"

+            }

+        });

+    }

+

+    return {

+        init: init

+    };

+});

+

+define("sms_sim_messages","jquery knockout set service".split(" "),

+    function ($, ko, config, service) {

+    var simMsgListTmpl = null;

+    //每页记录条数

+    var perPage = 200;

+

+    //获取短信分页记录

+    function getSMSMessages() {

+        return service.getSMSMessages({

+            page: 0,

+            smsCount: perPage,

+            nMessageStoreType: 0,

+            tags: 10,

+            orderBy: "order by id desc"

+        }, function (data) {

+            tryToDisableCheckAll($("#simMsgList-checkAll"), data.messages.length);

+            dealPhoneBooks(data.messages);

+        }, function (data) {

+            dealPhoneBooks([]);

+        });

+    }

+

+    //短信显示联系人名字,并将结果显示在UI

+    function dealPhoneBooks(messages) {

+        $.each(messages, function (j, n) {

+            n.itemId = getLastNumber(n.number, config.SMS_MATCH_LENGTH);

+            for (var i = 0; i < config.phonebook.length; i++) {

+                var person = config.phonebook[i];

+                if (n.itemId == getLastNumber(person.pbm_number, config.SMS_MATCH_LENGTH)) {

+                    n.name = person.pbm_name;

+                    break;

+                }

+            }

+        });

+        renderSimMessageList(messages);

+    }

+

+    //清楚短信列表内容

+    cleanSimSmsList = function () {

+        $("#simMsgList_container").empty();

+    };

+

+    //将短信显示结果显示在UI

+    function renderSimMessageList(messages) {

+        if (simMsgListTmpl == null) {

+            simMsgListTmpl = $.template("simMsgListTmpl", $("#simMsgListTmpl"));

+        }

+        cleanSimSmsList();

+        $("#simMsgList_container").html($.tmpl("simMsgListTmpl", {

+                data: messages

+            }));

+        hideLoading();

+    }

+

+    //初始化电话本信息

+    function initPhoneBooks(cb) {

+        service.getPhoneBooks({

+            page: 0,

+            data_per_page: 2000,

+            orderBy: "name",

+            isAsc: true

+        }, function (books) {

+            if ($.isArray(books.pbm_data) && books.pbm_data.length > 0) {

+                config.phonebook = books.pbm_data;

+            } else {

+                config.phonebook = [];

+            }

+            cb();

+        }, function () {

+            errorOverlay();

+        });

+    }

+

+    function simSmsViewMode() {

+        var self = this;

+        start();

+    }

+

+    //短信删除事件处理

+    deleteSelectedSimMsgClickHandler = function () {

+        var checkbox = $("input[name=msgId]:checked", "#simMsgList_container");

+        var msgIds = [];

+        for (var i = 0; i < checkbox.length; i++) {

+            msgIds.push($(checkbox[i]).val());

+        }

+        if (msgIds.length == 0) {

+            return false;

+        }

+        showConfirm("confirm_sms_delete", function () {

+            showLoading('deleting');

+            service.deleteMessage({

+                ids: msgIds

+            }, function (data) {

+                removeChecked("simMsgList-checkAll");

+                disableBtn($("#simMsgList-delete"));

+                var idsForDelete = "";

+                checkbox.each(function (i, n) {

+                    idsForDelete += ".simMsgList-item-class-" + $(n).val() + ",";

+                });

+                if (idsForDelete.length > 0) {

+                    $(idsForDelete.substring(0, idsForDelete.length - 1)).hide().remove();

+                }

+                tryToDisableCheckAll($("#simMsgList-checkAll"), $(".smslist-item", "#simMsgList_container").length);

+                successOverlay();

+            }, function (error) {

+                errorOverlay(error.errorText);

+            });

+            //删除短信后需要刷新列表

+            updateSimSmsCapabilityStatus($("#simSmsCapability"));

+        });

+    };

+    //将被checked的条目添加到self.checkedItem中,用于在滚动还原checkbox

+    function checkboxClickHandler() {

+        if (getSelectedItemSize() == 0) {

+            disableBtn($("#simMsgList-delete"));

+        } else {

+            enableBtn($("#simMsgList-delete"));

+        }

+    }

+

+    //获取已选择的条目

+    function getSelectedItemSize() {

+        return $("input:checkbox:checked", '#simMsgList_container').length;

+    }

+

+    //模块开始,检查电话本及短信状态并加装页码数据

+    function start() {

+        showLoading('waiting');

+        var getSMSReady = function () {

+            service.getSMSReady({}, function (data) {

+                if (data.sms_cmd_status_result == "2") {

+                    hideLoading();

+                    showAlert("sms_init_fail");

+                } else if (data.sms_cmd_status_result == "1") {

+                    addTimeout(function () {

+                        getSMSReady();

+                    }, 1000);

+                } else {

+                    if (!config.HAS_PHONEBOOK) {

+                        initSMSList(config.HAS_PHONEBOOK);

+                    } else {

+                        getPhoneBookReady();

+                    }

+                }

+            });

+        };

+

+        var getPhoneBookReady = function () {

+            service.getPhoneBookReady({}, function (data) {

+                if (data.pbm_init_flag == "6") {

+                    initSMSList(false);

+                } else if (data.pbm_init_flag != "0") {

+                    addTimeout(function () {

+                        getPhoneBookReady();

+                    }, 1000);

+                } else {

+                    initSMSList(config.HAS_PHONEBOOK);

+                }

+            });

+        };

+

+        var initSMSList = function (isPbmInitOK) {

+            if (isPbmInitOK) {

+                initPhoneBooks(function () {

+                    getSMSMessages();

+                });

+            } else {

+                config.phonebook = [];

+                getSMSMessages();

+            }

+        };

+        getSMSReady();

+        initSimSmsCapability();

+    }

+

+    //初始化短信容量状态

+    function initSimSmsCapability() {

+        var capabilityContainer = $("#simSmsCapability");

+        updateSimSmsCapabilityStatus(capabilityContainer);

+        addInterval(function () {

+            updateSimSmsCapabilityStatus(capabilityContainer);

+        }, 5000);

+    }

+

+    //更新短信容量状态

+    function updateSimSmsCapabilityStatus(capabilityContainer) {

+        service.getSmsCapability({}, function (capability) {

+            if (capabilityContainer != null) {

+                capabilityContainer.text("(" + capability.simUsed + "/" + capability.simTotal + ")");

+            }

+        });

+    }

+

+    //清除搜索关键字事件

+    clearSearchKey = function () {

+        updateSearchValue($.i18n.prop("search"));

+        $("#searchInput").addClass("ko-grid-search-txt-default").attr("data-trans", "search");

+    };

+    //点击搜索输入框事件

+    searchTextClick = function () {

+        var searchText = $("#searchInput");

+        if (searchText.hasClass("ko-grid-search-txt-default")) {

+            updateSearchValue("");

+            searchText.val("");

+            searchText.removeClass("ko-grid-search-txt-default").removeAttr("data-trans");

+        }

+    };

+    //离开搜索输入框事件

+    searchTextBlur = function () {

+        var txt = $.trim($("#searchInput").val()).toLowerCase();

+        if (txt == "") {

+            clearSearchKey();

+        }

+    };

+

+    updateSearchValue = function (key) {

+        if (key == "" || key == $.i18n.prop("search")) {

+            return true;

+        }

+        searchTable(key);

+    }

+

+    function searchTable(key) {

+        key = $.trim(key);

+        var $trs = $('tr', '#smslist-table'),

+        trLength = $trs.length;

+        if (key == '') {

+            $trs.show();

+            return false;

+        }

+        $trs.hide();

+        while (trLength) {

+            var $tr = $($trs[trLength - 1]),

+            $tds = $('td', $tr),

+            tdLength = $tds.length;

+            while (tdLength - 1) {

+                var $td = $($tds[tdLength - 1]);

+                if ($td.text().toLowerCase().indexOf(key.toLowerCase()) != -1) {

+                    $tr.show();

+                    break;

+                }

+                tdLength--;

+            }

+            trLength--;

+        }

+

+        addTimeout(function () {

+            $(":checkbox:checked", "#addPhonebookContainer").removeAttr('checked');

+            vm.selectedItemIds([]);

+            vm.freshStatus($.now());

+            renderCheckbox();

+        }, 300);

+        return true;

+    }

+

+    //点击短信列表条目

+    simsmsItemClickHandler = function (tag, id, num) {

+        if (tag == "1") {

+            var ids = [];

+            ids.push(id);

+            service.setSmsRead({

+                ids: ids

+            }, function (data) {

+                if (data.result) {

+                    $(".simMsgList-item-class-" + id, "#simMsgTableContainer").removeClass('font-weight-bold');

+                }

+            });

+        }

+    }

+

+    //页面事件绑定

+    function initEventBind() {

+        $(".smslist-item-msg", "#simMsgTableContainer").die().live("click", function () {

+            var $this = $(this).addClass('showFullHeight');

+            $('.smslist-item-msg.showFullHeight', '#simMsgTableContainer').not($this).removeClass('showFullHeight');

+        });

+        $("#simMsgList_container p.checkbox, #simMsgListForm #simMsgList-checkAll").die().live("click", function () {

+            checkboxClickHandler();

+        });

+        $("#searchInput").die().live('blur', function () {

+            searchTextBlur();

+        }).live('keyup', function () {

+            updateSearchValue($("#searchInput").val());

+        });

+    }

+

+    //模块初始化开始

+    function init() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new simSmsViewMode();

+        ko.applyBindings(vm, container[0]);

+        initEventBind();

+    }

+

+    window.smsUtil = {

+        changeLocationHandler: function (ele) {

+            if ($(ele).val() == 'sim') {

+                window.location.hash = '#msg_sim';

+            } else {

+                window.location.hash = '#msg_main';

+            }

+        }

+    };

+

+    return {

+        init: init

+    };

+});

diff --git a/lynq/S300/ap/app/zte_webui/js/wifi.js b/lynq/S300/ap/app/zte_webui/js/wifi.js
new file mode 100755
index 0000000..eceb2a9
--- /dev/null
+++ b/lynq/S300/ap/app/zte_webui/js/wifi.js
@@ -0,0 +1,3757 @@
+define("wifi_advance","underscore jquery knockout set service jqui".split(" "),

+    function (_, $, ko, config, service, jqui) {

+    var $sliderRange = null;

+    //当前是否WiFi连接

+    var viaWifi = false;

+

+    function paintRateOption(data) {

+        var opts = [];

+        for (var i = 0; i < data.length; i++) {

+            var rate = data[i].rate == 0 ? "Auto" : data[i].rate + " Mbps";

+            opts.push(new Option(rate, data[i].index));

+        }

+        return opts;

+    }

+

+    //wifi传输速率

+    var transpeed = [0, 1, 2, 5.5, 6, 6.5, 9, 11, 12, 13, 18, 19.5, 24, 26, 36, 39, 48, 52, 54, 58.5, 65];

+

+    function rateSort(a, b) {

+        return a.rate - b.rate;

+    }

+    //删除重复速率值

+    function unionRate(rateTable) {

+        var rates = [],

+        result = [];

+        for (var i = 0; i < rateTable.length; i++) {

+            for (var j = 0; j < rateTable[i].length; j++) {

+                if (ko.utils.arrayIndexOf(rates, rateTable[i][j]) == -1) {

+                    rates.push(rateTable[i][j]);

+                    result.push({

+                        index: rateTable[i][j],

+                        rate: transpeed[rateTable[i][j]]

+                    });

+                }

+            }

+        }

+        result.sort(rateSort);

+        return result;

+    }

+

+    //根据模式生成速率选项

+    function modeRateOption(wifimode) {

+        var wifimodeN = [0, 5, 9, 11, 13, 15, 17, 19, 20];

+        var wifimodeG = [0, 4, 6, 8, 10, 12, 14, 16, 18];

+        var wifimodeB = [0, 1, 2, 3, 7];

+        var rate = [];

+

+        switch (wifimode) {

+            //--wifimode

+        case '5':

+            rate.push(wifimodeN);

+            rate.push(wifimodeG);

+            rate.push(wifimodeB);

+            break;

+        case '4':

+            rate.push(wifimodeN);

+            rate.push(wifimodeG);

+            rate.push(wifimodeB);

+            break;

+        case '3':

+            rate.push(wifimodeG);

+            rate.push(wifimodeB);

+            break;

+        case '2':

+            rate.push(wifimodeN);

+            break;

+        case '1':

+            rate.push(wifimodeG);

+            break;

+        case '0':

+            rate.push(wifimodeB);

+            break;

+

+        default:

+            rate.push(wifimodeN);

+            break;

+        }

+        var union = unionRate(rate);

+        return paintRateOption(union);

+    }

+

+    function getCountryCode(country) {

+        var countryCodeArr = config.countryCode;

+        var type = '';

+        for (key in countryCodeArr) {

+            var codes = countryCodeArr[key];

+            if ($.inArray(country, codes) != -1) {

+                type = key;

+                break;

+            }

+        }

+        var typeCode = config.countryCodeType[type];

+        return typeCode ? typeCode : "0";

+    }

+

+    function channelOption(country) {

+        var showOption = [new Option('Auto', '0')];

+        var type = getCountryCode(country) + '';

+        switch (type) {

+            //--type

+        case '9':

+            generateChannelOption(showOption, 2307, 13);

+            break;

+        case '7':

+            generateChannelOption(showOption, 2307, 13);

+            generateChannelOption(showOption, 2407, 11);

+            generateChannelOption(showOption, 2462, 2);

+            break;

+        case '3':

+            generateChannelOption(showOption, 2407, 11);

+            generateChannelOption(showOption, 2462, 2);

+            break;

+            //--type

+        case '2':

+            generateChannelOption(showOption, 2307, 13);

+            generateChannelOption(showOption, 2407, 11);

+            break;

+        case '1':

+            generateChannelOption(showOption, 2407, 11);

+            break;

+        default:

+            generateChannelOption(showOption, 2407, 11);

+        }

+        return showOption;

+    }

+    function generateChannelOption(showOption, start, count) {

+        for (var i = 1; i <= count; i++) {

+            var txt = start + i * 5 + "MHz (Channel " + showOption.length + ")";

+            showOption.push(new Option(txt, showOption.length + "_" + (start + i * 5)));

+        }

+    }

+

+    function channelOption5g(country) {

+        for (key in config.countryCode_5g) {

+            var item = config.countryCode_5g[key];

+            if ($.inArray(country, item.codes) != -1) {

+                return generate5gChannelOption(item.channels);

+            }

+        }

+        return [new Option('Auto', '0')];

+    }

+    function generate5gChannelOption(channels) {

+        var showOption = [new Option('Auto', '0')];

+        for (var i = 0; i < channels.length; i++) {

+            var channel = channels[i];

+            var mhz = channel * 5 + 5000;

+            var txt = mhz + "MHz (Channel " + channel + ")";

+            showOption.push(new Option(txt, channel + "_" + (mhz)));

+        }

+        return showOption;

+    }

+

+    function getBandOptions() {

+        var showOption = [];

+        if (!config.WIFI_HAS_5G) {

+            showOption.push(new Option('2.4GHz', 'b'));

+        } else {

+            showOption.push(new Option('5GHz', 'a'));

+            showOption.push(new Option('2.4GHz', 'b'));

+        }

+        return showOption;

+    }

+

+    function getChannelBandwidthsOptions(isSupport40) {

+        var showOption = [];

+        if (isSupport40) {

+            showOption.push(new Option('20MHz', '0'));

+            showOption.push(new Option('20MHz/40MHz', '1'));

+        } else {

+            showOption.push(new Option('20MHz', '0'));

+        }

+        return showOption;

+    }

+

+    function countryCodeOption(is5G) {

+        var countries = is5G ? config.countries_5g : config.countries;

+        var showOption = [];

+        for (key in countries) {

+            showOption.push(new Option(countries[key], key));

+        }

+        showOption = _.sortBy(showOption, function (opt) {

+            return opt.text;

+        });

+        return showOption;

+    }

+

+    function getWifiAdvance() {

+        return service.getWifiAdvance();

+    }

+

+    function getWpsState() {

+        return service.getWpsInfo();

+    }

+

+    function getModeOption(wifiBand) {

+        var modes = wifiBand == 'a' ? config.NETWORK_MODES_BAND : config.NETWORK_MODES;

+        if (wifiBand == 'a') {

+            $("#mode").hide();

+            $("#modeFor5HZ").show();

+            $("#modeLabel").attr('for', 'modeFor5HZ');

+        } else if (modes.length == 1) {

+            $("#mode").hide();

+            $("#modeFor5HZ").hide();

+        } else {

+            $("#mode").show();

+            $("#modeFor5HZ").hide();

+        }

+        var modeOptions = [];

+        for (var i = 0; i < modes.length; i++) {

+            modeOptions.push(new Option(modes[i].name, modes[i].value));

+        }

+        return modeOptions;

+    }

+

+    function getSelectedRateV(rate, rates) {

+        for (var i = 0; i < rates.length; i++) {

+            var opt = rates[i];

+            if (opt.text == rate + " Mbps") {

+                return opt.value;

+            }

+        }

+        return '0';

+    }

+    //获取所选的信道对应的value值

+    function getSelectedChannelV(channel, channels) {

+        for (var i = 0; i < channels.length; i++) {

+            var opt = $(channels[i]);

+            if (opt.val().split("_")[0] == channel) {

+                return opt.val();

+            }

+        }

+        return '0';

+    }

+

+    function WifiAdvanceViewModel() {

+        // Data

+        var target = this;

+

+        var wifiInfo = service.getWifiAdvance();

+        target.origin_ap_station_enable = wifiInfo.ap_station_enable;

+        target.modes = ko.observableArray(getModeOption(wifiInfo.wifiBand));

+        target.bands = ko.observableArray(getBandOptions());

+

+        var countryOpts = countryCodeOption(wifiInfo.wifiBand == 'a');

+        target.countries = ko.observableArray(countryOpts);

+        target.channels = ko.observableArray(wifiInfo.wifiBand == 'a' ? channelOption5g(wifiInfo.countryCode) : channelOption(wifiInfo.countryCode));

+        target.rates = ko.observableArray(modeRateOption(wifiInfo.mode));

+

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+        target.hasWifiBand = ko.observable(config.WIFI_BAND_SUPPORT);

+        target.hasBandwidth = ko.observable(config.WIFI_BANDWIDTH_SUPPORT);

+

+        target.selectedMode = ko.observable(wifiInfo.mode);

+        target.selectedChannel = ko.observable(getSelectedChannelV(wifiInfo.channel, target.channels()));

+        target.selectedChannelBandwidth = ko.observable(wifiInfo.bandwidth); //5:a, 2.5:b

+        target.selectedCountry = ko.observable(wifiInfo.countryCode.toUpperCase());

+        target.selectedBand = ko.observable(wifiInfo.wifiBand); //5:a, 2.5:b

+        target.selectedRate = ko.observable(getSelectedRateV(wifiInfo.rate, target.rates()));

+

+        var baseInfo = service.getWifiBasic();

+        target.wifi_enable = ko.observable(baseInfo.wifi_enable);

+        if (config.HAS_MULTI_SSID && ((baseInfo.m_AuthMode == "OPEN" && baseInfo.m_encryptType == "WEP") || (baseInfo.m_AuthMode == "SHARED" && baseInfo.m_encryptType == "WEP") || baseInfo.m_encryptType == "TKIP")) {

+            target.isF = ko.observable(true);

+        } else if ((baseInfo.AuthMode == "OPEN" && baseInfo.encryptType == "WEP") || (baseInfo.AuthMode == "SHARED" && baseInfo.encryptType == "WEP") || baseInfo.encryptType == "TKIP") {

+            target.isF = ko.observable(true);

+        } else {

+            target.isF = ko.observable(false);

+        }

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (baseInfo.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+        target.multi_ssid_enable = ko.observable(baseInfo.multi_ssid_enable);

+        target.origin_multi_ssid_enable = baseInfo.multi_ssid_enable;

+        target.maxStationNumber = ko.observable(wifiInfo.MAX_Station_num);

+        target.selectedStation = ko.observable(wifiInfo.MAX_Access_num);

+        target.selectedStationM = ko.observable(wifiInfo.m_MAX_Access_num);

+

+        target.oneBandTrans = ko.observable(wifiInfo.wifiBand == 'a' ? '5G' : '2.4G');

+        target.oneModeTrans = ko.observable((wifiInfo.wifiBand == 'a' ? 'network_modes_band_select_' : 'network_mode_select_') + wifiInfo.mode);

+

+        target.channelBandwidths = ko.computed(function () {

+            if (config.WIFI_BANDWIDTH_SUPPORT_40MHZ) {

+                return getChannelBandwidthsOptions(true);

+            } else {

+                return getChannelBandwidthsOptions(false);

+            }

+        });

+

+        wifiInfo = $.extend(wifiInfo, target);

+

+        //Event Handler 频段切换时更新对应的国家/地区码、信道和网络模式选项

+        target.bandChangeHandler = function () {

+            if (target.selectedBand() == 'a') { //5g

+                //802.11a only   802.11n only   802.11a/n

+                target.modes(getModeOption(target.selectedBand()));

+                target.countries(countryCodeOption(true));

+            } else { // 2.4g

+                //802.11 n only   802.11 b/g/n

+                target.modes(getModeOption(target.selectedBand()));

+                target.countries(countryCodeOption(false));

+            }

+            target.selectedCountry('0');

+            target.channels(target.generateChannelOption());

+            target.selectedChannel('0');

+        };

+

+        target.countryChangeHandler = function (data, event) {

+            var opts = target.generateChannelOption();

+            target.channels(opts);

+            target.selectedChannel('0');

+        };

+

+        target.modeChangeHandler = function (data, event) {

+            var opts = modeRateOption(target.selectedMode());

+            target.rates(opts);

+            target.selectedRate('0');

+        };

+

+        target.generateChannelOption = function () {

+            if (target.selectedBand() == 'a') {

+                return channelOption5g(target.selectedCountry());

+            } else {

+                return channelOption(target.selectedCountry());

+            }

+        };

+

+        target.save = function () {

+            var status = getWpsState();

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return;

+            }

+            var selectedRateTxt = $("#rate option:selected").text();

+            var rateVal = null;

+            if (selectedRateTxt != $.i18n.prop('rate_0')) {

+                rateVal = $.trim(selectedRateTxt.replace('Mbps', ''));

+            } else {

+                rateVal = 0;

+            }

+            var wifiParam = {};

+            wifiParam.countryCode = target.selectedCountry();

+            wifiParam.mode = target.selectedMode();

+            var selectedChannel = target.selectedChannel();

+            wifiParam.channel = selectedChannel == '0' ? '0' : selectedChannel.split("_")[0];

+            wifiParam.rate = rateVal;

+            wifiParam.wifiBand = target.selectedBand();

+            if (config.WIFI_BANDWIDTH_SUPPORT) {

+                wifiParam.bandwidth = target.selectedChannelBandwidth();

+            }

+            wifiParam.station = target.selectedStation();

+            wifiParam.m_station = target.selectedStationM();

+            showConfirm('wifi_disconnect_confirm', function () {

+                showLoading('waiting');

+                service.setWifiAdvance(wifiParam, function (result) {

+                    if (result.result == "success") {

+                        if (viaWifi) {

+                            setTimeout(advanceReloadVarWifi, 15000);

+                        } else {

+                            addInterval(advanceReload, 1000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            });

+        };

+

+        target.checkSettings = function (ssid) {

+            var status = getWpsState();

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            if (config.HAS_MULTI_SSID && baseInfo.multi_ssid_enable == "1") {

+                if ((ssid == "ssid1" && parseInt(target.selectedStation()) + parseInt(baseInfo.m_MAX_Access_num) > baseInfo.MAX_Station_num)

+                     || (ssid == "ssid2" && parseInt(target.m_selectedStation()) + parseInt(baseInfo.MAX_Access_num) > baseInfo.MAX_Station_num)) {

+                    showAlert({

+                        msg: 'multi_ssid_max_access_number_alert',

+                        wifiParam: baseInfo.MAX_Station_num

+                    });

+                    return true;

+                }

+            }

+

+            return false;

+        };

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = function () {

+                showLoading('waiting');

+                var wifiParam = {};

+                wifiParam.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    wifiParam.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(wifiParam, function (result) {

+                    if (result.result == "success") {

+                        if (viaWifi) {

+                            setTimeout(hasApReloadVarWifi, 15000);

+                        } else {

+                            addInterval(hasApReload, 1000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            var baseInfo = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!baseInfo.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!baseInfo.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+

+            function hasApReloadVarWifi() {

+                successOverlay();

+                setTimeout(function () {

+                    window.location.reload();

+                }, 1000);

+                clearTimer();

+                clearValidateMsg();

+                service.refreshAPStationStatus();

+                initialize();

+            }

+            function hasApReload() {

+                var baseInfo = service.getWifiBasic();

+                if (baseInfo.wifi_enable == target.wifi_enable()) {

+                    successOverlay();

+                    clearTimer();

+                    clearValidateMsg();

+                    service.refreshAPStationStatus();

+                    initialize();

+                }

+            }

+

+        };

+

+    }

+

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    function advanceReloadVarWifi() {

+        successOverlay();

+        setTimeout(function () {

+            window.location.reload();

+        }, 1000);

+    }

+

+    function advanceReload() {

+        var baseInfo = service.getWifiBasic();

+        if (baseInfo.wifi_enable == "1") {

+            successOverlay();

+            clearTimer();

+            clearValidateMsg();

+            initialize();

+        }

+    }

+

+    function initialize() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new WifiAdvanceViewModel();

+        ko.applyBindings(vm, container[0]);

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+

+        if (config.WDS_SUPPORT) {

+            checkWifiStatusUseWDS();

+        } else if (config.AP_STATION_SUPPORT) {

+            checkWifiStatus();

+        }

+

+        $('#wifi_advance_form').validate({

+            submitHandler: function () {

+                vm.save();

+            }

+        });

+

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+    }

+

+    function checkWifiStatusUseWDS() {

+        var baseInfo = service.getWdsInfo();

+        if (baseInfo.currentMode == "0") {

+            $(':input', '#frmWifiSwitch,#wifi_advance_form').each(function () {

+                $(this).prop("disabled", false);

+            });

+        } else {

+            $(':input', '#frmWifiSwitch,#wifi_advance_form').each(function () {

+                $(this).prop("disabled", true);

+            });

+        }

+    }

+

+    function checkWifiStatus() {

+        var baseInfo = service.getAPStationBasic();

+        if (baseInfo.ap_station_enable != "1") {

+            $(':input', '#wifi_advance_form').each(function () {

+                $(this).prop("disabled", false);

+            });

+        } else {

+            $(':input', '#wifi_advance_form').each(function () {

+                $(this).prop("disabled", true);

+            });

+        }

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_ap_station","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+    var viaWifi = false;

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    function apStationViewMode() {

+        var target = this;

+        var ssid_ex = "";

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+

+        var securityModes = _.map(config.AUTH_MODES_ALL, function (item) {

+            return new Option(item.name, item.value);

+        });

+        //当前页面标识  list列表页 add添加页面  edit编辑页面

+        target.page = {

+            list: 1,

+            add: 2,

+            edit: 3

+        };

+        //WiFi热点列表列的配置项

+        var gridColumn = [{

+                columnType: "radio",

+                headerTextTrans: "option",

+                rowText: "profileName",

+                width: "10%"

+            }, {

+                headerTextTrans: "ssid_title",

+                rowText: "ssid",

+                width: "30%"

+            }, {

+                columnType: "image",

+                headerTextTrans: "signal",

+                rowText: "imgSignal",

+                width: "30%"

+            }, {

+                headerTextTrans: "security_mode",

+                rowText: "authMode_show",

+                width: "30%"

+            }

+        ];

+        //搜索到的WiFi热点列表列的配置项

+        var searchGridColumn = [{

+                columnType: "radio",

+                rowText: "index",

+                width: "10%"

+            }, {

+                headerTextTrans: "ssid_title",

+                rowText: "ssid",

+                width: "30%"

+            }, {

+                columnType: "image",

+                headerTextTrans: "signal",

+                rowText: "imgSignal",

+                width: "30%"

+            }, {

+                headerTextTrans: "security_mode",

+                rowText: "authMode_show",

+                width: "30%"

+            }

+        ];

+

+        target.pageState = ko.observable(target.page.list);

+

+        var info = service.getAPStationBasic();

+

+        target.origin_ap_station_enable = info.ap_station_enable;

+        target.ap_station_enable = ko.observable(info.ap_station_enable);

+        target.apList = ko.observable([]);

+        if (target.origin_ap_station_enable == "1") {

+            var apList = service.getHotspotList();

+            target.apList(fixHotspotList(apList.hotspotList));

+        }

+

+        target.apSearchList = ko.observable([]);

+

+        target.connectButtonStatus = ko.observable("disable");

+        target.hasSelectFromUser = ko.observable();

+        target.showPassword = ko.observable(false);

+

+        target.isCableMode = ko.observable();

+

+        var infoBasic = service.getWifiBasic();

+        target.wifi_enable = ko.observable(infoBasic.wifi_enable);

+

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (infoBasic.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+        target.multi_ssid_enable = ko.observable(infoBasic.multi_ssid_enable);

+

+        //密码显示事件

+        target.showPasswordHandler = function () {

+            $("#codeWPAKey").parent().find(".error").hide();

+            $("#pwdWepKey").parent().find(".error").hide();

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+

+        target.showWPAPasswordHandler = function () {

+            $("#codeWPAKey").parent().find(".error").hide();

+            $("#pwdWepKey").parent().find(".error").hide();

+            if ($("#showWPAPassword").is(":checked")) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+

+        //列表模板创建

+        target.apGrid = new ko.simpleGrid.viewModel({

+            idName: "profileName",

+            data: target.apList(),

+            tmplType: 'list',

+            pageSize: 100,

+            columns: gridColumn,

+            primaryColumn: "fromProvider",

+            radioClickHandler: function () {

+                computeButtonState();

+            }

+        });

+        //热点搜索结果列表模板创建

+        target.apSearchGrid = new ko.simpleGrid.viewModel({

+            data: target.apSearchList(),

+            idName: "index",

+            tmplType: 'list',

+            pageSize: 100,

+            columns: searchGridColumn,

+            radioClickHandler: function () {

+                var index = target.apSearchGrid.radioSelectValue();

+                var aplist = target.apSearchList();

+                for (var i = 0; i < aplist.length; i++) {

+                    var list_item = aplist[i];

+                    if (list_item.index == index) {

+                        target.profileName("");

+                        target.ssid(list_item.ssid);

+                        ssid_ex = list_item.ssid;

+                        target.signal(list_item.signal);

+                        target.authMode(list_item.authMode);

+                        target.password(list_item.password);

+                        target.mac(list_item.mac);

+                        if (list_item.authMode == "WPAPSKWPA2PSK" || list_item.authMode == "WPA2PSK" || list_item.authMode == "WPAPSK" || list_item.authMode == "WPA3Personal" || list_item.authMode == "WPA2WPA3") {

+                            target.encryptType_WPA(list_item.encryptType);

+                        } else {

+                            target.encryptType(list_item.encryptType);

+                        }

+                        target.keyID(list_item.keyID);

+                        renderCustomElement($("#cipherGroup"));

+                        break;

+                    }

+                }

+            }

+        });

+

+        //计算并设置当前连接和按钮的状态

+        target.computeConnectStatus = function () {

+            computeButtonState();

+

+            var networkStatus = target.connectStatus();

+            if (networkStatus == "ppp_connected") {

+                target.current_status_trans("ap_station_wan_connected");

+                target.current_status_text($.i18n.prop("ap_station_wan_connected"));

+                return;

+            }

+

+            var ssid = target.connectWifiSSID();

+            var wifiStatus = target.connectWifiStatus();

+            if (ssid && wifiStatus == "connect") {

+                target.current_status_trans("ap_station_wlan_connected");

+                target.current_status_text($.i18n.prop("ap_station_wlan_connected"));

+                return;

+            }

+

+            target.current_status_trans("ap_station_no_connection");

+            target.current_status_text($.i18n.prop("ap_station_no_connection"));

+        };

+        //计算并设置按钮的状态

+        function computeButtonState() {

+            var profileName = target.apGrid.radioSelectValue();

+            if (!profileName) {

+                target.hasSelectFromUser(false);

+                target.connectButtonStatus("disable");

+                return;

+            }

+

+            var status = "";

+            var fromProvider = "";

+            for (var i = 0; i < target.apList().length; i++) {

+                var list_item = target.apList()[i];

+                if (list_item.profileName == profileName) {

+                    status = list_item.connectStatus;

+                    fromProvider = list_item.fromProvider;

+                    break;

+                }

+            }

+

+            if (status == "1") {

+                target.connectButtonStatus("hide");

+                target.hasSelectFromUser(false);

+            } else {

+                target.connectButtonStatus("show");

+                target.hasSelectFromUser(fromProvider == "0");

+            }

+        }

+        var statusInfo = service.getStatusInfo();

+        target.networkType = ko.observable(statusInfo.networkType);

+        target.networkOperator = ko.observable(statusInfo.networkOperator);

+        target.connectStatus = ko.observable(statusInfo.connectStatus);

+        target.connectWifiStatus = ko.observable(statusInfo.connectWifiStatus);

+        target.connectWifiProfile = ko.observable(statusInfo.connectWifiProfile);

+        target.connectWifiSSID = ko.observable(statusInfo.connectWifiSSID);

+

+        target.current_status_trans = ko.observable("");

+        target.current_status_text = ko.observable("");

+        target.current_status = ko.computed(function () {

+            target.computeConnectStatus()

+        });

+

+        target.modes = securityModes;

+        target.profileName = ko.observable("");

+        target.ssid = ko.observable();

+        target.signal = ko.observable("0");

+        target.authMode = ko.observable();

+        target.password = ko.observable();

+        target.encryptType = ko.observable();

+        target.encryptType_WPA = ko.observable("TKIPCCMP");

+        target.keyID = ko.observable("0");

+        target.mac = ko.observable();

+

+        target.openAddPage = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            target.clear();

+            getSearchHotspot();

+        };

+

+        //打开基本设置页面

+        target.openListPage = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            target.clear();

+            target.pageState(target.page.list);

+            target.apGrid.data(target.apList());

+            v.computeConnectStatus();

+        };

+

+        target.addHotspot = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            if (target.pageState() == target.page.add && target.apList().length >= config.AP_STATION_LIST_LENGTH) {

+                showAlert({

+                    msg: "ap_station_exceed_list_max",

+                    params: config.AP_STATION_LIST_LENGTH

+                });

+                return;

+            }

+            showLoading('waiting');

+            var wifi_para = {};

+            var profileName = target.apGrid.radioSelectValue();

+            wifi_para.profileName = target.profileName();

+            wifi_para.ssid = target.ssid();

+            wifi_para.signal = target.signal();

+            wifi_para.authMode = target.authMode();

+            wifi_para.password = target.password();

+            if (wifi_para.authMode == "SHARED") {

+                wifi_para.encryptType = "WEP";

+            } else if (wifi_para.authMode == "WPAPSKWPA2PSK" || wifi_para.authMode == "WPA2PSK" || wifi_para.authMode == "WPAPSK" || wifi_para.authMode == "WPA3Personal" || wifi_para.authMode == "WPA2WPA3") {

+                wifi_para.encryptType = target.encryptType_WPA();

+            } else {

+                wifi_para.encryptType = target.encryptType();

+            }

+            wifi_para.keyID = target.keyID();

+            wifi_para.mac = (target.mac() == "" || target.ssid() != ssid_ex) ? "0F:00:00:00:00:00" : target.mac();

+            wifi_para.apList = target.apList();

+            service.saveHotspot(wifi_para, function (data) {

+                target.callback(data, true);

+            });

+        };

+

+        target.deleteHotspot = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            showConfirm("confirm_data_delete", function () {

+                var wifi_para = {};

+                wifi_para.profileName = target.apGrid.radioSelectValue();

+                wifi_para.apList = target.apList();

+                showLoading('waiting');

+                service.deleteHotspot(wifi_para, function (data) {

+                    target.callback(data, true);

+                });

+            });

+        };

+

+        target.openEditPage = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            var profileName = target.apGrid.radioSelectValue();

+            var aplist = target.apList();

+            for (var i = 0; i < aplist.length; i++) {

+                var list_item = aplist[i];

+                if (list_item.profileName == profileName) {

+                    target.profileName(profileName);

+                    target.ssid(list_item.ssid);

+                    target.signal(list_item.signal);

+                    target.authMode(list_item.authMode);

+                    target.password(list_item.password);

+                    target.mac(list_item.mac);

+                    if (list_item.authMode == "WPAPSKWPA2PSK" || list_item.authMode == "WPA2PSK" || list_item.authMode == "WPAPSK" || list_item.authMode == "WPA3Personal" || list_item.authMode == "WPA2WPA3") {

+                        target.encryptType_WPA(list_item.encryptType);

+                    } else {

+                        target.encryptType(list_item.encryptType);

+                    }

+                    target.keyID(list_item.keyID);

+                }

+            }

+            target.pageState(target.page.edit);

+        };

+

+        target.connectHotspot = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            var profileName = target.apGrid.radioSelectValue();

+            var apList = target.apList();

+

+            function connect() {

+                showLoading("connecting");

+                var wifi_para = {};

+                var connectIndex = -1;

+                var ssid = "";

+                for (var i = 0; i < apList.length; i++) {

+                    if (apList[i].profileName == profileName) {

+

+                        wifi_para.EX_SSID1 = apList[i].ssid;

+                        wifi_para.EX_AuthMode = apList[i].authMode;

+                        wifi_para.EX_EncrypType = apList[i].encryptType;

+                        wifi_para.EX_DefaultKeyID = apList[i].keyID;

+                        wifi_para.EX_WEPKEY = apList[i].password;

+                        wifi_para.EX_WPAPSK1 = apList[i].password;

+                        wifi_para.EX_wifi_profile = apList[i].profileName;

+                        wifi_para.EX_mac = apList[i].mac;

+                        connectIndex = i;

+                        ssid = apList[i].ssid;

+                        break;

+                    }

+                }

+

+                target.connectWifiSSID(ssid);

+                target.connectWifiStatus("connecting");

+                target.apGrid.setRadioSelect(profileName);

+                target.connectButtonStatus("disable");

+

+                service.connectHotspot(wifi_para, function (data) {

+                    if (data && data.result == "success") {

+                        target.connectButtonStatus("disable");

+                        //延迟检测 确保取得的状态是最新的

+                        addTimeout(checkWifiStatus, 3000);

+                    } else if (data && data.result == "processing") {

+                        showAlert("ap_station_processing");

+                    } else {

+                        var apList = target.apList(); // cov_2

+                        apList[connectIndex].connectStatus = "0";

+                        target.connectWifiStatus("disconnect");

+                        target.connectButtonStatus("show");

+                        hideLoading();

+                        errorOverlay();

+                    }

+                    var apList = service.getHotspotList();

+                    target.apList(fixHotspotList(apList.hotspotList));

+                    target.connectWifiProfile(profileName);

+                    target.connectWifiSSID(ssid);

+                    target.apGrid.data([]);

+                    target.apGrid.data(target.apList());

+                    target.apGrid.setRadioSelect(profileName);

+                });

+            }

+

+            //将用户选中的profile排在运营商定制profile后的第一位

+            function refreshApList(profile, aplist) {

+                var apListLeft = [];

+                var apListPre = [];

+                for (var i = 0; i < aplist.length; i++) {

+                    if (aplist[i].fromProvider != "1") {

+                        if (aplist[i].profileName == profile) {

+                            apListPre.push(apList[i]);

+                        } else {

+                            apListLeft.push(apList[i]);

+                        }

+                    } else {

+                        apListPre.push(apList[i]);

+                    }

+                }

+                var apListNew = apListPre.concat(apListLeft);

+                service.saveHotspot({

+                    apList: apListNew

+                }, function (data) {

+                    if (data && data.result == "success") {

+                        apList = apListNew;

+                        target.apList(fixHotspotList(apList));

+                    }

+                });

+            }

+

+            var check_count = 0;

+            var connectStatus = false;

+

+            var status = service.getStatusInfo();

+            if (status.connectStatus == "ppp_connected" || status.connectStatus == "ppp_connecting") {

+                showConfirm("ap_station_connect_change_alert", function () {

+                    showLoading();

+                    connect();

+                });

+            } else {

+                connect();

+            }

+

+            function checkWifiStatus() {

+                check_count = check_count + 1;

+                if (check_count > 60) {

+                    hideLoading();

+                    errorOverlay();

+                    return;

+                }

+                if (!connectStatus) {

+                    var status = service.getStatusInfo();

+                    if (status.connectWifiStatus != "connect") {

+                        addTimeout(checkWifiStatus, 1000);

+                    } else {

+                        connectStatus = true;

+                    }

+                }

+                if (connectStatus) {

+                    //继续判断profile中连接状态是否为1

+                    service.getHotspotList({}, function (data) {

+                        for (var i = 0, len = data.hotspotList.length; i < len; i++) {

+                            var list_item = data.hotspotList[i];

+                            if (list_item.profileName == profileName) {

+                                if (list_item.connectStatus == "1") {

+                                    hideLoading();

+                                    return;

+                                } else {

+                                    var errorMsg = {

+                                        msg: 'ap_connect_error',

+                                        params: [list_item.ssid]

+                                    };

+                                    showAlert(errorMsg);

+                                    return;

+                                }

+                                break;

+                            }

+                        }

+                        addTimeout(checkWifiStatus, 1000);

+                    });

+                }

+            }

+

+        };

+

+        target.disconnectHotspot = function () {

+            if (wpsIsOn()) {

+                return;

+            }

+            showLoading('disconnecting');

+            service.disconnectHotspot({}, function (data) {

+                target.callback(data, true);

+            })

+        };

+

+        function getSearchHotspot() {

+            var check_count = 0;

+

+            function search() {

+                var result = service.getSearchHotspotList();

+                if (result.scan_finish == "0") {

+                    if (check_count <= 60) {

+                        check_count = check_count + 1;

+                        addTimeout(search, 1000);

+                    } else {

+                        hideLoading();

+                        showAlert("ap_station_search_hotspot_fail");

+                    }

+                } else {

+                    if ("2" == result.scan_finish) {

+                        hideLoading();

+                        showAlert("ap_station_processing");

+                    } else {

+                        target.apSearchList(fixHotspotList(result.hotspotList));

+                        target.apSearchGrid.data(target.apSearchList());

+                        hideLoading();

+                    }

+                }

+            }

+

+            showLoading('scanning');

+            service.searchHotspot({}, function (data) {

+                if (data && data.result == "processing") {

+                    hideLoading();

+                    showAlert("ap_station_processing");

+                } else if (data && data.result == "success") {

+                    if (target.pageState() != target.page.add) {

+                        target.pageState(target.page.add);

+                    }

+                    search();

+                } else {

+                    if (target.pageState() != target.page.add) {

+                        target.pageState(target.page.add);

+                    }

+                    hideLoading();

+                    showAlert("ap_station_search_hotspot_fail");

+                }

+            });

+        }

+

+        //清除编辑页面的信息

+        target.clear = function () {

+            target.apSearchGrid.clearRadioSelect();

+            target.profileName("");

+            target.ssid("");

+            target.signal("0");

+            target.authMode("OPEN");

+            target.password("");

+            target.encryptType("NONE");

+            target.encryptType_WPA("TKIPCCMP");

+            target.keyID("0");

+            target.mac("");

+        };

+

+        target.apply = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+

+            function setBasic() {

+                showLoading('waiting');

+                var wifi_para = {};

+                wifi_para.ap_station_enable = target.ap_station_enable();

+                service.setAPStationBasic(wifi_para, function (data) {

+                    if (target.origin_ap_station_enable == target.ap_station_enable()) {

+                        target.callback(data, true);

+                    } else {

+                        target.callback2(data, true);

+                    }

+                });

+                service.refreshAPStationStatus();

+            }

+            if (!config.HAS_MULTI_SSID) {

+                setBasic();

+            } else {

+                var infoBasic = service.getWifiBasic();

+                if (target.ap_station_enable() == "1" && infoBasic.multi_ssid_enable == "1") {

+                    showConfirm("ap_station_enable_confirm", setBasic);

+                } else {

+                    setBasic();

+                }

+            }

+        };

+        //刷新搜到的热点列表

+        target.searchHotspot = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            getSearchHotspot();

+        };

+        //和webserver交互时的回调,wifi不重启的情况

+        target.callback = function (data, isInitPage) {

+            if (data) {

+                if (isInitPage) {

+                    initialize();

+                    $("#apList").translate();

+                }

+                if (data.result == "processing") {

+                    showAlert("ap_station_processing");

+                } else if (data.result == "spot_connected" || data.result == "spot_connecting") {

+                    showAlert("ap_station_update_fail");

+                } else if (data.result == "success") {

+                    successOverlay();

+                } else if (data.result == "exist") {

+                    showAlert("ap_station_exist");

+                } else {

+                    errorOverlay();

+                }

+            } else {

+                errorOverlay();

+            }

+        }

+

+        //和webserver交互时的回调,wifi会重启的情况

+        target.callback2 = function (data, isInitPage) {

+            if (data) {

+                if (!viaWifi) { //通过wifi登录webui

+                    addInterval(function () {

+                        var info = service.getWifiBasic();

+                        if (info.wifi_enable == "1") {

+                            clearTimer();

+                            clearValidateMsg();

+                            initialize();

+                            $("#apList").translate();

+                            if (data.result == "spot_connected" || data.result == "spot_connecting") {

+                                showAlert("ap_station_update_fail");

+                            } else if (data.result == "success") {

+                                successOverlay();

+                            } else {

+                                errorOverlay();

+                            }

+                        }

+                    }, 1000);

+                } else {

+                    setTimeout(function () {

+                        if (data.result == "processing") {

+                            showAlert("ap_station_processing");

+                        } else if (data.result == "spot_connecting" || data.result == "spot_connected") {

+                            showAlert("ap_station_update_fail");

+                        } else if (data.result == "success") {

+                            successOverlay();

+                            setTimeout(function () {

+                                window.location.reload();

+                            }, 1000);

+                            clearTimer();

+                            clearValidateMsg();

+                            initialize();

+                        } else {

+                            errorOverlay();

+                        }

+                    }, 15000);

+                }

+            } else {

+                errorOverlay();

+            }

+        };

+

+        target.checkSettings = function (ssid) {

+            var status = service.getWpsInfo();

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            if (config.HAS_MULTI_SSID && info.multi_ssid_enable == "1") {

+                if ((ssid == "ssid1" && parseInt(target.selectedStation()) + parseInt(info.m_MAX_Access_num) > info.MAX_Station_num)

+                     || (ssid == "ssid2" && parseInt(target.m_selectedStation()) + parseInt(info.MAX_Access_num) > info.MAX_Station_num)) {

+                    showAlert({

+                        msg: 'multi_ssid_max_access_number_alert',

+                        params: info.MAX_Station_num

+                    });

+                    return true;

+                }

+            }

+

+            return false;

+        };

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = function () {

+                showLoading('waiting');

+                var params = {};

+                params.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    params.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(params, function (result) {

+                    if (result.result == "success") {

+                        if (!viaWifi) {

+                            addInterval(function () {

+                                var info = service.getWifiBasic();

+                                if (info.wifi_enable == target.wifi_enable()) {

+                                    successOverlay();

+                                    clearTimer();

+                                    clearValidateMsg();

+                                    service.refreshAPStationStatus();

+                                    initialize();

+                                }

+                            }, 1000);

+                        } else {

+                            setTimeout(function () {

+                                successOverlay();

+                                setTimeout(function () {

+                                    window.location.reload();

+                                }, 1000);

+                                clearTimer();

+                                clearValidateMsg();

+                                service.refreshAPStationStatus();

+                                initialize();

+                            }, 15000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            var info = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!info.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!info.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+        };

+

+    }

+

+    function wpsIsOn() {

+        var wifi_info = service.getWpsInfo();

+        if (wifi_info.wpsFlag == '1') {

+            showAlert('wps_on_info', function() {

+                window.location.reload();

+            });

+            return true;

+        }

+    }

+

+    //处理热点列表内容,以便在表格显示

+    function fixHotspotList(list) {

+        var fixedList = [];

+        for (var ii = 0; ii < list.length; ii++) {

+            list[ii].index = ii;

+            var url_image = "";

+            if (list[ii].connectStatus != "1") {

+                if (list[ii].encryptType.toLowerCase() == "none" && list[ii].authMode.toLowerCase() == "open") {

+                    url_image = "pic/wlan_signal_" + list[ii].signal + ".png";

+                } else {

+                    url_image = "pic/wlan_lock_signal_" + list[ii].signal + ".png";

+                }

+            } else {

+                if (list[ii].encryptType.toLowerCase() == "none" && list[ii].authMode.toLowerCase() == "open") {

+                    url_image = "pic/wlan_connected.png";

+                } else {

+                    url_image = "pic/wlan_lock_connected.png";

+                }

+            }

+            list[ii].imgSignal = url_image;

+            list[ii].authMode_show = $.i18n.prop("ap_station_security_mode_" + list[ii].authMode);

+        }

+        return list;

+    }

+

+    function wifiIsClosed() {

+        var wifi_info = service.getWpsInfo();

+        if (wifi_info.radioFlag == "0") {

+            showAlert('wps_wifi_off');

+            return true;

+        }

+    }

+

+    function event_bind(aps_vm) {

+        $("#showWPAPassword").change(function () {

+            aps_vm.showWPAPasswordHandler();

+        });

+        $("#showPassword").change(function () {

+            aps_vm.showPasswordHandler();

+        });

+    }

+

+    function initialize() {

+        var aps_vm = new apStationViewMode();

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        ko.applyBindings(aps_vm, container);

+        event_bind(aps_vm);

+

+        aps_refresh(true);

+        clearTimer();

+        addInterval(function () {

+            aps_refresh(false);

+            checkAccessMode();

+        }, 1000);

+

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                aps_vm.setMultiSSIDSwitch();

+            }

+        });

+

+        $("#frmAPStation").validate({

+            submitHandler: function () {

+                aps_vm.addHotspot();

+            },

+            rules: {

+                txtSSID: "ssid_ap"

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "txtWPAKey" || id == "codeWPAKey") {

+                    error.insertAfter("#lblshowWPAPassword");

+                } else if (id == "txtWepKey" || id == "pwdWepKey") {

+                    error.insertAfter("#lblShowPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+

+        function aps_refresh(initPage) {

+            var info = service.getStatusInfo();

+            if (info.multi_ssid_enable != "1") {

+                aps_vm.isCableMode(checkCableMode(info.blc_wan_mode));

+                aps_vm.connectWifiProfile(info.connectWifiProfile);

+                aps_vm.connectWifiSSID(info.connectWifiSSID);

+                aps_vm.connectWifiStatus(info.connectWifiStatus);

+                aps_vm.networkType(info.networkType);

+                aps_vm.connectStatus(info.connectStatus);

+                aps_vm.computeConnectStatus();

+

+                service.getHotspotList({}, function (data) {

+                    var list = fixHotspotList(data.hotspotList);

+                    aps_vm.apList(list);

+                    var gripList = aps_vm.apGrid.data();

+                    if (list.length > 0 && list[0].profileName != gripList[0].profileName && list[0].connectStatus == "1") {

+                        aps_vm.apGrid.data([]);

+                        aps_vm.apGrid.data(aps_vm.apList());

+                        aps_vm.apGrid.setRadioSelect(list[0].profileName);

+                    }

+                    renderCustomElement($("#apList"));

+                    var radios = $("input[type='radio']", "#apList").each(function () {

+                        for (var i = 0, len = list.length; i < len; i++) {

+                            if (list[i].profileName == $(this).val()) {

+                                var img = $(this).parent().parent().find("img")[0];

+                                img.src = list[i].imgSignal;

+                                if (initPage) {

+                                    if (list[i].connectStatus == "1") {

+                                        aps_vm.hasSelectFromUser(false);

+                                        aps_vm.connectButtonStatus("disable");

+                                    }

+                                }

+                            }

+                        }

+                    });

+                });

+            } else {

+                //to do

+            }

+        }

+

+    }

+

+    return {

+        init: initialize

+    }

+});

+

+define("wifi_guest","underscore jquery knockout set service CryptoJS".split(" "),

+

+    function (_, $, ko, config, service, CryptoJS) {

+

+    var viaWifi = false;

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    var securityModes = _.map(config.WIFI_WEP_SUPPORT ? config.AUTH_MODES_WEP : config.AUTH_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    function maxStationAccess(max) {

+        var showOption = [];

+        for (var i = 1; i <= max; i++) {

+            showOption.push(new Option(i, i));

+        }

+        return showOption;

+    }

+

+    function wifiGuestVM() {

+        var target = this;

+        var info = service.getWifiBasic();

+

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.showIsolated = config.SHOW_WIFI_AP_ISOLATED;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+        target.hasWifiWep = config.WIFI_WEP_SUPPORT;

+        target.hasWifiWpa3 = config.WIFI_WAP3_SUPPORT;

+        target.hasWifiWpa23 = config.WIFI_WPA2_WAP3_SUPPORT;

+

+        var advanceInfo = service.getWifiAdvance();

+        target.adBand = ko.observable(advanceInfo.wifiBand);

+        target.adMode = ko.observable(advanceInfo.mode);

+

+        target.showQRSwitch = config.WIFI_SUPPORT_QR_CODE && config.WIFI_SUPPORT_QR_SWITCH;

+        target.showQR = ko.observable(info.m_show_qrcode_flag);

+        if (config.WIFI_SUPPORT_QR_SWITCH) {

+            target.showQRCode = ko.observable(config.WIFI_SUPPORT_QR_CODE && target.showQR());

+        } else {

+            target.showQRCode = ko.observable(config.WIFI_SUPPORT_QR_CODE);

+        }

+        if(config.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_multi_ssid_wifikey.png?_=' + $.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        target.origin_ap_station_enable = info.ap_station_enable;

+        target.wifi_enable = ko.observable(info.wifi_enable);

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (info.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+

+        target.multi_ssid_enable = ko.observable(info.multi_ssid_enable);

+        target.origin_multi_ssid_enable = info.multi_ssid_enable;

+

+        target.maxStationNumber = ko.computed(function () {

+            return config.MAX_STATION_NUMBER;

+        });

+

+        target.modes = ko.observableArray(securityModes);

+        target.selectedMode = ko.observable(info.AuthMode);

+        target.passPhrase = ko.observable(info.passPhrase);

+        target.showPassword = ko.observable(false);

+        target.ssid = ko.observable(info.SSID);

+        target.broadcast = ko.observable(info.broadcast == '1' ? '1' : '0');

+        target.apIsolation = ko.observable(info.apIsolation == '1' ? '1' : '0');

+        target.cipher = info.cipher;

+        target.selectedStation = ko.observable(info.MAX_Access_num);

+        target.maxStations = ko.observableArray(maxStationAccess(info.MAX_Station_num));

+

+        target.m_modes = ko.observableArray(securityModes);

+        target.m_selectedMode = ko.observable(info.m_AuthMode);

+        target.m_passPhrase = ko.observable(info.m_passPhrase);

+        target.m_showPassword = ko.observable(false);

+        target.m_ssid = ko.observable(info.m_SSID);

+        target.m_broadcast = ko.observable(info.m_broadcast == '1' ? '1' : '0');

+        target.m_apIsolation = ko.observable(info.m_apIsolation == '1' ? '1' : '0');

+        target.m_cipher = info.m_cipher;

+        target.m_selectedStation = ko.observable(info.m_MAX_Access_num);

+        target.m_maxStations = ko.observableArray(maxStationAccess(info.MAX_Station_num));

+        target.m_encryptType = ko.observable(info.m_encryptType);

+        target.m_keyID = ko.observable(info.m_keyID);

+        target.m_wepPassword = ko.observable("");

+

+        //刷新界面状态值显示

+        target.clear = function (option) {

+            if (option == "switch") {

+                target.multi_ssid_enable(info.multi_ssid_enable);

+                target.wifi_enable(info.wifi_enable);

+            } else if (option == "ssid1") {

+                target.selectedMode(info.AuthMode);

+                target.passPhrase(info.passPhrase);

+                target.ssid(info.SSID);

+                target.broadcast(info.broadcast == '1' ? '1' : '0');

+                target.cipher = info.cipher;

+                target.selectedStation(info.MAX_Access_num);

+                target.apIsolation(info.apIsolation == '1' ? '1' : '0');

+            } else if (option == "ssid2") {

+                target.m_selectedMode(info.m_AuthMode);

+                target.m_passPhrase(info.m_passPhrase);

+                target.m_ssid(info.m_SSID);

+                target.m_broadcast(info.m_broadcast == '1' ? '1' : '0');

+                target.m_cipher = info.m_cipher;

+                target.m_selectedStation(info.m_MAX_Access_num);

+                target.m_apIsolation(info.m_apIsolation == '1' ? '1' : '0');

+                if (config.WIFI_WEP_SUPPORT) {

+                    target.m_encryptType(info.m_encryptType);

+                    target.m_keyID(info.m_keyID);

+                    target.m_wepPassword(target.getWepPassword());

+                }

+            } else {

+                clearTimer();

+                clearValidateMsg();

+                initialize();

+                service.refreshAPStationStatus();

+            }

+        };

+

+        target.getWepPassword = function () {

+            return target.m_keyID() == '3' ? info.m_Key4Str1 : (target.m_keyID() == '2' ? info.m_Key3Str1 : target.m_keyID() == '1' ? info.m_Key2Str1 : info.m_Key1Str1);

+        }

+        target.m_wepPassword(target.getWepPassword());

+        //WEP加密模式下网络秘钥切换事件

+        target.profileChangeHandler = function (data, event) {

+            $("#pwdWepKey").parent().find("label[class='error']").hide();

+            target.m_wepPassword(target.getWepPassword());

+            return true;

+        };

+

+        target.saveSSID1 = function () {

+            if (target.checkSettings("ssid1")) {

+                return;

+            }

+            showConfirm('wifi_disconnect_confirm', function () {

+                target.saveSSID1Action();

+            });

+        };

+        target.saveSSID1Action = function () {

+            showLoading('waiting');

+            target.broadcast($("#broadcastCheckbox:checked").length > 0 ? '0' : '1');

+            target.apIsolation($("#apisolatedCheckbox:checked").length);

+            var params = {};

+            params.AuthMode = target.selectedMode();

+            params.passPhrase = target.passPhrase();

+            params.SSID = target.ssid();

+            params.broadcast = target.broadcast();

+            params.station = target.selectedStation();

+            params.cipher = target.selectedMode() == "WPA2PSK" ? 1 : 2;

+            if (params.AuthMode == "WPA3Personal" || params.AuthMode == "WPA2WPA3") {

+                params.cipher = 1;

+            }

+            params.NoForwarding = target.apIsolation();

+            params.show_qrcode_flag = target.showQR() == true ? 1 : 0;

+            service.setWifiBasic(params, function (result) {

+                if (result.result == "success") {

+                    if (viaWifi) {

+                        setTimeout(guestReloadVarWifi, 15000);

+                    } else {

+                        addInterval(guestReload, 1000);

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+        target.saveSSID2 = function () {

+            if (target.checkSettings("ssid2")) {

+                return;

+            }

+            if (!config.PASSWORD_ENCODE) {

+                var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,32}');

+                if (!pwdRegex.test(target.m_passPhrase())) {

+                        showConfirm("password_note_too_low", function () {

+                            showConfirm('wifi_disconnect_confirm', function () {

+                            target.saveSSID2Action();

+                            return;

+                        });

+                        return;

+                    });

+                    return;

+                }

+            }

+            showConfirm('wifi_disconnect_confirm', function () {

+                target.saveSSID2Action();

+            });

+        };

+        target.saveSSID2Action = function () {

+            showLoading('waiting');

+            target.m_broadcast($("#mBroadcastCheckbox:checked").length > 0 ? '0' : '1');

+            target.m_apIsolation($("#mApIsolatedCheckbox:checked").length);

+            var ciphertext = "";

+            if (config.PASSWORD_ENCODE) {

+	        ciphertext = target.m_passPhrase();

+	    } else {

+                var kparam = service.getDeviceInfoLow();

+                var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                ciphertext = CryptoJS.AES.encrypt(target.m_passPhrase(), tkey, {

+                    iv: tiv,

+                    mode: CryptoJS.mode.CBC,

+                    padding: CryptoJS.pad.ZeroPadding

+                    }).toString();

+	    }

+            var params = {};

+            params.m_AuthMode = target.m_selectedMode();

+            params.m_passPhrase = ciphertext;

+            params.m_SSID = target.m_ssid();

+            params.m_broadcast = target.m_broadcast();

+            params.m_station = target.m_selectedStation();

+            params.m_cipher = target.m_selectedMode() == "WPA2PSK" ? 1 : 2;

+            if (params.m_AuthMode == "WPA3Personal" || params.m_AuthMode == "WPA2WPA3") {

+                params.m_cipher = 1;

+            }

+            params.m_NoForwarding = target.m_apIsolation();

+            params.m_show_qrcode_flag = target.showQR() == true ? 1 : 0;

+

+            if (config.WIFI_WEP_SUPPORT) {

+                if (params.m_AuthMode == "SHARED") {

+                    params.m_encryptType = "WEP";

+                } else if (params.m_AuthMode == "WPAPSKWPA2PSK" || params.m_AuthMode == "WPA2PSK" || params.m_AuthMode == "WPAPSK" || params.m_AuthMode == "WPA3Personal" || params.m_AuthMode == "WPA2WPA3") {

+                    //params.m_encryptType = target.m_encryptType_WPA();

+                } else {

+                    params.m_encryptType = target.m_encryptType();

+                }

+                params.m_wep_default_key = target.m_keyID();

+                params.m_wep_key_4 = info.m_Key4Str1;

+                params.m_wep_key_3 = info.m_Key3Str1;

+                params.m_wep_key_2 = info.m_Key2Str1;

+                params.m_wep_key_1 = info.m_Key1Str1;

+                var mWEPSelect = '0';

+                if (target.m_wepPassword().length == '13' || target.m_wepPassword().length == '5') {

+                    mWEPSelect = '1';

+                } else {

+                    mWEPSelect = '0';

+                }

+                if (target.m_keyID() == '3') {

+                    params.m_wep_key_4 = target.m_wepPassword();

+                    params.m_WEP4Select = mWEPSelect;

+                } else if (target.m_keyID() == '2') {

+                    params.m_wep_key_3 = target.m_wepPassword();

+                    params.m_WEP3Select = mWEPSelect;

+                } else if (target.m_keyID() == '1') {

+                    params.m_wep_key_2 = target.m_wepPassword();

+                    params.m_WEP2Select = mWEPSelect;

+                } else {

+                    params.m_wep_key_1 = target.m_wepPassword();

+                    params.m_WEP1Select = mWEPSelect;

+                }

+            }

+

+            service.setWifiBasic4SSID2(params, function (result) {

+                if (result.result == "success") {

+                    if (viaWifi) {

+                        setTimeout(ssid2ReloadVarWifi, 15000);

+                    } else {

+                        addInterval(ssid2Reload, 1000);

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+        function guestReloadVarWifi() {

+            successOverlay();

+            setTimeout(function () {

+                window.location.reload();

+            }, 1000);

+            target.clear();

+        }

+        function guestReload() {

+            var info = getWifiMain();

+            if (info.wifi_enable == "1") {

+                successOverlay();

+                target.clear();

+            }

+        }

+        function ssid2ReloadVarWifi() {

+            successOverlay();

+            setTimeout(function () {

+                window.location.reload();

+            }, 1000);

+            target.clear();

+        }

+        function ssid2Reload() {

+            var info = getWifiMain();

+            if (info.wifi_enable == "1") {

+                successOverlay();

+                target.clear();

+            }

+        }

+

+        target.checkSettings = function (ssid) {

+            var status = getWpsState();

+

+            if (config.HAS_MULTI_SSID) {

+                if (ssid == "ssid1" || ssid == "ssid2") {

+                    if (ssid == "ssid2") {

+                        var accessDevice = service.getStatusInfo().ssid2AttachedNum;

+                        if (parseInt(target.m_selectedStation()) < accessDevice) {

+                            showAlert('Extend_accessDevice');

+                            return true;

+                        }

+                    } else {

+                        var accessDevice = service.getStatusInfo().ssid1AttachedNum;

+                        if (parseInt(target.selectedStation()) < accessDevice) {

+                            showAlert('Extend_accessDevice');

+                            return true;

+                        }

+                    }

+                }

+            }

+

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            if (config.HAS_MULTI_SSID && info.multi_ssid_enable == "1") {

+                if ((ssid == "ssid1" && parseInt(target.selectedStation()) + parseInt(info.m_MAX_Access_num) > info.MAX_Station_num)

+                     || (ssid == "ssid2" && parseInt(target.m_selectedStation()) + parseInt(info.MAX_Access_num) > info.MAX_Station_num)) {

+                    showAlert({

+                        msg: 'multi_ssid_max_access_number_alert',

+                        params: info.MAX_Station_num

+                    });

+                    return true;

+                }

+            }

+

+            return false;

+        };

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = function () {

+                showLoading('waiting');

+                var params = {};

+                params.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    params.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(params, function (result) {

+                    if (result.result == "success") {

+                        if (viaWifi) {

+                            setTimeout(multiReloadViaWifi, 15000);

+                        } else {

+                            addInterval(multiReload, 1000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+            function multiReloadViaWifi() {

+                successOverlay();

+                setTimeout(function () {

+                    window.location.reload();

+                }, 1000);

+                target.clear();

+            }

+            function multiReload() {

+                var info = getWifiMain();

+                if (info.wifi_enable == target.wifi_enable()) {

+                    successOverlay();

+                    target.clear();

+                }

+            }

+            var info = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (config.AP_STATION_SUPPORT && target.multi_ssid_enable() == "1" && target.origin_ap_station_enable == "1") {

+                    if (!info.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!info.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+        };

+        target.showQRHandler = function () {

+            var checkbox = $("#showQR:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showQR(true);

+            } else {

+                target.showQR(false);

+            }

+            target.showQRCode(config.WIFI_SUPPORT_QR_CODE && target.showQR());

+        };

+

+        target.showPasswordHandler = guestShowPassword;

+

+        target.m_showPasswordHandler = m_guestShowPassword;

+

+        function guestShowPassword() {

+            $("#passShow").parent().find(".error").hide();

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        }

+        function m_guestShowPassword() {

+            $("#m_passShow").parent().find(".error").hide();

+            $("#m_pwdWepKey").parent().find(".error").hide();

+            var checkbox = $("#m_showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.m_showPassword(true);

+            } else {

+                target.m_showPassword(false);

+            }

+        }

+

+    }

+

+    function getWifiMain() {

+        return service.getWifiBasic();

+    }

+

+    function initialize() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new wifiGuestVM();

+        ko.applyBindings(vm, container[0]);

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+

+        function checkWifiStatus() {

+            var info = service.getAPStationBasic();

+            if (info.ap_station_enable != "1") {

+                $('#frmMultiSSID :input').each(function () {

+                    $(this).attr("disabled", false);

+                });

+            } else {

+                $('#frmMultiSSID :input').each(function () {

+                    $(this).attr("disabled", true);

+                });

+            }

+        }

+

+        function checkWifiStatusAccordingToWDS() {

+            var info = service.getWdsInfo();

+            if (info.currentMode == "0") {

+                $('#frmWifiSwitch :input').each(function () {

+                    $(this).attr("disabled", false);

+                });

+                $('#frmSSID2 :input').each(function () {

+                    $(this).attr("disabled", false);

+                });

+                $('#frmSSID1 :input').each(function () {

+                    $(this).attr("disabled", false);

+                });

+            } else {

+                $('#frmWifiSwitch :input').each(function () {

+                    $(this).attr("disabled", true);

+                });

+                $('#frmSSID2 :input').each(function () {

+                    $(this).attr("disabled", true);

+                });

+                $('#frmSSID1 :input').each(function () {

+                    $(this).attr("disabled", true);

+                });

+            }

+        }

+

+        if (config.WDS_SUPPORT) {

+            checkWifiStatusAccordingToWDS();

+        } else if (config.AP_STATION_SUPPORT) {

+            checkWifiStatus();

+        }

+

+        $('#frmMultiSSID').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+        $('#frmSSID2').validate({

+            submitHandler: function () {

+                vm.saveSSID2();

+            },

+            rules: {

+                m_ssid: 'ssid',

+                m_pwdWepKey: {

+                    wifi_wep_password_check: true,

+                    wifi_password_check: true

+                },

+                m_txtWepKey: {

+                    wifi_wep_password_check: true,

+                    wifi_password_check: true

+                },

+                m_pass: 'wifi_password_check',

+                m_passShow: 'wifi_password_check'

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "m_passShow" || id == "m_pass") {

+                    error.insertAfter("#m_lblShowPassword");

+                } else if (id == "m_txtWepKey" || id == "m_pwdWepKey") {

+                    error.insertAfter("#m_lblShowWepPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+        $('#frmSSID1').validate({

+            submitHandler: function () {

+                vm.saveSSID1();

+            },

+            rules: {

+                pass: 'wifi_password_check',

+                ssid: 'ssid',

+                passShow: 'wifi_password_check'

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "passShow" || id == "pass") {

+                    error.insertAfter("#lblShowPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+

+    }

+

+    function getWpsState() {

+        return service.getWpsInfo();

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_mac_filter","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var viaWifi = false;

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    function macFilterViewModel() {

+        var target = this;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.showIsolated = config.SHOW_WIFI_AP_ISOLATED;

+

+        var info = service.getMacFilterInfo();

+        var wifiBaseInfo = service.getWifiBasic();

+        target.multi_ssid_enable = ko.observable(wifiBaseInfo.multi_ssid_enable);

+        target.origin_ap_station_enable = wifiBaseInfo.ap_station_enable;

+        target.wifi_enable = ko.observable(wifiBaseInfo.wifi_enable);

+

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (wifiBaseInfo.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+

+        target.selectedAction = ko.observable(info.ACL_mode);

+        target.mac1 = ko.observable("");

+        target.mac2 = ko.observable("");

+        target.mac3 = ko.observable("");

+        target.mac4 = ko.observable("");

+        target.mac5 = ko.observable("");

+        target.mac6 = ko.observable("");

+        target.mac7 = ko.observable("");

+        target.mac8 = ko.observable("");

+        target.mac9 = ko.observable("");

+        target.mac10 = ko.observable("");

+        if (info.ACL_mode == "1") {

+            macInfoWhite = info.wifi_mac_white_list.split(";");

+            target.mac1 = ko.observable(macInfoWhite[0]);

+            target.mac2 = ko.observable(macInfoWhite[1]);

+            target.mac3 = ko.observable(macInfoWhite[2]);

+            target.mac4 = ko.observable(macInfoWhite[3]);

+            target.mac5 = ko.observable(macInfoWhite[4]);

+            target.mac6 = ko.observable(macInfoWhite[5]);

+            target.mac7 = ko.observable(macInfoWhite[6]);

+            target.mac8 = ko.observable(macInfoWhite[7]);

+            target.mac9 = ko.observable(macInfoWhite[8]);

+            target.mac10 = ko.observable(macInfoWhite[9]);

+        } else if (info.ACL_mode == "2") {

+            macInfoBlack = info.wifi_mac_black_list.split(";");

+            target.mac1 = ko.observable(macInfoBlack[0]);

+            target.mac2 = ko.observable(macInfoBlack[1]);

+            target.mac3 = ko.observable(macInfoBlack[2]);

+            target.mac4 = ko.observable(macInfoBlack[3]);

+            target.mac5 = ko.observable(macInfoBlack[4]);

+            target.mac6 = ko.observable(macInfoBlack[5]);

+            target.mac7 = ko.observable(macInfoBlack[6]);

+            target.mac8 = ko.observable(macInfoBlack[7]);

+            target.mac9 = ko.observable(macInfoBlack[8]);

+            target.mac10 = ko.observable(macInfoBlack[9]);

+        }

+

+        target.save = filter_save;

+        //切换MAC过滤规则事件

+        target.ChangeHandler = function () {

+            $("#mac_filter_form").find(".error").hide();

+            $("#mac_filter_form").find("input[type=text]").show();

+            var info = service.getMacFilterInfo();

+            if (target.selectedAction() == "1") {

+                macInfoWhite = info.wifi_mac_white_list.split(";");

+                target.mac1(macInfoWhite[0]);

+                target.mac2(macInfoWhite[1]);

+                target.mac3(macInfoWhite[2]);

+                target.mac4(macInfoWhite[3]);

+                target.mac5(macInfoWhite[4]);

+                target.mac6(macInfoWhite[5]);

+                target.mac7(macInfoWhite[6]);

+                target.mac8(macInfoWhite[7]);

+                target.mac9(macInfoWhite[8]);

+                target.mac10(macInfoWhite[9]);

+            } else if (target.selectedAction() == "2") {

+                macInfoBlack = info.wifi_mac_black_list.split(";");

+                target.mac1(macInfoBlack[0]);

+                target.mac2(macInfoBlack[1]);

+                target.mac3(macInfoBlack[2]);

+                target.mac4(macInfoBlack[3]);

+                target.mac5(macInfoBlack[4]);

+                target.mac6(macInfoBlack[5]);

+                target.mac7(macInfoBlack[6]);

+                target.mac8(macInfoBlack[7]);

+                target.mac9(macInfoBlack[8]);

+                target.mac10(macInfoBlack[9]);

+            } else {

+                target.mac1("");

+                target.mac2("");

+                target.mac3("");

+                target.mac4("");

+                target.mac5("");

+                target.mac6("");

+                target.mac7("");

+                target.mac8("");

+                target.mac9("");

+                target.mac10("");

+            }

+        }

+        //检查WPS状态

+        target.checkSettings = function (ssid) {

+            var wifi_status = service.getWpsInfo();

+            if (wifi_status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            return false;

+        };

+

+        //设置多SSID开关

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = setFilterSwitch;

+

+            var info = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!info.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!info.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+

+			function setFilterSwitch() {

+                showLoading('waiting');

+                var filter_param = {};

+                filter_param.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    filter_param.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(filter_param, function (result) {

+                    if (result.result == "success") {

+                        if (!viaWifi) {

+                            addInterval(function () {

+                                var info = service.getWifiBasic();

+                                service.refreshAPStationStatus();

+                                if (info.wifi_enable == target.wifi_enable()) {

+                                    successOverlay();

+                                    clearTimer();

+                                    clearValidateMsg();

+                                    service.refreshAPStationStatus();

+                                    initialize();

+                                }

+                            }, 1000);

+                        } else {

+                            setTimeout(function () {

+                                successOverlay();

+                                setTimeout(function () {

+                                    window.location.reload();

+                                }, 1000);

+                                clearTimer();

+                                clearValidateMsg();

+                                service.refreshAPStationStatus();

+                                initialize();

+                            }, 15000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            }

+        };

+

+		function filter_save() {

+            var wifi_status = service.getWpsInfo();

+            if (wifi_status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+

+            if (target.mac1() == undefined || target.mac1().indexOf(" ") >= 0) {

+                target.mac1("")

+            }

+            if (target.mac2() == undefined || target.mac2().indexOf(" ") >= 0) {

+                target.mac2("")

+            }

+            if (target.mac3() == undefined || target.mac3().indexOf(" ") >= 0) {

+                target.mac3("")

+            }

+            if (target.mac4() == undefined || target.mac4().indexOf(" ") >= 0) {

+                target.mac4("")

+            }

+            if (target.mac5() == undefined || target.mac5().indexOf(" ") >= 0) {

+                target.mac5("")

+            }

+            if (target.mac6() == undefined || target.mac6().indexOf(" ") >= 0) {

+                target.mac6("")

+            }

+            if (target.mac7() == undefined || target.mac7().indexOf(" ") >= 0) {

+                target.mac7("")

+            }

+            if (target.mac8() == undefined || target.mac8().indexOf(" ") >= 0) {

+                target.mac8("")

+            }

+            if (target.mac9() == undefined || target.mac9().indexOf(" ") >= 0) {

+                target.mac9("")

+            }

+            if (target.mac10() == undefined || target.mac10().indexOf(" ") >= 0) {

+                target.mac10("")

+            }

+

+            var mac_list = new Array(target.mac1(), target.mac2(), target.mac3(), target.mac4(), target.mac5(),

+                    target.mac6(), target.mac7(), target.mac8(), target.mac9(), target.mac10());

+            if (target.selectedAction() == "2" && info.client_mac_address != "" && $.inArray(info.client_mac_address, mac_list) != -1) {

+                showAlert('black_yourself_tip');

+                return false;

+            }

+            var list_sort = mac_list.sort(); //排序

+            for (var i = 0; i < list_sort.length - 1; i++) {

+                if (list_sort[i] != "" && list_sort[i] == list_sort[i + 1]) {

+                    showAlert('mac_repeat_tip');

+                    return false;

+                }

+            }

+            var string_maclist = "";

+            for (var i = 0; i < 10; i++) {

+                if (string_maclist == "") {

+                    string_maclist = mac_list[i];

+                } else {

+                    if (mac_list[i]) {

+                        string_maclist = string_maclist + ";" + mac_list[i];

+                    }

+                }

+            }

+            var filter_param = {};

+            filter_param.ACL_mode = target.selectedAction();

+            if (target.selectedAction() == "2") {

+                filter_param.wifi_mac_black_list = string_maclist;

+            } else if (target.selectedAction() == "1") {

+                filter_param.wifi_mac_white_list = string_maclist;

+            }

+            showLoading('waiting');

+            service.setMacFilter(filter_param, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+    }

+

+    function bindContainer(filter_vm) {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(filter_vm, container[0]);

+

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                filter_vm.setMultiSSIDSwitch();

+            }

+        });

+        $('#mac_filter_form').validate({

+            submitHandler: function () {

+                filter_vm.save();

+            },

+            rules: {

+                mac_1: 'mac_check',

+                mac_2: 'mac_check',

+                mac_3: 'mac_check',

+                mac_4: 'mac_check',

+                mac_5: 'mac_check',

+                mac_6: 'mac_check',

+                mac_7: 'mac_check',

+                mac_8: 'mac_check',

+                mac_9: 'mac_check',

+                mac_10: 'mac_check'

+            }

+        });

+    }

+    function initialize() {

+        var filter_vm = new macFilterViewModel();

+        bindContainer(filter_vm);

+

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_main","underscore jquery knockout set service CryptoJS".split(" "),

+    function (_, $, ko, config, service, CryptoJS) {

+

+    var securityModes = _.map(config.WIFI_WEP_SUPPORT ? config.AUTH_MODES_WEP : config.AUTH_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    function maxStationAccess(max) {

+        var showOption = [];

+        for (var i = 1; i <= max; i++) {

+            showOption.push(new Option(i, i));

+        }

+        return showOption;

+    }

+    //是否通过wifi接入

+    var viaWifi = false;

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    function WifiMainVM() {

+        var target = this;

+        var info = getWifiMain();

+

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.showIsolated = config.SHOW_WIFI_AP_ISOLATED;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+        target.hasWifiWep = config.WIFI_WEP_SUPPORT;

+        target.hasWifiWpa3 = config.WIFI_WAP3_SUPPORT;

+        target.hasWifiWpa23 = config.WIFI_WPA2_WAP3_SUPPORT;

+

+        var advanceInfo = service.getWifiAdvance();

+        target.adBand = ko.observable(advanceInfo.wifiBand);

+        target.adMode = ko.observable(advanceInfo.mode);

+        target.showQRSwitch = config.WIFI_SUPPORT_QR_CODE && config.WIFI_SUPPORT_QR_SWITCH;

+        target.showQR = ko.observable(info.show_qrcode_flag);

+        if (config.WIFI_SUPPORT_QR_SWITCH) {

+            target.showQRCode = ko.observable(config.WIFI_SUPPORT_QR_CODE && target.showQR());

+        } else {

+            target.showQRCode = ko.observable(config.WIFI_SUPPORT_QR_CODE);

+        }

+        if(config.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_ssid_wifikey.png?_=' + $.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        target.origin_ap_station_enable = info.ap_station_enable;

+        target.wifi_enable = ko.observable(info.wifi_enable);

+

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (info.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+

+        target.multi_ssid_enable = ko.observable(info.multi_ssid_enable);

+        target.origin_multi_ssid_enable = info.multi_ssid_enable;

+

+        target.maxStationNumber = ko.computed(function () {

+            return config.MAX_STATION_NUMBER;

+        });

+

+        target.modes = ko.observableArray(securityModes);

+        target.selectedMode = ko.observable(info.AuthMode);

+        target.passPhrase = ko.observable(info.passPhrase);

+        target.showPassword = ko.observable(false);

+        target.ssid = ko.observable(info.SSID);

+        target.broadcast = ko.observable(info.broadcast == '1' ? '1' : '0');

+        target.apIsolation = ko.observable(info.apIsolation == '1' ? '1' : '0');

+        target.cipher = info.cipher;

+        target.selectedStation = ko.observable(info.MAX_Access_num);

+        target.maxStations = ko.observableArray(maxStationAccess(info.MAX_Station_num));

+        target.encryptType = ko.observable(info.encryptType);

+        target.keyID = ko.observable(info.keyID);

+        target.wepPassword = ko.observable("");

+

+        target.m_modes = ko.observableArray(securityModes);

+        target.m_selectedMode = ko.observable(info.m_AuthMode);

+        target.m_passPhrase = ko.observable(info.m_passPhrase);

+        target.m_showPassword = ko.observable(false);

+        target.m_ssid = ko.observable(info.m_SSID);

+        target.m_broadcast = ko.observable(info.m_broadcast == '1' ? '1' : '0');

+        target.m_apIsolation = ko.observable(info.m_apIsolation == '1' ? '1' : '0');

+        target.m_cipher = info.m_cipher;

+        target.m_selectedStation = ko.observable(info.m_MAX_Access_num);

+        target.m_maxStations = ko.observableArray(maxStationAccess(info.MAX_Station_num));

+

+        target.getWepPassword = function () {

+            return target.keyID() == '3' ? info.Key4Str1 : (target.keyID() == '2' ? info.Key3Str1 : target.keyID() == '1' ? info.Key2Str1 : info.Key1Str1);

+        }

+        target.wepPassword(target.getWepPassword());

+        target.profileChangeHandler = function (data, event) {

+            $("#pwdWepKey").parent().find("label[class='error']").hide();

+            target.wepPassword(target.getWepPassword());

+            return true;

+        };

+

+        target.clear = function (option) {

+            if (option == "switch") {

+                target.multi_ssid_enable(info.multi_ssid_enable);

+                target.wifi_enable(info.wifi_enable);

+            } else if (option == "ssid2") {

+                target.m_selectedMode(info.m_AuthMode);

+                target.m_passPhrase(info.m_passPhrase);

+                target.m_ssid(info.m_SSID);

+                target.m_broadcast(info.m_broadcast == '1' ? '1' : '0');

+                target.m_cipher = info.m_cipher;

+                target.m_selectedStation(info.m_MAX_Access_num);

+                target.m_apIsolation(info.m_apIsolation == '1' ? '1' : '0');

+            } else if (option == "ssid1") {

+                target.selectedMode(info.AuthMode);

+                target.passPhrase(info.passPhrase);

+                target.ssid(info.SSID);

+                target.broadcast(info.broadcast == '1' ? '1' : '0');

+                target.cipher = info.cipher;

+                target.selectedStation(info.MAX_Access_num);

+                target.apIsolation(info.apIsolation == '1' ? '1' : '0');

+                if (config.WIFI_WEP_SUPPORT) {

+                    target.encryptType(info.encryptType);

+                    target.keyID(info.keyID);

+                    target.wepPassword(target.getWepPassword());

+                }

+            } else {

+                clearTimer();

+                clearValidateMsg();

+                initialize();

+            }

+        };

+

+        target.saveSSID1 = function () {

+            if (target.checkSettings("ssid1")) {

+                return;

+            }

+            if (!config.PASSWORD_ENCODE) {

+                var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,32}');

+                if (!pwdRegex.test(target.passPhrase())) {

+                        showConfirm("password_note_too_low", function () {

+                            showConfirm('wifi_disconnect_confirm', function () {

+                            target.saveSSID1Action();

+                            return;

+                        });

+                        return;

+                    });

+                    return;

+                }

+            }

+            showConfirm('wifi_disconnect_confirm', function () {

+                target.saveSSID1Action();

+            });

+        };

+

+        target.saveSSID1Action = getSSID1Action;

+

+        target.saveSSID2 = function () {

+            if (target.checkSettings("ssid2")) {

+                return;

+            }

+            showConfirm('wifi_disconnect_confirm', function () {

+                target.saveSSID2Action();

+            });

+        };

+

+        target.saveSSID2Action = getSSID2Action;

+

+        //检测wps\最大接入数

+        target.checkSettings = function (ssid) {

+            var status = getWpsState();

+            if (ssid == "ssid1" || ssid == "ssid2") {

+                if (ssid == "ssid2") {

+                    var accessDevice = service.getStatusInfo().ssid2AttachedNum;

+                    if (parseInt(target.m_selectedStation()) < accessDevice) {

+                        showAlert('Extend_accessDevice');

+                        return true;

+                    }

+                } else {

+                    var accessDevice = service.getStatusInfo().ssid1AttachedNum;

+                    if (parseInt(target.selectedStation()) < accessDevice) {

+                        showAlert('Extend_accessDevice');

+                        return true;

+                    }

+                }

+            }

+

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+

+            if (info.multi_ssid_enable == "1" && config.HAS_MULTI_SSID) {

+                if ((ssid == "ssid2" && parseInt(target.m_selectedStation()) + parseInt(info.MAX_Access_num) > info.MAX_Station_num)

+                     || (ssid == "ssid1" && parseInt(target.selectedStation()) + parseInt(info.m_MAX_Access_num) > info.MAX_Station_num)) {

+                    showAlert({

+                        msg: 'multi_ssid_max_access_number_alert',

+                        params: info.MAX_Station_num

+                    });

+                    return true;

+                }

+            }

+

+            return false;

+        };

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = function () {

+                showLoading('waiting');

+                var params = {};

+                params.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    params.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(params, function (result) {

+                    if (result.result == "success") {

+                        if (viaWifi) {

+                            setTimeout(hasApReloadVarWifi, 15000);

+                        } else {

+                            addInterval(hasApReload, 1000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            function hasApReloadVarWifi() {

+                successOverlay();

+                setTimeout(function () {

+                    window.location.reload();

+                }, 1000);

+                service.refreshAPStationStatus();

+                target.clear();

+            }

+            function hasApReload() {

+                var info = getWifiMain();

+                service.refreshAPStationStatus();

+                if (info.wifi_enable == target.wifi_enable()) {

+                    successOverlay();

+                    target.clear();

+                }

+            }

+

+            var info = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!info.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!info.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+        };

+

+        //二维码显示事件

+        target.showQRHandler = function () {

+            var checkbox = $("#showQR:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showQR(true);

+            } else {

+                target.showQR(false);

+            }

+            target.showQRCode(config.WIFI_SUPPORT_QR_CODE && target.showQR());

+        };

+

+        //SSID2

+        target.m_showPasswordHandler = function () {

+            $("#m_passShow").parent().find(".error").hide();

+            var checkbox = $("#m_showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.m_showPassword(true);

+            } else {

+                target.m_showPassword(false);

+            }

+        };

+        target.showPasswordHandler = function () {

+            $("#codeWPAKey").parent().find(".error").hide();

+            $("#pwdWepKey").parent().find(".error").hide();

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+

+        function getSSID2Action() {

+            showLoading('waiting');

+            var params = {};

+            params.m_AuthMode = target.m_selectedMode();

+            params.m_passPhrase = target.m_passPhrase();

+            params.m_SSID = target.m_ssid();

+            params.m_broadcast = target.m_broadcast();

+            params.m_station = target.m_selectedStation();

+            params.m_cipher = target.m_selectedMode() == "WPA2PSK" ? 1 : 2;

+            if (params.m_AuthMode == "WPA3Personal" || params.m_AuthMode == "WPA2WPA3") {

+                params.m_cipher = 1;

+            }

+            params.m_NoForwarding = target.m_apIsolation();

+            params.m_show_qrcode_flag = target.showQR() == true ? 1 : 0;

+            service.setWifiBasic4SSID2(params, function (result) {

+                if (result.result == "success") {

+                    if (viaWifi) {

+                        setTimeout(ssid2ReloadVarWifi, 15000);

+                    } else {

+                        addInterval(ssid2Reload, 1000);

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+        function ssid2ReloadVarWifi() {

+            successOverlay();

+            setTimeout(function () {

+                window.location.reload();

+            }, 1000);

+            target.clear();

+        }

+        function ssid2Reload() {

+            var info = getWifiMain();

+            if (info.wifi_enable == "1") {

+                successOverlay();

+                target.clear();

+            }

+        }

+

+        function getSSID1Action() {

+

+            showLoading('waiting');

+            target.broadcast($("#broadcastCheckbox:checked").length > 0 ? '0' : '1');

+            target.apIsolation($("#apisolatedCheckbox:checked").length);

+            var ciphertext = "";

+            if (config.PASSWORD_ENCODE) {

+	        ciphertext = target.passPhrase();

+	    } else {

+                var kparam = service.getDeviceInfoLow();

+                var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                ciphertext = CryptoJS.AES.encrypt(target.passPhrase(), tkey, {

+                    iv: tiv,

+                    mode: CryptoJS.mode.CBC,

+                    padding: CryptoJS.pad.ZeroPadding

+                    }).toString();

+	    }

+            var params = {};

+            params.AuthMode = target.selectedMode();

+            params.passPhrase = ciphertext;

+            params.SSID = target.ssid();

+            params.broadcast = target.broadcast();

+            params.station = target.selectedStation();

+            params.cipher = target.selectedMode() == "WPA2PSK" ? 1 : 2;

+            if (params.AuthMode == "WPA3Personal" || params.AuthMode == "WPA2WPA3") {

+                params.cipher = 1;

+            }

+            params.NoForwarding = target.apIsolation();

+            params.show_qrcode_flag = target.showQR() == true ? 1 : 0;

+            if (config.WIFI_WEP_SUPPORT) {

+                if (params.AuthMode == "WPAPSK" || params.AuthMode == "WPA2PSK" || params.AuthMode == "WPAPSKWPA2PSK" || params.AuthMode == "WPA3Personal" || params.AuthMode == "WPA2WPA3") {}

+                else if (params.AuthMode == "SHARED") {

+                    params.encryptType = "WEP";

+                } else {

+                    params.encryptType = target.encryptType();

+                }

+                params.wep_default_key = target.keyID();

+                params.wep_key_1 = info.Key1Str1;

+                params.wep_key_2 = info.Key2Str1;

+                params.wep_key_3 = info.Key3Str1;

+                params.wep_key_4 = info.Key4Str1;

+                var WEPSelect = '0';

+                if (target.wepPassword().length == '5' || target.wepPassword().length == '13') {

+                    WEPSelect = '1';

+                } else {

+                    WEPSelect = '0';

+                }

+                if (target.keyID() == '3') {

+                    params.wep_key_4 = target.wepPassword();

+                    params.WEP4Select = WEPSelect;

+                } else if (target.keyID() == '2') {

+                    params.wep_key_3 = target.wepPassword();

+                    params.WEP3Select = WEPSelect;

+                } else if (target.keyID() == '1') {

+                    params.wep_key_2 = target.wepPassword();

+                    params.WEP2Select = WEPSelect;

+                } else {

+                    params.wep_key_1 = target.wepPassword();

+                    params.WEP1Select = WEPSelect;

+                }

+            }

+

+            service.setWifiBasic(params, function (result) {

+                if (result.result == "success") {

+                    if (viaWifi) {

+                        setTimeout(ssid1ReloadVarWifi, 15000);

+                    } else {

+                        addInterval(ssid1Reload, 1000);

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+        function ssid1ReloadVarWifi() {

+            successOverlay();

+            setTimeout(function () {

+                window.location.reload();

+            }, 1000);

+            target.clear();

+        }

+        function ssid1Reload() {

+            var info = getWifiMain();

+            if (info.wifi_enable == "1") {

+                successOverlay();

+                target.clear();

+            }

+        }

+

+    }

+

+    function getWpsState() {

+        return service.getWpsInfo();

+    }

+

+    function getWifiMain() {

+        return service.getWifiBasic();

+    }

+

+    function initialize() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new WifiMainVM();

+        ko.applyBindings(vm, container[0]);

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+

+        if (config.WDS_SUPPORT) {

+            checkWifiStatusAccordingToWDS();

+        } else if (config.AP_STATION_SUPPORT) {

+            checkWifiStatus();

+        }

+

+        $('#frmSSID1').validate({

+            submitHandler: function () {

+                vm.saveSSID1();

+            },

+            rules: {

+                ssid: 'ssid',

+                pwdWepKey: {

+                    wifi_wep_password_check: true,

+                    wifi_password_check: true

+                },

+                txtWepKey: {

+                    wifi_wep_password_check: true,

+                    wifi_password_check: true

+                },

+                codeWPAKey: 'wifi_password_check',

+                txtWPAKey: 'wifi_password_check'

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "codeWPAKey" || id == "txtWPAKey") {

+                    error.insertAfter("#lblshowWPAPassword");

+                } else if (id == "pwdWepKey" || id == "txtWepKey") {

+                    error.insertAfter("#lblShowWepPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+        $('#frmSSID2').validate({

+            submitHandler: function () {

+                vm.saveSSID2();

+            },

+            rules: {

+                m_ssid: 'ssid',

+                m_pass: 'wifi_password_check',

+                m_passShow: 'wifi_password_check'

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "m_pass" || id == "m_passShow") {

+                    error.insertAfter("#m_lblShowPassword");

+                } else if (id == "pass" || id == "passShow") {

+                    error.insertAfter("#lblShowPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+        //表单提交函数、校验规则配置

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+

+        $('#frmMultiSSID').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+

+    }

+

+    function checkWifiStatusAccordingToWDS() {

+        var info = service.getWdsInfo();

+        if (info.currentMode == "0") {

+            $('#frmWifiSwitch :input').each(function () {

+                $(this).prop("disabled", false);

+            });

+            $('#frmSSID1 :input').each(function () {

+                $(this).prop("disabled", false);

+            });

+            $('#frmSSID2 :input').each(function () {

+                $(this).prop("disabled", false);

+            });

+        } else {

+            $('#frmWifiSwitch :input').each(function () {

+                $(this).prop("disabled", true);

+            });

+            $('#frmSSID1 :input').each(function () {

+                $(this).prop("disabled", true);

+            });

+            $('#frmSSID2 :input').each(function () {

+                $(this).prop("disabled", true);

+            });

+        }

+    }

+    function checkWifiStatus() {

+        var info = service.getAPStationBasic();

+        if (info.ap_station_enable == "1") {

+            $('#frmMultiSSID :input').each(function () {

+                $(this).prop("disabled", true);

+            });

+        } else {

+            $('#frmMultiSSID :input').each(function () {

+                $(this).prop("disabled", false);

+            });

+        }

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_sleep_mode","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //休眠方式

+    function getSleepMode() {

+        return service.getSleepMode();

+    }

+

+    //覆盖范围

+    function getWifiRange() {

+        return service.getWifiRange();

+    }

+

+    var sleepTime = _.map(config.SLEEP_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    function SleepModeViewMode() {

+        var target = this;

+

+        target.isCPE = config.PRODUCT_TYPE == 'CPE';

+        target.showTSWDiv = config.TSW_SUPPORT;

+        target.showSleepDiv = config.WIFI_SLEEP_SUPPORT;

+        target.hasUssd = config.HAS_USSD;

+        target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+        target.hasDdns = config.DDNS_SUPPORT;

+

+        target.modes = ko.observableArray(sleepTime);

+

+        var smInfo = getSleepMode();

+        target.selectedMode = ko.observable(smInfo.sleepMode);

+

+        var wifiRangeInfo = getWifiRange();

+        target.wifiRangeMode = ko.observable(wifiRangeInfo.wifiRangeMode);

+

+        target.setWifiRange = smSetWifiRange;

+

+        target.setWifiRangeAct = smSetWifiRangeAct;

+

+        target.setSleepMode = smSetSleepMode;

+

+        target.setSleepModeAct = smSetSleepModeAct;

+

+        var tsw = service.getTsw();

+        target.openEnable = ko.observable(tsw.openEnable == "" ? '0' : tsw.openEnable);

+        target.openH = ko.observable(tsw.openH);

+        target.openM = ko.observable(tsw.openM);

+        target.closeH = ko.observable(tsw.closeH);

+        target.closeM = ko.observable(tsw.closeM);

+        //定时休眠唤醒

+        target.saveTsw = smSaveTsw;

+

+        function smSetWifiRange() {

+            service.getWpsInfo({}, function (smInfo) {

+                if (smInfo.wpsFlag == '1') {

+                    showAlert('wps_on_info', function() {

+                        window.location.reload();

+                    });

+                } else if (smInfo.radioFlag == '0') {

+                    showAlert('wps_wifi_off');

+                } else {

+                    showConfirm('wifi_sleep_confirm', function () {

+                        showLoading('waiting');

+                        target.setWifiRangeAct();

+                    });

+

+                }

+            });

+        }

+        function smSetSleepModeAct() {

+            var params = {};

+            params.sleepMode = target.selectedMode();

+            service.setSleepMode(params, function (result) {

+                if (result.result != "success") {

+                    errorOverlay();

+                } else {

+                    successOverlay();

+                }

+            });

+        }

+

+        function smSetWifiRangeAct() {

+            var params = {};

+            params.wifiRangeMode = target.wifiRangeMode();

+            service.setWifiRange(params, function (result) {

+                if (result.result != "success") {

+                    errorOverlay();

+                } else {

+                    successOverlay();

+                }

+            });

+        }

+

+        function smSetSleepMode() {

+            showLoading('waiting');

+            service.getWpsInfo({}, function (info) {

+                if (info.wpsFlag == '1') {

+                    showAlert('wps_on_info', function() {

+                        window.location.reload();

+                    });

+                } else if (info.radioFlag == '0') {

+                    showAlert('wps_wifi_off');

+                } else {

+                    target.setSleepModeAct();

+                }

+            });

+        }

+        function smSaveTsw() {

+            if (target.openEnable() == '1') {

+                if (Math.abs((target.openH() * 60 + parseInt(target.openM(), 10)) - (target.closeH() * 60 + parseInt(target.closeM(), 10))) < 10) {

+                    showAlert('tsw_time_interval_alert');

+                    return false;

+                }

+                showLoading('waiting');

+                service.saveTsw({

+                    openEnable: target.openEnable(),

+                    closeEnable: target.openEnable(),

+                    openTime: leftInsert(target.openH(), 2, '0') + ':' + leftInsert(target.openM(), 2, '0'),

+                    closeTime: leftInsert(target.closeH(), 2, '0') + ':' + leftInsert(target.closeM(), 2, '0')

+                }, smShowRes, $.noop);

+            } else {

+                showLoading('waiting');

+                service.saveTsw({

+                    openEnable: target.openEnable(),

+                    closeEnable: target.openEnable()

+                }, smShowRes, $.noop);

+            }

+

+        }

+

+    }

+    function bindContainer(smVm) {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(smVm, container[0]);

+

+        $('#frmTsw').validate({

+            submitHandler: function () {

+                smVm.saveTsw();

+            },

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "closeM" || element.attr("name") == "closeH") {

+                    $("#closeErrorDiv").html(error);

+                } else if (element.attr("name") == "openM" || element.attr("name") == "openH") {

+                    $("#openErrorDiv").html(error);

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+

+        $('#sleepModeForm').validate({

+            submitHandler: function () {

+                smVm.setSleepMode();

+            }

+        });

+

+        $('#wifiRangeForm').validate({

+            submitHandler: function () {

+                smVm.setWifiRange();

+            }

+        });

+

+    }

+    function initialize() {

+        var smVm = new SleepModeViewMode();

+        bindContainer(smVm);

+    }

+    function smShowRes(data) {

+        if (data && data.result == "success") {

+            successOverlay();

+        } else {

+            errorOverlay();

+        }

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_station_info","underscore jquery knockout set service menu".split(" "),

+    function (_, $, ko, config, service, menu) {

+

+    var stationUtil = {

+        dealElement: function (showEdit, idx) {

+            if (idx != "all") {

+                if (!showEdit) {

+                    $("#edit_btn_" + idx + ",#hostname_txt_" + idx).show();

+                    $("#save_btn_" + idx + ",#cancel_btn_" + idx + ",#hostname_input_" + idx).hide();

+                } else {

+                    $("#edit_btn_" + idx + ",#hostname_txt_" + idx).hide();

+                    $("#save_btn_" + idx + ",#cancel_btn_" + idx + ",#hostname_input_" + idx).show();

+                }

+            } else {

+                $("input[id^='hostname_txt_'],a[id^='edit_btn_']").show();

+                $("input[id^='hostname_input_'],a[id^='cancel_btn_'],a[id^='save_btn_']").hide();

+            }

+        },

+        //根据MAC匹配主机名

+        getHostName: function (hostName, mac, hostNameList) {

+            var element_data = _.find(hostNameList, function (element_data) {

+                return element_data.mac == mac;

+            });

+            return element_data ? element_data.hostname : hostName;

+        },

+        //匹配黑名单列表和主机名

+        parseBlackString: function (macStr, hostnameStr) {

+            if (macStr == "") {

+                return [];

+            }

+            var tempMac = macStr.split(';');

+            var tempHostName = hostnameStr.split(';');

+            var result = [];

+            for (var i = 0; i < tempMac.length; i++) {

+                //var obj = {};

+                //obj.hostName = tempHostName[i];

+                //obj.macAddress = tempMac[i];

+                result.push({

+                    hostName: tempHostName[i],

+                    macAddress: tempMac[i]

+                });

+            }

+            return result;

+        }

+    };

+

+    function staInfoViewMode() {

+        var target = this;

+        var originalData = {

+            user_ip: '',

+            macList: '',

+            ACL_mode: 2, //黑白名单

+            hostnameList: ''

+        };

+        target.showCableDiv = config.PRODUCT_TYPE == 'CPE' && config.RJ45_SUPPORT;

+        target.supportBlock = config.STATION_BLOCK_SUPPORT;

+        var pcMenu = menu.findMenu('#parental_control');

+        target.showPCLink = pcMenu && pcMenu.length > 0 && config.HAS_PARENTAL_CONTROL;

+

+        target.deviceInfo = ko.observableArray([]);

+        target.cableDeviceInfo = ko.observableArray([]);

+        target.blackDevices = ko.observableArray([]);

+        target.blackDevicesMac = ko.computed(function () {

+            return _.map(target.blackDevices(), function (element_data) {

+                return element_data.macAddress;

+            });

+        });

+        target.showBlackDiv = ko.observable(config.HAS_BLACK_AND_WHITE_FILTER ? (originalData.ACL_mode == '2' ? true : false) : config.STATION_BLOCK_SUPPORT);

+

+        ko.computed(function () {

+            target.deviceInfo();

+            target.cableDeviceInfo();

+            target.blackDevices();

+            $("#station_info_div").translate();

+        }).extend({

+            notify: 'always',

+            throttle: 300

+        });

+

+        var hostNameList = service.getHostNameList({}).devices;

+        //获取WiFi已连接设备

+        target.fetchAttachedDevices = function (cb) {

+            service.getCurrentlyAttachedDevicesInfo({}, function (data) {

+                if (editingHostname) {

+                    return false;

+                }

+                target.deviceInfo(_.map(data.attachedDevices, function (element_data, idx) {

+                        element_data.idx = _.uniqueId('wireless_');

+                        element_data.type = 1;

+                        element_data.inBlackGroup = config.HAS_BLACK_AND_WHITE_FILTER && originalData.ACL_mode != '2' ? false : _.contains(target.blackDevicesMac(), element_data.macAddress);

+                        element_data.hostName = stationUtil.getHostName(element_data.hostName, element_data.macAddress, hostNameList);

+                        element_data.disableFlag = (config.HAS_BLACK_AND_WHITE_FILTER && originalData.ACL_mode != '2') || element_data.inBlackGroup || editingHostname;

+                        return element_data;

+                    }));

+                if (_.isFunction(cb)) {

+                    cb.apply(this);

+                }

+            });

+        };

+        //获取RJ45已连接设备

+        target.fetchAttachedCableDevices = function (cb) {

+            service.getAttachedCableDevices({}, function (data) {

+                if (editingHostname) {

+                    return false;

+                }

+                target.cableDeviceInfo(_.map(data.attachedDevices, function (element_data, idx) {

+                        element_data.idx = _.uniqueId('cable_');

+                        element_data.hostName = stationUtil.getHostName(element_data.hostName, element_data.macAddress, hostNameList);

+                        element_data.type = 2;

+                        return element_data;

+                    }));

+                if (_.isFunction(cb)) {

+                    cb.apply(this);

+                }

+            });

+        };

+

+        target.fetchBlacklist = function (cb) {

+            service.getMacFilterInfo({}, function (data) {

+                originalData.ACL_mode = data.ACL_mode;

+                originalData.user_ip = data.user_ip_addr;

+                originalData.hostnameList = data.wifi_hostname_black_list;

+                originalData.macList = data.wifi_mac_black_list;

+                target.showBlackDiv(config.HAS_BLACK_AND_WHITE_FILTER ? (originalData.ACL_mode == '2' ? true : false) : config.STATION_BLOCK_SUPPORT);

+                var blackDevices = stationUtil.parseBlackString(data.wifi_mac_black_list, data.wifi_hostname_black_list);

+                target.blackDevices(_.map(blackDevices, function (element_data, idx) {

+                        element_data.idx = _.uniqueId('black_');

+                        element_data.type = 3;

+                        element_data.hostName = stationUtil.getHostName(element_data.hostName, element_data.macAddress, hostNameList);

+                        return element_data;

+                    }));

+                if (_.isFunction(cb)) {

+                    cb.apply(this);

+                }

+            }, $.noop);

+        };

+        target.fetchBlacklist();

+        target.fetchAttachedDevices();

+        if (target.showCableDiv) {

+            target.fetchAttachedCableDevices();

+        }

+

+        var editingHostname = 0;

+        addInterval(function () {

+            if (editingHostname == 0) {

+                target.fetchAttachedDevices();

+            }

+        }, 3000);

+

+        if (target.showCableDiv) {

+            addInterval(function () {

+                if (editingHostname == 0) {

+                    target.fetchAttachedCableDevices();

+                }

+            }, 5000);

+        }

+        //WiFi已连接设备列表中屏蔽按钮事件 入黑名单

+        target.wirelessBlockHandler = stationBlockEvent;

+        //保存主机名事件

+        target.saveHostNameHandler = saveHostNameEvent;

+        //主机名修改按钮点击事件

+        target.editHostNameHandler = function (element_data) {

+            editingHostname++;

+            $("#hostname_input_" + element_data.idx).val(element_data.hostName);

+            stationUtil.dealElement(true, element_data.idx);

+            return false;

+        };

+        //取消编辑主机名事件

+        target.cancelEditHostNameHandler = function (element_data) {

+            stationUtil.dealElement(false, element_data.idx);

+            editingHostname--;

+        };

+        target.cancelAllEditHostNameHandler = function () {

+            stationUtil.dealElement(false, "all");

+            editingHostname = 0;

+        };

+        //从黑名单列表中移除

+        target.blacklistRemoveHandler = function (element_data) {

+            if (originalData.macList.indexOf(element_data.macAddress) == -1) {

+                return false;

+            }

+            if (editingHostname) {

+                target.cancelAllEditHostNameHandler();

+            }

+            showLoading('waiting');

+            var macArr = [];

+            var hostnameArr = [];

+            $.each(target.blackDevices(), function (i, n) {

+                if (n.macAddress != element_data.macAddress) {

+                    macArr.push(n.macAddress);

+                    hostnameArr.push(n.hostName);

+                }

+            });

+            var params = {

+                ACL_mode: '2', //originalData.ACL_mode

+                macFilteringMode: '2', //originalData.ACL_mode

+                wifi_hostname_black_list: hostnameArr.join(';'),

+                wifi_mac_black_list: macArr.join(';')

+            };

+            target.updateMacFilterList(params);

+        };

+        target.updateMacFilterList = function (params) {

+            service.setMacFilter(params, function (data) {

+                if (data.result == "success") {

+                    target.blackDevices([]);

+                    target.fetchBlacklist(function () {

+                        target.fetchAttachedDevices(function () {

+                            successOverlay();

+                        });

+                    });

+                }

+            }, function () {

+                errorOverlay();

+            });

+        };

+

+        function saveHostNameEvent(element_data) {

+            var $input = $("#hostname_input_" + element_data.idx);

+            var newHostname = $input.val();

+            if (newHostname.indexOf(" ") == 0 || newHostname.lastIndexOf(" ") == (newHostname.length - 1) || /[\*\$\[&:,;<>'"\\`\]¥]{1,32}/.test(newHostname)) {

+                showAlert('device_rename');

+                return false;

+            } else if (newHostname == '') {

+                $(".promptErrorLabel", "#confirm-message-container").text($.i18n.prop("required"));

+                var $closestTD = $input.closest('td').addClass('has-error');

+                addTimeout(function () {

+                    $closestTD.removeClass('has-error');

+                }, 5000);

+                showAlert('required');

+                return false;

+            }

+            showLoading('waiting');

+            element_data.hostName = newHostname;

+            service.editHostName({

+                hostname: element_data.hostName,

+                mac: element_data.macAddress

+            }, function () {

+                editingHostname = 0;

+                service.getHostNameList({}, function (data) {

+                    hostNameList = data.devices;

+                    if (element_data.type == 3) {

+                        target.fetchBlacklist(function () {

+                            hideLoading();

+                            successOverlay();

+                        });

+                    } else if (element_data.type == 2) {

+                        target.fetchAttachedCableDevices(function () {

+                            hideLoading();

+                            successOverlay();

+                        });

+                    } else if (element_data.type == 1) {

+                        target.fetchAttachedDevices(function () {

+                            hideLoading();

+                            successOverlay();

+                        });

+                    }

+                });

+            }, function () {

+                errorOverlay();

+            });

+        }

+

+        function stationBlockEvent(element_data) {

+            if (config.HAS_BLACK_AND_WHITE_FILTER && originalData.ACL_mode != '2') {

+                return false;

+            }

+            if (originalData.macList.split(';').length == 10) {

+                showAlert('black_list_max');

+                return false;

+            }

+            if (originalData.macList.indexOf(element_data.macAddress) != -1) {

+                return false;

+            }

+            if (element_data.ipAddress == originalData.user_ip) {

+                showAlert('black_yourself_tip');

+                return false;

+            }

+            if (editingHostname) {

+                target.cancelAllEditHostNameHandler();

+            }

+            showLoading('waiting');

+            var newHostnameList = originalData.hostnameList == '' ? element_data.hostName : element_data.hostName + ';' + originalData.hostnameList;

+            var newMacList = originalData.macList == '' ? element_data.macAddress : element_data.macAddress + ';' + originalData.macList;

+            var params = {

+                ACL_mode: '2',

+                wifi_hostname_black_list: newHostnameList,

+                wifi_mac_black_list: newMacList

+            };

+            target.updateMacFilterList(params);

+        }

+

+    }

+

+    function bindContainer(ws_vm) {

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        ko.applyBindings(ws_vm, container);

+    }

+    function initialize() {

+        var ws_vm = new staInfoViewMode();

+        bindContainer(ws_vm);

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_wps","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var viaWifi = false;

+

+    function WpsViewMode() {

+        var target = this;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+

+        target.wpsType = ko.observable('');

+        target.wpsPin = ko.observable('');

+

+        var state = getWpsState();

+        target.origin_ap_station_enable = state.ap_station_enable;

+

+        target.wpsFlag = ko.observable(state.wpsFlag);

+        target.authMode = ko.observable(state.authMode);

+

+        target.radioFlag = ko.observable(state.radioFlag);

+        target.encrypType = ko.observable(state.encrypType);

+

+        target.mulOption = ko.observable(paintSSIDOption(state));

+        target.wpsSSID = ko.observable(getSSIDCurrWps(state));

+

+        var infoBasic = service.getWifiBasic();

+        target.wifi_enable = ko.observable(infoBasic.wifi_enable);

+

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) { //软开关

+            if (infoBasic.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+        target.multi_ssid_enable = ko.observable(infoBasic.multi_ssid_enable);

+        target.origin_multi_ssid_enable = infoBasic.multi_ssid_enable;

+

+        target.save = wpa_save;

+

+        // if (state.wpsFlag != '0') {

+        //     target.wpsType(state.wpsType == 'PIN' ? 'PIN' : 'PBC');

+        // } else {

+        //     target.wpsType('');

+        // }

+            target.wpsType(state.wpsType == 'PIN' ? 'PIN' : 'PBC');

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            function wpsSetSwitch() {

+                showLoading('waiting');

+                var wps_param = {};

+                wps_param.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    wps_param.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(wps_param, function (result) {

+                    if (result.result == "success") {

+                        if (!viaWifi) {

+                            addInterval(wpsReload, 1000);

+                        } else {

+                            setTimeout(wpsReloadViaWifi, 15000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            }

+

+            var setSwitch = wpsSetSwitch;

+            var state = service.getStatusInfo();

+            if (target.wifi_enable() == "1" && config.HAS_MULTI_SSID) {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!state.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!state.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+

+            function wpsReload() {

+                var state = service.getWifiBasic();

+                if (state.wifi_enable == target.wifi_enable()) {

+                    successOverlay();

+                    clearTimer();

+                    clearValidateMsg();

+                    service.refreshAPStationStatus();

+                    initialize();

+                }

+            }

+            function wpsReloadViaWifi() {

+                successOverlay();

+                setTimeout(function () {

+                    window.location.reload();

+                }, 1000);

+                clearTimer();

+                clearValidateMsg();

+                service.refreshAPStationStatus();

+                initialize();

+            }

+

+        };

+

+        target.checkSettings = function (ssid) {

+            var state = getWpsState();

+            if (state.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            return false;

+        };

+

+        function wpa_save() {

+            var state = getWpsState();

+

+            if (state.radioFlag == '0') {

+                showAlert('wps_wifi_off');

+                return;

+            }

+

+            if (state.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+

+            if (target.wpsSSID() == "SSID1") {

+                var res = (state.AuthMode == "OPEN" && state.encrypType == "WEP")

+                 || (state.AuthMode == "SHARED" && state.encrypType == "WEP")

+                 || (state.AuthMode == "WPAPSK" && state.encrypType == "TKIP")

+                 || (state.AuthMode == "WPAPSK" && state.encrypType == "TKIPCCMP")

+                 || (state.AuthMode == "WPAPSK" && state.encrypType == "AES")

+                 || (state.AuthMode == "WPA2PSK" && state.encrypType == "TKIP")

+                 || (state.AuthMode == "WPAPSKWPA2PSK" && state.encrypType == "TKIP")

+                 || (state.AuthMode == "WPA3Personal")

+                 || (state.AuthMode == "WPA2WPA3");

+                if (res) {

+                    showAlert('wps_auth_open');

+                    return;

+                }

+            } else {

+                var resm = (state.m_AuthMode == "OPEN" && state.m_encrypType == "WEP")

+                 || (state.m_AuthMode == "SHARED" && state.m_encrypType == "WEP")

+                 || (state.m_AuthMode == "WPAPSK" && state.m_encrypType == "TKIP")

+                 || (state.m_AuthMode == "WPAPSK" && state.m_encrypType == "TKIPCCMP")

+                 || (state.m_AuthMode == "WPAPSK" && state.m_encrypType == "AES")

+                 || (state.m_AuthMode == "WPA2PSK" && state.m_encrypType == "TKIP")

+                 || (state.m_AuthMode == "WPAPSKWPA2PSK" && state.m_encrypType == "TKIP")

+                 || (state.m_AuthMode == "WPA3Personal")

+                 || (state.m_AuthMode == "WPA2WPA3");

+                if (resm) {

+                    showAlert('wps_auth_open');

+                    return;

+                }

+            }

+

+            var wpsSSID;

+            var wpsIndex;

+            if (target.wpsSSID() != "SSID1") {

+                wpsSSID = state.multiSSID;

+                wpsIndex = 2;

+            } else {

+                wpsSSID = state.ssid;

+                wpsIndex = 1;

+            }

+

+            var basic = service.getWifiBasic();

+            if (wpsSSID == basic.m_SSID && wpsIndex == 2) {

+                if (basic.m_broadcast == '1') {

+                    showAlert('wps_ssid_broadcast_disable');

+                    return;

+                }

+            } else if (wpsSSID == basic.SSID && wpsIndex == 1) {

+                if (basic.broadcast == '1') {

+                    showAlert('wps_ssid_broadcast_disable');

+                    return;

+                }

+            }

+

+            showLoading('waiting');

+            var wps_param = {};

+            wps_param.wpsType = target.wpsType();

+            wps_param.wpsSSID = wpsSSID;

+            wps_param.wpsIndex = wpsIndex;

+            wps_param.wpsPin = getWpsPin(target.wpsPin());

+

+            service.openWps(wps_param, function (result) {

+                if (result.result != "success") {

+                    errorOverlay();

+                } else {

+                    target.wpsPin('');

+                    clearValidateMsg();

+                    successOverlay();

+                }

+            });

+        }

+

+    }

+

+    function getWpsPin(value) {

+        if (value.length != 9) {

+            return value;

+        } else {

+            return value.substring(0, 4) + value.substring(5);

+        }

+    }

+

+    function getWpsState() {

+        return service.getWpsInfo();

+    }

+

+    function paintSSIDOption(info) {

+        var show_opt = [];

+        show_opt.push(new Option(info.ssid, "SSID1"));

+        if (info.ssidEnable == "1") {

+            show_opt.push(new Option(info.multiSSID, "SSID2"));

+        }

+        return show_opt;

+    }

+

+    //检查当前是否通过wifi登录webui

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+    function bindContainer(wpsVm) {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(wpsVm, container[0]);

+

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+

+        $('#wpsForm').validate({

+            submitHandler: function () {

+                wpsVm.save();

+            },

+            rules: {

+                txtPin: {

+                    "wps_pin_validator": true

+                }

+            }

+        });

+

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                wpsVm.setMultiSSIDSwitch();

+            }

+        });

+    }

+    function getSSIDCurrWps(info) {

+        if (info.ssid != info.multiSSID) {

+            return info.wpsSSID == info.multiSSID ? "SSID2" : "SSID1";

+        } else {

+            if (info.wifi_wps_index == '2') {

+                return "SSID2";

+            } else {

+                return "SSID1";

+            }

+        }

+    }

+    //视图初始化

+    function initialize() {

+        var wpsVm = new WpsViewMode();

+        bindContainer(wpsVm);

+    }

+

+    return {

+        init: initialize

+    };

+});

+