[Feature][MD310EU][task-view-1009] Create MD310EU project code directory
Change-Id: I57cd3c474efe4493ae8a242d7e2fa643ad8ecbde
diff --git a/lynq/MD310EU/ap/app/zte_webui/css/com.css b/lynq/MD310EU/ap/app/zte_webui/css/com.css
new file mode 100755
index 0000000..50110dd
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/css/com.css
@@ -0,0 +1,2602 @@
+/* Reset the container */
+.container {
+ width: 970px !important;
+ max-width: none !important;
+}
+
+.container .navbar-header,
+.container .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+/* Always float the navbar header */
+.navbar-header {
+ float: left;
+}
+
+/* Undo the collapsing navbar */
+.navbar-collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0;
+ overflow: visible !important;
+}
+
+.navbar-toggle {
+ display: none;
+}
+.navbar-collapse {
+ border-top: 0;
+}
+
+.navbar-brand {
+ margin-left: -15px;
+}
+
+/* Always apply the floated nav */
+.navbar-nav {
+ float: left;
+ margin: 0;
+}
+.navbar-nav > li {
+ float: left;
+}
+.navbar-nav > li > a {
+ padding: 15px;
+}
+
+/* Redeclare since we override the float above */
+.navbar-nav.navbar-right {
+ float: right;
+}
+
+/* Undo custom dropdowns */
+.navbar .navbar-nav .open .dropdown-menu {
+ position: absolute;
+ float: left;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, .15);
+ border-width: 0 1px 1px;
+ border-radius: 0 0 4px 4px;
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+.navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #333;
+}
+.navbar .navbar-nav .open .dropdown-menu > li > a:hover,
+.navbar .navbar-nav .open .dropdown-menu > li > a:focus,
+.navbar .navbar-nav .open .dropdown-menu > .active > a,
+.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff !important;
+ background-color: #008AD7 !important;
+}
+.navbar .navbar-nav .open .dropdown-menu > .disabled > a,
+.navbar .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+.navbar .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #999 !important;
+ background-color: transparent !important;
+}
+
+body {
+ min-width: 970px;
+ padding-bottom: 30px;
+}
+
+.lead {
+ font-size: 16px;
+}
+
+.page-header {
+ margin-bottom: 30px;
+}
+.page-header .lead {
+ margin-bottom: 10px;
+}
+h1, .h1 {
+ font-size: 20px;
+}
+h2, .h2 {
+ font-size: 18px;
+}
+h3, .h3 {
+ font-size: 18px;
+}
+label{
+ font-weight: normal;
+}
+h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6{
+ font-weight: bold;
+}
+
+.label-primary {
+ background-color: #018AD8;
+}
+
+.arrow-down {
+ bottom:0;
+ border-width: 8px 4px 0;
+ width: 0;
+ height: 0;
+ border-color: #018AD8 transparent transparent;
+ border-style: solid;
+}
+
+.absolute-center {
+ position: absolute;
+ left: 49%;
+}
+
+.info-title.label {
+ padding: 0.3em 0.7em 0.3em;
+}
+
+.margin-top-10 {margin-top: 10px;}
+.margin-top-15 {margin-top: 15px;}
+.margin-top-20 {margin-top: 20px;}
+.margin-top-50 {margin-top: 50px;}
+.margin-top-80 {margin-top: 80px;}
+.margin-top-160 {margin-top: 160px;}
+
+.margin-bottom-10{margin-bottom: 10px;}
+.margin-bottom-20{margin-bottom: 20px;}
+.margin-bottom-50{margin-bottom: 50px;}
+
+.margin-left-10{margin-left: 10px;}
+.margin-left-15{margin-left: 15px;}
+.margin-left-3em{margin-left: 3em;}
+
+.margin-right-20{margin-right: 20px;}
+
+.padding-top-10{padding-top: 10px;}
+
+.padding-right-10{padding-right: 10px;}
+.padding-right-15{padding-right: 15px;}
+.padding-right-90 {
+ padding-right: 90px;
+}
+
+.line-height-20{line-height: 20px;}
+.line-height-30{line-height: 30px;}
+.line-height-40{line-height: 40px;}
+.line-height-60{line-height: 60px;}
+
+.width-60{width: 60px;}
+
+.font-weight-bold{
+ font-weight: bold;
+}
+
+.smsUnreadCount {
+ width: 30px;
+ height: 20px;
+ line-height: 20px;
+ padding: 2px;
+ top: -13px;
+ left: 20px;
+ position: absolute;
+ text-align: center;
+ z-index: 10;
+ background: url("../pic/png_new_sms_bg.png") no-repeat scroll 0 -5px transparent;
+ color: white;
+}
+
+.tooltip {
+ width: auto;
+ min-width: 5px;
+ position: absolute;
+ padding: 6px;
+ display: none;
+ color: #fff;
+ background-color: #4B4B4B;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ box-shadow: 0 3px 5px #999;
+ -moz-box-shadow: 0 3px 5px #999;
+ -webkit-box-shadow: 0 3px 5px #999;
+ margin-top: 5px;
+ *+margin-top:0px;
+}
+
+#statusBar span{
+ margin-right: 10px;
+}
+
+#statusBar span.smsUnreadCount{
+ margin-left: 0;
+}
+
+#statusBar .statusItem{
+ color: #696E72;
+ font-weight: bold;
+ line-height: 35px;
+ vertical-align: middle;
+}
+
+#statusBar #wifi_status{
+ width: 36px;
+ display: inline-block;
+}
+
+#statusBar #wifi_status i{
+ width: 36px;
+ height: 24px;
+ line-height: 24px;
+ display: inline-block;
+}
+
+#statusBar .icon_connection{
+ width: 50px;
+ display: inline-block;
+}
+
+#statusBar .wifi_connected{
+ width: 42px;
+ height: 30px;
+ background:url("../pic/pic_wifi_connect.png") no-repeat scroll center 2px transparent;
+}
+
+#statusBar .rj45_connected{
+ width: 42px;
+ height: 30px;
+ background:url("../pic/pic_rj45_connect.png") no-repeat scroll center 2px transparent;
+}
+
+#statusBar .connecting{
+ width: 36px;
+ height: 30px;
+ background:url("../pic/pic_connecting.gif") no-repeat scroll center 3px transparent;
+}
+
+#statusBar .disconnect{
+ width: 42px;
+ height: 30px;
+ background:url("../pic/pic_disconnect.png") no-repeat scroll center 3px transparent;
+}
+
+#statusBar .connectionNone{
+ height: 30px;
+ background:url("../pic/pic_connection.png") no-repeat scroll center 3px transparent;
+}
+
+#statusBar .connectionUp{
+ height: 30px;
+ background:url("../pic/pic_connection.png") no-repeat scroll center -27px transparent;
+}
+
+#statusBar .connectionDown{
+ height: 30px;
+ background:url("../pic/pic_connection.png") no-repeat scroll center -57px transparent;
+}
+
+#statusBar .connectionBoth{
+ height: 30px;
+ background:url("../pic/pic_connection.png") no-repeat scroll center -87px transparent;
+}
+
+#statusBar .signal{
+ width: 40px;
+ height: 30px;
+ display: inline-block;
+}
+
+#statusBar .signal_none{
+ width: 30px;
+ height: 30px;
+ background:url("../pic/res_signal.png") no-repeat scroll 6px -268px transparent;
+}
+
+#statusBar .signal0{
+ height: 30px;
+ background:url("../pic/res_signal.png") no-repeat scroll center -3px transparent;
+}
+
+#statusBar .signal1{
+ height: 30px;
+ background:url("../pic/res_signal.png") no-repeat scroll center -45px transparent;
+}
+
+#statusBar .signal2{
+ height: 30px;
+ background:url("../pic/res_signal.png") no-repeat scroll center -92px transparent;
+}
+
+#statusBar .signal3{
+ height: 30px;
+ background:url("../pic/res_signal.png") no-repeat scroll center -140px transparent;
+}
+
+#statusBar .signal4{
+ height: 30px;
+ background:url("../pic/res_signal.png") no-repeat scroll center -185px transparent;
+}
+
+#statusBar .signal5{
+ height: 30px;
+ background:url("../pic/res_signal.png") no-repeat scroll center -227px transparent;
+}
+
+#statusBar .wifi_status0{
+ background: url("../pic/wlan.png") no-repeat scroll 0 4px transparent;
+}
+
+#statusBar .wifi_status1{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -20px transparent;
+}
+
+#statusBar .wifi_status2{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -45px transparent;
+}
+
+#statusBar .wifi_status3{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -70px transparent;
+}
+
+#statusBar .wifi_status4{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -95px transparent;
+}
+
+#statusBar .wifi_status5{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -120px transparent;
+}
+
+#statusBar .wifi_status6{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -145px transparent;
+}
+
+#statusBar .wifi_status7{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -170px transparent;
+}
+
+#statusBar .wifi_status8{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -195px transparent;
+}
+
+#statusBar .wifi_status9{
+ background: url("../pic/wlan.png") no-repeat scroll 0 -220px transparent;
+}
+
+#statusBar .wifi_status10{
+ background: url("../pic/wlan.png") no-repeat scroll -40px 4px transparent;
+}
+
+#statusBar .wifi_status11{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -20px transparent;
+}
+
+#statusBar .wifi_status12{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -45px transparent;
+}
+
+#statusBar .wifi_status13{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -70px transparent;
+}
+
+#statusBar .wifi_status14{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -95px transparent;
+}
+
+#statusBar .wifi_status15{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -120px transparent;
+}
+
+#statusBar .wifi_status16{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -145px transparent;
+}
+
+#statusBar .wifi_status17{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -170px transparent;
+}
+
+#statusBar .wifi_status18{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -195px transparent;
+}
+
+#statusBar .wifi_status19{
+ background: url("../pic/wlan.png") no-repeat scroll -40px -220px transparent;
+}
+
+#statusBar .wifi_status20{
+ background: url("../pic/wlan.png") no-repeat scroll -78px 5px transparent;
+}
+
+#statusBar .wifi_status21{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -20px transparent;
+}
+
+#statusBar .wifi_status22{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -45px transparent;
+}
+
+#statusBar .wifi_status23{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -70px transparent;
+}
+
+#statusBar .wifi_status24{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -95px transparent;
+}
+
+#statusBar .wifi_status25{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -120px transparent;
+}
+
+#statusBar .wifi_status26{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -145px transparent;
+}
+
+#statusBar .wifi_status27{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -170px transparent;
+}
+
+#statusBar .wifi_status28{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -195px transparent;
+}
+
+#statusBar .wifi_status29{
+ background: url("../pic/wlan.png") no-repeat scroll -78px -220px transparent;
+}
+
+#statusBar .wifi_status30{
+ background: url("../pic/wlan.png") no-repeat scroll -116px 5px transparent;
+}
+
+#statusBar .wifi_status31{
+ background: url("../pic/wlan.png") no-repeat scroll -116px -20px transparent;
+}
+
+#statusBar .wifi_status32{
+ background: url("../pic/wlan.png") no-repeat scroll -116px -45px transparent;
+}
+
+#statusBar .wifi_status_off{
+ background:url('../pic/wlan_off.png') no-repeat;
+}
+
+/* Overlay */
+#loading {
+ display: none;
+}
+
+#result-overlay {
+ display: none;
+}
+
+#result_wording h2{
+ font-size: 20px;
+ margin-top: 5px;
+ margin-bottom: 8px;
+}
+
+#result-overlay #result-image {
+ height: 75px;
+ margin: 0 auto;
+ width: 75px;
+}
+
+#result-overlay .overlay-success {
+ background: url("../pic/res_succ.png") no-repeat scroll 0 0 transparent;
+}
+
+#result-overlay .overlay-error {
+ background: url("../pic/res_failure.png") no-repeat scroll 0 0 transparent;
+}
+
+#loading_container{padding-bottom: 15px;}
+
+#loading_container a {
+ outline: none;
+}
+
+#progress {
+ display: none;
+}
+
+
+.ko-grid-search{
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
+ margin-top: 3px;
+ margin-right: 15px;
+ width: 155px;
+ height: 30px;
+ line-height: 30px;
+ padding-right: 5px;
+ display: inline-block;
+ border: 1px solid #a1a1a1 ;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ -khtml-border-radius: 5px;
+ -ms-border-radius: 5px;
+ -o-border-radius: 5px;
+}
+
+.ko-grid-search input{
+ border: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: none;
+ height: 20px;
+ line-height: 20px;
+ padding: 5px 0;
+ background: none;
+ outline: none;
+ display: inline;
+}
+
+.ko-grid-search input.focusIn[type="text"]{
+ width: 100px;
+ padding: 2px 0;
+ margin: 0;
+ color: #767676;
+ background: none;
+ border: none;
+ box-shadow: none;
+}
+
+#frmPhoneBook #ko_grid_search_txt{
+ width: 100px;
+ padding: 2px 0;
+ color: #767676;
+ font-style:italic;
+}
+
+#smsListForm #searchInput{
+ width: 100px;
+ padding: 2px 0;
+ color: #767676;
+ font-style:italic;
+}
+
+#ko_grid_search_txt::-ms-clear {
+ display: none;
+}
+
+.ko-grid-search input.focusIn[type="text"], input.focusIn[type="password"] ,textarea:focus{
+ border-color:none;
+ outline: 0;
+ /* IE6-9 */
+ -webkit-box-shadow:none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+
+.checkbox {
+ width: 16px;
+ height: 16px;
+ margin-top: 0;
+ margin-bottom: 0;
+ cursor: pointer;
+ vertical-align: middle;
+ display: inline-block;
+ background:url("../pic/tickbox.png") no-repeat;
+}
+
+.checkbox:hover {
+ display: inline-block;
+}
+
+.checkbox input {
+ display: none;
+}
+
+.checkbox_selected {
+ background:url("../pic/tickbox_in.png") no-repeat;
+}
+
+p.checkbox.disable{
+ background:url("../pic/tickbox_disable.png") no-repeat;
+}
+
+p.checkbox.checked_disable{
+ background:url("../pic/tickbox_in_disable.png") no-repeat;
+}
+
+.header-bottom {
+ padding-bottom: 10px;
+ border-bottom: 1px solid #d3d3d3;
+}
+
+.popover_title{
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 18px;
+ margin: 0;
+ padding: 8px 14px;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 5px 5px 0 0;
+ background-color: #f7f7f7;
+}
+
+.popover_content{
+ margin-top: 1em;
+ padding: 0 8px 8px 8px;
+}
+
+.popover_row label.error{
+ width: 100%;
+ text-align: left;
+}
+
+.form-title{
+ margin-bottom: 20px;
+ border-bottom: 1px solid #eee;
+}
+
+#footer{
+ /*margin-top: 40px;
+ background: #eeeeee;*/
+ height: 60px;
+ line-height: 60px;
+ text-align: center;
+}
+
+#smsChatRoom {
+ width: 100%;
+ font-size: 12px;
+ padding-left: 0;
+ float: left;
+ display: none;
+}
+
+#smsChatRoom #chosenUserSelect{
+ width: 690px;
+}
+
+#chosenUser {
+ padding: 10px;
+ background-color: #D4DAE2;
+ box-shadow: 0 -3px 8px #ddd;
+}
+
+#chosenUser1{
+ margin-top: 0;
+}
+
+#chatlist {
+ padding-left: 10px;
+ padding-top: 10px;
+ background-color: white;
+ position: relative;
+ min-height: 240px;
+ box-shadow: 0 -3px 8px #D4DAE2;
+ *display: inline;
+}
+
+#chatlist a{
+ text-decoration: underline;
+ color: blue;
+}
+
+#chatpanel {
+ height: 250px;
+ border: 1px solid #e1e1e1;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ background-color: white;
+}
+
+#chatpanel .clear-container {
+ width: 100%;
+ height: 250px;
+ border: 1px solid #e1e1e1;
+ border-top: none;
+ border-left: none;
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+#inputpanel {
+ height: 142px;
+ padding: 10px 0;
+ position: relative;
+}
+
+.chatform {
+ margin: 0;
+ height: 120px;
+}
+
+textarea {
+ resize: none;
+}
+
+.chatform .chattextinput textarea {
+ height: 110px;
+ line-height:normal;
+ font-size: 14px;
+ color: #696e72;
+ overflow: auto;
+}
+
+#sendSmsErrorLi{
+ color: #CC0000;
+}
+
+.chatfun {
+ padding-top: 8px;
+}
+
+.chatfun ul.ext {
+ float: left;
+}
+
+.chatfun ul.ext li {
+ float: left;
+ padding-left: 10px;
+ margin-right: 20px;
+}
+
+.chatfun ul.btn {
+ float: right;
+}
+
+.chatfun ul.btn li {
+ float: left;
+ margin-right: 10px;
+}
+
+.chatfun ul.btn li button {
+ padding: 1px 0;
+}
+
+.grid-talk .main-wrap {
+ margin-right: 36px;
+ _margin-right: 18px;
+}
+
+.grid-talkf .main-wrap {
+ margin-left: 36px;
+ _margin-left: 18px;
+}
+
+.col-main {
+ float: left;
+ width: 100%;
+ min-height: 1px;
+}
+
+
+.progress-content{
+ text-align: center
+}
+
+.progress-bar-container{
+ width:400px; height:32px;
+ margin:0 auto;
+ padding:1px;
+ border:1px #CCC solid;
+ text-align: left;
+ position:relative;
+}
+
+.progress-bar{
+ width:200px;
+ height:28px;
+ background:#429aff;
+}
+
+.progress-bar-value{
+ top:7px;
+ width:400px;
+ position:absolute;
+ text-align:center;
+ overflow:hidden;
+ font-weight:bold;
+}
+
+.progress-prompt{
+ font-size:small;
+ font-weight:bold;
+ padding-bottom: 15px;
+}
+
+#simplemodal-overlay {
+ cursor: wait;
+ background-color: #000;
+}
+
+#confirm,#popupSettingWindow{
+ display: none;
+}
+
+/* Overlay */
+#confirm-overlay {
+ cursor: wait;
+ background-color: #000;
+}
+
+/* Container */
+#confirm-container {
+ width: 420px;
+ border: 2px solid #dddddd;
+ border-radius: 6px;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ text-align: left;
+ background: none repeat scroll 0 0 #fff;
+}
+
+#confirm-container .header {
+ width: 100%;
+ height: 30px;
+ line-height: 30px;
+ color: #000;
+ font-weight: bold;
+ background-color: #eaeaea;
+ border-bottom: 1px solid #cbcbcb;
+}
+
+#confirm-container .header span {
+ padding-left: 8px;
+}
+
+#confirm-container .buttons {
+ padding: 10px 8px;
+ text-align: right;
+}
+
+#confirm-container .message {
+ color: #000;
+ font-size: 14px;
+}
+
+#confirm .message > i {
+ font-size: 0.9em;
+}
+
+#confirm-message-container{
+ margin: 10px 5px;
+}
+
+#confirm .icon {
+ width: 50px;
+ margin: 0 0 0 10px;
+ vertical-align: top;
+ display: inline-block;
+}
+
+#confirm .confirm-message {
+ width: 310px;
+ margin: 10px 10px 10px 0;
+ vertical-align: top;
+ display: inline-block;
+}
+
+.simplemodal-wrap .form-title{
+ font-size: 16px;
+ font-weight: bold;
+}
+
+.cursorhand{
+ cursor: pointer;
+}
+
+.device-block{
+ width: 100px;
+ margin: 0 24px 5px 0;
+ text-align: center;
+ text-decoration: none;
+ display: inline-block;
+}
+
+.device-block-desc{
+ padding-top: 100px;
+ width: 100px;
+ display: inline-block;
+ overflow: hidden;
+ vertical-align: middle;
+ text-align: center;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ background: url("../pic/mobile.png") no-repeat scroll 0 0 transparent;
+}
+
+.expend-desc{
+ padding-left: 2em;
+}
+
+.arrow-right{
+ padding-right: 30px;
+ background: url("../pic/direct-right.png") no-repeat scroll right center transparent;
+}
+
+#pc_main_form .content {
+ padding-left: 2em;
+}
+
+table.colorHoverTable thead tr {
+ height: 27px;
+}
+
+.header-center th{
+ text-align: center;
+}
+
+#pc_time_limited_form table thead tr{
+ background: none;
+}
+
+#pc_time_limited_form table thead td{
+ min-width: 4%;
+}
+
+#pc_time_limited_form table tbody td{
+ border: 1px solid #ccc;
+ height: 40px;
+ vertical-align: middle;
+ /*line-height: 40px;*/
+ padding: 0;
+ border-collapse: collapse;
+}
+
+#pc_time_limited_form table tbody td.active{
+ background-color: red;
+}
+
+#pc_time_limited_form table tbody td:first-child{
+ width: 50px;
+ border-width: 0 1px 0 0;
+}
+
+#pc_time_limited_form .pc_time_block{
+ width: 20px;
+ height: 20px;
+ display: inline-block;
+ border: 1px solid #ccc;
+}
+
+#pc_time_limited_form .time_td_hover{
+ background: #eee;
+}
+
+#pc_time_limited_form .forbid_time{
+ background-color: red;
+}
+
+#pc_children_group_form table td{
+ line-height: 32px;
+}
+
+.layout:after,.main-wrap:after,.col-sub:after,.col-extra:after {
+ content: '\20';
+ display: block;
+ height: 0;
+ clear: both;
+}
+
+.talk-item {
+ margin: 10px 0 5px 0;
+}
+
+.talk-item .info-user {
+ width: 30px;
+ padding: 2px;
+ border: 1px solid #335A8B;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ background-color: #fff;
+}
+
+.talk-item .info-user img {
+ width: 30px;
+ display: block;
+}
+
+.talk-item .time {
+ height: 20px;
+ line-height: 20px;
+ clear: both;
+}
+
+.talk-item .msg {
+ padding: 10px;
+ max-width: 560px;
+ line-height: 180%;
+ position: relative;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #000;
+}
+
+.talk-item .msg s.arrow {
+ width: 7px;
+ height: 13px;
+ bottom: 10px;
+ display: block;
+ position: absolute;
+ background: url(../pic/a-direct.png) no-repeat;
+}
+
+.talk-b .msg_fail s.arrow{
+ bottom: 10px;
+ display: block;
+ width: 7px;
+ height: 13px;
+ left: 100%;
+ position: absolute;
+ background: url(../pic/c-direct.png) no-repeat;
+}
+
+.talk-item .msg_fail {
+ padding: 10px;
+ line-height: 180%;
+ max-width: 560px;
+ position: relative;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #000;
+}
+
+.talk-b .msg_fail{
+ float: right;
+ min-width: 70px;
+ padding: 10px 10px 15px 10px;
+ background: #ffdbdb;
+ border: 1px solid #f46c6c;
+ min-width: 350px;
+}
+
+.msg_fail pre{
+ border: medium none;
+ line-height: 17px;
+ margin: 0;
+ overflow-x: auto;
+ padding: 0;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ color: #696e72;
+ background: none repeat scroll 0 0 transparent;
+}
+
+#smsChatRoom .error {
+ color: #CC0000;
+}
+
+.info-talk{
+ color: #87acd6;
+}
+
+.talk-a .info-talk {
+ float: left;
+ padding: 0 20% 10px 10px;
+ min-width: 420px;
+ _float: none;
+ _padding-left: 26px;
+}
+
+.talk-a .msg {
+ min-width: 350px;
+ min-height: 20px;
+ border: 1px solid #ccc;
+ background: #eef2f4;
+}
+
+.talk-a .msg s.arrow {
+ left: -7px;
+ _left: -17px;
+}
+
+.talk-b {
+ margin-right: 10px;
+ _margin-right: 20px;
+}
+
+.talk-b .info-talk {
+ float: right;
+ min-width: 420px;
+ padding: 0 10px 10px 20%;
+}
+
+.talk-b .msg {
+ float: right;
+ min-width: 350px;
+ min-height: 20px;
+ border: 1px solid #ADCAE3;
+ padding: 10px 10px 10px 10px;
+ background: #bce3f4;
+}
+
+.talk-c {
+ margin-right: 20px;
+ _margin-right: 30px;
+}
+
+.talk-b .info-talk {
+ float: right;
+ min-width: 420px;
+ padding: 0 10px 10px 20%;
+}
+
+.talk-c .msg {
+ float: right;
+ min-width: 70px;
+ padding: 10px 10px 15px 10px;
+ border: 1px solid #ADCAE3;
+ background: #bce3f4;
+}
+
+.talk-b .msg s.arrow {
+ left: 100%;
+ background: url("../pic/b-direct.png") no-repeat;
+}
+
+#smslist-main .smslist-btns.smsListFloatButs{
+ position: fixed;
+ top: 0;
+ width: 770px;
+ height: 50px;
+ padding: 6px 0 0 0;
+ border: 1px solid #018AD8;
+ display: block;
+ z-index: 9999;
+ background: #F5F9FE;
+ background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F5F9FE), to(#018AD8) );
+ background: -ms-linear-gradient(top, #F5F9FE, #018AD8);
+ background: -moz-linear-gradient(top, #F5F9FE, #018AD8);
+ background: -o-linear-gradient(top, #F5F9FE, #018AD8);
+ filter: progid:dximagetransform.microsoft.gradient(enabled='true', startColorstr='#FFF5F9FE', endColorstr='#FF018AD8', GradientType=0);
+}
+
+#popupSettingWindow .tag-popup-close{
+ height: 0;
+ position: relative;
+ z-index: 2000;
+}
+
+#popupSettingWindow .tag-popup-close a {
+ float: right;
+ display: block;
+ top: 15px;
+ right: 15px;
+ width: 12px;
+ height: 13px;
+ font-size: 1px;
+ background: url("../pic/select-sprite.png") no-repeat scroll right -11px transparent;
+ position: absolute;
+}
+
+#innerTagPopup{
+ z-index: 250;
+ width: 185px;
+ line-height: 130%;
+ border: 1px solid #D4DAE2;
+ border-radius: 5px;
+ position: absolute;
+ background-color: #D4DAE2;
+ box-shadow: 0 -3px 8px #DDDDDD;
+}
+
+#innerTagPopup label.error{
+ color: #CC0000;
+ display: block;
+}
+
+#innerTagPopup .popup-wrapper {
+ background: #fff;
+ border: 2px solid #76b2de;
+ padding: 5px;
+}
+
+#innerTagPopup .tag-popup-close a {
+ float: right;
+ display: block;
+ width: 12px;
+ height: 13px;
+ font-size: 1px;
+ background: url("../pic/select-sprite.png") no-repeat scroll right -11px transparent;
+}
+
+
+#home_control{
+ color: #fff;
+ margin: 4px 0 0;
+}
+
+#home_control #change{
+ color: #ffffff;
+ font-weight: bold;
+ padding: 3px 15px;
+ background-color: transparent;
+}
+
+#home_image{
+ height: 400px;
+ color: #fff;
+}
+
+.label-font-normal label{
+ font-weight: normal;
+}
+
+#showDetailInfo ~ .popover{
+ min-width: 400px;
+}
+
+#showDetailInfo ~ .popover label{
+ font-size: 12px;
+ line-height: 1.5em;
+ word-wrap: break-word;
+}
+
+#h_qrcode {
+ width: 115px;
+ height: 115px;
+ background-color: #ffffff;
+ border: 1px solid #ffffff;
+}
+
+#h_wire_device {
+ top: 38px;
+ left: 130px;
+ display:inline;
+ margin-right:25px;
+ font-size: 30px;
+ display:inline-block;
+}
+
+#h_wireless_device {
+ font-size: 30px;
+ top: 105px;
+ left: 60px;
+ display:inline-block;
+}
+
+#h_network_type{
+ height: 30px;
+ top: 183px;
+ left: 415px;
+ line-height: 30px;
+ text-align: center;
+ font-size: 18px;
+}
+
+.data-card #h_network_type{
+ top: 156px;
+ left: 218px;
+}
+
+#h_network_type.no-btn {
+}
+
+#h_connect_btn{
+ width: 72px;
+ height: 35px;
+ display:inline-block;
+}
+
+.data-card #h_connect_btn{
+ top: 153px;
+ left: 323px;
+}
+
+.h_connect_on{
+ background: url('../pic/dial-on.png') no-repeat scroll 0 0 transparent;
+}
+
+.h_connect_off{
+ background: url('../pic/dial-off.png') no-repeat scroll 0 0 transparent;
+}
+
+#h_internet_setting_div{
+ top: 222px;
+ left: 418px;
+ width: 170px;
+ height: 35px;
+ margin-top:20px;
+ line-height: 35px;
+ text-align: center;
+}
+
+.data-card #h_internet_setting_div{
+ top: 205px;
+ left: 221px;
+}
+
+#h_internet_setting_btn{
+ width: 170px;
+ height: 35px;
+ line-height: 35px;
+ padding-right: 25px;
+ color: #fff;
+ display: block;
+ font-weight: bold;
+}
+
+#h_wifi_setting_div{
+ top: 318px;
+ left: 418px;
+ width: 170px;
+ height: 35px;
+ line-height: 35px;
+ text-align: center;
+}
+
+#h_wifi_setting_btn{
+ width: 170px;
+ height: 35px;
+ line-height: 35px;
+ padding-right: 25px;
+ color: #fff;
+ display: block;
+ font-weight: bold;
+}
+
+#h_connect_status{
+ top: 272px;
+ left: 670px;
+ width: 25px;
+ height: 25px;
+ position: absolute;
+}
+
+.h_status_connected{
+ background: url('../pic/local-connected.png') no-repeat scroll 0 0 transparent;
+}
+
+.h_status_disconnected{
+ background: url('../pic/local-disconnected.png') no-repeat scroll 0 0 transparent;
+}
+
+.h_status_connecting{
+ background: url('../pic/local-connecting.png') no-repeat scroll 0 0 transparent;
+}
+
+.h_status_disconnecting{
+ background: url('../pic/local-disconnecting.png') no-repeat scroll 0 0 transparent;
+}
+
+.color_block{
+ width: 20px;
+ height: 20px;
+ line-height: 20px;
+ border: 1px solid #ccc;
+ vertical-align: middle;
+ display: inline-block;
+}
+
+.color_block_desc{
+ line-height: 20px;
+ vertical-align: middle;
+ margin-left: 8px;
+ display: inline-block;
+}
+
+.colorRed{
+ color: #CC0000;
+}
+
+.msg pre{
+ line-height: 17px;
+ border: none;
+ margin: 0;
+ padding: 0;
+ overflow-x: hidden;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ color: #696e72;
+ background: none;
+}
+
+.smslist-item-icon {
+ width: 80px;
+ height: 80px;
+ margin-left: 10px;
+ margin-top: -6px;
+}
+
+.smslist-item-name {
+ max-width: 550px;
+ color: #000;
+ display: inline-block;
+ overflow: hidden;
+}
+
+.smslist-item-name2 {
+ color: #000;
+}
+
+.smslist-item-name-draftShowName{
+ display:inline;
+}
+
+.smslist-item-total-count-style{
+ float:left;
+ width:50px;
+ display:inline-block;
+ color:#696e72;
+}
+
+.smslist-item-repeat {
+ font-weight: bold;
+ line-height: 18px;
+ text-indent: 3px;
+ color: #7D8DA3;
+}
+
+.smslist-item-repeat:hover {
+ color: #207DDD;
+}
+
+.smslist-item{
+ border-bottom: 1px solid #e1e1e1;
+ margin-bottom: 10px;
+}
+
+.repeat-icon {
+ width: 18px;
+ height: 18px;
+ display: block;
+ background: url("../pic/png_forward.png") no-repeat;
+}
+
+.repeat-icon:hover {
+ width: 18px;
+ height: 18px;
+ display: block;
+ background: url("../pic/png_forward_hover.png") no-repeat;
+}
+
+.sms-forward-icon {
+ width: 18px;
+ height: 18px;
+ display: block;
+ background: url("../pic/png_forward.png") no-repeat scroll;
+}
+
+.sms-forward-icon:hover {
+ width: 18px;
+ height: 18px;
+ display: block;
+ background: url("../pic/png_forward_hover.png") no-repeat scroll;
+}
+
+.smslist-item-delete {
+ width: 18px;
+ height: 18px;
+ display: block;
+}
+
+.smslist-item-delete:hover {
+ width: 18px;
+ height: 18px;
+ display: block;
+}
+
+.sms-add-contact-icon {
+ width: 13px;
+ height: 13px;
+ display: inline-block;
+ background: url("../pic/png_add_contact.png") no-repeat scroll 0 0 transparent;
+}
+
+.sms-add-contact-icon:hover {
+ width: 13px;
+ height: 13px;
+ display: inline-block;
+ background: url("../pic/png_add_contact_hover.png") no-repeat scroll 0 0 transparent;
+}
+
+.smslist-item-delete:hover .trash-icon {
+ width: 18px;
+ height: 18px;
+ display: block;
+ background: url("../pic/png_delete_hover.png") no-repeat;
+}
+
+.trash-icon {
+ width: 18px;
+ height: 18px;
+ display: block;
+ background: url("../pic/png_delete.png") no-repeat;
+}
+
+.smslist-item-resend {
+ font-weight: bold;
+ line-height: 22px;
+ text-indent: 3px;
+ color: #7D8DA3;
+}
+
+.sms-resend-icon {
+ width: 18px;
+ height: 18px;
+ display: block;
+ background: transparent url("../pic/png_resend1.png") no-repeat;
+}
+
+.smslist-item-resend:hover {
+ color: #207DDD;
+}
+
+.smslist-item-resend:hover .sms-resend-icon{
+ background: transparent url("../pic/png_resend_hover.png") no-repeat;
+}
+
+.clock-icon {
+ width: 18px;
+ height: 30px;
+ line-height: 30px;
+ display: block;
+ background: url("../pic/png_time.png") no-repeat;
+}
+
+.clock-icon:hover {
+ width: 18px;
+ height: 30px;
+ line-height: 30px;
+ display: block;
+ background: url("../pic/png_time.png") no-repeat;
+}
+
+.smslist-item-new-count {
+ width: 29px;
+ height: 35px;
+ line-height: 35px;
+ margin-right: 5px;
+ text-align: center;
+ font-weight: bold;
+ color: #ffffff;
+ background: url("../pic/png_new_sms_bg.png") no-repeat scroll 0 0 transparent;
+}
+
+#mainContainer .width100p {
+ width: 100%;
+}
+
+.height15 {
+ height: 15px;
+ line-height: 15px;
+}
+
+
+label.error{
+ color: #a94442;
+}
+
+#frmPassword label.error {
+ white-space: nowrap;
+}
+
+.form-information{
+ margin-top: 10px;
+}
+
+.form-information p{
+ padding: 15px;
+}
+
+body[lang=en] .label-absolute{
+ height: 40px;
+}
+
+body[lang=en] .label-absolute > label{
+ top: 0;
+ left: 40px;
+ position: absolute;
+}
+
+.ko-grid-pageLinks {
+
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 4px;
+ width: 100%;
+ display: inline-block;
+}
+
+.ko-grid-pageLinks > a,
+.ko-grid-pageLinks > span {
+ display: inline;
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ line-height: 1.42857143;
+ text-decoration: none;
+ color: #008AD7;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+ margin-left: -1px;
+}
+
+.ko-grid-pageLinks > a:first-child,
+.ko-grid-pageLinks > span:first-child {
+ margin-left: 0;
+ border-radius: 4px 0 0 4px;
+}
+
+.ko-grid-pageLinks > a:last-child,
+.ko-grid-pageLinks > span:last-child {
+ margin-left: 0;
+ border-radius: 0 4px 4px 0;
+}
+
+.ko-grid-pageLinks > a.ko-grid-pager-selected,
+.ko-grid-pageLinks > span.ko-grid-pager-selected,
+.ko-grid-pageLinks > a.ko-grid-pager-selected:hover,
+.ko-grid-pageLinks > span.ko-grid-pager-selected:hover {
+ z-index: 2;
+ cursor: default;
+ color: #ffffff;
+ background-color: #008AD7;
+ border-color: #008AD7;
+}
+
+.ko-grid-pageLinks > a:hover,
+.ko-grid-pageLinks > span:hover {
+ z-index: 2;
+ background-color: #EEEEEE;
+ border-color: #DDDDDD;
+}
+
+.ko-grid-pageLinks > span.ko-grid-pager-disabled,
+.ko-grid-pageLinks > span.ko-grid-pager-disabled:hover,
+.ko-grid-pageLinks > span.ko-grid-pager-disabled:focus,
+.ko-grid-pageLinks > a.ko-grid-pager-disabled,
+.ko-grid-pageLinks > a.ko-grid-pager-disabled:hover,
+.ko-grid-pageLinks > a.ko-grid-pager-disabled:focus {
+ color: #777777;
+ background-color: #ffffff;
+ border-color: #dddddd;
+ cursor: not-allowed;
+}
+
+.nav-tabs > li > a, .nav-tabs.nav-justified > li > a{
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.nav-tabs > li > a, .nav-tabs > li > a:hover, .nav-tabs > li > a:focus{
+ color: #333333;
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+ background-color: #f5f5f5;
+ *background-color: #e6e6e6;
+ background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+ background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+ background-repeat: repeat-x;
+ border: 1px solid #cccccc;
+ *border: 0;
+ border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ border-bottom-color: #b3b3b3;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled='true', startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+ *zoom: 1;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.nav-tabs > li:first-child > a, .nav-tabs > li:first-child > a:hover, .nav-tabs > li:first-child > a:focus{
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+}
+
+.nav-tabs > li:last-child > a, .nav-tabs > li:last-child > a:hover, .nav-tabs > li:last-child > a:focus{
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+
+.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus,
+.nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus{
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #006dcc;
+ *background-color: #0044cc;
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+ background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled='true', startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+}
+
+#result-overlay .simplemodal-data, #result-overlay .simplemodal-wrap, #result-overlay .alert{
+ border-radius: 8px;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ box-shadow: 0 3px 5px #999;
+ -moz-box-shadow: 0 3px 5px #999;
+ -webkit-box-shadow: 0 3px 5px #999;
+}
+
+.form-note .notes-title {
+ height: 30px;
+ cursor: pointer;
+ padding-bottom: 5px;
+ background: url("../pic/res_help.png") no-repeat scroll left center transparent;
+}
+
+.form-note .notes-content {
+ display: none;
+}
+
+.form-note .notes-dot {
+ border-bottom: 1px solid #ffffff;
+}
+
+.form-body .form-note {
+ border-radius: 4px;
+ font-size: 12px;
+ margin-bottom: 10px;
+ margin-top: 20px;
+ padding: 10px;
+ background-color: #ededed;
+}
+
+.form-body .form-note li {
+ line-height: 30px;
+ list-style: none outside none;
+ padding-left: 15px;
+ background: url("../pic/res_point.png") no-repeat scroll 0 12px transparent;
+}
+
+.form-body .form-note li.no-style {
+ background: none;
+}
+
+.border-color-transition {;
+ -moz-transition: border-color .5s ease-in;
+ -webkit-transition: border-color .5s ease-in;
+ -o-transition: border-color .5s ease-in;
+ -ms-transition: border-color .5s ease-in;
+ transition: border-color .5s ease-in;
+}
+
+.attention-focus{
+ border-color: red;
+}
+
+.popover-title{
+ background-color: #eaeaea;
+ border-bottom: 1px solid #cbcbcb;
+}
+
+.fixTableScroll {
+ width:100%;
+ overflow-x:auto;
+ overflow-y:hidden;
+ height:100%;
+ overflow-scrolling: touch;
+}
+
+.fixTableScroll:hover {
+ height:100%;
+}
+
+#h_internet_setting_btn:hover {
+ background-image: url("../pic/internet_setting_hover.png");
+}
+
+#h_wifi_setting_btn:hover {
+ background-image: url("../pic/wlan_setting_hover.jpg");
+}
+
+.connected_devices_container {
+ float:left;
+ width: 280px;
+ height: 400px;
+ margin-left:20px;
+ text-align: center;
+ border-radius:10px;
+ cursor: pointer;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #70EBE6, endColorstr = #059EC4);
+ background: -webkit-linear-gradient(left top, #70EBE6 , #059EC4); /* Safari 5.1 - 6.0 */
+ background: -o-linear-gradient(bottom right, #70EBE6 , #059EC4); /* Opera 11.1 - 12.0 */
+ background: -moz-linear-gradient(bottom right, #70EBE6 , #059EC4); /* Firefox 3.6 - 15 */
+ background: linear-gradient(to bottom right, #70EBE6 , #059EC4); /* 标准的语法(必须放在最后)*/
+}
+
+.connected_devices_container .item_icon{
+ height: 45%;
+ background: url(../pic/new/device.png) center center no-repeat;
+}
+
+.home_h3{
+ font-size: 25px;
+ -webkit-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ -moz-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ -ms-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ text-align: center;
+}
+
+.network_control_container {
+ float:left;
+ width: 280px;
+ height: 400px;
+ margin-left:20px;
+ border-radius:10px;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #36A4FF, endColorstr = #0877D4);
+ background: -webkit-linear-gradient(left top, #36A4FF , #0877D4); /* Safari 5.1 - 6.0 */
+ background: -o-linear-gradient(bottom right, #36A4FF , #0877D4); /* Opera 11.1 - 12.0 */
+ background: -moz-linear-gradient(bottom right, #36A4FF , #0877D4); /* Firefox 3.6 - 15 */
+ background: linear-gradient(to bottom right, #36A4FF , #0877D4); /* 标准的语法(必须放在最后)*/
+}
+
+.network_control_container .item_icon{
+ height: 45%;
+ background: url(../pic/new/router.png) center center no-repeat;
+}
+
+.internet_status_container{
+ float:left;
+ width: 280px;
+ height: 400px;
+ margin-left:60px;
+ border-radius:10px;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #D014FE, endColorstr = #7109D5);
+ background: -webkit-linear-gradient(left top, #D014FE , #7109D5); /* Safari 5.1 - 6.0 */
+ background: -o-linear-gradient(bottom right, #D014FE , #7109D5); /* Opera 11.1 - 12.0 */
+ background: -moz-linear-gradient(bottom right, #D014FE , #7109D5); /* Firefox 3.6 - 15 */
+ background: linear-gradient(to bottom right, #D014FE , #7109D5); /* 标准的语法(必须放在最后)*/
+ text-align: center;
+}
+
+.internet_status_container .item_icon_connect{
+ height: 45%;
+ background: url(../pic/new/surfing1.png) center center no-repeat;
+}
+
+.internet_status_container .item_icon_disconnect{
+ height: 45%;
+ background: url(../pic/new/surfing2.png) center center no-repeat;
+}
+
+.internet_status_container .data-card{
+ top: 180px;
+ left: 636px;
+}
+
+.traffic_control_container{
+ float:left;
+ width: 280px;
+ height: 305px;
+ margin-left:45px;
+ border-radius:10px;
+ color:#fff;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #FCCA53, endColorstr = #F45406);
+ background: -webkit-gradient(linear, 0 0, 0 100%, from(#FCCA53), to(#F45406));
+ background: -webkit-linear-gradient(left top, #FCCA53 , #F45406); /* Safari 5.1 - 6.0 */
+ background: -o-linear-gradient(bottom right, #FCCA53 , #F45406); /* Opera 11.1 - 12.0 */
+ background: -moz-linear-gradient(bottom right, #FCCA53 , #F45406); /* Firefox 3.6 - 15 */
+ background: -ms-linear-gradient(left, #FCCA53, #F45406);
+ background: linear-gradient(to bottom right, #FCCA53 , #F45406); /* 标准的语法(必须放在最后)*/
+
+}
+.device_info_container{
+ float:left;
+ width: 580px;
+ height: 305px;
+ border-radius:10px;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #B454F6, endColorstr = #0096D7);
+ background: -webkit-linear-gradient(left top, #B454F6 , #0096D7); /* Safari 5.1 - 6.0 */
+ background: -o-linear-gradient(bottom right, #B454F6 , #0096D7); /* Opera 11.1 - 12.0 */
+ background: -moz-linear-gradient(bottom right, #B454F6 , #0096D7); /* Firefox 3.6 - 15 */
+ background: linear-gradient(to bottom right, #B454F6 , #0096D7); /* 标准的语法(必须放在最后)*/
+}
+
+.device_info_container_hastraffic{
+ margin-left:20px;
+}
+
+.device_info_container_notraffic{
+ margin-left:210px;
+}
+
+.device_info_container a{
+ padding-right: 2em;
+ margin-right:1em;
+ color: #FFF;
+ background: url(../pic/new/direct.png) right center no-repeat;
+}
+
+
+#smslist-table td{
+ vertical-align: middle;
+ line-height: 1.2;
+}
+
+#simMsgList_container td{
+ vertical-align: middle;
+ line-height: 1.2;
+}
+
+.smslist-item-msg pre{
+ overflow: hidden;
+ text-overflow: ellipsis;
+ border: none;
+ padding: 0;
+ margin:0;
+ font-size: 14px;
+ line-height: 1.2;
+ white-space: nowrap;
+ background-color: transparent;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.smslist-btns {
+}
+
+#smsScrollLoading {
+ margin: 25px auto;
+ font-size: 22px;
+ font-weight: bold;
+ text-align: center;
+ color: #7D8DA3;
+}
+
+#smsScrollLoadingBtn {
+ margin: 25px auto;
+ font-size: 22px;
+ font-weight: bold;
+ text-align: center;
+ color: #7D8DA3;
+ cursor: pointer;
+}
+
+#smslist_container{
+ position: relative;
+}
+
+#smslist_container table,#smslist_container table td,#smslist_container table th {
+ padding: 0;
+ margin: 0;
+ border: none;
+}
+
+.smslist-item-checkbox{float: left; width: 20px;}
+.chosen-container-multi .chosen-choices li.search-field input[type="text"]{
+ height: auto;
+}
+
+.sms-table-content{
+ width: 450px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.showFullHeight{
+ white-space: normal;
+}
+
+#buttom-bubble{
+ width: 230px;
+ height: auto;
+ right: 0;
+ bottom: 0;
+ margin-right: 10px;
+ position: fixed;
+ z-index: 100;
+}
+
+#buttom-bubble .bubbleItem{
+ margin-top: 8px;
+ border-radius: 10px 10px 0 0;
+ position: relative;
+}
+
+#buttom-bubble h3{
+ padding: 8px 30px 8px 8px;
+ background-color: #eaeaea;
+ border: 2px solid #eaeaea;
+ border-bottom: 0;
+ border-radius: 8px 8px 0 0;
+ margin-bottom: 0;
+ font-size: 14px;
+}
+
+#buttom-bubble .bubbleItem.report h3{
+ color: #E47602;
+}
+
+#buttom-bubble h3 a.bubbleCloseBtn{
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ border: 1px solid #E2E2E2;
+ -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
+ -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
+}
+
+#buttom-bubble h3 a.bubbleCloseBtn:hover{
+ border: 1px solid #2063AB;
+}
+
+#buttom-bubble .bubbleCloseBtn{
+ width: 16px;
+ height: 14px;
+ display: block;
+ background: url("../pic/res_delete.png");
+}
+
+#buttom-bubble .bubbleContainer{
+ border: 2px solid #E2E2E2;
+ padding: 2px 8px 8px 8px;
+ line-height: 150%;
+ overflow: hidden;
+ border-top: 0;
+ font-size: 12px;
+ background: #F2F2F2;
+ background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(white), to(#eaeaea) );
+ background: -ms-linear-gradient(top, white, #eaeaea);
+ background: -moz-linear-gradient(top, white, #eaeaea);
+ background: -o-linear-gradient(top, white,#eaeaea);
+ filter: progid:dximagetransform.microsoft.gradient(enabled='true', startColorstr='#FFFFFFFF', endColorstr='#ffeaeaea', GradientType=0);
+}
+
+#buttom-bubble .bubbleContent{
+ max-height: 55px;
+ overflow: hidden;
+ line-height: 18px;
+ word-break: break-all;
+ word-wrap: break-word;
+}
+
+#buttom-bubble .bubbleDatetime{
+ padding-right: 10px;
+ text-align: right;
+ font-size: 10px;
+}
+
+#topContainer{
+ padding-top: 10px;
+ padding-bottom: 10px;
+ background-color: #EAEAEA;
+}
+
+.login-page-bg{
+ background: url("../pic/res_login-bg.png") repeat-x scroll 0 0 transparent;
+}
+
+#login-form-container{
+ border: 1px solid gray;
+ border-radius: 8px;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ background-color: white;
+ box-shadow: 0 3px 5px #053984;
+ -moz-box-shadow: 0 3px 5px #053984;
+ -webkit-box-shadow: 0 3px 5px #053984;
+}
+
+#htmlContainer{
+ padding: 0;
+}
+
+#htmlContainer .form-title{
+ padding: 10px 15px 10px 15px;
+ margin-bottom: 0;
+ border-bottom: 1px solid #cbcbcb;
+ background-color: #eaeaea;
+}
+
+#htmlContainer .content{
+ padding: 15px;
+}
+
+#simplemodal-data .alert{
+ border: 1px solid gray;
+ border-radius: 8px;
+ box-shadow: 0 6px 10px #053984;
+ width: 400px;
+ height: 150px;
+ background-color: white;
+}
+
+.btn-primary{
+ background-color: #008AD7;
+}
+
+#pblist tr td {
+ cursor: pointer;
+}
+
+#pblist tr td:first-child {
+ cursor: default;
+}
+
+.form-buttons {
+ margin-right: 20px;
+ margin-bottom: 5px;
+ text-align: right;
+}
+
+.align-right {
+ text-align: right;
+}
+
+.margin-right-10 {
+ margin-right: 10px;
+}
+
+.beautiful_bg #indexContainer{
+}
+
+.header-row {
+ background-color: #018ad8;
+ border-left-width: 0;
+ border-radius: 10px 10px 0 0;
+ margin: -1px 0 30px -11px;
+ width: 940px;
+ color: white;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #B454F6, endColorstr = #0096D7);
+ background: -webkit-gradient(linear, 0 0, 0 100%, from(#B454F6), to(#0096D7));
+ background: -webkit-linear-gradient(left top, #B454F6 , #0096D7); /* Safari 5.1 - 6.0 */
+ background: -o-linear-gradient(bottom right, #B454F6 , #0096D7); /* Opera 11.1 - 12.0 */
+ background: -moz-linear-gradient(bottom right, #B454F6 , #0096D7); /* Firefox 3.6 - 15 */
+ background: -ms-linear-gradient(left, #B454F6, #0096D7);
+ background: linear-gradient(to bottom right, #B454F6 , #0096D7); /* 标准的语法(必须放在最后)*/
+}
+
+.header-row .form-title {
+ border: none;
+ margin-bottom: 0;
+ text-align:center;
+}
+
+#innerContainer {
+ width: 100%;
+ margin: 35px auto;
+ padding: 0 10px 20px 10px;
+ border: 1px solid #fff;
+ border-bottom:0px;
+ border-radius: 10px;
+ background: -webkit-linear-gradient(top, #F1F9FC , #fff); /* Safari 5.1 - 6.0 */
+ background: -o-linear-gradient(bottom, #F1F9FC , #fff); /* Opera 11.1 - 12.0 */
+ background: -moz-linear-gradient(bottom, #F1F9FC , #fff); /* Firefox 3.6 - 15 */
+ background: linear-gradient(to bottom, #F1F9FC , #fff); /* 标准的语法(必须放在最后)*/
+ }
+
+.form-title-multi h1 {
+ margin-top: 10px;
+ margin-bottom: 5px;
+}
+
+.form-title-multi p {
+ margin-bottom: 0;
+}
+.mobile_version_link{
+ color: #A0AFCB;
+}
+
+#opmode_form .content {
+ background-color: #FFFFFF;
+}
+
+#sms_unread_count a:hover {
+ text-decoration: none;
+}
+
+.customfile-input {
+ outline: none;
+ position: absolute;
+ height: 100px;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ z-index: 999;
+ opacity: 0;
+ -moz-opacity: 0;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0 );
+}
+
+.customfile {
+ width: 400px;
+ padding: 2px;
+ border: 1px solid #444;
+ line-height: 30px;
+ background: #FAFAFA;
+ background: -ms-linear-gradient(#FAFAFA, #CACACA);
+ background: -moz-linear-gradient(#FAFAFA, #CACACA);
+ background : -webkit-linear-gradient( #FAFAFA, #EAEAEA);
+ cursor: pointer;
+ overflow: hidden;
+ -moz-border-radius: 7px;
+ -webkit-border-radius: 7px;
+ border-radius: 7px;
+ position: relative;
+ float: left;
+}
+
+.customfile-disabled {
+ opacity: .5;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0 );
+ cursor: default;
+}
+
+.customfile-feedback {
+ display: block;
+ margin: 1px 1px 1px 5px;
+ font-size: 1.2em;
+ color: #767676;
+ font-style: italic;
+}
+
+.customfile-feedback-populated {
+ color: #111;
+ padding-left: 20px;
+ line-height: 24px;
+ margin-top: 6px;
+ width:290px;
+ font-style: normal;
+ font-weight: bold;
+ background: url(../pic/pic-file.png) left 0px no-repeat;
+ white-space:nowrap;
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.customfile-button {
+ border: 1px solid #999;
+ background-color: #008AD7;
+ color: #fff;
+ float: right;
+ padding: 0px 10px;
+ text-align: center;
+ text-decoration: none;
+ font-size: 1em;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+}
+
+.customfile-hover .customfile-button,.customfile-focus .customfile-button {
+ background-color: #3071A9;
+ border-color: #285E8E;
+ padding: 0px 10px;
+ color: #fff;
+}
+
+.customfile-focus .customfile-button {
+ outline: 1px dotted #ccc;
+}
+
+/*file type icons*/
+.customfile-ext-jpg, .customfile-ext-gif, .customfile-ext-png, .customfile-ext-jpeg, .customfile-ext-bmp { background-image: url(../pic/pic-picture.png);}
+.customfile-ext-mp4, .customfile-ext-mov, .customfile-ext-swf, .customfile-ext-m4v { background-image: url(../pic/pic-film.png);}
+.customfile-ext-mp3, .customfile-ext-wav { background-image: url(../pic/pic-mp3.png);}
+.customfile-ext-zip, .customfile-ext-tar, .customfile-ext-sit { background-image: url(../pic/pic-rar.png);}
+
+input[type='file']:focus{
+ outline: none;
+}
+
+#smslist-checkAll, #simMsgList-checkAll {
+ margin-left: -4px;
+}
+
+.not-allowed {
+ color: #D1D1D1 !important;
+ cursor: not-allowed;
+}
+
+.not-allowed:hover {
+ outline: 0;
+ text-decoration: none;
+}
+
+.not-allowed:focus {
+ outline: 0;
+ text-decoration: none;
+}
+
+.margin-top-5 {
+ margin-top: 5px;
+}
+
+.colorLightBlue{
+ color: #09F;
+}
+
+.sd_invalid_notes ul li{
+ height: 2em;
+ line-height: 2em;
+}
+
+.sd_invalid_notes .notes-content{
+ display: block;
+}
+
+#fileControlSection li {
+ list-style: outside none none;
+ display: inline;
+}
+
+
+.my_router_list,.net_surfing_list{
+ margin-top: 20px;
+}
+
+.my_router_list ul,.net_surfing_list ul,.statistics_list ul,.nav_right ul{
+ -webkit-padding-start: 0px;
+ margin:0px;
+ padding:0px;
+}
+
+.my_router_list li,.net_surfing_list li,.statistics_list li{
+ padding: 0 1em;
+ list-style:none;
+}
+
+.my_router_list li,.my_router_list li a,.net_surfing_list li{
+ text-align: left;
+ line-height: 2em;
+ font-size: 18px;
+
+}
+
+.my_router_list li a{
+ display: block;
+ color: #FFF;
+ background: url(../pic/new/direct.png) right center no-repeat;
+ -webkit-transition: all ease-in .3s;
+ -moz-transition: all ease-in .3s;
+ -ms-transition: all ease-in .3s;
+ transition: all ease-in .3s;
+}
+
+.my_router_list li a:hover{
+ color: #FAFAFA;
+ -webkit-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ -moz-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ -ms-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+}
+
+.net_surfing_list li{
+ text-align: center;
+}
+
+.net_surfing_list i{
+ display: inline-block;
+ width: 17px;
+ height: 24px;
+ margin-right: 15px;
+ vertical-align: middle;
+}
+
+.net_surfing_list i.up{
+ background: url(../pic/new/direct_top.png);
+}
+
+.net_surfing_list i.down{
+ background: url(../pic/new/direct_down.png);
+}
+
+.statistics_list ul li{
+ padding: 0 20px;
+ text-align: left;
+ margin-top: 15px;
+ font-size:18px;
+}
+
+.statistics_list ul li a{
+ color: #FFF;
+ display: block;
+ background: url(../pic/new/direct.png) right center no-repeat;
+ -webkit-transition: all ease-in .3s;
+ -moz-transition: all ease-in .3s;
+ -ms-transition: all ease-in .3s;
+ transition: all ease-in .3s;
+}
+
+.statistics_list ul li a:hover{
+ -webkit-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ -moz-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ -ms-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+ text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+}
+
+.type_items{
+ width:880px;
+ height: 100px;
+ text-align: center;
+ margin:0 0 0 45px;
+ -webkit-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -moz-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -ms-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ -ms-border-radius: 8px;
+ border-radius: 10px;
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #B454F6, endColorstr = #0096D7);
+ background: -webkit-linear-gradient(left top, #B454F6 , #0096D7); /* Safari 5.1 - 6.0 */
+ background: -o-linear-gradient(bottom right, #B454F6 , #0096D7); /* Opera 11.1 - 12.0 */
+ background: -moz-linear-gradient(bottom right, #B454F6 , #0096D7); /* Firefox 3.6 - 15 */
+ background: linear-gradient(to bottom right, #B454F6 , #0096D7); /* 标准的语法(必须放在最后)*/
+}
+
+.type_items ul{
+ width: auto;
+ -webkit-padding-start: 0px;
+ margin:0px;
+ padding:0px;
+}
+
+.type_items ul li{
+ display: inline-block;
+ float:left;
+ list-style:none;
+}
+
+.type_items a{
+ display: table-cell;
+ width: 125px;
+ height: 100px;
+ color: #FFF;
+ vertical-align: middle;
+ -webkit-transition: all ease-in .3s;
+ -moz-transition: all ease-in .3s;
+ -ms-transition: all ease-in .3s;
+ transition: all ease-in .3s;
+ border-left: 1px solid;
+}
+
+.type_items a,.nav_right a:hover{
+ -webkit-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -moz-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -ms-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+}
+
+.nav_right{
+ margin: 0 auto 0px -10px;
+ text-align: center;
+
+}
+
+.nav_right ul{
+ width: auto;
+ margin: 0 auto;
+}
+
+.nav_right ul li{
+ margin: 15px 20px 0 0;
+ width:100%;
+ list-style:none;
+}
+
+.nav_right .active a{
+ display: table-cell;
+ width: 138px;
+ height: 50px;
+ color: #fff;
+ font-weight:bold;
+ vertical-align: middle;
+ -webkit-transition: all ease-in .3s;
+ -moz-transition: all ease-in .3s;
+ -ms-transition: all ease-in .3s;
+ transition: all ease-in .3s;
+ -webkit-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -moz-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -ms-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ box-shadow: 0px 8px 10px rgba(172, 172, 172, 0.5);
+ background-color:rgb(66, 153, 237);
+}
+
+.nav_right a{
+ width: 138px;
+ height: 50px;
+ display: table-cell;
+ color: #000;
+ vertical-align: middle;
+ -webkit-transition: all ease-in .3s;
+ -moz-transition: all ease-in .3s;
+ -ms-transition: all ease-in .3s;
+ transition: all ease-in .3s;
+ -webkit-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -moz-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ -ms-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+ box-shadow: 0px 8px 10px rgba(172, 172, 172, 0.5);
+ background-color:rgb(182, 214, 232);
+}
+
+.sd-total {
+ text-align: right;
+ padding-right: 20px;
+}
+
+.icon-folder{
+ background: url("../pic/pic-folder.png") no-repeat;
+}
+
+.icon-pdf{
+ background: url("../pic/pic-pdf.png") no-repeat;
+}
+
+.icon-rar{
+ background: url("../pic/pic-rar.png") no-repeat;
+}
+
+.icon-mp3{
+ background: url("../pic/pic-mp3.png") no-repeat;
+}
+
+.icon-file{
+ background: url("../pic/pic-file.png") no-repeat;
+}
+
+.icon-film{
+ background: url("../pic/pic-film.png") no-repeat;
+}
+
+.icon-picture{
+ background: url("../pic/pic-picture.png") no-repeat;
+}
+
+.icon-doc{
+ background: url("../pic/pic-doc.png") no-repeat;
+}
+
+.icon-ppt{
+ background: url("../pic/pic-ppt.png") no-repeat;
+}
+
+.icon-xls{
+ background: url("../pic/pic-xls.png") no-repeat;
+}
+
+.icon-xml{
+ background: url("../pic/pic-xml.png") no-repeat;
+}
+
+.icon-download{
+ background: url("../pic/pic-download.png") no-repeat;
+}
+
+.mini-icon{
+ width: 20px;
+ height: 20px;
+ font-size: 16px;
+ display: block;
+}
+
+.cursor-pointer {
+ cursor: pointer;
+}
+
+#fileListSection th {
+ text-align: center;
+}
+
+.margin-left-5 {
+ margin-left: 5px;
+}
+
+.margin-top-2 {
+ margin-top: 2px;
+}
+
+.push-right {
+ text-align: right;
+}
+
+.data-card-language {
+ top: -25px;
+ right: 10px;
+ position: absolute;
+ display: block;
+}
diff --git a/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_en.properties b/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_en.properties
new file mode 100755
index 0000000..5bd1c7c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_en.properties
@@ -0,0 +1,1723 @@
+#menu 英文
+pc_version = PC
+mobile_version = Mobile
+home = Home
+phonebook = Phonebook
+sms = SMS
+sd = SD Card
+setting = Settings
+status = Information
+net_select = Network Selection
+dial_setting = Dial-up Settings
+apn_setting = APN
+wifi_advance = Advanced Settings
+management = Management
+net_setting = Connection Settings
+quick_setting = Quick Settings
+
+device_info = Status Information
+traffic_statistics = Statistics
+traffic_alert = Data Management
+
+wifi = Wi-Fi Settings
+wifi_basic = Basic Settings
+device_setting = Device Settings
+sim = SIM Card
+device = Device
+router_setting = Router
+mac_filter = WLAN MAC Filter
+
+wps = WPS
+sleep_mode = Power-save
+lan = LAN
+
+firewall = Firewall
+system_security = System Security
+port_forward = Port Forwarding
+port_filter = Port Filtering
+fastboot = Fast Boot
+display_password = Display Password
+display_QR = Display QR Code
+cable = cable
+wireless = wireless
+
+my_router = Network Settings
+net_surfing = Connect Status
+
+#validate
+phonenumbers_check = Input 5 phone numbers at most, and separate them by ';'
+required = Required
+remote = Please fix this field
+url = Please input a valid URL
+siteLink_check = Please input a valid URL
+siteName_check = Please input a valid name
+date = Please input a valid date
+dateISO = Please input a valid date (ISO)
+number = Please input a valid digit
+digits = Please input integer only
+decimalRange = Please enter a positive number and decimal places a maximum of 2
+any_digits = Please input integer only
+creditcard = Please input a valid credit card number
+equalTo = Please input the same value again
+accept = Please input a value with a valid extension
+maxlength = Please input no more than {0} characters
+minlength = Please input at least {0} characters
+rangelength = Please input a value between {0} and {1} characters in length
+range = Please input a value between {0} and {1}
+max = Please input a value less than or equal to {0}
+min = Please input a value greater than or equal to {0}
+ssid = Please input a valid SSID
+ssid_ap = Please input a valid SSID(, ; " \ are invalid characters)
+email_check = Please input a valid email
+ipv4 = Please input a valid IP address
+ipv6 = Please enter a valid IPv6 address
+name_check = Please input a valid name
+phonenumber_check = Please input a valid phone number
+sms_service_center_check = Please enter a valid center number
+pin_check = Please input 4 to 8 digits
+puk_check = Please input 8 digits.
+password_check = Please input a valid password
+subnetmask_check = Invalid subnet mask
+dhcp_check = DHCP {0} IP is not in the range of LAN subnet
+dns_check = Invalid DNS. DNS can''t be 255.255.255.255 or 0.0.0.0
+start = start
+end = end
+dhcpCompare = Invalid IP address. Start IP shouldn't be greater than end IP
+ipRange = IP pool can't contain LAN IP address (DHCP start IP should be greater than LAN IP address)
+lanip_check = Please input a valid IP address
+ip_check = Please input a full and valid IP address
+dmz_ip_check = Please input a valid IP address
+wps_pin_check = Invalid PIN number
+wps_pin_length_check = Please enter 4 or 8 digits
+browse_sdcard = View SD card
+portCompare = Invalid port range
+comment_check = Invalid character
+check_file_path = The folder name contains invalid characters
+check_filefold_name = The folder name contains invalid characters: ` ~ # & * + | \ : ? / < > . " '
+apn_check = Please input a valid APN
+ppp_username_check = Please input a valid username
+ppp_password_check = Please input a valid password
+unlock_code_check = Please input a valid unlock code. The code must be 0-9, a-f or A-F, and its length must be 16 characters.
+apn_profile_name_check = The APN profile name contains invalid characters
+dlna_name_check = The Device Name must be 0-9, a-z, A-Z or _
+wifi_password_check = Please input a valid password
+wifi_wep_password_check = Please input 5 or 13 ASCII characters or input 10 or 26 Hex characters.
+range_except = Input a value between {0} and {1}, except for that between 32000 and 32007
+
+#common
+copyright = Copyright © 2010-2022 demo Corporation. All rights reserved
+enable = Enable
+disable = Disable
+apply = Apply
+cancel = Cancel
+clear = Clear
+reset = Reset
+add = Add
+add_new = Add New
+save = Save
+new = New
+view = View
+select = Select
+edit = Edit
+delete = Delete
+delete_all = Delete All
+success_info = Success
+error_info = Failure
+connect = Connect
+disconnect = Disconnect
+connected = Connected
+disconnected = Disconnected
+connecting = Connecting…
+disconnecting = Disconnecting…
+cancelconnect = Cancel Connect
+confirm = Confirm
+prompt = Prompt
+info = Information
+alert = Alert
+yes = Yes
+no = No
+ok = OK
+back = Back
+exit = Exit
+next_step = Next
+prev_step = Previous
+next_page = >>
+prev_page = <<
+root = Root
+create = Create
+speed = Speed
+upload = Upload
+download = Download
+uploaded = Uploaded
+downloaded = Downloaded
+on = On
+off = Off
+need_login_again = You''re logged out of your account. Please login again.
+modify = Change
+content = Content
+time = Time
+processing = Processing...
+saving = Saving...
+deleting = Deleting...
+scanning = State: scanning...
+dlna_scanning = DLNA state: rescanning...
+scanned = DLNA state: rescan complete.
+need_rescan = DLNA state: need rescan.
+sending = Sending...
+creating = Creating...
+uploading = Uploading...
+waiting = Waiting...
+leave_page_info = You have unsaved changes. Are you sure you want to continue?
+colon = :
+page = Page:
+go = GO
+ALL = ALL
+open_source_licenses = Open Source Licenses
+vertical_bar = |
+#security
+security_policy = Security Policy
+security_mode = Security Mode
+security_mode_OPEN = OPEN
+security_mode_SHARED = SHARED
+security_mode_WPA2PSK = WPA2(AES)-PSK
+security_mode_WPAPSKWPA2PSK = WPA-PSK/WPA2-PSK
+security_mode_WPA3Personal = WPA3-Personal
+security_mode_WPA2WPA3 = WPA2(AES)/WPA3-Personal
+wpa = WPA
+pass_phrase = Pass Phrase
+
+#station
+station_info = Connected Devices
+station_number = No.
+host_name = Host Name
+
+#Wifi Basic
+multi_ssid_enable = Multi SSID Switch
+multi_ssid_1 = Main SSID
+multi_ssid_2 = Guest SSID
+multi_ssid_enable_confirm = If enable multi-SSID, Internet Wi-Fi will be disabled. Continue?
+multi_ssid_enable_confirm2 = If enable multi-SSID, Internet Wi-Fi will be disabled. And all connected Wi-Fi devices will probably need to reconnect. Continue?
+multi_ssid_max_access_number_alert = The combined max access number of Main SSID and Guest SSID can''t be more than {0}!
+network_band_selection = Band Selection
+network_mode = Network Mode
+network_name = Network Name(SSID)
+broadcast_network_name = SSID Broadcast
+country_region_code = Country/Region Code
+frequency_channel = Frequency (Channel)
+rate = Rate
+max_station_number = Max Station Number
+wifi_basic_note = When clicking Apply, any connected Wi-Fi devices will need to reconnect.
+wifi_disconnect_confirm = All connected Wi-Fi devices will need to reconnect. <br/>Do you want to continue?
+wifi_disconnect_confirm2 = All connected Wi-Fi devices will probably need to reconnect. <br/>Do you want to continue?
+network_mode_2 = 802.11 n only
+network_mode_4 = 802.11 b/g/n
+network_mode_5 = 802.11 a only
+network_mode_6 = 802.11 b/g/n/ax
+frequency_channel_0 = Auto
+frequency_channel_1 = (Channel 1)
+frequency_channel_2 = (Channel 2)
+frequency_channel_3 = (Channel 3)
+frequency_channel_4 = (Channel 4)
+frequency_channel_5 = (Channel 5)
+frequency_channel_6 = (Channel 6)
+frequency_channel_7 = (Channel 7)
+frequency_channel_8 = (Channel 8)
+frequency_channel_9 = (Channel 9)
+frequency_channel_10 = (Channel 10)
+frequency_channel_11 = (Channel 11)
+frequency_channel_12 = (Channel 12)
+frequency_channel_13 = (Channel 13)
+frequency_channel_14 = (Channel 14)
+frequency_channel_15 = (Channel 15)
+frequency_channel_16 = (Channel 16)
+frequency_channel_17 = (Channel 17)
+frequency_channel_18 = (Channel 18)
+frequency_channel_19 = (Channel 19)
+frequency_channel_20 = (Channel 20)
+frequency_channel_21 = (Channel 21)
+frequency_channel_22 = (Channel 22)
+frequency_channel_23 = (Channel 23)
+frequency_channel_24 = (Channel 24)
+frequency_channel_25 = (Channel 25)
+frequency_channel_26 = (Channel 26)
+frequency_channel_36 = (Channel 36)
+frequency_channel_40 = (Channel 40)
+frequency_channel_44 = (Channel 44)
+frequency_channel_48 = (Channel 48)
+frequency_channel_149 = (Channel 149)
+frequency_channel_153 = (Channel 153)
+frequency_channel_157 = (Channel 157)
+frequency_channel_161 = (Channel 161)
+frequency_channel_165 = (Channel 165)
+rate_0 = Auto
+rate_1 = 1 Mbps
+rate_2 = 2 Mbps
+rate_3 = 5.5 Mbps
+rate_4 = 6 Mbps
+rate_5 = 6.5 Mbps
+rate_6 = 9 Mbps
+rate_7 = 11 Mbps
+rate_8 = 12 Mbps
+rate_9 = 13 Mbps
+rate_10 = 18 Mbps
+rate_11 = 19.5 Mbps
+rate_12 = 24 Mbps
+rate_13 = 26 Mbps
+rate_14 = 36 Mbps
+rate_15 = 39 Mbps
+rate_16 = 48 Mbps
+rate_17 = 52 Mbps
+rate_18 = 54 Mbps
+rate_19 = 58.5 Mbps
+rate_20 = 65 Mbps
+cannot_operate_when_wifi_connected = You can''t operate when Wi-Fi is connected!
+network_mode_select_2 = 802.11 n only
+network_mode_select_4 = 802.11 b/g/n
+network_mode_select_6 = 802.11 b/g/n/ax
+network_modes_band_select_2 = 802.11 n only
+network_modes_band_select_4 = 802.11 a/n
+network_modes_band_select_5 = 802.11 a only
+
+#net select
+auto_select = Automatic
+manual_select = Manual
+auto_select_type_WCDMA_preferred = Automatic
+auto_select_type_LTE_preferred = Automatic
+auto_select_type_NETWORK_auto = Automatic
+auto_select_type_Only_LTE = 4G Only
+auto_select_type_WCDMA_AND_LTE = 4G/3G Only
+auto_select_type_Only_WCDMA = 3G Only
+auto_select_type_TD_W = 3G Only
+auto_select_type_Only_GSM = 2G Only
+
+search = Search
+searching_net = Searching, please wait...
+registering_net = Registering, please wait...
+network_list = Network List
+register = Register
+auto = Auto
+unknown = Unknown
+available = Available
+current = Current
+forbidden = Forbidden
+net_select_note_automatic = Automatic: The device will search available network automatically.
+net_select_note_manual = Manual: The device will search available network manually.
+net_status = Status
+mccmnc = MCCMNC
+option = Option
+networktype = Network Type
+subnet = Act
+
+#home
+ap_station_clear = Clear all
+current_flux = Current Data
+total_flux = Total Used Data
+connected_time = Duration
+flux_up = Upload
+flux_down = Download
+traffic_current_connection = Current Connection
+traffic_current_month_data = Current Month
+traffic_total_traffic = Total Used Data
+traffic_used_data_month = Data usage of this month:
+traffic_used_time_month = The online time of this month:
+traffic_data_approximated = Data usage is approximate only. For actual usage, please refer to your network operator.
+traffic_used_month = Used:
+traffic_left_month = Left:
+traffic_exceeded_month = Exceeded:
+traffic_total_month = Limit:
+traffic_apply_volume_limit = Data Management
+traffic_data_limit_type = Data Type
+traffic_data = Data
+traffic_time = Time
+traffic_limit_data_month = Monthly
+traffic_alert_when_data_reach = Remind me
+traffic_limit_time_month = Monthly
+traffic_alert_when_time_reach = Remind me
+traffic_million_byte = MB
+traffic_percent = %
+traffic_limit_disconnect_msg = Your data/time used reaches {0} percent. Do you want to disconnect from network?
+traffic_limit_connect_msg = Your data/time used reaches {0} percent. Do you still want to connect to network?
+traffic_limit_msg = Your data/time used reaches {0} percent.
+traffic_beyond_disconnect_msg = Your data/time used exceeds limit. Do you want to disconnect from network?
+traffic_beyond_connect_msg = Your data/time used exceeds limit. Do you still want to connect to network?
+traffic_beyond_msg = Your data/time used exceeds limit.
+traffic_calibrate_note = Support data calibrate function. If the data that web page displayed is not in agreement with the actual used, you can modify the used data by this operation.
+traffic_note = Remind me when used data/time reaches specified percentage.
+traffic_over_note = When the data plan''s unit is MB, the used data should be less than 4096TB.
+traffic_clear_confirm = Are you sure to clear?
+traffic_not_support = The current mode does not support this feature.
+
+#APN
+apn_currentApn = Current APN
+apn_mode = Mode
+apn_auto_apn = Auto
+apn_manual_apn = Manual
+apn_profile = Profile
+apn_profile_name = Profile Name
+apn = APN
+apn_ipv4_apn = IPv4 APN
+apn_ipv6_apn = IPv6 APN
+apn_dns_mode = DNS Mode
+apn_dns_mode_ipv4 = IPv4 DNS Mode
+apn_dns_mode_ipv6 = IPv6 DNS Mode
+apn_auto_dns = Auto
+apn_manual_dns = Manual
+apn_dns1 = DNS 1
+apn_dns2 = DNS 2
+apn_dns1_ipv4 = IPv4 DNS 1
+apn_dns2_ipv4 = IPv4 DNS 2
+apn_dns1_ipv6 = IPv6 DNS 1
+apn_dns2_ipv6 = IPv6 DNS 2
+apn_authentication = Authentication
+apn_authentication_ipv4 = IPv4 Authentication
+apn_authentication_ipv6 = IPv6 Authentication
+apn_user_name = User Name
+apn_user_name_ipv4 = IPv4 User Name
+apn_user_name_ipv6 = IPv6 User Name
+apn_password = Password
+apn_password_ipv4 = IPv4 Password
+apn_password_ipv6 = IPv6 Password
+apn_pdp_type = PDP Type
+set_default = Set as default
+apn_save_profile_exist = Profile Name already exists, please select another name.
+apn_delete_cant_delete_default = You can''t delete the default profile!
+apn_delete_confirm = Are you sure to delete?
+apn_cant_modify_status = Can''t change the current APN setting when the network is {0}!
+apn_cant_modify_current = You can''t change the APN that is in use!
+apn_cant_delete_current = You can''t delete the current profile!
+apn_profile_full = You can only add {0} items at most!
+dial_num = Dial No.
+apn_no_select_alert = Please choose a valid profile!
+
+#Status bar
+network_status = Network Status
+connection_status = Wireless Broadband Connection status
+rj45_connection_status = Cable Broadband Connection status
+battery = Battery
+charging = Charging
+sim_status = SIM Status
+sim_status_modem_waitpin = Invalid SIM card
+sim_status_modem_waitpuk = Invalid SIM card
+sim_status_modem_sim_undetected = Invalid SIM card
+sim_status_modem_undetected = Invalid SIM card
+sim_status_modem_imsi_waitnck = Invalid SIM card
+sim_status_modem_sim_destroy = Invalid SIM card
+sim_status_modem_destroy = Invalid SIM card
+sim_status_modem_init_complete = Valid SIM card
+sim_status_modem_ready = SIM is ready
+wifi_status = Wi-Fi Status
+wifi_status_on = Wi-Fi on
+wifi_status_off = Wi-Fi off
+wifi_status1 = Number of users:1
+wifi_status2 = Number of users:2
+wifi_status3 = Number of users:3
+wifi_status4 = Number of users:4
+wifi_status5 = Number of users:5
+wifi_status6 = Number of users:6
+wifi_status7 = Number of users:7
+wifi_status8 = Number of users:8
+wifi_status9 = Number of users:9
+wifi_status10 = Number of users:10
+enable_pin = Enable PIN
+remaining_time = Remaining Time
+signal = Signal
+network_type = Network type
+network_type_limited_service = Limited Service
+network_type_no_service = No Service
+network_provider = Operator
+roaming_status = Roaming status
+sim_status_ready = SIM is ready
+sim_status_waitpin = Ready to input PIN
+sim_status_waitpuk = Ready to input PUK
+sim_status_undetected = No SIM card detected
+sim_status_waitnck = Ready to input NCK
+sim_status_destroy = SIM is corrupted
+signal_strength = Signal strength
+signal_strength_label = Signal Strength
+battery_level = Battery level
+
+#dial_setting
+dial_note = WAN Connection Status
+dial_mode = Connection Mode
+dial_mode_cpe = Dial-up Mode
+dial_roam_info = The Roaming Setting is disabled. To enable it, please go to setting page and click in the checkbox.
+dial_setting_note_automatic = Automatic: The device will automatically connect to network when it is powered on.
+dial_setting_note_manual = Manual: The device will connect to network manually.
+dial_roaming_remind = Check here, you can connect to internet in the roaming status.
+dial_roaming_connect = Your device is roaming. Connecting to network may occur additional charges. Continue?
+
+#net_status
+net_info = Network Status
+pci = PCI
+rsrp = RSRP
+rsrq = RSRQ
+plmn = PLMN
+band = BAND
+
+#phonebook
+search = Search
+save_location = Save Location
+save_location_0 = SIM Card
+save_location_1 = Device
+group_all = All
+group_null = -
+group_common = Common
+group_family = Family
+group_friend = Friend
+group_colleague = Colleague
+name = Name
+mobile_phone_number = Mobile Number
+home_phone_number = Home Number
+office_phone_number = Office Number
+mail = Email
+group = Group
+no_data_selected = Please select an item!
+confirm_data_delete = Are you sure to delete?
+confirm_pb_delete = Delete selected contact(s)?
+too_many_data_selected = Too many numbers are selected! Please select one number!
+delete_fail_try_again = Delete failed, please try again.
+max_send_number = You can enter 5 phone numbers at most!
+send = Send
+send_sms = Send Message
+new_message = New SMS
+send_numbers = Number
+contents = Contents
+device_full = Phonebook space on your device is full!
+sim_full = SIM card is full!
+phonebook_init_fail = The phone book failed to initialize!<br/>Please check SIM card and restart the device.
+sim_removed = SIM card was removed!
+change_device_to_sim_confirm = Information may be lost, and whether there is a need to continue to deposit?
+
+#SMS
+smslist = Device SMS
+sms_setting = SMS Settings
+sim_messages = SIM SMS
+refresh = Refresh
+forward = Forward
+draft = Draft
+send_fail_try_again = Send failed.
+sms_content_required = Please type a SMS.
+sms_contact_required = Please select a contact.
+select_some_options = You can choose 5 contacts at most
+select_an_option = Select an Option
+chat_input_placehoder = Please type message here
+sms_chat_input_confirm = Please press Enter or enter ";" to complete
+sms_capacity_will_full = SMS capacity will be full, please delete some SMS
+sms_capacity_is_full = SMS capacity is full, please delete some SMS
+sms_capacity_is_full_for_send = SMS capacity is full, please delete some SMS to receive or send message.
+sms_capacity_will_full_just = SMS capacity will be full, you could send {0} SMS(s)
+sms_init_fail = SMS failed to initialize!<br/>Please check SIM card and restart the device.
+sms_resending = Resending SMS...
+sms_resend_fail = SMS resend failure.
+sms_stop_sending = Stop Sending
+sms_unread_count = Unread SMS
+sms_delivery_report_1 = SMS is delivered.
+sms_delivery_report_2 = SMS is undelivered.
+sms_delivery_report_3 = Sending SMS...
+sms_report = Delivery Report
+sms_cancel_sending = Cancelling...
+sms_save_draft_success = SMS is saved as a draft
+sms_save_draft_failed = Draft save failed
+sms_to_save_draft = SMS was modified, save it as a draft?
+sms_no_recipient = Your SMS doesn''t have any recipients, and this SMS will be discarded.
+phone_number_invalid = Phone number invalid
+sms_to = To:
+confirm_sms_delete = Delete selected message(s)?
+sms_save_tip = Saving...
+
+#login
+password = Password
+puk = PUK
+login = Login
+logout = Logout
+new_pin = New PIN
+confirm_pin = Confirm New PIN
+puk_locked = Your SIM card is locked permanently. Please contact your operator.
+password_error = Password is incorrect!
+password_error_left = Password is incorrect!<br/>You have {0} attempt(s) left.
+password_error_account_lock = Your account is locked. <br/>Remaining time:
+password_error_five_times = You''ve input 5 times incorrectly. Retry in 5 minutes.
+password_error_account_lock_time = Your account is locked. <br/>Please try later.
+enter_pin = SIM card is locked, please input PIN to unlock.
+enter_puk = SIM card is PIN-locked, please input PUK to unlock.
+last_enter_pin = Final attempt. If incorrect again, your SIM card will be locked!
+last_enter_puk = Final attempt. If incorrect again, your SIM card will be corrupted!
+attempts_left = Attempts Left:
+pin_error = PIN is incorrect!
+puk_error = PUK is incorrect!
+confirm_logout = Do you want to logout?
+
+#advanced password
+password_management = Login Password
+current_password = Current Password
+new_password = New Password
+confirm_password = Confirm New Password
+current_password_error = Current password is incorrect!
+password_note_info = You can change login password on this page.
+password_note_valid = The password can''t be empty and must contain at most 32 characters.
+password_note_input = The password contains 0-9 a-z A-Z ! # $ * + , - . % : = ? @ [ ] ^ _ { | } ~
+password_note_first_change = Please change your initial login password!
+password_note_too_low = Your password complexity is too low (the password could contain uppercase and lowercase letters, numbers, special characters and no less than 8 characters). Do you want to continue?
+
+#advanced pin
+pin = PIN
+current_pin = Current PIN
+pin_management = PIN Management
+pin_status = PIN Status
+modify_pin = Change PIN
+cannot_operate_when_connected = Can''t operate when connecting to network!
+cannot_change_pin_when_connected = Can''t change PIN when connecting to network!
+pin_note_info = Apply PIN security settings in PIN Management to prevent unauthorized use of the SIM, USIM, or UIM card. If you want to change current settings, please disconnect from network first.
+pin_note_operator = If enable PIN, you may need to enter PIN when the device is powered on. If disable PIN, no PIN is required.
+pin_note_modify = You can change PIN when PIN is enabled.
+
+#lan
+lan_setting = LAN Interface Setup
+ip_address = IP Address
+subnet_mask = Subnet Mask
+mac_address = MAC Address
+dhcp_server = DHCP Server
+dhcp_ip_pool = DHCP IP Pool
+dhcp_lease = DHCP Lease Time
+hours = hour(s)
+minutes = minute(s)
+lan_note = Your settings will take effect after restarting your device.
+lan_note_ip_address = IP Address: LAN IP address of the router. You can access page management on device via this IP address.
+lan_note_subnet_mask = Subnet Mask: Subnet mask for IP address.
+lan_note_dhcp_server_enable = DHCP Server Enable: If the Dynamic Host Configuration Protocol (DHCP) service is enabled, the device allocates IP addresses to clients connected to it.
+lan_note_dhcp_server_disable = DHCP Server Disable: If the Dynamic Host Configuration Protocol (DHCP) service is disabled, the device does not allocate IP addresses to clients connected to it and IP addresses must be entered manually from each client.
+lan_note_dhcp_ip_pool = DHCP IP Pool: Starting and Ending IP address specify IP address range which is assigned by DHCP server to access devices. The IP address out of this range cannot be assigned by DHCP server.
+lan_note_dhcp_lease_time = DHCP Lease Time: Lease Time specifies how long a computer can use IP address. If the device will continue to use IP address, it must initiate request again before lease time expires. This IP address will not assign to other device until the old device initiates no request when its lease time expires.
+lan_confirm_reopen = Your settings will take effect after restarting your device. Do you want to continue?<br/><br/><i>Note: Click Yes to submit the request and restart the device. If you choose No, it means that you give up the current operation.</i>
+lan_tip_staticip_notsame = IP Address and static IP address can''t be in the same segment!
+
+#sms_setting
+sms_validity = Validity
+sms_validity_twelve_hours = 12 Hours
+sms_validity_one_day = 1 Day
+sms_validity_one_week = 1 Week
+sms_validity_largest = Maximum
+center_number = Center Number
+delivery_report = Delivery Report
+list = List
+
+#restore
+restore = Reset
+restore_title = Reset Factory Settings
+restore_button = Reset Factory Settings
+restore_confirm = Parameters will be reset to factory defaults, the device will restart. Continue?
+restore_when_connected = Please disconnect from WAN first!
+restoring = Resetting factory settings
+restore_note_info = Click Reset to reset all settings to defaults, and the device will restart automatically.
+
+#wps
+wps_note_all = WPS (Wi-Fi Protected Setup) is a standard that allows users to set up a wireless network in an easy and secure way without specific configuration, such as: SSID, security mode and password.
+wps_note_pin = PIN: You need to enter the PIN that is generated by the access client.
+wps_note_pbc = PBC: You can select the PBC (Push Button Configuration) on the web page or hold the WPS button for 3-4 seconds on the device to enable WPS function.
+wps_note_wait = The device will wait for receiving the access request of wireless access client within 2 minutes.
+wps_pin = PIN
+wps_pbc = PBC
+wps_wifi_off = You can''t operate when Wi-Fi is off!
+wps_auth_open = Current encryption type does not support WPS.
+wps_on_info = WPS is enabled now, please try again later.
+wps_ssid_broadcast_disable = You can''t operate when SSID broadcast is disabled!
+
+#sleep mode
+wifi_sleep = Wi-Fi Sleep
+wifi_sleep_mode = Power saving mode
+sleep_time = Shutdown after
+sleep_select_0 = Sleep
+sleep_select_1 = Power off
+sleep_mode_-1 = Never Sleep
+sleep_mode_5 = 5 Minutes
+sleep_mode_10 = 10 Minutes
+sleep_mode_20 = 20 Minutes
+sleep_mode_30 = 30 Minutes
+sleep_mode_60 = 1 Hour
+sleep_mode_120 = 2 Hours
+wifi_sleep_note_info = Shutdown after: When there''s no Wi-Fi connection in specific time, Wi-Fi will be unavailable, and the system will power off for power-saving.
+wifi_sleep_confirm = The current setting changes may restart Wi-Fi, continue any way?
+
+#system security
+remote_management = Remote Management (via WAN)
+ping_from_wan = Ping From WAN Filter
+
+#portforward
+protocol_TCP&UDP = TCP+UDP
+protocol_TCP = TCP
+protocol_UDP = UDP
+virtual_server_setting = Virtual Server Settings
+port_forward_setting = Port Forwarding Settings
+port_forward_list = Current Virtual Servers in system
+port_forward_note_info = Configure a Port Forward to enable external computers to access WWW, FTP or other services provided by LAN.
+port_forward_note_port = Port Range: Set port numbers to be forwarded.
+port_forward_note_ip_address = IP Address: Set the source IP address which you want to forward.
+port_forward_note_protocol = Protocol: Set the protocol for forwarding.
+port_forward_note_comment = Comment: Type comment for Port Forwarding rule. It contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ .
+port_range = Port Range
+protocol = Protocol
+comment = Comment
+ipExam = (e.g., 192.168.0.101)
+rules_max = The rule number exceeds {0}.
+rule_exist = This rule already exists.
+rule_max_note = The maximum number of rules is 10.
+rule_max_note_v4v6 = The maximum of rules for IPv4 and IPv6 is 10 respectively.
+
+rules_max_v4v6 = The {0} rule number exceeds {1}.
+rule_exist_v4v6 = This {0} rule already exists.
+
+#quick setting
+step_number_1 = 1
+step_number_2 = 2
+step_number_3 = 3
+step_number_4 = 4
+step_number_5 = 5
+step_number_6 = 6
+step_name_1 = 1.Quick Setup
+step_name_2 = 2.PPP Profile Configuration
+step_name_3 = 3.PPP Authentication
+step_name_4 = 4.SSID Configuration
+step_name_5 = 5.Security Configuration
+step_name_6 = Configuration as Follows
+step1_exp1 = The wizard will show you how to set up basic parameters of gateway safely: Click "Previous" & "Next" to navigate, and click "Apply" to save settings.For advanced parameters, set them in other menu.
+step1_exp2 = Set basic parameters in this wizard. For advanced parameters, set them in other menu.
+apn_settings = APN Settings
+step2_auto_apn_explain = If you select Auto APN, the second step, i.e., PPP Authentication, will be skipped.
+step2_profile_name_explain = Profile Name: The default profile that you use currently.
+ppp_authentication = PPP Authentication
+step3_authentication_apn_explain1 = Authentication: It is provided by your Internet Service Provider (ISP). Password Authentication Protocol (PAP) provides a simple method without encryption for the peer to establish its identity using a 2-way handshake. Challenge-Handshake Authentication Protocol (CHAP) is used to periodically verify the identity of the peer using a 3-way handshake.
+step3_authentication_apn_explain2 = User Name: It is used to obtain authentication from the ISP when connection is established.
+step3_authentication_apn_explain3 = Password: It is used to obtain authentication from the ISP when connection is established.
+step3_username_password_explain = Click "Set as default" to set this profile as the default profile.
+ssid_title = SSID
+ssid_name = Network Name(SSID)
+ssid_broadcast = SSID Broadcast
+step4_ssid_explain = Network Name: Service Set Identifier (SSID). Enter name of your wireless local area network (WLAN), which is less than 32 characters.
+step4_ssid_broadcast_explain1 = SSID Broadcast: Disable or Enable (Default) this function. Once enabled, the router will broadcast SSID, and other devices can discover and connect to it.
+step4_ssid_broadcast_explain2 = Disable: The gateway disables broadcasting and hides the name of your network.
+step5_encryption_mode_info = Security Mode:
+step5_encryption_mode_explain1 = OPEN: Authentication and encryption won''t be performed. There are risks that private information may be intercepted, or network may be used by unauthorized individuals. This encryption scheme isn''t recommended.
+step5_encryption_mode_explain2 = WPA2(AES)-PSK: It is the secure version of WPA with implementation of the 802.11i standard.
+step5_encryption_mode_explain3 = WPA-PSK/WPA2-PSK: WPA Pre-Shared Key (WPA-PSK). WPA2-PSK is the secure version of WPA with implementation of the 802.11i standard.
+step5_encryption_mode_explain4 = Pass Phrase: The pass-phrase contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~
+step6_apply_explain = You need to reconnect wireless network when committing.
+quick_setting_wifi_disable_confirm = 1. Wi-Fi is off, the settings for Wi-Fi won''t take effect.<br\>Continue?
+quick_setting_param_changed_confirm = 1. Connected Wi-Fi devices probably need to reconnect when Wi-Fi configuration changes.<br\>Continue?
+#SD Card
+sdcard = SD Card
+httpshare = HTTP Share
+sd_card_mode = Mode
+sd_card_share_setting = Share Setting
+sd_card_share_usb_mode = USB
+sd_card_share_http_share_mode = HTTP SHARE
+http_title = HTTP Share Settings
+sd_card_status = Status
+sd_card_file_to_share = File to Share
+sd_card_access_type = Access Type
+sd_card_path_to_share = Path to Share
+sd_card_entire_sd_card = Entire SD Card
+sd_card_custom_setting = Custom
+sd_card_read_write = Read/Write
+sd_card_readonly = Read Only
+sd_card_share_setting_no_sdcard = No SD Card!
+sd_card_share_setting_exist = The folder/file already exists!
+sd_card_share_setting_noexist = The folder/file does not exist!
+sd_card_status_info_0 = No SD Card!
+sd_card_status_info_1 = SD Card already exists and can be used now
+sd_card_status_info_2 = SD Card already exists, but it is invalid now! Please retry in 5 minutes. If still invalid, please check SD Card!
+sd_card_status_info_2_reason = Possible reasons are as follows
+sd_card_status_info_2_reason_1 = SD card is of NTFS format, please switch to USB mass storage.
+sd_card_status_info_2_reason_2 = SD card is loading, please retry in 5 minutes. If still invalid, please check SD card.
+sd_card_invalid_chars_cant_download = The file name contains invalid characters and can not be downloaded! (< > " '' & + / \\ : * | # ? ~ ` are invalid characters)
+note_not_support_fs_ntfs = In HTTP Share Mode, the device only supports FAT/FAT32 file system!
+note_web_share_mode = HTTP Share Mode: Share SD card via web browser. The removable drive mapping of SD card via USB port will be disabled.
+note_usb_access = USB Access Only: By the removable drive mapping, user can access SD card via USB cable only. The web page of sharing SD card will be disabled.
+note_http_share_usb_access = USB Access Only: By the removable drive mapping, user can access SD card via USB cable only. The web page of sharing SD card will be disabled.
+note_http_share_cannot_access = You can''t access this page!
+note_path_to_share_example = Path to Share: You can input the sharing path, such as /Picture. By typing only a slash in Path to Share filed, you agree to share entire SD card.
+note_upload_not_refresh = When you''re in process of downloading or uploading the file, please don''t refresh the page!
+note_upload_single_file_2g = The single file upload can not be above 2G.
+note_upload_filelenth_25 = The name of the file / folder name modification function supports 25 characters at most.
+note_uploading_not_refresh = Uploading, please don''t refresh the page!
+note_invalid_file_path = Path to Share can''t be a dot, and can''t contain following characters: < > " '' & + / \\ : * | # ? ~ `
+browse_btn = Browse
+change_btn = Change
+no_file_selected = No file selected...
+sd_no_file_selected = Please select a file
+sd_name = Name
+sd_path = Path:
+sd_rename = Rename
+sd_download = Download
+sd_file_size = File Size
+sd_update_time = Updated Time
+no_sdcard = No SD Card!
+no_exist = The file is not exist!
+sd_card_folder_name_is_null = Please enter a name
+get_file_list_failure = Get file list failed
+create_folder_failure = Create folder failed
+delete_folder_failure = Delete folder/file failed
+sd_card_path_too_long = File path too long.
+sd_file_size_too_big = The file is too large. The single file upload can not be above 2G.
+sd_file_name_invalid = File name containing * is not supported. Please update the file name.
+back_to_login = Back to Login
+sd_config_changed_reload = The settings for SD card share are changed, and the page will reload.
+sd_upload_space_not_enough = The space is not enough!
+sd_upload_data_lost = Upload failed, please retry.
+sd_upload_file_is_downloading = File is downloading, try later!
+sd_share_path_is_invalid = Path to Share is invalid, please set the share path
+sd_share_path_cant_rename = The folder was shared and cannot be renamed.
+sd_share_path_cant_delete = The folder "{0}" was shared and cannot be deleted.
+sd_share_path_invalid = The shared path does not exist.
+sd_file_processing_cant_delete = File is being used, cannot be deleted.
+sd_file_processing_cant_rename = File is being used, cannot be renamed.
+sd_not_support = The card format don''t support or other reasons, please re-insert or replace SD card.
+sd_usb_forbidden = The card is busy now, cannot be changed.
+sd_upload_rename = The file already exists! Please change the file name and select "yes" to continue. Select "no" will cancel the upload.
+sd_upload_rename_null = Can''t be empty or more than 25 characters!
+
+#port filter
+filter_basic_setting = Basic Settings
+port_filter_enabled = MAC/IP/Port Filtering
+default_policy = Default Policy
+default_policy_note = You can set firewall policies to protect your network from viruses, worms and malicious activities on the Internet.
+default_policy_note_filter = Only when filtering is enabled, the filter policy is available.
+accepted = Accepted
+dropped = Dropped
+port_filter_setting = MAC/IP/Port Filtering Settings
+mac_address = MAC Address
+macExam = (e.g., 00:1E:90:FF:FF:FF)
+dest_ip_address = Dest. IP Address
+source_ip_address = Source IP Address
+port_filter_action = Action
+filter_accept = Accept
+filter_drop = Drop
+protocol_None = ALL
+protocol_ICMP = ICMP
+port_filter_list = Current MAC/IP/Port Filtering Rules in System
+dest_port_range = Dest. Port Range
+source_port_range = Source Port Range
+filter_accept_note = Others would be accepted.
+filter_drop_note = Others would be dropped.
+filter_optional = Please input any IP, MAC or/and port value
+mac_check = Invalid MAC address
+filter_ip_setting = IP Settings
+filter_ipv4 = IPv4
+filter_ipv6 = IPv6
+ip_type = IP Type
+source_ipv6_address = Source IPv6 Address
+dest_ipv6_address = Dest. IPv6 Address
+port_filter_note_mac_address = MAC Address: Set MAC address to be filtered.
+port_filter_note_source_ip_address = Source IP Address: Set source IP address to be filtered.
+port_filter_note_dest_ip_address = Dest IP Address: Set dest IP address to be filtered.
+port_filter_note_protocol = Protocol: Set protocol to be used for filtering.
+port_filter_note_source_port_range = Source Port Range: Set source port numbers to be filtered.
+port_filter_note_dest_port_range = Dest Port Range: Set dest port numbers to be filtered.
+port_filter_note_action = Action: Set to handle the packet if it matches with the rule.
+port_filter_note_comment = Comment: Enter comment for filter settings. It contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ .
+port_filter_note_info = The filter policies are matched one by one with the rules. And if met this provision, it won''t continue to match the rules listed below.
+confirm_data_effect = Your settings may not take effect immediately. If you need to fully take effect, proposed restart the device. Continue?
+
+#wifi_range
+wifi_range_settings = Wi-Fi Performance Settings
+wifi_range = Wi-Fi Coverage
+wifi_short_mode = Short Wi-Fi Coverage - Best battery life
+wifi_medium_mode = Medium Wi-Fi Coverage
+wifi_long_mode = Long Wi-Fi Coverage
+wifi_des_short_mode = Short Wi-Fi Coverage
+wifi_des_medium_mode = Medium Wi-Fi Coverage
+wifi_des_long_mode = Long Wi-Fi Coverage
+wifi_range_note_range = Wi-Fi Coverage:
+wifi_range_note_short = Short Wi-Fi Coverage: Coverage and launch small power consumption, it is the best battery life.
+wifi_range_note_medium = Medium Wi-Fi Coverage: Coverage and emission power consumption is half of equipment support ability, normal power consume.
+wifi_range_note_long = Long Wi-Fi Coverage: Maximum emission power and coverage, if the terminal device still connect to your Wi-Fi network, which will decrease battery life.
+wifi_range_note_short_cpe = Short Wi-Fi Coverage: Minimum power consumption and coverage.
+wifi_range_note_medium_cpe = Medium Wi-Fi Coverage: 50% of device power consumption and coverage.
+wifi_range_note_long_cpe = Long Wi-Fi Coverage: Maximum power consumption and coverage.
+
+#upnp
+upnp = UPnP
+upnp_setting = UPnP Settings
+upnp_note_info = Universal Plug and Play (UPnP) is a set of networking protocols that allows networked devices, such as PC, printers, Internet gateways, Wi-Fi access points and mobile devices, to seamlessly discover each other''s presence on the network and establish functional network services for data sharing, communications, and entertainment.
+
+#dmz
+dmz = DMZ
+dmz_setting = DMZ Settings
+dmz_note_info = If a terminal device can''t run network applications via this device, please enter IP address of the terminal device in the entry box when DMZ is enabled.
+dmz_note_function = You can configure DMZ address, enable or disable DMZ on this page.
+
+#Device Information
+max_access_num = Max Access Number
+lan_domain = LAN Domain
+sim_serial_number = SIM Card Number
+software_version = Software Version
+firmware_version = Firmware Version
+hardware_version = Hardware Version
+imei = IMEI
+imsi = IMSI
+iccid = ICCID
+wan_ip_address = WAN IP Address
+ipv6_wan_ip_address = WAN IPv6 Address
+network_name_ssid1 = Network Name (Main SSID)
+pass_phrase_ssid1 = Pass Phrase (Main SSID)
+max_access_num_ssid1 = Max Access Number (Main SSID)
+network_name_ssid2 = Network Name (Guest SSID)
+pass_phrase_ssid2 = Pass Phrase (Guest SSID)
+max_access_num_ssid2 = Max Access Number (Guest SSID)
+
+#port map
+port_map = Port Mapping
+port_map_basic = Basic Settings
+port_map_setting = Port Mapping Settings
+source_port = Src. Port
+dest_port = Dest. Port
+port_map_list = Current Port Mapping Rules in System
+port_map_note_info = Configure a Port Mapping to enable external computers to access WWW, FTP or other services provided by LAN.
+port_map_note_port = Src. Port/Dest Port: The port of the computer that provides services.
+port_map_note_dest_ip_address = Dest. IP Address: Specify a computer located at LAN to provide services.
+port_map_note_protocol = Protocol: Protocols applied by services.
+port_map_note_comment = Comment: Type comment for Port Mapping rule. It contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ .
+
+#USSD Info
+USSD = USSD
+ussd = USSD
+ussd_send_to = Send to
+ussd_send = Send
+ussd_cancel = Cancel
+ussd_reply_to = Reply to
+ussd_reply = Reply
+ussd_contents = Contents
+ussd_timeout = Network Timeout!
+ussd_operation_timeout = Operation Timeout!
+ussd_no_service = No Network Service!
+ussd_retry = Operation Failed! Please Retry!
+ussd_unsupport = USSD is unsupported!
+ussd_info_error = Get Information Error!
+ussd_fail = Operation Failed!
+ussd_error_input = Error Input!
+ussd_note1 = You can send a command to the network (have predefined numbers or symbols), the network will be based on the instruction for you to provide the corresponding services.
+
+#dlna setting
+dlna_setting = DLNA Settings
+dlna_language = Language
+dlna_language_chinese = Chinese
+dlna_language_english = English
+dlna_device_name = Device Name
+dlna_media_type = Shared Media Type
+dlna_media_info = Share Settings
+dlna_audio = Music
+dlna_image = Image
+dlna_video = Video
+dlna_rescan = Rescan
+dlna_note_info = You can set Digital Living Network Alliance(DLNA) when SD card is available or HTTP Share Mode is enabled.
+dlna_note_httpshare = You can set Digital Media Server (DMS) language, device name, and media type which you want to share on this page.
+dlna_note_rescan = In order to allow DLNA multimedia database to be synchronized with SD card, please rescan.
+
+#nosimcard
+no_sim_card_title = System Information
+no_sim_card_message = No SIM Card or SIM Card invalid!
+
+#network_locked
+network_locked = SIM Lock!
+network_locked_explain = This device is network locked. Please contact your service provider to get unlock code.
+network_locked_times_explain = Attempts left for unlock code input:
+network_locked_enter_explain = Please input unlock code:
+network_locked_zero_times = This device is network locked. Please contact your service provider.
+
+#update_info
+update_info = Update Information
+update_no_info = Software is up to date
+update_new_version_found = New version available
+update_current_version = Current Version
+update_new_version = New Version
+update_link_prompt = Click the following links to download update tools.
+update_skip_btn = Apply
+update_id_skip_info = If you don''t want to update, please click "Skip".
+update_remind = Remind me when new version found.
+update_management = Update Management
+update_log = Bug Fixed
+update_note = Note
+update_notice = New version found. For more details, please goto Settings->Device Settings->Update management
+update_note_info = Click the link to download update tool.
+update_note_install = Extract update tool and then run it to start updating.
+update_note_linux = Can''t upgrade online in Linux. Please upgrade in Windows or on a Mac.
+update_status = Status
+update_settings = Update
+wifi_connect_alert = You can only update by connecting the ethernet cable.
+
+#AP_Station
+ap_station = Internet Wi-Fi
+ap_station_switch = Internet Wi-Fi Switch
+ap_station_wlan_mode = Preferred Network
+ap_station_wifi_prior = Wi-Fi
+ap_station_3g_prior = WWAN
+ap_station_current_status = Current Status
+ap_station_wlan_connected = Wi-Fi connected
+ap_station_wan_connected = WAN connected
+ap_station_no_connection = No connection
+ap_station_hotspot_list = Wi-Fi Hotspot
+ap_station_connect = Connect
+ap_station_disconnect = Disconnect
+ap_station_add_hotspot = Add Wi-Fi Hotspot
+ap_station_edit_hotspot = Edit Wi-Fi Hotspot
+ap_station_show_password = Display Password
+ap_station_encrypt_type = Encryption Type
+ap_station_wep_keys = WEP Keys
+ap_station_encrypt_type_none = NO ENCRYPTION
+ap_station_encrypt_type_wep = WEP
+ap_station_wep_key_type_ascii = ASCII
+ap_station_wep_key_type_hex = HEX
+ap_station_cipher = WPA Algorithms
+ap_station_cipher_TKIP = TKIP
+ap_station_cipher_AES = AES
+ap_station_cipher_AUTO = AUTO
+ap_station_security_mode_OPEN = OPEN
+ap_station_security_mode_WPAPSKWPA2PSK = WPA-PSK/WPA2-PSK
+ap_station_security_mode_SHARED = SHARED
+ap_station_security_mode_WPAPSK = WPA-PSK
+ap_station_security_mode_WPA2PSK = WPA2-PSK
+ap_station_security_mode_EAPAKASIM = EAP-AKA/SIM
+ap_station_security_mode_EAP-SIM/AKA = EAP-SIM/AKA
+ap_station_security_mode_WPA3Personal = WPA3-Personal
+ap_station_security_mode_WPA2WPA3 = WPA2(AES)/WPA3-Personal
+ap_station_wep_default_key = Default Key
+ap_station_wep_key = Key
+ap_station_wep_key_0 = Key 1
+ap_station_wep_key_1 = Key 2
+ap_station_wep_key_2 = Key 3
+ap_station_wep_key_3 = Key 4
+ap_station_exceed_list_max = The max number of AP is {0}!
+ap_station_search_hotspot_fail = Search hotspot failure!
+ap_station_connect_change_alert = Will disconnect from WAN. Continue?
+ap_station_update_fail = Operate failed. The hotspot is in connection.
+ap_station_enable_confirm = Multi SSID cannot be used when Internet Wi-Fi is being used. Multi SSID is automatically turned OFF if Internet Wi-Fi is ON. Still change settings?
+ap_station_processing = Background busy, please try again.
+ap_station_exist = Hot spots of the same name already exist.
+ap_connect_error = Failed to connect {0}!
+
+#fastboot
+fastboot = Fast Boot
+fastboot_setting = Fast Boot Settings
+fastboot_note = If enable Fast Boot function, your device will start in a short time.
+
+#notes
+wifi_channel_bandwidth = Channel Bandwidth
+
+home_note = The table shows the information of connected wireless device(s).
+
+sms_setting_note_validity = Validity: Set valid period of outgoing messages.
+sms_setting_note_center_number = Center Number: Enter SMS center number. For more information, please contact your service provider.
+sms_setting_note_delivery_report = Delivery Report: Receive or reject a prompt informing you that the message is delivered to the recipient.
+
+apn_note_whole_page = You can set the Access Point Name(APN) on this page.
+apn_note_mode = Mode: If a fixed APN is provided by your service provider, select Manual APN. Otherwise, please select Auto APN, and the device will automatically obtain parameters.
+apn_note_profile = Profile: It contains one or more profile names.
+apn_note_pdp_type = PDP Type: IPv4/IPv6/IPv4&IPv6.
+apn_note_profile_name = Profile Name: It refers to the name that you assign to the new profile.
+apn_note_apn = APN: Access Point Name. The APN contains 0-9 a-z A-Z . - and it can''t start with and end with .or -.
+apn_note_dns_mode = DNS Mode: If a fixed IP address is provided by your service provider, select Manual DNS. Otherwise, please select Auto DNS, and the device will automatically obtain parameters.
+apn_note_authentication = Authentication: It is provided by your Internet Service Provider(ISP).Password Authentication Protocol (PAP) provides a simple method without encryption for the peer to establish its identity using a 2-way handshake. Challenge-Handshake Authentication Protocol (CHAP) is used to periodically verify the identity of the peer using a 3-way handshake.
+apn_note_username = User Name: User name is used to obtain authentication from the ISP when the connection is established.
+apn_note_password = Password: Password is used to obtain authentication from the ISP when the connection is established.
+apn_note_set_default = Click "Set as default" to set this profile as the default profile.
+
+wifi_basic_note_multi_ssid_switch = Multi SSID Switch: 2 SSID can be used at the same time.
+wifi_basic_note_network_name = Network Name(SSID): SSID can be understood as network name. When change the SSID, please enter a string less than 32 characters as the name for your Wi-Fi. The string contains numbers, letters (a-z, A-Z), special characters (!#()+-./%=?@^_{|}~) and space, and it can''t start and end with space.
+wifi_basic_note_network_name_input = The network name contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ and space, and it can''t start and end with space.
+wifi_basic_note_broadcast = SSID Broadcast: If enable this function, the device will broadcast SSID. Other wireless devices will discover and connect to this device.
+wifi_basic_note_security_mode = Security Mode:
+wifi_basic_note_no_encryption = OPEN: Unencrypted mode. There are risks that network will be used by unauthorized individuals. This encryption mode isn't recommended.
+wifi_basic_note_shared = SHARED(WEP): Link authentication mode is shared key authentication, the encryption method is WEP.
+wifi_basic_note_wpa_psk_aes = WPA2(AES)-PSK: It is the secure version of WPA with implementation of the 802.11i standard.
+wifi_basic_note_wpa_psk = WPA-PSK/WPA2-PSK: WPA Pre-Shared Key (WPA-PSK). WPA2-PSK is the secure version of WPA with implementation of the 802.11i standard.
+wifi_basic_note_wpa3 = WPA3-Personal: It is the successor to WPA2.
+wifi_basic_note_wpa2_wpa3 = WPA2(AES)/WPA3-Personal: WPA2-PSK is the secure version of WPA with implementation of the 802.11i standard. WAP3 is the successor to WPA2.
+wifi_basic_note_pass_phrase = Pass Phrase: The pass-phrase contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~
+wifi_basic_note_max_station_number1 = Max Station Number: You can select the maximum number of wireless terminals which can connect to the device.The Wi-Fi Hotspot connected by Internet Wi-Fi is also calculated.
+wifi_basic_note_max_station_number = Max Station Number: You can select the maximum number of wireless terminals which can connect to the device.
+
+wifi_advanced_note_whole_page = You can set Wi-Fi advanced characters on this page.
+wifi_advanced_note_band_selection = Band Selection: You can select the suitable band for your device.
+wifi_advanced_note_network_mode = Network Mode: Select the suitable Wi-Fi network mode, the device Wi-Fi performance will be improved.
+wifi_advanced_note_country_code = Country/Region Code: You can select the suitable Country/Region Code for your device.
+wifi_advanced_note_frequency = Frequency (Channel): Select appropriate channel to optimize the performance and coverage of your wireless network.
+
+ap_station_note_info = Please make sure that the IP address of Wi-Fi hotspot you''ve connected isn''t in the range of this device IP address, or you won''t have access to Internet via the Wi-Fi hotspot.
+ap_station_note_disable_info = If enable multi-SSID, Internet Wi-Fi will be disabled.
+ap_station_on_info = You can''t operate when Wi-Fi is enabled!
+
+wif_filter_note1 = Set MAC address filtering mode in the WLAN MAC Filter drop-down list box.
+wif_filter_note2 = Ruleless:Disable the WLAN MAC fliter.
+wif_filter_note3 = White List:Allow a client to connect to the device using the WLAN if the client's MAC address exists in the MAC Address list.
+wif_filter_note4 = Black List:Deny a client's connection to the device using the WLAN if the client's MAC address exists in the MAC Address list.
+
+#restart
+restart = Restart
+restart_button = Restart Device
+restart_confirm = Restart the device?
+restarting = Restarting Device
+
+#diconneted_operate_note
+diconneted_operate_note = To change current setting, please disconnect from network.
+diconneted_network_confirm = This operation may disconnect from network, continue any way?
+
+#ota_update
+ota_update = Update Management
+ota_title = Update
+ota_no_new_version = No new version found.
+ota_new_version = Found new version. Do you want to update?
+ota_connect_server = Connecting to server
+ota_connect_server_successfully = Connected to server successfully
+ota_downloading = Downloading...
+ota_download_failed = Download failed
+ota_no_network = No network
+ota_network_disconnected = Please connect to network before updating!
+ota_interrupted_alert = Found new version. Please login to update!
+ota_interrupted = Resume the downloading task which was interrupted before?
+ota_download_success = Download completed, and the device will restart. Please wait. Please do not power off, or reset factory settings, or turn off the device during the update.
+ota_pkg_download_success = Upgrade package has been downloaded already, and the device will restart. Please wait. Please do not power off, or reset factory settings, or turn off the device during the update.
+ota_update_success = Updated successfully!
+ota_update_failed = Update failed.
+ota_connect_server_failed = Unable to connect to server.
+ota_download_warning = Make sure there''s enough battery; Don''t force stop during download process.
+ota_update_warning = Attention: Don''t force stop during update process.
+ota_cancel = Update has been cancelled!
+ota_pkg_exceed = The update package is too large!
+ota_have_cancel = You have already cancelled!
+ota_roamming = The Roaming Setting is disabled. To enable it, please click in the checkbox on this page.
+ota_low_battery = Download completed and battery is low, please charge before update!
+ota_pkg_low_battery = Upgrade package has been downloaded already,and battery is low, please charge before update!
+ota_md5_error = Check update package failed.
+ota_version = Version:
+ota_update_setting = Auto Check Settings
+ota_auto_update_switch = Auto-check New Version
+ota_update_interval_day = Auto-check Cycle
+ota_roaming_setting = Roaming Settings
+ota_update_roaming_remind = Check this option, the device will update when roaming, which will incur roaming charges.
+ota_update_manual = Check New Version
+ota_check_new_version = Check
+ota_check_new_version_desc = Click Check button for checking new version immediately.
+ota_check_roaming_confirm = You are on roaming! Would you like to continue?
+ota_update_every_day = Every day
+ota_update_15_day = 15 days
+ota_update_30_day = 30 days
+ota_new_version_checking = Checking new version...
+ota_update_running = Checking is ongoing...
+ota_check_fail = Check new version failed!
+ota_manual_upgrade_url = Upgrade File Download Address
+wefota_check_new_version = Check New Version And Upgrade
+fota_package_downloading = A new version has been detected and is currently being downloaded. The upgrade will begin after the download is complete. Please do not power off, reset to factory settings, or shut down
+fota_package_no_new_version = No new version detected
+fota_package_already_download = Upgrade package has been downloaded,after waiting for equipment to restart to complete.
+software_upload = Software Upload
+local_upload = Local Upgrade
+upload_update_success = The upgrade file upload successful and will be about to restart,do not power off.
+upload_update_failed0 = parse file failed.
+upload_update_failed1 = verify file failed.
+upload_update_failed2 = write file failed.
+upload_update_failed3 = write update flag failed.
+upload_update_failed4 = verify flash failed.
+error_file_selected = please choose right files.
+upload_tip = Should not close,refresh or open more webui,when uploading until restart.
+########CPE more wording##############
+opmode = Change Mode
+wds = WDS
+url_filter = URL Filtering
+
+voip_settings = VoIP Settings
+voip_basic_settings = Basic Settings
+voip_user_details = User Details
+voip_advanced_settings = Advanced Settings
+voip_supplementary_service = Supplementary Service
+
+url_check = invalid URL
+url_filter_check = invalid url filter format
+sntp_invalid_server_name = Invalid URL format or invalid ip address
+server_alreay_exist = This server is already exist
+forwarding_uri_check = Invalid Value
+
+wifi_switch = Wi-Fi Switch
+ap_isolation = AP Isolation
+#mac filter
+black_list = Black List
+black_list_switch = Black List Switch
+block = Block
+black_list_max = The max number of black list is 10!
+mac_repeat_tip = Please delete the repeated MAC addresses!
+black_yourself_tip = You can''t block yourself!
+wifi_status11 = Number of users:11
+wifi_status12 = Number of users:12
+wifi_status13 = Number of users:13
+wifi_status14 = Number of users:14
+wifi_status15 = Number of users:15
+wifi_status16 = Number of users:16
+wifi_status17 = Number of users:17
+wifi_status18 = Number of users:18
+wifi_status19 = Number of users:19
+wifi_status20 = Number of users:20
+wifi_status21 = Number of users:21
+wifi_status22 = Number of users:22
+wifi_status23 = Number of users:23
+wifi_status24 = Number of users:24
+wifi_status25 = Number of users:25
+wifi_status26 = Number of users:26
+wifi_status27 = Number of users:27
+wifi_status28 = Number of users:28
+wifi_status29 = Number of users:29
+wifi_status30 = Number of users:30
+wifi_status31 = Number of users:31
+wifi_status32 = Number of users:32
+
+auto_connect = Auto Connect
+manual_connect = Manual Connect
+
+default_Gateway = Default Gateway
+primary_dns = Primary DNS Server
+secondary_dns = Secondary DNS Server
+gateway_check = Please input a valid gateway
+
+mac_filter_lable = MAC Filter Format
+
+wlan_mac_filter_0 = Ruleless
+wlan_mac_filter_1 = White List
+wlan_mac_filter_2 = Black List
+
+#SNTP
+local_current_time = Current Local Time
+time_set_mode = Time Set Mode
+time_set_time_manual = Manual Set Time
+time_set_time_auto = Sntp auto Synchronization
+year = Year
+month = Month
+date = Date
+hour = Hour
+minute = Minute
+second = Second
+sunday = Sunday
+monday = Monday
+tuesday = Tuesday
+wednesday = Wednesday
+thursday = Thursday
+friday = Friday
+saturday = Saturday
+stnp_server1 = SNTP Server1
+stnp_server2 = SNTP Server2
+stnp_server3 = SNTP Server3
+time_zone = Time Zone
+daylight_saving_time = Daylight Saving Time
+daylightsave_0 = Disable
+daylightsave_1 = Enable
+sntp_syn_time_wan_connected = SNTP time synchronization can be used after networking!
+operation_not_supported = operation not supported!
+network_terminated = USSD terminated by network
+upgrade_file_nomatch = You do not select the root_uImage or modem.zip!
+upgrade_confirm = Do you really want to upgrade the Image?
+upgrading = Upgrading, please wait....
+upgrading_alert = Upgrading, please don''t cut off your power supply. After upgrade, it will restart automaticly!
+upgrad_note = Please select the version you want to upgrade, then click the ''Apply'' button to start upgrade.
+sntp_processing = Synchronizing, please wait....
+sntp_req_success = The SNTP request has been sent!
+time_zone_<-12>12_0 = (GMT-12:00) Dateline West
+time_zone_SST11_0 = (GMT-11:00) Midway Islands, Samoa
+time_zone_<-10>10_0 = (GMT-10:00) Hawaii
+time_zone_<-09>9_0 = (GMT-09:00) Alaska
+time_zone_PST8PDT,M3.2.0,M11.1.0_0 = (GMT-08:00) Pacific time (USA and Canada), Tijuana
+time_zone_<-07>7_0 = (GMT-07:00) Mountain time (USA and Canada)
+time_zone_<-07>7_1 = (GMT-07:00) Arizona
+time_zone_MST7MDT,M4.1.0,M10.5.0_2 = (GMT-07:00) Chihuahua, La Paz, Mazza Tran
+time_zone_<-06>6_0 = (GMT-06:00) Saskatchewan
+time_zone_<-06>6_1 = (GMT-06:00) Central time (USA and Canada)
+time_zone_<-06>6_2 = (GMT-06:00) Central America
+time_zone_<-06>6_3 = (GMT-06:00) Guadalajara City, Mexico City, Monterey
+time_zone_<-05>5_0 = (GMT-05:00) Bogota, Lima, Quito
+time_zone_<-05>5_1 = (GMT-05:00) Eastern time (USA and Canada)
+time_zone_EST5EDT,M3.2.0,M11.1.0_2 = (GMT-05:00) Indiana (East)
+#time_zone_-4.5 = (GMT-04:30)
+time_zone_AST4ADT,M3.2.0,M11.1.0_0 = (GMT-04:00) Atlantic time (Canada)
+time_zone_<-04>4_1 = (GMT-04:00) Caracas, La Paz
+time_zone_<-04>4<-03>,M8.2.6/24,M5.2.6/24_2 = (GMT-04:00) Santiago
+time_zone_NST3:30NDT,M3.2.0,M11.1.0_0 = (GMT-03:30) Newfoundland
+time_zone_<-03>3_0 = (GMT-03:00) Brasilia
+time_zone_<-03>3_1 = (GMT-03:00) Buenos Aires, Georgetown
+time_zone_<-03>3_2 = (GMT-03:00) Greenland
+time_zone_<-02>2_0 = (GMT-02:00) Mid-Atlantic
+time_zone_<-01>1_0 = (GMT-01:00) Cape Verde Islands
+time_zone_<-01>1<+00>,M3.5.0/0,M10.5.0/1_1 = (GMT-01:00) Azores
+time_zone_GMT0IST,M3.5.0/1,M10.5.0_0 = (GMT) GMT: Dublin, Edinburgh, London, Lisbon
+time_zone_WET0WEST,M3.5.0,M10.5.0/3_1 = (GMT) Casablanca, Monrovia
+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_0 = (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_1 = (GMT+01:00) Belgrad, Bratislava, Budapest, Ljubljana, Prague
+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_2 = (GMT+01:00) Brussels, Copenhagen, Madrid, Paris
+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_3 = (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb
+time_zone_<+01>-1_4 = (GMT+01:00) Western Central African
+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_0 = (GMT+02:00) Bucharest
+time_zone_CAT-2_1 = (GMT+02:00) Pretoria, Harare
+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_2 = (GMT+02:00) Helsinki, Kiev, Riga, Sofia, Tallinn, Vilnius
+time_zone_EET-2_3 = (GMT+02:00) Cairo
+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_4 = (GMT+02:00) Athens, Beirut, Istanbul, Minsk
+time_zone_IST-2IDT,M3.4.5/02:00:00,M10.5.0/02:00:00_5 = (GMT+02:00) Jerusalem
+time_zone_<+03>-3_0 = (GMT+03:00) Baghdad
+time_zone_<+03>-3_1 = (GMT+03:00) Riyadh, Kuwait
+time_zone_<+03>-3_2 = (GMT+03:00) Moscow, St Petersburg, Volgograd
+time_zone_EAT-3_3 = (GMT+03:00) Nairobi
+time_zone_<+0330>-3:30<+0430>,J80/0,J264/0_0 = (GMT+03:30) Teheran
+time_zone_<+04>-4_0 = (GMT+04:00) Abu Zabi, Muscat
+time_zone_<+04>-4_1 = (GMT+04:00) Baku, Tbilisi, Yerevan
+time_zone_<+0430>-4:30_0 = (GMT+04:30) Kabul
+time_zone_<+05>-5_0 = (GMT+05:00) Yekaterinburg
+time_zone_PKT-5_1 = (GMT+05:00) Islamabad, Karachi, Tashkent
+time_zone_<+0530>-5:30_0 = (GMT+05:30) Madras, Calcutta, Mumbai, New Delhi
+time_zone_<+0545>-5:45_0 = (GMT+05:45) Kathmandu
+time_zone_<+06>-6_0 = (GMT+06:00) Ala Mutu, Novosibirsk
+time_zone_<+06>-6_1 = (GMT+06:00) Dhaka, Astana
+time_zone_<+06>-6_2 = (GMT+06:00) Sri Haya Ed Denny Pla
+time_zone_<+0630>-6:30_0 = (GMT+06:30) Yangon
+time_zone_<+07>-7_0 = (GMT+07:00) Krasnoyarsk
+time_zone_<+07>-7_1 = (GMT+07:00) Bangkok, Hanoi, Jakarta
+time_zone_CST-8_0 = (GMT+08:00) Beijing, Chongqing, Hongkong Special Administrative Region, Urumqi
+time_zone_<+08>-8_1 = (GMT+08:00) Kuala Lumpur, Singapore
+time_zone_AWST-8_2 = (GMT+08:00) Perth
+time_zone_CST-8_3 = (GMT+08:00) Taipei
+time_zone_<+08>-8_4 = (GMT+08:00) Irkutsk, Ulam Batu
+time_zone_JST-9_0 = (GMT+09:00) Osaka, Sapporo, Tokyo
+time_zone_KST-9_1 = (GMT+09:00) Seoul
+time_zone_<+09>-9_2 = (GMT+09:00) Yakutsk
+time_zone_ACST-9:30ACDT,M10.1.0,M4.1.0/3_0 = (GMT+09:30) Adelaide
+time_zone_ACST-9:30_1 = (GMT+09:30) Darwin
+time_zone_AEST-10_0 = (GMT+10:00) Brisbane
+time_zone_<+10>-10_1 = (GMT+10:00) Vladivostok
+time_zone_<+10>-10_2 = (GMT+10:00) Guam, Port Moresby
+time_zone_AEST-10AEDT,M10.1.0,M4.1.0/3_3 = (GMT+10:00) Hobart
+time_zone_AEST-10AEDT,M10.1.0,M4.1.0/3_4 = (GMT+10:00) Canberra, Melbourne, Sydney
+time_zone_<+11>-11_0 = (GMT+11:00) Magadan, Solomon islands, New Caledonia
+time_zone_<+12>-12_0 = (GMT+12:00) Wellington, Oakland
+time_zone_<+12>-12_1 = (GMT+12:00) Fiji, Kamchatka, Marshall Islands
+time_zone_<+13>-13_0 = (GMT+13:00) Nukualofa
+
+#operation mode
+opmode_auto = Automatic
+opmode_bridge = Bridge Mode
+opmode_cable = Cable Broadband Mode
+opmode_gateway = Wireless Broadband Mode
+EthPort_Status = Ethernet Port Status
+change_mode = Change Mode
+current_mode = Current Mode:
+change = Change
+change_mode_alert = Cable Broadband mode can only use Wi-Fi to access, please remember Wi-Fi SSID and password! Continue?
+opmode_msg1 = If wireless broadband mode is enabled, please remove network cable of public network.
+opmode_msg2 = The device will be restarted when operation mode is changed.
+opmode_msg3 = The network cable of public network has been removed.
+#pppoe dial
+pppoe_mode = PPPoE
+pppoe_success = PPPoE dial successfully
+pppoe_fail = PPPoE dial failed
+pppoe_processing = PPPoE dialing
+static_success = Successfully set static IP
+static_fail = Set static IP failed
+static_processing = Setting static IP
+dyn_success = Successfully obtained dynamic IP
+dyn_fail = Obtain dynamic IP failed
+dyn_processing = Obtaining dynamic IP
+pppoe_msg = The network cable of public network has been removed
+pppoe_message_send_fail = Send message failed!
+ip_gate_not_same = IP Address and Default Gateway can''t be same!
+ip_innergate_not_same = IP Address and LAN IP address of the router can''t be in the same segment!
+auto_success = AUTO dial successfully
+auto_fail = AUTO dial failed
+auto_processing = AUTO dialing
+#url filter
+url_filter_list = Current URL Filtering
+url_filter_max = The maximum number of URL filter rules is {0}
+url_repeated = This URL already exists.
+url_note1 = You can set the web address of URL filter to protect your network from some of the bad site (not support https).
+url_note2 = URL: Set the URL address that needs to be filtered.
+url_note3 = URL: Maximum length is 32.
+
+#wds
+wds_mode = WDS Mode
+wds_mode_0 = Disable
+wds_mode_1 = RootAP Mode
+wds_mode_2 = Bridge Mode
+wds_mode_3 = Repeater Mode
+repeater_ssid = Repeater SSID
+wpa_algorithms = WPA Algorithms
+enable_wds_confirm = If enable WDS, Wi-Fi basic settings will be disabled. Continue?
+#sys log
+sys_log = System Log
+log_setting = Log Settings
+syslog_mode_all = All
+syslog_mode_wan_connect = WAN Connect
+syslog_mode_sms = SMS
+syslog_mode_tr069 = tr069
+syslog_mode_voip = VoIP
+syslog_mode_dlna = DLNA
+syslog_mode_wlan = WLAN
+syslog_mode_router = Router
+view_log = View log
+log_info = Log information
+
+#add at 2013.6.20
+periodic_inform = Periodic Inform
+periodic_inform_interval = Periodic Inform Interval
+periodic_inform_time = Periodic Inform Time
+certificate_import = Certificate
+import_certificate_btn = Import
+certificate_file_nomatch = You do not select the ca-cert.crt!
+#voip setting
+outbound_mode = Outbound Mode
+outbound_server = Outbound Server
+outbound_port = Outbound Port
+stun_mode = STUN Mode
+stun_server = STUN Server
+register_every = Register Every
+advanced_options = Advanced Options
+sip_port = SIP Port
+rtp_port = RTP Port
+voip_outbound_port_check = Invalid port.
+voip_time_check = Invalid register time.
+timeRange = [1, 3600] seconds
+voip_sip_port_check = Invalid port.
+voip_port_compare = Invalid port range.
+warn_information = The parameters of VoIP set success, please register again.
+#voip user details
+user_details_title = SIP Server and Configuration
+sip_register_server = SIP Register Server
+sip_domain = SIP Domain
+sip_realm = SIP Realm
+sip_proxy_mode = SIP Proxy Mode
+sip_proxy_server = SIP Proxy Server
+authorization = Authorization
+display_name = Display Name
+authorized_user_name = Authorized User Name
+authorized_password = Authorized Password
+voip_register_status = VoIP Register Status
+register_failed = Register Fail
+register_success = Register Success
+register_connecting = Register Connecting
+unregister = Unregister
+deregister = Deregister
+sip_domain_check = SIP Domain Address invalid
+sip_realm_check = SIP Realm invalid
+sip_proxy_server_check = IP Proxy Server invalid
+display_name_check = Display Name invalid
+authorized_username_check = Authorized User Name invalid
+account_password_check = Password invalid
+#voip advanced settings
+sip_advanced_options = Advanced Options
+adv_sip_t38 = T.38 FAX Encoder
+sip_dtmf = DTMF
+voip_sip_dtmf_method_inband = InBand
+voip_sip_dtmf_method_rfc2833 = RFC2833
+voip_sip_dtmf_method_sipinfo = SIPInfo
+sip_encoder = Encoder
+voip_sip_encoder_method_0 = G.711 u-Law
+voip_sip_encoder_method_1 = G.711 a-Law
+voip_sip_encoder_method_2 = G.722
+voip_sip_encoder_method_3 = G.729
+voip_sip_encoder_method_4 = G.726-16kps
+voip_sip_encoder_method_5 = G.726-24kps
+voip_sip_encoder_method_6 = G.726-32kps
+voip_sip_encoder_method_7 = G.726-40kps
+sip_vad = VAD
+sip_cng = CNG
+#voip supplementary service
+sip_protocol_voip = VoIP supplementary service
+sip_protocol_call_forw = Call Forwarding
+voip_forwarding_mode_1 = Unconditional forwarding
+voip_forwarding_mode_2 = When busy
+voip_forwarding_mode_3 = When no answer
+voip_forwarding_mode_0 = Cancel all forwarding
+sip_protocol_forw_uri = Forwarding URI
+show_msg = Please press '*80' on the phone!
+sip_protocol_incoming_call = Do Not Disturb
+sip_protocol_call_waiting = Call Waiting
+wds_note = WDS: Wireless Distribution System
+#voip user details
+connect_note = Please connect to internet if you want to use VoIP phone!
+#fota
+upgrade_pack_fix_success = Upgrade success!
+upgrade_pack_fix_failed = Upgrade failed!
+have_new_version = New version is found,the device will update.
+upload_file = File upload in progress!
+update_status_error = Fail to read the update status file, unable to update!
+verify_error = Verification upgrade file failed, unable to update!
+start_update = The upgrade file has been successfully verified and is currently being upgraded. Please do not power off, restore factory settings, or shut down the device!
+
+######key same value different###########
+dmz_note_info = If a terminal device can''t run network applications via this device, please enter IP address of the terminal device in the entry box when DMZ is enabled.
+dlna_note_info = DLNA: Digital Living Network Alliance.
+dlna_note_httpshare = You can set Digital Media Server (DMS) device name, and media type which you want to share on this page.
+#############串口转网口###################
+switch_port_title = Switch ethernet port to serial port
+open_serial_port = Turn ethernet port to serial port
+close_serial_port = Close ethernet port to serial port
+switching = switching...
+##############定时重启功能wording###################
+restart_schedule = Restart Schedule
+enable_reboot_switch = Turn on automatic restart function
+enable_reboot_byday = Automatic restart schedule based on every day
+enable_reboot_byweek = Automatic restart schedule based on the week
+enable_reboot_bymonth = Automatic restart schedule based on the month
+synchronized = synchronized
+unsynchronized = unsynchronized
+week = Week
+login_password_length_check = Please input 4 characters at least.
+system_time_not_syn = System time not synchronized!
+fota_note1 = You can set up an auto-check cycle for your device, so that the device automatically detects whether there is a new version of the software.
+local_note = You can choose the upgrade file on the local computer, upgrade the device software to the selected version, complete the system repair and optimization.
+
+#new word
+modify_password = Login Setting
+
+#parental control
+parental_control = Parental Control
+pc_children_group = Kids Devices
+pc_children_group_manage = Kids Manage
+pc_manage = Manage
+pc_no_children_device = Not set Kids Devices
+pc_children_group_desc = All kids devices will follow network access policy
+pc_edit_host_name = Edit the hostname:
+pc_internet_rule = Network Access Policy
+pc_time_limited = Online Time Setting
+pc_site_white_list = Website Whitelist
+pc_manage_children_group = Manage Kids Devices
+pc_current_attached_devices = Current Devices
+pc_action = Operation
+pc_remove = Remove
+pc_remove_all = Remove All
+pc_add = Add
+pc_leave = Leave
+pc_add_white_site = Add The White List
+pc_in_child_group = Added as kids device
+pc_forbid_time = Not Allow
+pc_allow_time = Allow
+pc_setting_desc = Click with your mouse to allow or forbid network access
+pc_name = Name
+pc_link = URL
+pc_not_save = Data not saved, please pay attention to save
+pc_link_exist = URL already exists!
+no_data = No data
+sun = SUN
+mon = MON
+tues = TUES
+wed = WED
+thur = THUR
+fri = FRI
+sat = SAT
+
+#定时休眠唤醒
+tsw_settings = Wi-Fi Awake Settings
+tsw = Wi-Fi Awake
+time_sleep_wake_up = Wi-Fi Awake Settings
+tsw_timer_on = Wake-up Time
+tsw_timer_off = Sleep Time
+tsw_sys_time_mode_alert = Please connect to the network and using the SNTP auto synchronizing time.
+tsw_time_interval_alert = The time interval should not be less than 10 minutes.
+
+#new wording
+advanced_settings = Advanced Settings
+others = Others
+others_restart_reset = Restart and Reset
+others_note_info = Please login again after rebooting or resetting router
+
+pwd_sub_title = Manage information about your wireless router
+pwd_note = When you log in wireless router, need to input this password (password is different from your wireless network password)
+current_network = Current Network
+
+wifi_wireless_settings = Wi-Fi Settings
+wifi_main_sub_title = Set up wireless hotspot so that your mobile phone or laptop could access network via it
+wifi_broadcast_desc = SSID Broadcast
+wifi_isolated_desc = All the wireless client device is completely isolated
+
+detail_info = Detail Information
+sd_u_share = SD Sharing
+
+settings_wireless = Wi-Fi Settings
+settings_internet = Network Settings
+not_connect_network = Disconnected
+
+traffic_data_plan = Statistics
+traffic_pie_title = Data Plan
+traffic_sub_title = You can create statistic plan, query used and left statistic
+traffic_used = Used
+traffic_used_text = {0} Used
+traffic_limit_data = Data Plan
+traffic_limit_data_text = {0} Data Plan
+traffic_alert_reach_text = When reached {0}%, {1} to remind me
+traffic_data_left_text = {0} of remaining
+traffic_when = When reached
+traffic_remind_me = %, to remind me
+traffic_remind_me_time = , to remind me
+traffic_limit_time_text = {0} Plan
+traffic_limit_time_h = {0} Hour(s) Plan
+traffic_limit_time_m = {0} Minute(s) Plan
+traffic_not_set_limited = Not set, click Settings
+
+echarts_used = Used
+echarts_left1 = Left
+echarts_alert = Alert
+echarts_alarm = Used(exceed alert)
+echarts_free = Left
+echarts_full = Exceed
+echarts_no = Not set
+
+3g = 3G
+wan = WAN
+connection_mode = Connection Mode
+wireless_access_device = Wireless Access Device
+cable_access_device = Cable Access Devices
+station_info_sub_title = All of wireless devices connected to this router will show on the page, including device name and MAC address
+station_info_desc = More access control options, please click here
+
+device_unit =
+ota_last_update_check = Last Update Time:
+main_ssid_num = Main SSID ({0})
+guest_ssid_num = Guest SSID ({0})
+wifi_slider_desc = * Drag the progress bar has adjusted the SSID maximum access number
+wif_guest_disabled = Guest SSID is disabled
+
+phone_number = Number
+equalToPin = The PINs you've entered do not match
+equalToPassword = The passwords you've entered do not match
+
+pppoe_mode_type_PPPOE = PPPoE
+pppoe_mode_type_STATIC = Static IP
+pppoe_mode_type_DHCP = Dynamic IP
+pppoe_mode_type_AUTO = Auto
+
+tsw_note = Awake Settings: When awake settings is enabled, device will automatically sleep; Wi-Fi will be unavailable.
+tsw_note_on = Wake-up Time: You can set the wake-up time.
+tsw_note_off = Sleep Time: You can set the sleep time.
+
+parent_control_note_kids = Kids Devices: Show Kids devices.
+parent_control_note_manage = Kids Management: Manage Kids devices.
+parent_control_note_time = Online Time Setting: Set online time for kids.
+parent_control_note_whitelist = Website Whitelist: Set website white list for kids to access websites.
+
+wan_note_dial = Dial-up Mode:
+wan_note_connection_mode = Please select network connection mode for your device:
+wan_note_connection_mode_pppoe = PPPoE: Access Internet. You may ask your network provider for PPPoE username and password.
+wan_note_connection_mode_dhcp = Dynamic IP: Access Internet via dynamic IP address.
+wan_note_connection_mode_static = Static IP: Access Internet via static IP address. Please set IP address, subnet mask, default gateway, primary and secondary DNS.
+wan_note_user_name = User Name: Enter your PPPoE account.
+wan_note_password = Password: Enter your PPPoE password.
+wan_note_connection_mode_auto = AUTO: Access Internet via dynamic IP address or PPPoE. You may ask your network provider for PPPoE username and password.
+parent_control_note_siteName = The White List namecan''t contain following characters: < > [ ] * $ & : , ; " ' ` / \\ | ? ¥
+parent_control_note_siteLink = The white list link should start with "http://" or "https://".
+firewal_note = Note : Firewall''s related rule settings may not take effect immediately, need to wait for a few minutes or restart the device. If you need to take effect immediately, it is recommended to restart the device.
+
+wps_pin_validator = Please input a valid PIN number
+device_rename = Please input a valid name.
+
+turnoff_button = Turn Off Device
+others_turn_off= Turn Off Device
+turnoff_confirm = Turn Off the device?
+turnoff = Turn Off...
+setting_no_change = Your settings did not change.
+Extend_accessDevice = The Max Station Number is not less than current access device number.
+
+TBcheck = Please input a value between 1 and 4095
+apn_pdptype_change_note = If the setting is changed,you may have a risk not to visit the Webpage by {0}. Then please try {1} to visit.
+apn_alert = This operation may restart the device. Continue any way?
+apn_alert_restart = The default APN settings are successful and the device is being restarted.
+apn_diconneted_network_confirm = This operation may disconnect from network, continue any way?
+
+#super
+super = Lock cell Settings
+lockCell_settings = Lock cell Settings
+v4_settings = Lock(V4 Encryption)
+cell_id1 = Cell Id 1
+cell_id2 = Cell Id 2
+cell_id3 = Cell Id 3
+cell_id4 = Cell Id 4
+cell_id5 = Cell Id 5
+v4_check = Invalid character, The character must be 0-9, a-z, A-Z
+v4_note = Your settings will take effect after restarting your device,Do you want to continue?
+
+export_title = Export settings
+band_3 = Band 3
+band_8 = Band 8
+band_38 = Band 38
+band_39 = Band 39
+band_40 = Band 40
+band_info = Band Settings
+cell_id = Current registration Cell
+cellid = CELLID
+lock_apply = Lock
+unlock_apply= Unlock
+sinr = SINR
+band_cell_settings = Band Cell Settings
+export = Export
+cell_not_correct= Not Lock Cell,Connected Fail!
+cell_id_lock = Locked Cell
+
+sip_uri_format = URI format
+user_name = User Name
+pin_v4_encrypt = PIN encrypt
+wep_cannot_2040 = When Current Security Mode of Main SSID or Guest SSID is OPEN (WEP) or SHARED, Channel Bandwidth can''t be 20MHz/40MHz!
+2040_cannot_wep = When Channel Bandwidth is 20MHz/40MHz, Current Security Mode of SSID can''t be OPEN (WEP) or SHARED.
+wifi_device_busy = Wi-Fi driver is busy, please wait...
+manufactory_code = Manufactory Code
+key_version_number = Key Version Number
+key_value = Key Value
+
+white_list = White List
+black_enable= Black list
+white_enable = White list
+mac_white_address = MAC Address
+max_white_list = The maximum number of white list is 6.
+LockCell_note1 = Cell locking is for the LTE network community lock, the current registration area and locking the same cell allows network, currently registered residential and residential lock inconsistent when inhibit the initiation network.
+LockCell_note2 = Residential lock to open and save the locking area not is empty, network community of the current registration of every boot and timing 8:00/14:00/20:00 ratio on the and locking area is the same, if different is broken network processing.
+mac_blank = MAC Address can''t be empty.
+
+vlan_switch = VLAN Switch
+vlan_notice = If you choose the Disable, it will take effect after restarting your device. Do you want to continue?
+vlan_notice2 = If you want to Enable this function, the Multi SSID Switch must be Enable. Do you want to open Multi SSID Switch and Enable this function?
+ap_hide = AP Hide
+
+urlparent = The end of URL can''t follow with /.
+not_change_mode = The device is setting parameters, please wait...
+#device
+device_status = Device Status
+device_status_0 = Decrypted
+device_status_1 = Encrypted
+
+######DDNS###########
+ddns = DDNS
+Hash value is empty = Hash value is empty!
+DDNS Provider is empty = DDNS Provider is empty!
+register successful = Register successful
+login error = Login error
+network error = Network error
+registering = Registering
+not registered = Not registered
+error registering = Error registering
+error = error
+ddns_set_mode = DDNS
+mode_set_mode_1 = Enable
+mode_set_mode_0 = Disable
+mode_select_auto = Auto
+mode_select_manual = Manual
+ddns_mode = DDNS Mode
+Auto = Auto
+Manual = Manual
+DDNS_Status = DDNS Status
+DDNSHashValue = Hash Value
+ddns_ProviderList = Dynamic DNS Provider
+ddns_account = Account
+ddns_passwd = Password
+ddns_domainName = Domain Name
+ddns_hashvalue_check = Invalid character, The character must be 0-9, a-z, A-Z or =
+ddns_note1 = You can set the dynamic domain name service to assign a fixed domain name for the dynamic IP WAN address.
+ddns_note2 = Dynamic DNS Provider: Set the server which will provide dynamic domain name service.
+ddns_note3 = Password: The pass-phrase contains: 0-9 a-z A-Z ! # $ * + , - . % : = ? @ [ ] ^ _ { | } ~
+ddns_note4 = Domain Name: Set the domain name you want to apply for.
+ddns_note5 = Hash Value: DDNS hash value, you need to fill in the Hash value when select the freedns server. It contains: 0-9 a-z A-Z 或 =
+
+#########PING#########
+ping_diagnostics = PING diagnosis
+ping_times = PING times
+ping_url = URL or IP address
+ping_start = Start
+ping_end = End
+ping_clear = Clear
+ping_starting = Start diagnosis ...
diff --git a/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_zh-cn.properties b/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_zh-cn.properties
new file mode 100755
index 0000000..618bd46
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_zh-cn.properties
@@ -0,0 +1,1729 @@
+#menu 中文字符
+pc_version = PC版
+mobile_version = 手机版
+home = 首页
+phonebook = 电话本
+sms = 短信
+sd = SD卡
+setting = 设置
+status = 基本信息
+net_select = 找网方式
+dial_setting = 拨号设置
+apn_setting = APN设置
+wifi_advance = 高级设置
+management = 管理
+net_setting = 联网设置
+quick_setting = 快速设置
+
+device_info = 状态信息
+traffic_statistics = 流量统计
+traffic_alert = 流量管理
+
+wifi = Wi-Fi 设置
+wifi_basic = 基本设置
+device_setting = 设备设置
+sim = SIM卡侧
+device = 设备侧
+router_setting = 路由
+mac_filter = 无线MAC过滤
+
+wps = WPS
+sleep_mode = 省电
+lan = 局域网
+
+firewall = 防火墙
+system_security = 系统安全
+port_forward = 端口转发
+port_filter = 端口过滤
+fastboot = 快速开机
+display_password = 显示密码
+display_QR = 显示二维码
+cable = 有线
+wireless = 无线
+
+my_router = 网络设置
+net_surfing = 网络连接
+
+#validate
+phonenumbers_check = 最多可输入 5 个电话号码,并且用 ';' 将号码隔开
+required = 必填项
+remote = 请修正该字段
+url = 请输入有效的网址
+siteLink_check = 请输入有效的网址
+siteName_check = 请输入有效的网站名
+date = 请输入有效的日期
+dateISO = 请输入有效的日期 (ISO)
+number = 请输入有效的数字
+digits = 只能输入整数
+decimalRange = 请输入正数且小数位最多2位
+any_digits = 只能输入整数
+creditcard = 请输入有效的信用卡号
+equalTo = 请再次输入相同的值
+accept = 请输入拥有效后缀名的字符串
+maxlength = 最多输入 {0} 个字符
+minlength = 最少输入 {0} 个字符
+rangelength = 请输入一个长度介于 {0} 和 {1} 之间的字符串
+range = 请输入一个介于{0}和{1}之间的值
+max = 请输入一个最大为 {0} 的值
+min = 请输入一个最小为 {0} 的值
+ssid = 请输入有效的 SSID
+ssid_ap = 请输入有效的 SSID(无效字符包括 , ; " \)
+email_check = 请输入有效的邮箱
+ipv4 = 请输入有效的 IP 地址
+ipv6 = 请输入有效的 IPv6 地址
+name_check = 请输入有效的姓名
+phonenumber_check = 请输入有效的电话号码
+sms_service_center_check = 请输入有效的短信中心号码
+pin_check = 请输入 4 到 8 位的数字
+puk_check = 请输入 8 位数字
+password_check = 请输入有效的密码
+subnetmask_check = 无效的子网掩码
+dns_check = 无效的 DNS,DNS不能为255.255.255.255或0.0.0.0
+dhcp_check = DHCP 的 {0}IP 超出局域网子网范围
+start = 起始
+end = 结束
+dhcpCompare = 无效的 IP 地址,起始地址不能大于结束地址
+ipRange = IP 地址池不能包含局域网 IP 地址(DHCP 起始地址应该比局域网 IP 地址大)
+lanip_check = 请输入有效的 IP 地址
+ip_check = 请输入完整且有效的 IP 地址
+dmz_ip_check = 请输入有效的 IP 地址
+wps_pin_check = 无效的 PIN
+wps_pin_length_check = 请输入4位或8位数字
+browse_sdcard = 查看 SD 卡
+portCompare = 无效的端口范围
+comment_check = 无效字符
+check_file_path = 文件夹名称中包含无效的字符
+check_filefold_name = 文件夹名称中包含无效的字符: ` ~ # & * + | \ : ? / < > . " '
+apn_check = 请输入有效的 APN
+ppp_username_check = 请输入有效的用户名
+ppp_password_check = 请输入有效的密码
+unlock_code_check = 请输入正确的解锁码。解锁码只能输入 0-9、a-f、A-F,并且长度为 16 个字符
+apn_profile_name_check = APN 配置文件名称中包含无效的字符
+dlna_name_check = 设备名称只能输入 0-9、a-z、A-Z 或 _
+wifi_password_check = 请输入有效的密码
+wifi_wep_password_check = 请输入 5 或 13 位ASCII密钥,或者输入 10 或 26 位 Hex 密钥。
+range_except = 请输入有效值,有效范围:{0}-{1}。(32000-32007 的范围值除外)。
+
+#common
+copyright = Copyright © 2010-2022 示例公司 版权所有
+enable=启用
+disable=关闭
+apply= 应用
+cancel = 取消
+clear = 清除
+reset = 重置
+add = 添加
+add_new = 新增
+save = 保存
+new = 新建
+view = 查看
+select = 选择
+edit = 编辑
+delete = 删除
+delete_all = 删除所有
+success_info = 成功
+error_info = 失败
+connect = 连接
+disconnect = 断开连接
+connected = 已连接
+disconnected = 已断开连接
+connecting = 正在连接…
+disconnecting = 正在断开连接…
+cancelconnect = 取消连接
+confirm = 确认
+prompt = 提示
+info = 信息
+alert = 提醒
+yes = 是
+no = 否
+ok = 确定
+back = 返回
+exit = 退出
+next_step = 下一步
+prev_step = 上一步
+next_page = >>
+prev_page = <<
+root = 根目录
+create = 创建
+speed = 速率
+upload = 上传
+download = 下载
+uploaded = 已上传
+downloaded = 已下载
+on = 打开
+off = 关闭
+need_login_again = 您的帐户已退出,请重新登录。
+modify = 更改
+content = 内容
+time = 时间
+processing = 处理中…
+saving = 保存中…
+deleting = 删除中…
+scanning = 状态:扫描中…
+dlna_scanning = 状态:扫描中…
+scanned = 状态:扫描结束。
+need_rescan = 状态: 需要重新扫描。
+sending = 发送中…
+creating = 创建中…
+uploading = 上传中…
+waiting = 请稍等…
+leave_page_info = 您有未保存的修改。您确定要继续吗?
+colon = :
+page = 页码:
+go = 跳转
+ALL = 全部
+open_source_licenses = 开放源代码许可
+vertical_bar = |
+
+#security
+security_policy = 安全策略
+security_mode = 安全模式
+security_mode_OPEN = OPEN
+security_mode_SHARED = SHARED
+security_mode_WPA2PSK = WPA2(AES)-PSK
+security_mode_WPAPSKWPA2PSK = WPA-PSK/WPA2-PSK
+security_mode_WPA3Personal = WPA3-Personal
+security_mode_WPA2WPA3 = WPA2(AES)/WPA3-Personal
+wpa = WPA
+pass_phrase = 密码
+
+#Station
+station_info = 接入设备
+station_number = 序号
+host_name = 主机名
+
+#Wifi Basic
+multi_ssid_enable = 多重网络名称开关
+multi_ssid_1 = 主SSID
+multi_ssid_2 = 副SSID
+multi_ssid_enable_confirm = 如果开启“多重网络名称”,Internet Wi-Fi 功能将会停用。您要继续吗?
+multi_ssid_enable_confirm2 = 如果开启“多重网络名称”,Internet Wi-Fi 功能将会停用。且已连接的 Wi-Fi 设备可能需要重连。您要继续吗?
+multi_ssid_max_access_number_alert = 主SSID 和 副SSID 的最大接入数之和不能超过 {0}!
+network_band_selection = 频段选择
+network_mode = 网络模式
+network_name = 网络名称(SSID)
+broadcast_network_name = SSID 广播
+country_region_code = 国家/地区 码
+frequency_channel = 信道
+rate = 速率
+max_station_number = 最大接入数
+wifi_basic_note = 点击“应用”时,任意已连接的 Wi-Fi 设备需要重新连接。
+wifi_disconnect_confirm = 所有已连接的 Wi-Fi 设备需要重连。您要继续吗?
+wifi_disconnect_confirm2 = 已连接的 Wi-Fi 设备可能需要重连。您要继续吗?
+network_mode_2 = 仅 802.11 n
+network_mode_4 = 802.11 b/g/n
+network_mode_5 = 仅 802.11 a
+network_mode_6 = 802.11 b/g/n/ax
+frequency_channel_0 = 自动
+frequency_channel_1 = (频道 1)
+frequency_channel_2 = (频道 2)
+frequency_channel_3 = (频道 3)
+frequency_channel_4 = (频道 4)
+frequency_channel_5 = (频道 5)
+frequency_channel_6 = (频道 6)
+frequency_channel_7 = (频道 7)
+frequency_channel_8 = (频道 8)
+frequency_channel_9 = (频道 9)
+frequency_channel_10 = (频道 10)
+frequency_channel_11 = (频道 11)
+frequency_channel_12 = (频道 12)
+frequency_channel_13 = (频道 13)
+frequency_channel_14 = (频道 14)
+frequency_channel_15 = (频道 15)
+frequency_channel_16 = (频道 16)
+frequency_channel_17 = (频道 17)
+frequency_channel_18 = (频道 18)
+frequency_channel_19 = (频道 19)
+frequency_channel_20 = (频道 20)
+frequency_channel_21 = (频道 21)
+frequency_channel_22 = (频道 22)
+frequency_channel_23 = (频道 23)
+frequency_channel_24 = (频道 24)
+frequency_channel_25 = (频道 25)
+frequency_channel_26 = (频道 26)
+frequency_channel_36 = (频道 36)
+frequency_channel_40 = (频道 40)
+frequency_channel_44 = (频道 44)
+frequency_channel_48 = (频道 48)
+frequency_channel_149 = (频道 149)
+frequency_channel_153 = (频道 153)
+frequency_channel_157 = (频道 157)
+frequency_channel_161 = (频道 161)
+frequency_channel_165 = (频道 165)
+rate_0 = 自动
+rate_1 = 1 Mbps
+rate_2 = 2 Mbps
+rate_3 = 5.5 Mbps
+rate_4 = 6 Mbps
+rate_5 = 6.5 Mbps
+rate_6 = 9 Mbps
+rate_7 = 11 Mbps
+rate_8 = 12 Mbps
+rate_9 = 13 Mbps
+rate_10 = 18 Mbps
+rate_11 = 19.5 Mbps
+rate_12 = 24 Mbps
+rate_13 = 26 Mbps
+rate_14 = 36 Mbps
+rate_15 = 39 Mbps
+rate_16 = 48 Mbps
+rate_17 = 52 Mbps
+rate_18 = 54 Mbps
+rate_19 = 58.5 Mbps
+rate_20 = 65 Mbps
+cannot_operate_when_wifi_connected = Wi-Fi 连接时无法进行该操作!
+network_mode_select_2 = 仅 802.11 n
+network_mode_select_3 = 802.11 b/g
+network_mode_select_4 = 802.11 b/g/n
+network_mode_select_6 = 802.11 b/g/n/ax
+network_modes_band_select_2 = 仅802.11 n
+network_modes_band_select_4 = 802.11 a/n
+network_modes_band_select_5 = 仅 802.11 a
+
+#net select
+auto_select = 自动
+manual_select = 手动
+auto_select_type_WCDMA_preferred = 自动
+auto_select_type_LTE_preferred = 自动
+auto_select_type_NETWORK_auto = 自动
+auto_select_type_Only_LTE = 仅4G
+auto_select_type_WCDMA_AND_LTE = 仅4G/3G
+auto_select_type_Only_WCDMA = 仅3G
+auto_select_type_TD_W = 仅3G
+auto_select_type_Only_GSM = 仅2G
+
+search = 搜索
+searching_net = 搜索中,请稍候...
+registering_net = 注册中,请稍候...
+network_list = 网络列表
+register = 注册
+auto = 自动
+unknown = 未知
+available = 可用
+current = 当前
+forbidden = 禁止
+net_select_note_automatic = 自动:该设备将会自动搜索可用网络。
+net_select_note_manual = 手动:将会手动搜索可用网络。
+net_status = 网络状态
+mccmnc = MCCMNC
+option = 选项
+networktype = 网络类型
+subnet = 制式
+
+#home
+ap_station_clear = 清空
+current_flux = 当前流量
+total_flux = 已用总流量
+connected_time = 持续时间
+flux_up = 上传速率
+flux_down = 下载速率
+traffic_current_connection = 当前连接
+traffic_current_month_data = 当月
+traffic_total_traffic = 已用总流量
+traffic_used_data_month = 本月流量使用情况:
+traffic_used_time_month = 本月上网时间:
+traffic_data_approximated = 流量仅供参考,建议向运营商查询以获得准确流量。
+traffic_used_month = 已用:
+traffic_left_month = 剩余:
+traffic_exceeded_month = 超出:
+traffic_total_month = 限额:
+traffic_apply_volume_limit = 流量管理
+traffic_data_limit_type = 套餐形式
+traffic_data = 流量
+traffic_time = 时间
+traffic_limit_data_month = 每月
+traffic_alert_when_data_reach = 提醒设置
+traffic_limit_time_month = 当月配额
+traffic_alert_when_time_reach = 提醒设置
+traffic_million_byte = MB
+traffic_percent = %
+traffic_limit_disconnect_msg = 您的流量/时间已经达到 {0}%,要断开网络连接吗?
+traffic_limit_connect_msg = 您的流量/时间已经达到 {0}%,要继续连接网络吗?
+traffic_limit_msg = 您的流量/时间已经达到 {0}%。
+traffic_beyond_disconnect_msg = 您的流量/时间已超出配额,要断开网络连接吗?
+traffic_beyond_connect_msg = 您的流量/时间已超出配额,要继续连接网络吗?
+traffic_beyond_msg = 您的流量/时间已超出配额。
+traffic_calibrate_note = 支持手动校准流量功能。如果页面流量统计与实际有偏差,您可以修改实际已用流量。
+traffic_note = 当已用流量/时间达到设置的百分比时提醒我。
+traffic_over_note = 当流量套餐单位为MB时,已使用流量的统计范围需小于4096TB。
+traffic_clear_confirm = 您确定要清除吗?
+traffic_not_support = 当前模式不支持此功能。
+
+#APN
+apn_currentApn = 当前 APN
+apn_mode = 模式
+apn_auto_apn = 自动
+apn_manual_apn = 手动
+apn_profile = 配置文件
+apn_profile_name = 配置文件名称
+apn = APN
+apn_ipv4_apn = IPv4 APN
+apn_ipv6_apn = IPv6 APN
+apn_dns_mode = DNS 模式
+apn_dns_mode_ipv4 = IPv4 DNS 模式
+apn_dns_mode_ipv6 = IPv6 DNS 模式
+apn_auto_dns = 自动
+apn_manual_dns = 手动
+apn_dns1 = DNS 1
+apn_dns2 = DNS 2
+apn_dns1_ipv4 = IPv4 DNS 1
+apn_dns2_ipv4 = IPv4 DNS 2
+apn_dns1_ipv6 = IPv6 DNS 1
+apn_dns2_ipv6 = IPv6 DNS 2
+apn_authentication = 鉴权方式
+apn_authentication_ipv4 = IPv4 鉴权方式
+apn_authentication_ipv6 = IPv6 鉴权方式
+apn_user_name = 用户名
+apn_user_name_ipv4 = IPv4 用户名
+apn_user_name_ipv6 = IPv6 用户名
+apn_password = 密码
+apn_password_ipv4 = IPv4 密码
+apn_password_ipv6 = IPv6 密码
+apn_pdp_type = PDP 类型
+set_default = 设为默认
+apn_save_profile_exist = 配置文件名称已存在,请选择其他名称。
+apn_delete_cant_delete_default = 无法删除默认配置文件。
+apn_delete_confirm = 确定删除?
+apn_cant_modify_status = 网络为 {0} 时无法更改当前的 APN 设置!
+apn_cant_modify_current = 无法更改正在使用的 APN!
+apn_cant_delete_current = 无法删除正在使用的配置文件!
+apn_profile_full = 最多只能添加 {0} 项设置!
+dial_num = 拨号号码
+apn_no_select_alert = 请选择有效的配置文件!
+
+#Status bar
+network_status = 网络状态
+connection_status = 无线宽带连接状态
+rj45_connection_status = 有线宽带连接状态
+battery = 电量
+charging = 充电中
+sim_status = SIM卡状态
+sim_status_modem_waitpin = 无效的 SIM卡
+sim_status_modem_waitpuk = 无效的 SIM卡
+sim_status_modem_sim_undetected = 无效的 SIM卡
+sim_status_modem_undetected = 无效的 SIM卡
+sim_status_modem_imsi_waitnck = 无效的 SIM卡
+sim_status_modem_sim_destroy = 无效的 SIM卡
+sim_status_modem_destroy = 无效的 SIM卡
+sim_status_modem_init_complete = 有效的 SIM卡
+sim_status_modem_ready = SIM卡就绪
+wifi_status = Wi-Fi 状态
+wifi_status_on = Wi-Fi 开
+wifi_status_off = Wi-Fi 关
+wifi_status1 = 用户数:1
+wifi_status2 = 用户数:2
+wifi_status3 = 用户数:3
+wifi_status4 = 用户数:4
+wifi_status5 = 用户数:5
+wifi_status6 = 用户数:6
+wifi_status7 = 用户数:7
+wifi_status8 = 用户数:8
+wifi_status9 = 用户数:9
+wifi_status10 = 用户数:10
+enable_pin = 启用 PIN
+remaining_time = 剩余时间
+signal = 信号
+network_type = 网络类型
+network_type_limited_service = 服务受限
+network_type_no_service = 无服务
+network_provider = 运营商
+roaming_status = 漫游状态
+sim_status_ready = SIM卡就绪
+sim_status_waitpin = 等待输入 PIN
+sim_status_waitpuk = 等待输入 PUK
+sim_status_undetected = 未检测到 SIM卡
+sim_status_waitnck = 等待输入 NCK
+sim_status_destroy = SIM卡已损毁
+signal_strength = 信号强度
+signal_strength_label = 信号强度
+battery_level = 电量
+
+#dial_setting
+dial_note = WAN 连接状态
+dial_mode = 连接模式
+dial_mode_cpe = 拨号方式
+dial_roam_info = 您尚未开启漫游设置。要开启漫游功能,请到设置页面中勾选复选框。
+dial_setting_note_automatic = 自动:开机后,设备会自动连接到网络。
+dial_setting_note_manual = 手动:开机后,设备需要手动连接到网络。
+dial_roaming_remind = 勾选此项,您可以在漫游状态下连接到网络,且可能会产生额外费用。
+dial_roaming_connect = 设备处于漫游状态,连接网络会使您的资费增加。确定继续?
+
+#net_status
+net_info = 网络状态
+pci = PCI
+rsrp = RSRP
+rsrq = RSRQ
+plmn = PLMN
+band = BAND
+
+#phonebook
+search = 搜索
+save_location = 存储位置
+save_location_0 = SIM卡
+save_location_1 = 设备
+group_all = 全部
+group_null = -
+group_common = 普通
+group_family = 家人
+group_friend = 朋友
+group_colleague = 同事
+name = 姓名
+mobile_phone_number = 移动电话
+home_phone_number = 住宅电话
+office_phone_number = 单位电话
+mail = 邮箱
+group = 群组
+no_data_selected = 请选择一项!
+confirm_data_delete = 确定删除?
+confirm_pb_delete = 确定要删除所选联系人吗?
+too_many_data_selected = 选择电话号码过多,请选择一个电话号码!
+delete_fail_try_again = 删除失败,请重试。
+max_send_number = 最多输入 5 个电话号码!
+send = 发送
+send_sms = 发送短信
+new_message = 新短信
+send_numbers = 电话号码
+contents = 短信内容
+device_full = 设备的电话本存储空间已满!
+sim_full = SIM卡已满!
+phonebook_init_fail = 电话本初始化失败!<br/>请检查SIM卡并重启设备。
+sim_removed = SIM卡已被移除!
+change_device_to_sim_confirm = 可能会丢掉信息,是否需要继续转存?
+
+#SMS
+smslist = 设备侧短信
+sms_setting = 短信设置
+sim_messages = SIM侧短信
+refresh = 刷新
+forward = 转发
+draft = 草稿
+send_fail_try_again = 发送失败。
+sms_content_required = 请输入短信息内容。
+sms_contact_required = 请选择联系人。
+select_some_options = 最多可选择5位联系人
+select_an_option = 请选择一个选项
+chat_input_placehoder = 请在此输入信息
+sms_chat_input_confirm = 请按回车键或者用分号完成输入
+sms_capacity_will_full = 短信容量将满,请删除部分短信
+sms_capacity_is_full = 短信容量满,请删除部分短信
+sms_capacity_is_full_for_send = 短信容量满,请删掉部分短信以正常收发新信息。
+sms_capacity_will_full_just = 容量将满,您最多只能发送 {0} 条。
+sms_init_fail = 短信初始化失败!<br/>请检查SIM卡并重启设备。
+sms_resending = 正在重发短信...
+sms_resend_fail = 短信重发失败。
+sms_stop_sending = 停止发送
+sms_unread_count = 未读短信
+sms_delivery_report_1 = 短信已送达对方。
+sms_delivery_report_2 = 短信未送达对方。
+sms_delivery_report_3 = 正在发送短信...
+sms_report = 发送报告
+sms_cancel_sending = 取消中…
+sms_save_draft_success = 短信已存为草稿
+sms_save_draft_failed = 草稿保存失败
+sms_to_save_draft = 短信已修改,要存为草稿吗?
+sms_no_recipient = 您尚未选择收件人,该短信将被舍弃。
+phone_number_invalid = 电话号码无效
+sms_to = 接收人:
+confirm_sms_delete = 确定要删除所选信息吗?
+sms_save_tip = 保存草稿中...
+
+#login
+password = 密码
+puk = PUK
+login = 登录
+logout = 退出
+new_pin = 新 PIN
+confirm_pin = 确认新 PIN
+puk_locked = 您的 SIM卡已彻底锁定。请联系您的运营商。
+password_error = 密码不正确!
+password_error_left = 密码不正确!<br/>您的剩余尝试次数:{0}。
+password_error_account_lock = 你的账户被锁定。<br/>剩余时间:
+password_error_five_times = 您已经输错5次。请5分钟后再试。
+password_error_account_lock_time = 您的账户已被锁定。<br/>请稍后再试。
+enter_pin = SIM卡已锁,请输入 PIN码以解锁。
+enter_puk = SIM卡 PIN码已锁,请输入 PUK码以解锁。
+last_enter_pin = 最后尝试机会。如果再次错误,您的 SIM卡将被锁定!
+last_enter_puk = 最后尝试机会。如果再次错误,您的 SIM卡将会损毁!
+attempts_left = 剩余次数:
+pin_error = PIN码不正确!
+puk_error = PUK码不正确!
+confirm_logout = 您要注销吗?
+
+#advanced password
+password_management = 登录密码
+current_password = 当前密码
+new_password = 新密码
+confirm_password = 确认新密码
+current_password_error = 当前密码错误!
+password_note_info = 您可以在该网页更改登录密码。
+password_note_valid = 密码不能为空,且最多包含 32 个字符。
+password_note_input = 密码的有效字符包含:0-9 a-z A-Z ! # $ * + , - . % : = ? @ [ ] ^ _ { | } ~
+password_note_first_change = 请修改您的初始登陆密码!
+password_note_too_low = 您的密码复杂度太低(密码中可以包含大小写字母、数字、特殊字符,且不小于8位)。您要继续吗?
+
+#advanced pin
+pin = PIN
+current_pin = 当前 PIN
+pin_management = PIN码管理
+pin_status = PIN码状态
+modify_pin = 更改 PIN
+cannot_operate_when_connected = 网络连接时无法进行该操作!
+cannot_change_pin_when_connected = 网络连接时无法更改 PIN!
+pin_note_info = “PIN码管理”提供PIN保密设置功能,防止对SIM/USIM/UIM卡的非授权使用。如果要改变当前设置,请先断开网络。
+pin_note_operator = 启用PIN码后,下次启动设备时,需要输入PIN码;关闭PIN码后,下次启动设备时,不需要输入PIN码。
+pin_note_modify = 启用PIN码后,可修改PIN码。
+
+#lan
+lan_setting = 局域网接口设置
+ip_address = IP 地址
+subnet_mask = 子网掩码
+mac_address = MAC地址
+dhcp_server = DHCP服务
+dhcp_ip_pool = DHCP IP池
+dhcp_lease = DHCP租期
+hours = 小时
+minutes = 分钟
+lan_note = 新的设置会在设备重启后生效。
+lan_note_ip_address = IP 地址:路由器局域网的IP地址,使用该IP地址可以通过浏览器管理设备。
+lan_note_subnet_mask = 子网掩码:对应 IP 地址的子网掩码。
+lan_note_dhcp_server_enable = DHCP服务启用:如果开启DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)服务,设备将会为所连接的客户端自动分配IP地址。
+lan_note_dhcp_server_disable = DHCP服务关闭:如果关闭DHCP服务,设备将不会为连接的客户端自动分配IP地址,客户端必须手动输入IP地址。
+lan_note_dhcp_ip_pool = DHCP IP 池:起始IP地址和终止IP地址指定了DHCP服务器分配给接入设备的IP地址范围。这个范围之外的地址不能由DHCP服务器分配。
+lan_note_dhcp_lease_time = DHCP 租期时间:租期时间表示计算机获取IP地址后可以使用这个IP地址的期限,到达租期时间后,如果客户端需要继续使用这个地址,必须在到期前重新发起请求。只有当原来的客户端租期到期并且不再发起续租请求时,这个地址才能分配给其他客户端使用。
+lan_confirm_reopen = 您的设置将在设备重启后生效。您要继续吗?<br/><br/><i>注意:选择是,表示提交请求并重启设备。如果选择否,表示您放弃当前的选择。</i>
+lan_tip_staticip_notsame = 路由器局域网的IP地址不能与静态IP地址在同一个网段内!
+
+#sms_setting
+sms_validity = 有效期
+sms_validity_twelve_hours = 12 小时
+sms_validity_one_day = 1 天
+sms_validity_one_week = 1 周
+sms_validity_largest = 最长
+center_number = 中心号码
+delivery_report = 发送报告
+list = 列表
+
+#restore
+restore = 恢复出厂
+restore_title = 恢复出厂设置
+restore_button = 恢复出厂设置
+restore_confirm = 所有参数将恢复为出厂设置,设备会重启。确定继续?
+restore_when_connected = 请先断开 WAN 网络!
+restoring = 出厂设置恢复中
+restore_note_info = 点击“恢复出厂”以将所有设置还原为默认值,并且设备会自动重启。
+
+#wps
+wps_note_all = WPS(Wi-Fi Protected Setup)代表Wi-Fi保护设置,是一个简单且安全地建立无线网络的标准,您可以通过这一过程轻松地将无线客户端连接到设备,而无需进行任何具体的配置,例如SSID、安全模式和密码。
+wps_note_pin = PIN:您需要输入客户端的PIN码。
+wps_note_pbc = PBC:您可以在该网页选择PBC(Push Button Configuration)或者长按(3-4秒)设备上的WPS按键启用WPS功能。
+wps_note_wait = 该设备在 2 分钟内会等候接收无线接入客户端的访问请求。
+wps_pin = PIN
+wps_pbc = PBC
+wps_wifi_off = Wi-Fi 关闭时无法进行操作!
+wps_auth_open = 当前的加密类型不支持WPS。
+wps_on_info = WPS 已经启用,请稍后再试!
+wps_ssid_broadcast_disable = SSID 广播关闭时无法进行该操作!
+
+#sleep mode
+wifi_sleep = Wi-Fi 休眠设置
+wifi_sleep_mode = 省电模式
+sleep_time = 关机时间
+sleep_select_0 = 休眠
+sleep_select_1 = 关机
+sleep_mode_-1 = 从不休眠
+sleep_mode_5 = 5分钟
+sleep_mode_10 = 10分钟
+sleep_mode_20 = 20分钟
+sleep_mode_30 = 30分钟
+sleep_mode_60 = 1小时
+sleep_mode_120 = 2小时
+wifi_sleep_note_info = 关机时间:当在指定的时间内无 Wi-Fi 连接时,Wi-Fi 功能将会停用,系统会直接关机以节省电量。
+wifi_sleep_confirm = 当前设置改变时将会重启wifi,是否继续?
+
+#system security
+remote_management = 远程管理(通过 WAN 口)
+ping_from_wan = 从外网 PING 入
+
+#portforward
+protocol_TCP&UDP = TCP+UDP
+protocol_TCP = TCP
+protocol_UDP = UDP
+virtual_server_setting = 虚拟服务器设置
+port_forward_setting = 端口转发设置
+port_forward_list = 系统当前虚拟服务器
+port_forward_note_info = 配置端口转发以启用外部计算机,访问局域网提供的网络、FTP 或其他服务。
+port_forward_note_port = 端口范围:设置要转发的源端口数量。
+port_forward_note_ip_address = IP 地址:设置要转发的源 IP 地址。
+port_forward_note_protocol = 协议:设置用于转发的协议。
+port_forward_note_comment = 注释:输入用于转发设置的注释。有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ 。
+port_range = 端口范围
+protocol = 协议
+comment = 注释
+ipExam = (例如:192.168.0.101)
+rules_max = 规则数量已达最大值{0}。
+rule_exist = 规则已经存在。
+rule_max_note = 规则的最大数量为 10。
+rule_max_note_v4v6 = IPv4 或 IPv6 规则的最大数量为 10。
+
+rules_max_v4v6 = {0}规则数量已达最大值{1}。
+rule_exist_v4v6 = {0}规则已经存在。
+
+#quick setting
+step_number_1 = 1
+step_number_2 = 2
+step_number_3 = 3
+step_number_4 = 4
+step_number_5 = 5
+step_number_6 = 6
+step_name_1 = 1.快速设置
+step_name_2 = 2.APN 设置
+step_name_3 = 3.PPP 鉴权
+step_name_4 = 4.SSID 配置
+step_name_5 = 5.安全配置
+step_name_6 = 配置如下
+step1_exp1 = 该向导帮助您安全设置网关基本参数:点击“上一步”和“下一步”进行导航;点击“应用”以保存设置。您也可以在其他菜单中设置高级参数。
+step1_exp2 = 在该向导中设置基本参数。您也可以在其他菜单中设置高级参数。
+apn_settings = APN 设置
+step2_auto_apn_explain = 如果您选择了“自动 APN”,将跳过第二步设置(PPP 鉴权)。
+step2_profile_name_explain = 配置文件名称:您当前使用的默认配置文件。
+ppp_authentication = PPP 鉴权
+step3_authentication_apn_explain1 = 鉴权方式:由您的互联网服务提供商 (ISP) 来提供。密码验证协议 (PAP) 不用加密就可以通过两次握手建立对端的身份。询问握手认证协议(CHAP)通过三次握手周期性的校验对端的身份。
+step3_authentication_apn_explain2 = 用户名:用于建立连接时,从互联网服务提供商获取验证。
+step3_authentication_apn_explain3 = 密码:用于建立连接时,从互联网服务提供商获取验证。
+step3_username_password_explain = 点击“设为默认”以将该配置文件设置为默认配置文件。
+ssid_title = SSID
+ssid_name = 网络名称 (SSID)
+ssid_broadcast = SSID 广播
+step4_ssid_explain = 网络名称:服务集标识符 (SSID)。输入无线局域网 (WLAN) 名称,最多 32 个字符。
+step4_ssid_broadcast_explain1 = SSID 广播:停用或启用(默认为启用)该功能。一旦启用该功能,路由器将会广播 SSID,其他设备将会发现该设备并进行连接。
+step4_ssid_broadcast_explain2 = 禁用:网关停止广播 SSID,在网络中隐藏您的网络名称。
+step5_encryption_mode_info = 安全模式:
+step5_encryption_mode_explain1 = OPEN:不进行验证以及加密。这可能会导致个人信息被拦截,或者网络被他人滥用,因此不推荐使用此方式。
+step5_encryption_mode_explain2 = WPA2(AES)-PSK:WPA2(AES)-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。
+step5_encryption_mode_explain3 = WPA-PSK/WPA2-PSK:WPA 预共享密钥 (WPA-PSK)。以纯文本 (ASCII) 密码的方式输入预共享密钥。WPA2-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。
+step5_encryption_mode_explain4 = 密码:密码的有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~
+step6_apply_explain = 一旦设置完成时,您需要重新连接无线网络。
+quick_setting_wifi_disable_confirm = 1、Wi-Fi 已关闭,与 Wi-Fi 相关的设置不会生效。<br\>要继续吗?
+quick_setting_param_changed_confirm = 1、Wi-Fi 配置更改后已连接的 Wi-Fi 设备可能需要重连。<br\>要继续吗?
+#SD Card
+sdcard = SD卡
+httpshare = HTTP 共享
+sd_card_mode = 模式
+sd_card_share_setting = 共享设置
+sd_card_share_usb_mode = USB
+sd_card_share_http_share_mode = HTTP 共享
+http_title = HTTP 共享设置
+sd_card_status = 状态
+sd_card_file_to_share = 共享文件
+sd_card_access_type = 访问类型
+sd_card_path_to_share = 路径共享
+sd_card_entire_sd_card = 整个SD卡
+sd_card_custom_setting = 自定义
+sd_card_read_write = 读/写
+sd_card_readonly = 只读
+sd_card_share_setting_no_sdcard = 无 SD卡!
+sd_card_share_setting_exist = 该文件或文件夹已经存在!
+sd_card_share_setting_noexist = 该文件或文件夹不存在!
+sd_card_status_info_0 = 无 SD卡!
+sd_card_status_info_1 = SD卡存在,现在可以使用了
+sd_card_status_info_2 = SD卡存在,但目前处于无效状态,请 5 秒后重试。如果无法使用,请检查 SD卡!
+sd_card_status_info_2_reason = 可能的原因如下
+sd_card_status_info_2_reason_1 = SD卡格式是NTFS,请切换至USB方式使用。
+sd_card_status_info_2_reason_2 = SD卡内容正在加载中,请5分钟后再试;如果仍然无效,请检查SD卡。
+sd_card_invalid_chars_cant_download = 文件名称中包含无效的字符,无法下载!(无效字符包括 < > " '' & + / \\ : * | # ? ~ `)。
+note_not_support_fs_ntfs = 在 HTTP 共享模式下,设备仅支持 FAT/FAT32 文件系统!
+note_web_share_mode = HTTP 分享模式:通过网络浏览器分享 SD 卡。此模式将会停用通过 USB 端口访问 SD 卡的可移动驱动器映射功能。
+note_usb_access = 仅通过 USB 访问:在可移动的驱动器映射模式下,用户仅能通过 USB 数据线来访问 SD 卡。共享的 SD 卡的网页将会停用。
+note_http_share_usb_access = 仅通过 USB 访问:在可移动的驱动器映射模式下,用户仅能通过 USB 数据线来访问 SD 卡。共享的 SD 卡的网页将会停用。
+note_http_share_cannot_access = 无法访问此页面!
+note_path_to_share_example = 路径共享:您可以输入共享路径,例如:/Picture。当仅输入斜线号“/”时,表示共享整个SD卡。
+note_upload_not_refresh = 当下载或者上传文件时,请不要刷新该网页!
+note_upload_single_file_2g = 单个文件上传最大支持2G。
+note_upload_filelenth_25 = 文件名、文件夹名称修改支持最长25个字符。
+note_uploading_not_refresh = 文件上传中,请不要刷新该页面!
+note_invalid_file_path = 路径共享不能为单独的小数点,也不能包含以下字符: < > " '' & + / \\ : * | # ? ~ `
+browse_btn = 浏览
+change_btn = 更改
+no_file_selected = 未选择文件
+sd_no_file_selected = 请选择一个文件
+sd_name = 名称
+sd_path = 路径:
+sd_rename = 重命名
+sd_download = 下载
+sd_file_size = 文件大小
+sd_update_time = 更新时间
+no_sdcard = 无 SD卡!
+no_exist = 文件不存在!
+sd_card_folder_name_is_null = 请输入名称
+get_file_list_failure = 获取文件列表失败
+create_folder_failure = 创建文件夹失败
+delete_folder_failure = 删除文件或文件夹失败
+sd_card_path_too_long = 文件路径过长。
+sd_file_size_too_big = 文件过大。单个文件上传最大支持2G。
+sd_file_name_invalid = 本设备不支持含有*号的文件名,请更新文件名。
+back_to_login = 返回登录
+sd_config_changed_reload = SD卡共享设置已改变,页面将重新加载。
+sd_upload_space_not_enough = SD卡空间不足!
+sd_upload_data_lost = 文件上传出现异常,请重试。
+sd_upload_file_is_downloading = 文件正在下载中,请稍候!
+sd_share_path_is_invalid = 共享路径无效,请重新设置
+sd_share_path_cant_rename = 文件夹已共享,无法重命名。
+sd_share_path_cant_delete = 文件夹“{0}”已共享,无法删除。
+sd_share_path_invalid = 共享路径失效。
+sd_file_processing_cant_delete = 文件正在被使用,无法删除。
+sd_file_processing_cant_rename = 文件正在被使用,无法重命名。
+sd_not_support = SD卡格式不支持或其它原因,请重新插入或更换SD卡。
+sd_usb_forbidden = SD卡正在被使用,无法切换。
+sd_upload_rename = 该文件已经存在!如需继续上传请修改文件名并选择“是”。选择“否”将取消上传。
+sd_upload_rename_null = 文件名不能为空或超过25个字符!
+
+#port filter
+filter_basic_setting = 基本设置
+port_filter_enabled = MAC/IP/端口过滤
+default_policy = 默认策略
+default_policy_note = 您可以设置防火墙策略以保护网络免受病毒、蠕虫和恶意网络行为的攻击。
+default_policy_note_filter = 过滤策略仅在启用过滤功能时可用。
+accepted = 放行
+dropped = 丢弃
+port_filter_setting = MAC/IP/端口过滤设置
+mac_address = MAC 地址
+macExam = (例如:00:1E:90:FF:FF:FF)
+dest_ip_address = 目的 IP 地址
+source_ip_address = 源 IP 地址
+port_filter_action = 操作
+filter_accept = 放行
+filter_drop = 丢弃
+protocol_None = 全部
+protocol_ICMP = ICMP
+port_filter_list = 系统当前 MAC/IP/端口过滤规则
+dest_port_range = 目的端口范围
+source_port_range = 源端口范围
+filter_accept_note = 其它数据包会被放行。
+filter_drop_note = 其它数据包会被丢弃。
+filter_optional = 请输入IP,MAC 或者端口值
+mac_check = 无效的 MAC 地址
+filter_ip_setting = IP设置
+filter_ipv4 = IPv4
+filter_ipv6 = IPv6
+ip_type = IP 类型
+source_ipv6_address = 源 IPv6 地址
+dest_ipv6_address = 目的 IPv6 地址
+port_filter_note_mac_address = MAC 地址:设置要过滤的 MAC 地址。
+port_filter_note_source_ip_address = 源 IP 地址:设置要过滤的源 IP 地址。
+port_filter_note_dest_ip_address = 目的 IP 地址:设置要过滤的目的 IP 地址。
+port_filter_note_protocol = 协议:设置用于过滤的协议。
+port_filter_note_source_port_range = 源端口范围:设置要过滤的源端口数量。
+port_filter_note_dest_port_range = 目的端口范围:设置要过滤的目的端口数量。
+port_filter_note_action = 操作:如果信息包与规则相符,可设置处理信息包。
+port_filter_note_comment = 注释:输入用于过滤设置的注释。有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ 。
+port_filter_note_info = 过滤策略同规则是一一对应的。如果与此条款相抵触,将不会继续同下列规则匹配。
+confirm_data_effect = 您的设置可能不会立即生效,如果需要全部生效,建议重启设备,是否继续?
+
+#wifi_range
+wifi_range_settings = Wi-Fi 性能设置
+wifi_range = Wi-Fi 覆盖范围
+wifi_short_mode = 近距离 Wi-Fi 范围 - 最佳电池续航
+wifi_medium_mode = 中距离 Wi-Fi 范围
+wifi_long_mode = 远距离 Wi-Fi 范围
+wifi_des_short_mode = 近距离 Wi-Fi 范围
+wifi_des_medium_mode = 中距离 Wi-Fi 范围
+wifi_des_long_mode = 远距离 Wi-Fi 范围
+wifi_range_note_range = Wi-Fi 范围:
+wifi_range_note_short = 近距离 Wi-Fi 范围:覆盖范围和发射功耗小,是最佳电池续航方案。
+wifi_range_note_medium = 中距离 Wi-Fi 范围:覆盖范围和发射功耗是设备支持能力的一半,正常耗电。
+wifi_range_note_long = 远距离 Wi-Fi 范围:设备最大发射功耗和覆盖范围,如果一直有终端接入,耗电会增加,减少电池续航。
+wifi_range_note_short_cpe = 近距离 Wi-Fi 范围:覆盖范围和发射功耗最小。
+wifi_range_note_medium_cpe = 中距离 Wi-Fi 范围:覆盖范围和发射功耗是设备支持能力的一半。
+wifi_range_note_long_cpe = 远距离 Wi-Fi 范围:设备最大发射功耗和覆盖范围。
+
+#upnp
+upnp = UPnP
+upnp_setting = UPnP 设置
+upnp_note_info = 通用即插即用 (UPnP) 是网络协议集。它允许电脑、打印机、互联网网关、Wi-Fi 接入点和移动设备之间在网络上更方便地进行互相搜索,并为数据共享、通信和娱乐建立功能性的网络服务。
+
+#dmz
+dmz = DMZ
+dmz_setting = DMZ 设置
+dmz_note_info = 如果终端设备无法通过该设备运行网络应用程序,请启用 DMZ,在输入框输入该终端设备的 IP 地址。
+dmz_note_function = 您可以在该网页配置 DMZ 地址、启用或停用 DMZ 功能。
+
+#Device Information
+max_access_num = 最大连接数
+lan_domain = 局域网域名
+sim_serial_number = SIM卡卡号
+software_version = 软件版本
+firmware_version = 固件版本
+hardware_version = 硬件版本
+imei = IMEI
+imsi = IMSI
+iccid = ICCID
+wan_ip_address = WAN IP 地址
+ipv6_wan_ip_address = WAN IPv6 地址
+network_name_ssid1 = 网络名称 (主SSID)
+pass_phrase_ssid1 = 密码 (主SSID)
+max_access_num_ssid1 = 最大连接数 (主SSID)
+network_name_ssid2 = 网络名称 (副SSID)
+pass_phrase_ssid2 = 密码 (副SSID)
+max_access_num_ssid2 = 最大连接数 (副SSID)
+
+#port map
+port_map = 端口映射
+port_map_basic = 基本设置
+port_map_setting = 端口映射设置
+source_port = 源端口
+dest_port = 目的端口
+port_map_list = 当前映射规则
+port_map_note_info = 配置端口映射以启用外部计算机,访问局域网提供的网络、FTP 或其他服务。
+port_map_note_port = 源端口/目的端口:提供服务的计算机端口。
+port_map_note_dest_ip_address = 目的 IP 地址:指定一台加入局域网的计算机以提供服务。
+port_map_note_protocol = 协议:由服务应用的协议。
+port_map_note_comment = 注释:输入用于端口映射规则的注释。有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ 。
+
+#USSD Info
+USSD = USSD
+ussd = USSD
+ussd_send_to = 发送
+ussd_send = 发送
+ussd_cancel = 取消
+ussd_reply_to = 回复
+ussd_reply = 回复
+ussd_contents = 内容
+ussd_timeout = 网络超时!
+ussd_operation_timeout = 操作超时!
+ussd_no_service = 无网络服务!
+ussd_retry = 操作失败!请重试!
+ussd_unsupport = 不支持 USSD 功能!
+ussd_info_error = 获取信息出错!
+ussd_fail = 操作失败!
+ussd_error_input = 输入有误!
+ussd_note1 = 您可以向网络发送一条指令(已预先制定的数字或者符号),网络将会根据指令给您提供相应的服务。
+
+#dlna setting
+dlna_setting = DLNA 设置
+dlna_language = 语言
+dlna_language_chinese = 中文
+dlna_language_english = 英文
+dlna_device_name = 设备名称
+dlna_media_type = 共享媒体类型
+dlna_media_info = 共享设置
+dlna_audio = 音乐
+dlna_image = 图片
+dlna_video = 视频
+dlna_rescan = 重新扫描
+dlna_note_info = 当 SD 卡可用或者 HTTP 共享模式启用时,您可以设置数字生活网络联盟 (DLNA)。
+dlna_note_httpshare = 您可以设置要在该网页上共享的数字媒体服务器 (DMS) 语言、设备名称和媒体类型。
+dlna_note_rescan = 为了使 DLNA 多媒体文件数据库与 SD 卡保持同步,建议重新扫描。
+
+#nosimcard
+no_sim_card_title = 系统信息
+no_sim_card_message = 没有 SIM卡或者 SIM卡无效!
+
+#network_locked
+network_locked = 网络被锁!
+network_locked_explain = 设备的网络被锁,请联系您的服务提供商获取解锁码。
+network_locked_times_explain = 解锁码输入剩余次数:
+network_locked_enter_explain = 请输入解锁码:
+network_locked_zero_times = 网络被锁,请联系您的服务提供商。
+
+#update_info
+update_info = 升级信息
+update_no_info = 当前已是最新版本
+update_new_version_found = 有新版本可用
+update_current_version = 当前版本
+update_new_version = 新版本
+update_link_prompt = 点击下面的链接下载升级工具
+update_skip_btn = 应用
+update_id_skip_info = 如果不想升级至此版本,请点击“跳过”按钮
+update_remind = 有新版本时提醒我。
+update_management = 更新管理
+update_log = 问题解决
+update_note = 备注
+update_notice = 发现新版本。通过“设置->设备设置->更新管理”查看详情。
+update_note_info = 点击链接以下载对应系统的更新工具。
+update_note_install = 解压更新工具并运行,进行版本更新。
+update_note_linux = Linux 系统不支持在线升级。如需升级,请在 Windows 系统或 Mac 上完成。
+update_status = 状态
+update_settings = 升级
+wifi_connect_alert = 您只能通过以太网升级。
+
+#AP_Station
+ap_station = Internet Wi-Fi
+ap_station_switch = Internet Wi-Fi 开关
+ap_station_wlan_mode = 首选网络
+ap_station_wifi_prior = Wi-Fi
+ap_station_3g_prior = WWAN
+ap_station_current_status = 当前状态
+ap_station_wlan_connected = Wi-Fi 已连接
+ap_station_wan_connected = WAN 已连接
+ap_station_no_connection = 无任何连接
+ap_station_hotspot_list = Wi-Fi 热点
+ap_station_connect = 连接
+ap_station_disconnect = 断开连接
+ap_station_add_hotspot = 添加 Wi-Fi 热点
+ap_station_edit_hotspot = 编辑 Wi-Fi 热点
+ap_station_show_password = 显示密码
+ap_station_encrypt_type = 加密方式
+ap_station_wep_keys = WEP密钥
+ap_station_encrypt_type_none = 不加密
+ap_station_encrypt_type_wep = WEP
+ap_station_wep_key_type_ascii = ASCII
+ap_station_wep_key_type_hex = HEX
+ap_station_cipher = WPA算法
+ap_station_cipher_TKIP = TKIP
+ap_station_cipher_AES = AES
+ap_station_cipher_AUTO = AUTO
+ap_station_security_mode_OPEN = OPEN
+ap_station_security_mode_WPAPSKWPA2PSK = WPA-PSK/WPA2-PSK
+ap_station_security_mode_SHARED = SHARED
+ap_station_security_mode_WPAPSK = WPA-PSK
+ap_station_security_mode_WPA2PSK = WPA2-PSK
+ap_station_security_mode_EAPAKASIM = EAP-AKA/SIM
+ap_station_security_mode_EAP-SIM/AKA = EAP-SIM/AKA
+ap_station_security_mode_WPA3Personal = WPA3-Personal
+ap_station_security_mode_WPA2WPA3 = WPA2(AES)/WPA3-Personal
+ap_station_wep_default_key = 网络密钥
+ap_station_wep_key = WEP密钥
+ap_station_wep_key_0 = 密钥 1
+ap_station_wep_key_1 = 密钥 2
+ap_station_wep_key_2 = 密钥 3
+ap_station_wep_key_3 = 密钥 4
+ap_station_exceed_list_max = 最多可添加 {0} 个热点!
+ap_station_search_hotspot_fail = 搜索热点失败!
+ap_station_connect_change_alert = WAN连接将断开,要继续吗?
+ap_station_update_fail = 操作失败,该热点处于连接状态。
+ap_station_enable_confirm = 当Internet Wi-Fi使用时多重网络名称不能使用。如果开启Internet Wi-Fi,多重网络名称将自动关闭,是否修改设置?
+ap_station_processing = 后台忙,请重试。
+ap_station_exist = 存在同名热点。
+ap_connect_error = 无法连接上热点 {0}!
+
+#fastboot
+fastboot = 快速开机
+fastboot_setting = 快速开机设置
+fastboot_note = 如果启用了快速开机功能,设备将花费较短的时间开机。
+
+#notes
+wifi_channel_bandwidth = 频带宽度
+
+home_note = 表格中显示了已连接的无线终端设备信息。
+
+sms_setting_note_validity = 有效期:设置外发短信的有效期。
+sms_setting_note_center_number = 中心号码:请输入短信中心号码。如需详情请联系您的服务提供商。
+sms_setting_note_delivery_report = 发送报告:当短信已送达收件人时,接收或者拒绝送达提示。
+
+apn_note_whole_page = 您可以在该网页设置接入点名称 (APN)。
+apn_note_mode = 模式:如果您的服务提供商向您提供了固定的 APN,请选择“手动 APN”。如果没有提供,请选择“自动 APN”,该设备将会自动获取参数。
+apn_note_profile = 配置文件:包含了一个或多个配置文件名称。
+apn_note_pdp_type = PDP 类型:IPv4/IPv6/IPv4&IPv6。
+apn_note_profile_name = 配置文件名称:有关您指定的新的配置文件的名称。
+apn_note_apn = APN:接入点名称。有效字符包含:0-9 a-z A-Z . - 且开头和结尾不能是 . 或者 - 。
+apn_note_dns_mode = DNS 模式:如果您的服务提供商向您提供了固定的 IP 地址,请选择“手动 DNS”,如果没有提供,请选择“自动 DNS”,该设备将会自动获取参数。
+apn_note_authentication = 鉴权方式:由您的互联网服务提供商 (ISP) 来提供。密码验证协议 (PAP) 不用加密就可以通过两次握手建立对端的身份。询问握手认证协议(CHAP)通过三次握手周期性的校验对端的身份。
+apn_note_username = 用户名:用于建立连接时,从互联网服务提供商处获取验证。
+apn_note_password = 密码:用于建立连接时,从互联网服务提供商处获取验证。
+apn_note_set_default = 点击“设为默认”以将该配置文件设置为默认配置文件。
+
+wifi_basic_note_multi_ssid_switch = 多重网络名称开关:可以同时使用 2 个网络名称。
+wifi_basic_note_network_name = 网络名称(SSID):SSID可以简单地理解为无线网络的名称。修改SSID时,请在本框中输入一个最多不超过32个字符的字符串,该字符串由数字、字母(a-z、A-Z)、特殊字符(!#()+-./%=?@^_{|}~)和空格,且开头和结尾不能是空格。
+wifi_basic_note_network_name_input = 网络名称的有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ 和空格且开头和结尾不能是空格。
+wifi_basic_note_broadcast = SSID 广播:启用后,设备将会广播其无线网络标识(SSID)。这样附近的计算机或其他无线客户端即可搜索到本路由器的无线信号并连接到该设备。
+wifi_basic_note_security_mode = 安全模式:
+wifi_basic_note_no_encryption = OPEN:无数据加密。这可能会导致网络被他人滥用,因此不推荐使用此方式。
+wifi_basic_note_shared = SHARED(WEP):链路认证方式为共享密钥认证方式,加密方式为WEP加密。
+wifi_basic_note_wpa_psk_aes = WPA2(AES)-PSK: WPA2(AES)-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。
+wifi_basic_note_wpa_psk = WPA-PSK/WPA2-PSK:WPA 预共享密钥 (WPA-PSK)。WPA2-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。
+wifi_basic_note_wpa3 = WPA3-Personal:WPA2加密协议的升级版本。
+wifi_basic_note_wpa2_wpa3 = WPA2(AES)/WPA3-Personal: WPA2-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。WAP3是WPA2加密协议的升级版本。
+wifi_basic_note_pass_phrase = 密码:密码的有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~
+wifi_basic_note_max_station_number1 = 最大接入数:通过本操作,可以选择连接到该设备的最大无线终端接入数。通过Internet Wi-Fi功能连接的Wi-Fi热点也属于该设备的无线终端接入设备。
+wifi_basic_note_max_station_number = 最大接入数:通过本操作,可以选择连接到该设备的最大无线终端接入数。
+
+wifi_advanced_note_whole_page = 您可以在该网页设置 Wi-Fi 高级字符。
+wifi_advanced_note_band_selection = 频段选择:您可以为您的设备选择合适的频段。
+wifi_advanced_note_network_mode = 网络模式:选择合适的无线网络模式,该设备的无线性能会提高。
+wifi_advanced_note_country_code = 国家/地区码:您可以为您的设备选择合适的国家/地区码。
+wifi_advanced_note_frequency = 信道:选择合适的频道来优化Wi-Fi网络性能和覆盖范围。
+
+ap_station_note_info = 请确保您所连接的 Wi-Fi 热点的IP地址段与本设备的IP地址段不在同一范围内,否则您将无法通过该 Wi-Fi 热点连接网络。
+ap_station_note_disable_info = 如果开启“多重网络名称”,Internet Wi-Fi 功能将会停用。
+ap_station_on_info = Internet Wi-Fi 功能启用时无法进行该操作!
+
+wif_filter_note1 = 无线局域网地址过滤规则设置。
+wif_filter_note2 = 无规则:不启用无线局域网地址过滤规则。
+wif_filter_note3 = 白名单:允许MAC地址列表中的用户通过无线网络与本设备连接。
+wif_filter_note4 = 黑名单:不允许MAC地址列表中的用户通过无线网络与本设备连接。
+
+#restart
+restart = 重启
+restart_button = 重启设备
+restart_confirm = 确定重启设备吗?
+restarting = 设备重启中
+
+#diconneted_operate_note
+diconneted_operate_note = 要更改当前设置,请断开网络连接。
+diconneted_network_confirm = 当前操作将会断开网络,是否继续?
+
+#ota_update
+ota_update = 更新管理
+ota_title = 更新
+ota_no_new_version = 没有发现新版本。
+ota_new_version = 发现新版本,是否更新?
+ota_connect_server = 正在连接服务器
+ota_connect_server_successfully = 连接服务器成功
+ota_downloading = 正在下载...
+ota_download_failed = 下载失败
+ota_no_network = 无网络
+ota_network_disconnected = 请连接网络后更新!
+ota_interrupted_alert = 发现新版本,请登陆后更新!
+ota_interrupted = 是否恢复上次被中断的下载任务?
+ota_download_success = 下载完成,设备将重启,请稍候。升级过程中请不要断电、恢复出厂设置或关机。
+ota_pkg_download_success = 升级包已存在,设备将重启,请稍候。升级过程中请不要断电、恢复出厂设置或关机。
+ota_update_success = 更新成功。
+ota_update_failed = 更新失败。
+ota_connect_server_failed = 无法连接到服务器
+ota_download_warning = 请保持电量充足;请不要强制中断下载。
+ota_update_warning = 注意事项:请不要强制中断更新。
+ota_cancel = 更新已取消!
+ota_pkg_exceed = 更新包太大!
+ota_have_cancel = 你已经选择取消了!
+ota_roamming = 您尚未开启漫游设置。要开启漫游功能,请勾选本页复选框。
+ota_low_battery = 下载成功,设备电量不足,请充电后再升级!
+ota_pkg_low_battery = 升级包已存在,设备电量不足,请充电后再升级!
+ota_md5_error = 检测更新包失败。
+ota_version = 版本:
+ota_update_setting = 自动检测设置
+ota_auto_update_switch = 自动检测新版本
+ota_update_interval_day = 自动检测周期
+ota_roaming_setting = 漫游设置
+ota_update_roaming_remind = 勾选此项后,设备将在漫游状态下进行更新,并且会产生漫游费用。
+ota_update_manual = 检测新版本
+ota_check_new_version = 检测
+ota_check_new_version_desc = 点击“检测”按钮,立即检测新版本。
+ota_check_roaming_confirm = 当前处于漫游网络下,您确定要升级吗?
+ota_update_every_day = 每天
+ota_update_15_day = 15天
+ota_update_30_day = 30天
+ota_new_version_checking = 新版本检测中...
+ota_update_running = 检测已经在进行...
+ota_check_fail = 检测新版本失败!
+ota_manual_upgrade_url = 升级文件下载地址
+wefota_check_new_version = 检测新版本并升级
+fota_package_downloading = 检测到新版本,正在下载中,下载完成后会开始升级,请不要断电、恢复出厂设置或关机
+fota_package_no_new_version = 没有检测到新版本
+fota_package_already_download = 升级包已下载,待设备重启后完成升级
+software_upload = 软件升级
+local_upload = 本地升级
+upload_update_success = 升级文件上传成功,即将重启,请勿断电。
+upload_update_failed0 = 文件解析失败。
+upload_update_failed1 = 文件校验失败。
+upload_update_failed2 = 文件写入失败。
+upload_update_failed3 = 升级标志写入失败。
+upload_update_failed4 = Flash校验失败。
+error_file_selected = 请选择正确的升级文件
+upload_tip = 上传中,请勿关闭、刷新或多页面操作webui,直至重启。
+########CPE more wording##############
+opmode = 模式切换
+wds = WDS
+url_filter = URL过滤设置
+
+voip_settings = VoIP设置
+voip_user_details = 用户详情
+voip_advanced_settings = 高级设置
+voip_supplementary_service = 补充业务
+
+url_check = 无效的URL
+url_filter_check = 无效的URL过滤规则
+sntp_invalid_server_name = 无效的URL格式或者IP地址!
+server_alreay_exist = 该服务器已经存在!
+forwarding_uri_check = 无效值
+
+wifi_switch = Wi-Fi开关
+ap_isolation = AP 隔离
+#mac filter
+black_list = 黑名单
+black_list_switch = 黑名单开关
+block = 屏蔽
+black_list_max = 黑名单支持的最大个数是10!
+mac_repeat_tip = 请删除设置列表中重复的MAC地址!
+black_yourself_tip = 你不能屏蔽你自己!
+wifi_status11 = 用户数:11
+wifi_status12 = 用户数:12
+wifi_status13 = 用户数:13
+wifi_status14 = 用户数:14
+wifi_status15 = 用户数:15
+wifi_status16 = 用户数:16
+wifi_status17 = 用户数:17
+wifi_status18 = 用户数:18
+wifi_status19 = 用户数:19
+wifi_status20 = 用户数:20
+wifi_status21 = 用户数:21
+wifi_status22 = 用户数:22
+wifi_status23 = 用户数:23
+wifi_status24 = 用户数:24
+wifi_status25 = 用户数:25
+wifi_status26 = 用户数:26
+wifi_status27 = 用户数:27
+wifi_status28 = 用户数:28
+wifi_status29 = 用户数:29
+wifi_status30 = 用户数:30
+wifi_status31 = 用户数:31
+wifi_status32 = 用户数:32
+
+auto_connect = 自动连接
+manual_connect = 手动连接
+
+default_Gateway = 默认网关
+primary_dns = 首选 DNS
+secondary_dns = 备用 DNS
+gateway_check = 请输入有效的网关
+
+mac_filter_lable = MAC过滤规则
+
+wlan_mac_filter_0 = 无规则
+wlan_mac_filter_1 = 白名单
+wlan_mac_filter_2 = 黑名单
+black_enable= 黑名单
+white_list = 白名单
+white_enable = 白名单
+mac_white_address = MAC 地址
+max_white_list = 白名单最多只能添加6条。
+
+#SNTP
+local_current_time = 本地当前时间
+time_set_mode = 时间设置模式
+time_set_time_manual = 手动设置时间
+time_set_time_auto = 自动同步Sntp
+year = 年
+month = 月
+date = 日
+hour = 时
+minute = 分
+second = 秒
+sunday = 星期日
+monday = 星期一
+tuesday = 星期二
+wednesday = 星期三
+thursday = 星期四
+friday = 星期五
+saturday = 星期六
+stnp_server1 = SNTP 服务器1
+stnp_server2 = SNTP 服务器2
+stnp_server3 = SNTP 服务器3
+time_zone = 时区
+daylight_saving_time = 夏时制
+daylightsave_0 = 禁用
+daylightsave_1 = 启用
+sntp_syn_time_wan_connected = 联网后才可以使用sntp时间同步!
+operation_not_supported = 不支持该操作!
+network_terminated = 网络终止!
+upgrade_file_nomatch = 升级文件错误!
+upgrade_confirm = 您确认要升级吗?
+upgrading = 升级中,请稍等...
+upgrading_alert = 升级中,请勿切断电源。升级后,系统将会自动重启!
+upgrad_note = 请选择您要升级的版本,然后点击“应用”按钮后,开始升级。
+sntp_processing = 同步中,请稍等...
+sntp_req_success = 同步请求已发送!
+time_zone_<-12>12_0 = (GMT-12:00) 日界线西
+time_zone_SST11_0 = (GMT-11:00) 中途岛,萨摩亚群岛
+time_zone_<-10>10_0 = (GMT-10:00) 夏威夷
+time_zone_<-09>9_0 = (GMT-09:00) 阿拉斯加
+time_zone_PST8PDT,M3.2.0,M11.1.0_0 = (GMT-08:00) 太平洋时间(美国和加拿大),蒂华纳
+time_zone_<-07>7_0 = (GMT-07:00) 山地时间(美国和加拿大)
+time_zone_<-07>7_1 = (GMT-07:00) 亚利桑那
+time_zone_MST7MDT,M4.1.0,M10.5.0_2 = (GMT-07:00) 奇瓦瓦,拉巴斯,马扎特兰
+time_zone_<-06>6_0 = (GMT-06:00) 萨斯喀彻温
+time_zone_<-06>6_1 = (GMT-06:00) 中部时间(美国和加拿大)
+time_zone_<-06>6_2 = (GMT-06:00) 中美洲
+time_zone_<-06>6_3 = (GMT-06:00) 瓜达拉哈拉,墨西哥城,蒙特雷
+time_zone_<-05>5_0 = (GMT-05:00) 波哥大,利马,基多
+time_zone_<-05>5_1 = (GMT-05:00) 东部时间(美国和加拿大)
+time_zone_EST5EDT,M3.2.0,M11.1.0_2 = (GMT-05:00) 印第安纳州(东部)
+#time_zone_-4.5 = (GMT-04:30)
+time_zone_AST4ADT,M3.2.0,M11.1.0_0 = (GMT-04:00) 大西洋时间(加拿大)
+time_zone_<-04>4_1 = (GMT-04:00) 加拉加斯,拉巴斯
+time_zone_<-04>4<-03>,M8.2.6/24,M5.2.6/24_2 = (GMT-04:00) 圣地亚哥
+time_zone_NST3:30NDT,M3.2.0,M11.1.0_0 = (GMT-03:30) 纽芬兰
+time_zone_<-03>3_0 = (GMT-03:00) 巴西利亚
+time_zone_<-03>3_1 = (GMT-03:00) 布宜诺斯艾利斯,乔治敦
+time_zone_<-03>3_2 = (GMT-03:00) 格陵兰
+time_zone_<-02>2_0 = (GMT-02:00) 中大西洋
+time_zone_<-01>1_0 = (GMT-01:00) 佛得角群岛
+time_zone_<-01>1<+00>,M3.5.0/0,M10.5.0/1_1 = (GMT-01:00) 亚速尔群岛
+time_zone_GMT0IST,M3.5.0/1,M10.5.0_0 = (GMT) 格林威治标准时间:都柏林,爱丁堡,伦敦,里斯本
+time_zone_WET0WEST,M3.5.0,M10.5.0/3_1 = (GMT) 卡萨布兰卡,蒙罗维亚
+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_0 = (GMT+01:00) 阿姆斯特丹,柏林,伯尔尼,罗马,斯德哥尔摩,维也纳
+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_1 = (GMT+01:00) 贝尔格莱德,布拉迪斯拉发,布达佩斯,卢布尔雅那,布拉格
+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_2 = (GMT+01:00) 布鲁塞尔,哥本哈根,马德里,巴黎
+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_3 = (GMT+01:00) 萨拉热窝,斯科普里,华沙,萨格勒布
+time_zone_<+01>-1_4 = (GMT+01:00) 中非西部
+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_0 = (GMT+02:00) 布加勒斯特
+time_zone_CAT-2_1 = (GMT+02:00) 哈拉雷,比勒陀利亚
+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_2 = (GMT+02:00) 赫尔辛基,基辅,里加,索非亚,塔林,维尔纽斯
+time_zone_EET-2_3 = (GMT+02:00) 开罗
+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_4 = (GMT+02:00) 雅典,贝鲁特,伊斯坦布尔,明斯克
+time_zone_IST-2IDT,M3.4.5/02:00:00,M10.5.0/02:00:00_5 = (GMT+02:00) 耶路撒冷
+time_zone_<+03>-3_0 = (GMT+03:00) 巴格达
+time_zone_<+03>-3_1 = (GMT+03:00) 科威特,利雅得
+time_zone_<+03>-3_2 = (GMT+03:00) 莫斯科,圣彼得堡,伏尔加格勒
+time_zone_EAT-3_3 = (GMT+03:00) 内罗毕
+time_zone_<+0330>-3:30<+0430>,J80/0,J264/0_0 = (GMT+03:30) 德黑兰
+time_zone_<+04>-4_0 = (GMT+04:00) 阿布扎比,马斯喀特
+time_zone_<+04>-4_1 = (GMT+04:00) 巴库,第比利斯,埃里温
+time_zone_<+0430>-4:30_0 = (GMT+04:30) 喀布尔
+time_zone_<+05>-5_0 = (GMT+05:00) 叶卡捷琳堡
+time_zone_PKT-5_1 = (GMT+05:00) 伊斯兰堡,卡拉奇,塔什干
+time_zone_<+0530>-5:30_0 = (GMT+05:30) 马德拉斯,加尔各答,孟买,新德里
+time_zone_<+0545>-5:45_0 = (GMT+05:45) 加德满都
+time_zone_<+06>-6_0 = (GMT+06:00) 阿拉木图,新西伯利亚
+time_zone_<+06>-6_1 = (GMT+06:00) 阿斯塔纳,达卡
+time_zone_<+06>-6_2 = (GMT+06:00) 斯里哈亚华登尼普拉
+time_zone_<+0630>-6:30_0 = (GMT+06:30) 仰光
+time_zone_<+07>-7_0 = (GMT+07:00) 克拉斯诺亚尔斯克
+time_zone_<+07>-7_1 = (GMT+07:00) 曼谷,河内,雅加达
+time_zone_CST-8_0 = (GMT+08:00) 北京,重庆,香港特别行政区,乌鲁木齐
+time_zone_<+08>-8_1 = (GMT+08:00) 吉隆坡,新加坡
+time_zone_AWST-8_2 = (GMT+08:00) 珀斯
+time_zone_CST-8_3 = (GMT+08:00) 台北
+time_zone_<+08>-8_4 = (GMT+08:00) 伊尔库茨克,乌兰巴图
+time_zone_JST-9_0 = (GMT+09:00) 大阪,札幌,东京
+time_zone_KST-9_1 = (GMT+09:00) 汉城
+time_zone_<+09>-9_2 = (GMT+09:00) 雅库茨克
+time_zone_ACST-9:30ACDT,M10.1.0,M4.1.0/3_0 = (GMT+09:30) 阿德莱德
+time_zone_ACST-9:30_1 = (GMT+09:30) 达尔文
+time_zone_AEST-10_0 = (GMT+10:00) 布里斯班
+time_zone_<+10>-10_1 = (GMT+10:00) 弗拉迪沃斯托克
+time_zone_<+10>-10_2 = (GMT+10:00) 关岛,莫尔兹比港
+time_zone_AEST-10AEDT,M10.1.0,M4.1.0/3_3 = (GMT+10:00) 霍巴特
+time_zone_AEST-10AEDT,M10.1.0,M4.1.0/3_4 = (GMT+10:00) 堪培拉,墨尔本,悉尼
+time_zone_<+11>-11_0 = (GMT+11:00) 马加丹,所罗门群岛,新喀里多尼亚
+time_zone_<+12>-12_0 = (GMT+12:00) 奥克兰,惠灵顿
+time_zone_<+12>-12_1 = (GMT+12:00) 斐济,勘察加半岛,马绍尔群岛
+time_zone_<+13>-13_0 = (GMT+13:00) 努库阿洛法
+
+#operation mode
+opmode_auto = 自动模式
+opmode_bridge = 桥模式
+opmode_cable = 有线宽带模式
+opmode_gateway = 无线宽带模式
+EthPort_Status = 以太网端口状态
+change_mode = 选择模式
+current_mode = 当前模式:
+change = 改变
+change_mode_alert = 有线宽带模式只能使用Wi-Fi访问,请记住Wi-Fi SSID和密码!要继续吗?
+
+opmode_msg1 = 无线宽带模式下请将公网网线拔掉。
+opmode_msg2 = 改变工作模式后,设备会自动重启。
+#pppoe dial
+pppoe_mode = PPPoE
+pppoe_success = PPPoE拨号成功
+pppoe_fail = PPPoE拨号失败
+pppoe_processing = 正在进行PPPoE拨号
+static_success = 配置静态IP成功
+static_fail = 配置静态IP失败
+static_processing = 正在获取静态IP
+dyn_success = 动态获取IP成功
+dyn_fail = 动态获取IP失败
+dyn_processing = 正在获取动态IP
+pppoe_msg = 公网网线未连上
+pppoe_message_send_fail = 消息发送失败!
+ip_gate_not_same = IP地址和默认网关不可以相同!
+ip_innergate_not_same = IP地址和局域网的IP地址不可以在同一网段中!
+auto_success = 自动拨号成功
+auto_fail = 自动拨号失败
+auto_processing = 正在进行自动拨号
+#url filter
+url_filter_list = 当前系统的URL过滤规则
+url_filter_max = URL过滤规则最大数量为{0}
+url_repeated = URL已经存在。
+url_note1 = 您可以设置网页地址的过滤以过滤一些不良的网站(不支持https过滤)。
+url_note2 = URL:设置需要过滤的url地址。
+url_note3 = URL:最大长度为32。
+
+#wds
+wds_mode = WDS模式
+wds_mode_0 = 禁用
+wds_mode_1 = RootAP 模式
+wds_mode_2 = Bridge 模式
+wds_mode_3 = Repeater 模式
+repeater_ssid = Repeater SSID
+wpa_algorithms = WPA算法
+enable_wds_confirm = 如果开启WDS,那么Wi-Fi基本设置将被禁用,继续吗?
+#sys log
+sys_log = 系统日志
+log_setting = 日志设置
+syslog_mode_all = 所有
+syslog_mode_wan_connect = WAN Connect
+syslog_mode_sms = SMS
+syslog_mode_tr069 = tr069
+syslog_mode_voip = VoIP
+syslog_mode_dlna = DLNA
+syslog_mode_wlan = Wi-Fi
+syslog_mode_router = Router
+view_log = 查看日志
+log_info = 日志信息
+
+#add at 2013.6.20
+periodic_inform = 周期性通知
+periodic_inform_interval = 周期性通知间隔
+periodic_inform_time = 周期性通知时间
+certificate_import = 证书
+import_certificate_btn = 导入
+certificate_file_nomatch = 证书文件错误
+#voip setting
+outbound_mode = Outbound模式
+outbound_server = Outbound服务器
+outbound_port = Outbound端口
+stun_mode = STUN模式
+stun_server = STUN服务器
+register_every = 注册有效期
+advanced_options = 高级选项
+sip_port = SIP端口
+rtp_port = RTP端口
+voip_outbound_port_check = 无效端口
+voip_time_check = 注册时间无效
+timeRange = [1,3600]秒
+voip_sip_port_check = 无效端口
+voip_port_compare = 无效的端口范围
+warn_information = VoIP参数设置成功,请重新注册。
+#voip user details
+user_details_title = SIP服务器和配置
+sip_register_server = SIP注册服务器
+sip_domain = SIP域
+sip_realm = SIP范围
+sip_proxy_mode = SIP代理模式
+sip_proxy_server = SIP代理服务器
+authorization = 鉴权
+display_name = 显示名称
+authorized_user_name = 鉴权用户名
+authorized_password = 授权密码
+voip_register_status = VoIP注册状态
+register_failed = 注册失败
+register_success = 注册成功
+register_connecting = 注册连接中
+unregister = 注销成功
+deregister = 注销
+sip_domain_check = SIP域地址无效!
+sip_realm_check = SIP域无效!
+sip_proxy_server_check = 代理服务器无效!
+display_name_check = 显示名称无效!
+authorized_username_check = 鉴权用户名无效!
+account_password_check = 密码无效!
+#voip advanced settings
+sip_advanced_options = 高级选项
+adv_sip_t38 = T.38传真编码
+sip_dtmf = DTMF
+voip_sip_dtmf_method_inband = InBand
+voip_sip_dtmf_method_rfc2833 = RFC2833
+voip_sip_dtmf_method_sipinfo = SIPInfo
+sip_encoder = 编码
+voip_sip_encoder_method_0 = G.711 u-Law
+voip_sip_encoder_method_1 = G.711 a-Law
+voip_sip_encoder_method_2 = G.722
+voip_sip_encoder_method_3 = G.729
+voip_sip_encoder_method_4 = G.726-16kps
+voip_sip_encoder_method_5 = G.726-24kps
+voip_sip_encoder_method_6 = G.726-32kps
+voip_sip_encoder_method_7 = G.726-40kps
+sip_vad = VAD
+sip_cng = CNG
+#voip supplementary service
+sip_protocol_voip = VoIP补充业务
+sip_protocol_call_forw = 呼叫转移
+voip_forwarding_mode_1 = 无条件呼叫转移
+voip_forwarding_mode_2 = 遇忙转移
+voip_forwarding_mode_3 = 无应答转移
+voip_forwarding_mode_0 = 禁止所有转移
+sip_protocol_forw_uri = 发送URI
+show_msg = 请在电话上按'*80'!
+sip_protocol_incoming_call = 免扰功能
+sip_protocol_call_waiting = 呼叫等待
+wds_note = WDS:无线分布式系统
+#voip user details
+connect_note = 请先连接网络,再使用VOIP功能!
+#fota
+upgrade_pack_fix_success = 升级成功!
+upgrade_pack_fix_failed = 升级失败!
+have_new_version = 发现新版本,设备将升级。
+upload_file = 文件上传中!
+update_status_error = 获取更新状态文件失败,无法升级!
+verify_error = 校验文件失败,无法升级!
+start_update = 校验升级文件成功,正在升级中,请不要断电、恢复出厂设置或关机!
+
+######key same value different###########
+dmz_note_info = 如果终端设备无法通过该设备运行网络应用程序,请启用 DMZ,在输入框输入该终端设备的 IP 地址。
+dlna_note_info = DLNA: 数字生活网络联盟。
+dlna_note_httpshare = 您可以设置要在该网页上共享的数字媒体服务器 (DMS) 设备名称和媒体类型。
+#############串口转网口###################
+switch_port_title = 网口转串口
+open_serial_port = 开启网口转串口
+close_serial_port = 关闭网口转串口
+switching = 转换中...
+##############定时重启功能wording###################
+restart_schedule = 定时重启
+enable_reboot_switch = 启动定时重启功能
+restart_schedule_time = 定时重启时间
+enable_reboot_byday = 按天自动重启
+enable_reboot_byweek = 按周自动重启
+enable_reboot_bymonth = 按月自动重启
+synchronized = 已同步
+unsynchronized = 未同步
+week = 星期
+eyeryday = 每日
+login_password_length_check = 请输入至少4位字符。
+system_time_not_syn = 系统时间未同步!
+fota_note1 = 您可以为您的设备设置自动检测周期,使设备定时自动检测是否有新版本的软件。
+local_note = 您可以选择本地电脑中的升级文件,将设备软件升级到选中的版本,完成系统修复和优化。
+
+#new word
+modify_password = 登录设置
+
+#家长控制
+parental_control = 家长控制
+pc_children_group = 儿童组设备
+pc_children_group_manage = 儿童组管理
+pc_manage = 管理
+pc_no_children_device = 没有设置儿童组设备
+pc_children_group_desc = 添加到儿童组的所有设备将受到上网规则的限制
+pc_edit_host_name = 修改主机名:
+pc_internet_rule = 上网规则
+pc_time_limited = 上网时间设置
+pc_site_white_list = 网站白名单
+pc_manage_children_group = 管理儿童组设备
+pc_current_attached_devices =当前接入设备
+pc_action = 操作
+pc_remove = 移除
+pc_remove_all = 移除所有
+pc_add = 添加
+pc_leave = 离开
+pc_add_white_site = 添加白名单
+pc_in_child_group = 已在儿童组
+pc_forbid_time = 禁止上网时段
+pc_allow_time = 允许上网时段
+pc_setting_desc =可用鼠标点按设置禁止或允许上网时段
+pc_name = 网站名
+pc_link = 链接
+pc_not_save = 数据还未保存,请注意保存。
+pc_link_exist = 链接已存在!
+no_data = 没有数据
+sun = 周日
+mon = 周一
+tues = 周二
+wed = 周三
+thur = 周四
+fri = 周五
+sat = 周六
+
+#定时休眠唤醒
+tsw_settings = 定时休眠唤醒设置
+tsw = 定时休眠唤醒
+time_sleep_wake_up = 定时休眠唤醒设置
+tsw_timer_on = 定时唤醒时间
+tsw_timer_off = 定时休眠时间
+tsw_sys_time_mode_alert = 请先连接网络,使SNTP同步服务器时间后即可设置。
+tsw_time_interval_alert = 时间间隔不得小于10分钟。
+
+#new wording
+advanced_settings = 高级设置
+others = 其他
+others_restart_reset = 重启与复位
+others_note_info = 当重启或复位路由器后,你需要重新登陆
+
+pwd_sub_title = 管理你的无线路由器有关信息
+pwd_note = 当你登陆无线路由器时,需要输入此密码(不同于你的无线网络密码)
+current_network = 当前网络
+
+wifi_wireless_settings = Wi-Fi设置
+wifi_main_sub_title = 建立你的无线热点,以供手机或笔记本等无线设备上网使用
+wifi_broadcast_desc = SSID 广播
+wifi_isolated_desc = 将所有的无线客户端设备完全隔离
+
+detail_info = 详细信息
+sd_u_share = U盘共享
+
+settings_wireless = 设置无线内网
+settings_internet = 设置外网连接
+not_connect_network = 未连接网络
+
+traffic_data_plan = 流量统计
+traffic_pie_title = 流量套餐
+traffic_sub_title = 您可以在该页面创建流量计划、查询已用流量及剩余流量
+traffic_used = 已使用
+traffic_used_text = {0} 已使用
+traffic_limit_data = 流量套餐
+traffic_limit_data_text = {0} 流量套餐
+traffic_alert_reach_text = 当达到{0}%,{1} 时提醒我
+traffic_data_left_text = {0} 剩余
+traffic_when = 当达到
+traffic_remind_me = %,时提醒我
+traffic_remind_me_time = ,时提醒我
+traffic_limit_time_text = {0}套餐
+traffic_limit_time_h = {0} 小时套餐
+traffic_limit_time_m = {0} 分钟套餐
+traffic_not_set_limited = 未设置流量套餐,点按设置
+
+echarts_used = 已使用
+echarts_left1 = 未使用
+echarts_alert = 提醒值
+echarts_alarm = 已使用(超出提醒值)
+echarts_free = 未使用
+echarts_full = 流量超出
+echarts_no = 未设置
+
+3g = 3G
+wan = WAN
+connection_mode = 联网模式
+wireless_access_device = 无线接入设备
+cable_access_device = 有线接入设备
+station_info_sub_title = 本页面显示了连接到本路由器的所有无线终端,其中包括无线终端的设备名称、MAC(介质访问控制)地址
+station_info_desc = 更多的权限控制选项,请查看
+
+device_unit = 台
+ota_last_update_check = 最后更新时间:
+main_ssid_num = 主 SSID ({0})
+guest_ssid_num = 副 SSID ({0})
+wifi_slider_desc = * 拖动进度条已调整各SSID最大可接入数量
+wif_guest_disabled = 副SSID 没有开启
+
+phone_number = 号码
+equalToPin = 两次输入的PIN码不一致
+equalToPassword = 两次输入的密码不一致
+
+pppoe_mode_type_PPPOE = PPPoE
+pppoe_mode_type_STATIC = 静态IP
+pppoe_mode_type_DHCP = 动态IP
+pppoe_mode_type_AUTO = 自动
+
+tsw_note = 定时休眠唤醒功能,当定时休眠唤醒功能打开时,设备将进入休眠状态,此时设备的Wi-Fi功能将会自动关闭。
+tsw_note_on = 定时唤醒时间:您可以设置设备唤醒时间。
+tsw_note_off = 定时休眠时间:您可以设置设备定时休眠时间。
+
+parent_control_note_kids = 儿童组设备:显示当前儿童组设备。
+parent_control_note_manage = 儿童组管理:管理儿童组设备,您可以从当前连接设备列表添加儿童组设备。
+parent_control_note_time = 上网时间设置:设置儿童上网时间规则,即允许儿童设备上网的时间。
+parent_control_note_whitelist = 网站白名单:设置网站白名单,即允许儿童设备访问的网站。
+parent_control_note_siteName = 白名单网站名不能包含以下字符: < > [ ] * $ & : , ; " ' ` / \\ | ? ¥
+parent_control_note_siteLink = 白名单链接输入时请以“http://”或“https://”开头。
+firewal_note = 注意:防火墙相关的规则设置,可能不会立即生效,需等待几分钟或重启设备,如需立即生效,建议重启设备。
+
+wan_note_dial = 拨号方式:
+wan_note_connection_mode = 请为您的设备设置合适的网络连接方式:
+wan_note_connection_mode_pppoe = PPPoE:通过PPPoE方式接入外网,您需要向您的运营商咨询PPPoE用户名和密码。
+wan_note_connection_mode_dhcp = 动态IP:通过动态IP地址方式接入外网。
+wan_note_connection_mode_static = 静态IP:通过设置静态IP地址的方式接入外网,您需要设置IP地址、子网掩码、默认网关、首选DNS及备用DNS。
+wan_note_user_name = 用户名:填写您的PPPoE帐号。
+wan_note_password = 密码:填写您的PPPoE密码。
+wan_note_connection_mode_auto = 自动:自动选择动态IP或PPPoE方式接入外网,您需要向您的运营商咨询PPPoE用户名和密码。
+
+wps_pin_validator = 请输入有效的PIN码
+device_rename = 请输入有效的名称。
+
+turnoff_button = 关机
+others_turn_off = 关机
+turnoff_confirm = 确定关机吗?
+turnoff = 关机中...
+setting_no_change = 您的设置未发生变化。
+Extend_accessDevice = WIFI最大接入数不能小于当前接入设备数。
+TBcheck = 请输入一个介于1和4095之间的值。
+apn_pdptype_change_note = 如果该设置被改变,通过域名 {0} 访问Web页面可能存在打不开的风险,这时候请尝试 {1} 来访问。
+apn_alert = 当前操作将会重启设备。是否继续?
+apn_alert_restart = 默认APN设置成功,设备正在重启。
+apn_diconneted_network_confirm = 当前操作将会断开网络,是否继续?
+
+#super
+super = 锁小区设置
+lockCell_settings = 锁小区设置
+v4_settings = 机卡互锁 (V4 加密)
+
+cell_id1 = Cell Id 1
+cell_id2 = Cell Id 2
+cell_id3 = Cell Id 3
+cell_id4 = Cell Id 4
+cell_id5 = Cell Id 5
+
+v4_check = 无效字符,只能输入 0-9、a-z、A-Z
+v4_note = 您的设置将在设备重启后生效,您要继续吗?
+export_title = 导出设置
+band_3 = 频段 3
+band_8 = 频段 8
+band_38 = 频段 38
+band_39 = 频段 39
+band_40 = 频段 40
+band_info = 频段设置
+cell_id = 当前注册的小区
+cellid = CELLID
+lock_apply = 加锁
+unlock_apply= 解锁
+band_cell_settings = 频段小区设置
+export = 导出
+sinr = SINR
+cell_not_correct = 非锁定小区,联网失败!
+cell_id_lock = 已锁定的小区
+
+sip_uri_format = URI 模式
+user_name = 用户名
+pin_v4_encrypt = PIN 加密
+wep_cannot_2040 = 当主SSID或者副SSID的安全模式是OPEN (WEP)或者SHARED的时候,频带宽度不能是20MHz/40MHz!
+2040_cannot_wep = 当频带宽度是20MHz/40MHz的时候,SSID的安全模式不能为OPEN (WEP)或者SHARED。
+wifi_device_busy = Wi-Fi驱动繁忙中,请稍等...
+v4_settings = 机卡互锁 (V4 加密)
+manufactory_code = 厂商代码
+key_version_number = 密钥版本号
+key_value = 密钥值
+
+LockCell_note1 = 锁小区功能是用于对LTE网络的小区锁定,当前注册小区与锁定小区一致时允许联网,当前注册小区与锁定小区不一致时禁止发起联网。
+LockCell_note2 = 锁定小区功能开启且保存的锁定小区不为空时,每天开机和定时(8:00/14:00/20:00)比对当前注册的网络小区与锁定小区是否相同,如果不同则做断网处理。
+mac_blank = MAC地址不能为空
+
+vlan_switch = VLAN开关
+vlan_notice = 如果您要停用该功能,重启后才生效。请问您是否继续?
+vlan_notice2 = 如果您要开启该功能,多重网络名称开关必须是开启状态。请问您是否开启多重网络名称开关并开启VLAN功能?
+ap_hide = AP隐藏
+
+urlparent = 主域名后面不能再跟随以/开始的内容。
+not_change_mode = 设备正在后台配置相关参数,请稍后尝试
+
+
+#device
+device_status = 设备加密状态
+device_status_0 = 已解密
+device_status_1 = 未解密
+
+######DDNS###########
+ddns = DDNS
+Hash value is empty = Hash 值为空!
+DDNS Provider is empty = DDNS 服务器为空!
+register successful = 注册成功
+login error = 登陆错误
+network error = 网络错误
+registering = 正在注册
+not registered = 未注册
+error registering = 注册失败
+error = 错误
+ddns_set_mode = DDNS
+mode_set_mode_1 = 启用
+mode_set_mode_0 = 禁用
+mode_select_auto = 自动
+mode_select_manual = 手动
+ddns_mode = DDNS 模式
+Auto = 自动
+Manual = 手动
+DDNS_Status = DDNS 状态
+DDNSHashValue = Hash 值
+ddns_ProviderList = 动态DNS服务器
+ddns_account = 用户
+ddns_passwd = 密码
+ddns_domainName = 域名
+ddns_hashvalue_check = 无效字符,只能输入 0-9、a-z、A-Z 或 =
+ddns_note1 = 您可以设置动态域名服务,为动态WAN IP地址分配一个固定域名。
+ddns_note2 = 动态DNS服务器:设置提供动态域名服务的服务器。
+ddns_note3 = 密码:密码的有效字符包含:0-9 a-z A-Z ! # $ * + , - . % : = ? @ [ ] ^ _ { | } ~
+ddns_note4 = 域名:设置要申请的域名。
+ddns_note5 = Hash 值:DDNS哈希值,在使用freedns服务器的时候需要。有效字符包含:0-9 a-z A-Z 或 =
+
+##############ping 诊断##################
+ping_diagnostics = PING 诊断
+ping_times = PING 次数
+ping_url = URL 或者 IP 地址
+ping_start = 开始
+ping_end = 结束
+ping_clear = 清除结果
+ping_starting = 开始诊断...
diff --git a/lynq/MD310EU/ap/app/zte_webui/index.html b/lynq/MD310EU/ap/app/zte_webui/index.html
new file mode 100755
index 0000000..f64166a
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/index.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8"/>
+<meta name="renderer" content="webkit"/>
+<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/>
+<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
+<meta http-equiv="Pragma" content="no-cache"/>
+<meta http-equiv="Expires" content="0"/>
+<title></title>
+<script type="text/javascript">
+document.write("<link rel='stylesheet' type='text/css' href='css/csn.css?random=" + Math.random() + "' />");
+document.write("<link rel='stylesheet' type='text/css' href='css/bt_strp.css?random=" + Math.random() + "' />");
+document.write("<link rel='stylesheet' type='text/css' href='css/com.css?random=" + Math.random() + "' />");
+</script>
+<link href="favicon.ico" rel="shortcut icon" />
+<!--[if lt IE 9]>
+<script type="text/javascript">
+document.write("<script type='text/javascript' rc='js/3rd/html5shiv.js?random=" + Math.random() + "'></s" + "cript>");
+document.write("<script type='text/javascript' rc='js/3rd/respond.js?random=" + Math.random() + "'></s" + "cript>");
+</script>
+<![endif]-->
+</head>
+<body>
+<div class="container" id="topContainer">
+ <div id="langLogoBar" class="row">
+ <div class="col-xs-4">
+ <a href="index.html" style="display: none;">
+ <script type="text/javascript">
+ document.write("<img src='pic/res_logo_web.png?random=" + Math.random() + "' />");
+ </script>
+ </a>
+ <!--span class="center-block" id="webui_title"></span-->
+ </div>
+ <div id="statusBar" style="display: none;" class="col-xs-8 text-right">
+ <span id="networkType" title="network_type" i18n="true" data-bind="text: networkType" class="statusItem"></span>
+ <span id="operator" title="network_provider" i18n="true" data-bind="text: networkOperator" class="statusItem"></span>
+ <span id="OTA" title="ota_title" i18n="true" data-bind="visible:isShowFotaNewversionIcon()" class="statusItem">
+ <a onclick="return showOTAAlert();">
+ <script type="text/javascript">
+ document.write("<img src='pic/res_update.gif?random=" + Math.random() + "' class='paddingbottom6' />");
+ </script>
+ </a>
+ </span>
+ <span id="signal_strength" title="signal_strength" i18n="true" class="statusItem"><i data-bind="attr:{'class': signalCssClass}" class="signal"> </i></span>
+ <span id="connection_status" title="connection_status" i18n="true" class="statusItem"><i data-bind="attr:{'class': connectionCssClass}" class="icon_connection"> </i></span>
+ <span id="rj45_connection_status" title="rj45_connection_status" i18n="true" data-bind="visible: isShowRj45ConnectionIcon" class="statusItem"><i data-bind="attr:{'class': rj45ConnectionCssClass}" class="icon_connection"> </i></span>
+ <span id="sms_unread_count" title="sms_unread_count" i18n="true" data-bind="visible: smsUnreadCount() > 0 || showSmsDeleteConfirm()" style="display: none; position: relative;" class="statusItem">
+ <a onclick="return gotoSmsList();" href="javascript: void(0)">
+ <script type="text/javascript">
+ document.write("<img data-bind='visible: smsUnreadCount() > 0 && !showSmsDeleteConfirm()' src='./pic/msg_unread.png?random=" + Math.random() + "' class='paddingbottom6'/>");
+ document.write("<img data-bind='visible: showSmsDeleteConfirm()' src='./pic/msg_full.gif?random=" + Math.random() + "' class='paddingbottom6'/>");
+ </script>
+ <sup data-bind="visible: smsUnreadCount() > 0, text: smsUnreadCount" class="smsUnreadCount"></sup>
+ </a>
+ </span>
+ <span id="statusItemSimStatus" title="sim_status" i18n="true" class="statusItem"><img data-bind="attr: {src: simStatus}" class="paddingbottom6"/></span>
+ <span id="roamingStatus" title="roaming_status" i18n="true" data-bind="visible: roamingStatus() == 'R'" style="display: none;" class="statusItem">
+ <script type="text/javascript">
+ document.write("<img src='./pic/res_roaming.png?random=" + Math.random() + "' class='paddingbottom6'/>");
+ </script>
+ </span>
+ <span id="wifi_status" title="wifi_status" i18n="true" data-bind="visible: hasWifi" class="statusItem">
+ <!--img class="paddingbottom6" id="wifi_status_img" data-bind="attr: {src: wifiStatusImg}"/-->
+ <i class="wifi_status" data-bind="attr:{'class': wifiStatusCssClass}"> </i>
+ </span>
+ <span title="battery_level" i18n="true" data-bind="visible: hasBattery" class="statusItem"><img id="batteryCharging" data-bind="attr: {src: batteryPers}" class="paddingbottom6"/></span>
+ </div>
+ </div>
+ <div id="manageBar" class="row">
+ <div id="manageContainer" class="col-xs-12 text-right">
+ <span id="logout">
+ <a data-trans="modify_password" href="#pwd_mode" data-bind="visible:showLogout()" class="margin-right-10"></a>
+ <a id="logoutlink" data-trans="logout" href="javascript:void(0)" data-bind="click:logout,visible:showLogout() " style="display: none;" class="margin-right-10"></a>
+ </span>
+ <select id="language" data-bind="options: languages, value: currentLan, optionsText: 'text', optionsValue: 'value', event:{ change: langChangeHandler}" class="marginright10"></select>
+ </div>
+ </div>
+</div>
+<div id="indexContainer" class="container">
+ <div id="mainContainer" style="min-height: 450px;">
+ <div id='container'></div>
+ </div>
+</div>
+<!-- <div id="footer" style="border-top:1px solid #dddddd" class="container margin-top-5">
+ <span data-trans='copyright'></span> -->
+ <!--span data-trans="vertical_bar"></span> <a href="http://www.demo.com" target="_blank" data-trans="open_source_licenses" class="extendLink"></a-->
+<!-- </div> -->
+
+<div id='result-overlay'>
+ <div class='header'></div>
+ <br/>
+ <div class="text-center">
+ <div>
+ <div id="result-image"></div>
+ </div>
+ <div id="result_wording"></div>
+ </div>
+</div>
+
+<div id='loading'>
+ <div class='header'><span id="loadMsg"></span></div>
+ <br/>
+ <div class="text-center">
+ <div><span id="loading_wording" class="message"></span></div>
+ <img id="loadingImg" src="pic/res_loading.gif?bG9hZGluZy5naWY="/>
+ <div id="loading_container"></div>
+ </div>
+</div>
+
+<div id='progress'>
+ <div class='header'><span id="barMsg"></span></div>
+ <br/>
+ <div class="progress-content">
+ <div class="progress-bar-container">
+ <div id="bar" class="progress-bar"></div>
+ <div id="barValue" class="progress-bar-value"></div>
+ </div>
+ <div id="progress_container" class="progress-prompt"></div>
+ </div>
+ </div>
+<!-- confirm content -->
+<div id='confirm'>
+ <div class='header'><span id="popTitle"></span></div>
+ <div id="confirm-message-container">
+ <div class='icon'><img id='confirmImg'/></div>
+ <div class="confirm-message">
+ <div class='message'></div>
+ <div class='promptDiv'>
+ <input id="promptInput" name="promptInput" type="text" maxlength="25" class="width190"/><br/>
+ <label class="promptErrorLabel colorRed"></label>
+ </div>
+ </div>
+ </div>
+ <div class='buttons'>
+ <input id='okbtn' type="button" data-trans='ok' class="btn btn-default simplemodal-close"/>
+ <input id='yesbtn' type="button" data-trans='yes' class="btn btn-default "/>
+ <input id='nobtn' type="button" data-trans='no' class="btn btn-default simplemodal-close"/>
+ </div>
+</div>
+<div id='popupSettingWindow'>
+ <div class='header'>
+ <p class="tag-popup-close"><a href="javascript:hidePopupSettingWindow();"></a></p>
+ </div>
+ <div id="htmlContainer" class="modal-body"></div>
+</div>
+<div id="buttom-bubble">
+</div>
+<script type="text/x-jquery-tmpl" id="newMessagePopTmpl">
+ <div class="bubbleItem ${report}" id="${mark}">
+ <h3>
+ <span data-trans="${titletrans}">${title}</span> ${name} <a href="javascript:void(0);" data-targetid="${mark}" class="bubbleCloseBtn"></a>
+ </h3>
+ <div class="bubbleContainer">
+ <div class="bubbleContent">${content}</div>
+ <div class="bubbleDatetime">${datetime}</div>
+ </div>
+ </div>
+</script>
+<script type="text/javascript">
+document.write("<script type='text/javascript' data-main='js/main' src='js/3rd/require-jquery.js?random=" + Math.random() + "'></s" + "cript>");
+</script>
+</body>
+</html>
diff --git a/lynq/MD310EU/ap/app/zte_webui/js/com.js b/lynq/MD310EU/ap/app/zte_webui/js/com.js
new file mode 100755
index 0000000..de5ca46
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/com.js
@@ -0,0 +1,11444 @@
+
+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 getNetworkStatus() {
+ return stuffMake(arguments, {}, prepare, deal, null, false);
+ function prepare(values, isPost) {
+ var valueReq = {};
+ valueReq.cmd = "NETWORK_INFO";
+ return valueReq;
+ }
+ function deal(result) {
+ return {
+ sinr: result.lte_sinr,
+ rsrp: result.lte_rsrp,
+ rsrq: result.lte_rsrq,
+ plmn: result.lte_plmn,
+ pci: result.lte_pci,
+ cellid: result.lte_cellid,
+ band: result.lte_band
+ };
+ }
+ }
+ 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 = "wifi_sleep_mode,Sleep_interval";
+ valueReq.multi_data = 1;
+ return valueReq;
+ }
+ function deal(paramD) {
+ if (paramD) {
+ var result = {};
+ result.wifiSleepMode = paramD.wifi_sleep_mode;
+ 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.sysWifiSleepMode = values.wifiSleepMode;
+ 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,ziccid,cell_id,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,
+ iccid: paramD.ziccid,
+ cellid: paramD.cell_id,
+ 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 getPingResult() {
+ return stuffMake(arguments, {}, prepare, deal, null, false);
+ function prepare(values, isPost) {
+ var valueReq = {};
+ valueReq.cmd = "ping_result";
+ return valueReq;
+ }
+ function deal(paramD) {
+ if (paramD) {
+ var result = {};
+ result.pingResult = paramD.ping_result;
+ return result;
+ } else {
+ return errUnknownObj;
+ }
+ }
+ }
+ function pingResultClear() {
+ return stuffMake(arguments, {}, prepare, deal, null, true);
+ function prepare(values, isPost) {
+ var valueReq = {};
+ valueReq.goformId = "PING_RESULT_CLEAR";
+ return valueReq;
+ }
+ function deal(paramD) {
+ if (paramD) {
+ return paramD;
+ } else {
+ return errUnknownObj;
+ }
+ }
+ }
+ function getPingSetting() {
+ return stuffMake(arguments, {}, prepare, deal, null, false);
+ function prepare(values, isPost) {
+ var valueReq = {};
+ valueReq.cmd = "ping_repetition_count,ping_diag_addr";
+ valueReq.multi_data = 1;
+ return valueReq;
+ }
+ function deal(paramD) {
+ if (paramD) {
+ var result = {};
+ result.pingTimes = paramD.ping_repetition_count;
+ result.pingURL = paramD.ping_diag_addr;
+ return result;
+ } else {
+ return errUnknownObj;
+ }
+ }
+ }
+ function setPingSettingStart() {
+ return stuffMake(arguments, {}, prepare, deal, null, true);
+ function prepare(values, isPost) {
+ var valueReq = {};
+ valueReq.goformId = "PINT_DIAGNOSTICS_START";
+ valueReq.ping_repetition_count = values.pingTimes;
+ valueReq.ping_diag_addr = values.pingURL;
+ 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 wefotagetNewVersionState() {
+ return stuffMake(arguments, {}, prepare, deal, null, false);
+ function prepare(values, isPost) {
+ var valueReq = {};
+ valueReq.cmd = "wefota_new_version_state,wefota_current_upgrade_state";
+ valueReq.multi_data = 1;
+ return valueReq;
+ }
+ function deal(paramD) {
+ if (paramD) {
+ 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 setWefotaOTAUpdateSetting() {
+ return stuffMake(arguments, {}, prepare, deal, null, true);
+ function prepare(values, isPost) {
+ var valueReq = {};
+ valueReq.goformId = "SetUpgWefotaSetting";
+ 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,
+ getNetworkStatus: getNetworkStatus,
+ 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,
+ setWefotaOTAUpdateSetting: setWefotaOTAUpdateSetting,
+ 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,
+ getPingResult: getPingResult,
+ pingResultClear: pingResultClear,
+ getPingSetting: getPingSetting,
+ setPingSettingStart: setPingSettingStart,
+ 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,
+ wefotagetNewVersionState: wefotagetNewVersionState,
+ 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
+ }
+});
+
+// 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 sc_pingTimes = [];
+
+ 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);
+ sf_produceArray(0, 59, sc_startMinutes);
+ sf_produceArray(1, 10, sc_pingTimes);
+
+ function othersViewModel() {
+ var target = this;
+
+ var inChildGroup = false;
+ var scheduleInfo = service.getScheduleSetting();
+ var pingDiagInfo = service.getPingSetting();
+
+ 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);
+ target.src_times = ko.observableArray(sc_pingTimes);
+ target.pingTimes = ko.observable(pingDiagInfo.pingTimes);
+ target.pingURL = ko.observable(pingDiagInfo.pingURL);
+
+
+ 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.pingResult = ko.observable();
+
+ target.loadFileContent = function() {
+ var newPingResInfo = service.getPingResult();
+ if (newPingResInfo.pingResult !== target.pingResult()) {
+ target.pingResult(newPingResInfo.pingResult);
+ }
+ };
+
+ function showinfo(msgObj, minHeight) {
+ var option = {
+ title: 'info',
+ img: 'pic/res_info.png',
+ msg: msgObj,
+ minHeight: minHeight
+ };
+ popup(option);
+
+ $('#yesbtn, #nobtn, #okbtn').hide();
+
+ setTimeout(function() {
+ $.modal.close();
+ }, 1000);
+ }
+
+ setInterval(target.loadFileContent, 1000);
+
+ target.pingStart = function () {
+ showinfo('ping_starting');
+ var params = {};
+ params.pingTimes = target.pingTimes();
+ params.pingURL = target.pingURL();
+ service.setPingSettingStart(params, function (result) {
+ if (result.result != "success") {
+ errorOverlay();
+ }
+ });
+ };
+
+ target.pingClear = function () {
+ showLoading();
+ service.pingResultClear({}, 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;
+ target.hasUssd = set.HAS_USSD;
+ 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.iccid = libko.observable('');
+ target.cellid = 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.iccid(verifyDeviceInfo(data.iccid));
+ target.cellid(verifyDeviceInfo(data.cellid));
+ 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),
+ iccid : verifyDeviceInfo(data.iccid),
+ cellid: verifyDeviceInfo(data.cellid),
+ 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 = "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;
+
+ // ��ȡ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/MD310EU/ap/app/zte_webui/js/ext/menu.js b/lynq/MD310EU/ap/app/zte_webui/js/ext/menu.js
new file mode 100755
index 0000000..dc3a4e4
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/ext/menu.js
@@ -0,0 +1,313 @@
+define(function () {
+ var needLogin = true;
+ var menu = [{
+ 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: '#net_status',
+ path: 'network_info',
+ 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: '1',
+ 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/MD310EU/ap/app/zte_webui/js/ext/menu_pppoe.js b/lynq/MD310EU/ap/app/zte_webui/js/ext/menu_pppoe.js
new file mode 100755
index 0000000..52fddf8
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/ext/menu_pppoe.js
@@ -0,0 +1,313 @@
+define(function () {
+ var needLogin = true;
+ var menu = [{
+ 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: '#net_status',
+ path: 'network_info',
+ 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: '1',
+ 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/MD310EU/ap/app/zte_webui/js/ext/set_aic8800.js b/lynq/MD310EU/ap/app/zte_webui/js/ext/set_aic8800.js
new file mode 100755
index 0000000..f26d6c2
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/ext/set_aic8800.js
@@ -0,0 +1,68 @@
+define(function () {
+ var config = {
+ WEBUI_TITLE: '4G MiFi',
+ 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/ax',
+ value : '6'
+ } ],
+ WIFI_SUPPORT_QR_CODE: true,
+ HAS_PHONEBOOK: false,
+ HAS_BATTERY: true, //ÊÇ·ñÓÐµç³Ø
+ FAST_BOOT_SUPPORT: false, //ÊÇ·ñÖ§³Ö¿ìËÙ¿ª»ú
+ TURN_OFF_SUPPORT: true, //ÊÇ·ñÖ§³Ö¹Ø»ú
+ WIFI_SLEEP_SUPPORT: true, // ÊÇ·ñÖ§³ÖwifiÐÝÃß
+ HAS_USSD: false, // ÊÇ·ñÖ§³ÖUSSD
+ HAS_URL: true, // 是否支持URL过滤
+ //station¼ÓÃÜģʽ
+ 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'
+ }
+ ],
+ AUTO_MODES: [{
+ name: 'Automatic',
+ value: 'NETWORK_auto'
+ }, {
+ name: '4G Only',
+ value: 'Only_LTE'
+ }
+ ],
+ WIFI_SLEEP_MODES: [{
+ name: 'turn off',
+ value: '1'
+ }
+ ]
+ };
+
+ return config;
+});
diff --git a/lynq/MD310EU/ap/app/zte_webui/js/main.js b/lynq/MD310EU/ap/app/zte_webui/js/main.js
new file mode 100755
index 0000000..fa447ca
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/main.js
@@ -0,0 +1,122 @@
+require.config({
+ shim: {
+ knockoutbase: ['jq_tmpl'],
+ jq_additional: ['jq_validate'],
+ jq_simplemodal: ['3rd/twbs.bootstrap'],
+ jq_translate: ['jq_i18n'],
+ },
+ paths: {
+ base64: '3rd/webtoolkit.base64',
+ echarts: '3rd/apache.echarts',
+ knockout: '3rd/knockout',
+ knockoutbase: '3rd/knockout.base',
+ jq_additional: '3rd/jquery.additional-methods',
+ jq_chosen: '3rd/jquery.chosen',
+ jq_fileinput: '3rd/jquery.fileinput',
+ jq_i18n: '3rd/jquery.i18n',
+ jq_simplemodal: '3rd/jquery.simplemodal',
+ jq_tmpl: '3rd/jquery.tmpl',
+ jq_translate: '3rd/jquery.translate',
+ jq_validate: '3rd/jquery.validate',
+ jquery: '3rd/require-jquery',
+ jqui: '3rd/jqui',
+ text: '3rd/require-text',
+ tmpl: '../subpg',
+ underscore: '3rd/underscore',
+ service: 'com',
+
+ CryptoJS: '3rd/crypto-js',
+
+ menu: 'com',
+ adm_lan: 'com',
+ adm_others: 'com',
+ adm_management: 'com',
+ adm_pin: 'com',
+ adm_quick_set: 'com',
+ main: 'com',
+ language: 'com',
+ entry: 'com',
+ logout: 'com',
+ opmode: 'com',
+ opmode_popup: 'com',
+ router: 'com',
+ statusBar: 'com',
+ status_traffic_alert: 'com',
+ tooltip: 'com',
+
+ phonebook: 'sim_device',
+ sim_abnormal: 'sim_device',
+ ota_update: 'sim_device',
+ sd: 'sim_device',
+ sd_httpshare: 'sim_device',
+ sms_set: 'sim_device',
+ sms_sim_messages: 'sim_device',
+ sms_list: 'sim_device',
+ ussd: 'sim_device',
+ network_apn_set: 'net',
+ network_dial_set: 'net',
+ network_dial_set_cpe: 'net',
+ network_info: 'net',
+ locknet: 'net',
+ network_net_select: 'net',
+ ddns: 'net',
+ firewall: 'net',
+ firewall_dmz_set: 'net',
+ firewall_parental_control: 'net',
+ firewall_port_filter: 'net',
+ firewall_port_forward: 'net',
+ firewall_port_map: 'net',
+ firewall_upnp_set: 'net',
+ firewall_url_filter: 'net',
+ wifi_advance: 'wifi',
+ wifi_ap_station: 'wifi',
+ wifi_guest: 'wifi',
+ wifi_mac_filter: 'wifi',
+ wifi_main: 'wifi',
+ wifi_sleep_mode: 'wifi',
+ wifi_station_info: 'wifi',
+ wifi_wps: 'wifi',
+ },
+
+});
+
+require("set service lib".split(" "),
+ function (set, fnc, util) {
+ function initAndLoad(cfg) {
+ require([cfg.menu, cfg.set], function (params) {
+ require("menu language logout statusBar router entry jq_additional jq_translate jq_simplemodal base64".split(" "),
+ function (menu, language, logout, statusBar, router, entry) {
+ menu.init();
+ language.init();
+ router.init();
+ logout.init();
+ statusBar.init();
+ });
+ });
+ }
+ if (!set.RJ45_SUPPORT) {
+ initAndLoad({
+ set: set.DEVICE + '/set',
+ menu: set.DEVICE + '/menu'
+ });
+ } else {
+ var tmp = "menu";
+ fnc.getOpMode({}, function (mod) {
+ set.blc_wan_mode = mod.blc_wan_mode;
+ switch (mod.blc_wan_mode) {
+ case "AUTO_PPPOE":
+ case "PPPOE":
+ tmp = "menu_pppoe";
+ break;
+ default:
+ tmp = "menu";
+ break;
+ }
+ initAndLoad({
+ set: set.DEVICE + '/set',
+ menu: set.DEVICE + '/' + tmp
+ });
+ });
+ }
+
+});
diff --git a/lynq/MD310EU/ap/app/zte_webui/js/net.js b/lynq/MD310EU/ap/app/zte_webui/js/net.js
new file mode 100755
index 0000000..650aeb5
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/net.js
@@ -0,0 +1,4262 @@
+
+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 {
+ errorOverlay();
+ 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;
+ target.hasUssd = config.HAS_USSD;
+ 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
+ };
+});
+define("network_info","underscore jquery knockout set service".split(" "),
+ function (_, $, ko, config, service) {
+
+ function NetInfoVM() {
+ var target = this;
+ var network_status = service.getNetworkStatus();
+
+ target.pci = ko.observable(network_status.pci);
+ target.sinr = ko.observable(network_status.sinr);
+ target.rsrp = ko.observable(network_status.rsrp);
+ target.rsrq = ko.observable(network_status.rsrq);
+ target.plmn = ko.observable(network_status.plmn);
+ target.cellid = ko.observable(network_status.cellid);
+ target.band = ko.observable(network_status.band);
+ }
+
+ function initialize() {
+ var container = $('#container');
+ ko.cleanNode(container[0]);
+ var imVm = new NetInfoVM();
+ ko.applyBindings(imVm, container[0]);
+ }
+
+ return {
+ init: initialize
+ };
+});
diff --git a/lynq/MD310EU/ap/app/zte_webui/js/set.js b/lynq/MD310EU/ap/app/zte_webui/js/set.js
new file mode 100755
index 0000000..f2dc0cc
--- /dev/null
+++ b/lynq/MD310EU/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/MD310EU/ap/app/zte_webui/js/sim_device.js b/lynq/MD310EU/ap/app/zte_webui/js/sim_device.js
new file mode 100755
index 0000000..409b978
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/sim_device.js
@@ -0,0 +1,5063 @@
+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;
+ target.hasUssd = config.HAS_USSD;
+ 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();
+ }
+ });
+ };
+
+ // fota升级
+ target.ota_upgrade_check = function () {
+ var wefotaInfo = service.wefotagetNewVersionState();
+ var checkingState = ["checking"];
+ if ($.inArray(wefotaInfo.wefota_current_upgrade_state, checkingState) != -1) {
+ showAlert("ota_update_running");
+ return;
+ }
+ showLoading("ota_new_version_checking");
+ service.setWefotaOTAUpdateSetting(wefotaInfo, function (settingInfo) {
+ if (settingInfo && settingInfo.result == "success") {
+ wefotaInfo = service.wefotagetNewVersionState();
+ if(wefotaInfo.wefota_new_version_state == "has_new_version"){
+ showAlert("fota_package_downloading");
+ return;
+ }
+ else if(wefotaInfo.wefota_new_version_state == "bad_network") {
+ errorOverlay("ota_connect_server_failed");
+ return;
+ }
+ else if(wefotaInfo.wefota_new_version_state == "no_new_version") {
+ showAlert("fota_package_no_new_version");
+ return;
+ }
+ else {
+ showAlert("ota_check_fail");
+ return;
+ }
+ } 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/MD310EU/ap/app/zte_webui/js/wifi.js b/lynq/MD310EU/ap/app/zte_webui/js/wifi.js
new file mode 100755
index 0000000..a5ef6b9
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/wifi.js
@@ -0,0 +1,3764 @@
+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 wifiSleepTime = _.map(config.WIFI_SLEEP_MODES, function (item) {
+ return new Option(item.name, item.value);
+ });
+
+ 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.option = ko.observableArray(wifiSleepTime);
+ target.modes = ko.observableArray(sleepTime);
+
+ var smInfo = getSleepMode();
+ target.wifiSleepedMode = ko.observable(smInfo.wifiSleepMode);
+ 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.wifiSleepMode = target.wifiSleepedMode();
+ 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
+ };
+});
+
diff --git a/lynq/MD310EU/ap/app/zte_webui/makefile b/lynq/MD310EU/ap/app/zte_webui/makefile
new file mode 100755
index 0000000..2caeab6
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/makefile
@@ -0,0 +1,61 @@
+include $(zte_app_mak)
+
+all:
+ echo "zte_webui compile do nothing"
+
+clean:
+ echo "zte_webui clean do nothing"
+
+romfs:
+ @mkdir -p $(ROOTFS_DIR)/etc_ro/web
+ @cp -afvp $(APP_DIR)/zte_webui/* $(ROOTFS_DIR)/etc_ro/web
+ find . -type f -name '*.js' | xargs -n1 -I {} java -jar $(YUICOMPRESSOR) {} -o $(ROOTFS_DIR)/etc_ro/web/{}
+ find . -type f -name '*.css' | xargs -n1 -I {} java -jar $(YUICOMPRESSOR) {} -o $(ROOTFS_DIR)/etc_ro/web/{}
+ find . -type f -name '*.html' | xargs -n1 -I {} sed -i 's/^[ \t]*//g' $(ROOTFS_DIR)/etc_ro/web/{}
+ find . -type f -name '*.html' | xargs -n1 -I {} sed -i 's/[ \t]*$$//g' $(ROOTFS_DIR)/etc_ro/web/{}
+ find . -type f -name '*.html' | xargs -n1 -I {} sed -i ":a;N;s/\r//g;ta" $(ROOTFS_DIR)/etc_ro/web/{}
+ find . -type f -name '*.html' | xargs -n1 -I {} sed -i ":a;N;s/\n//g;ta" $(ROOTFS_DIR)/etc_ro/web/{}
+ifeq ($(CONFIG_WEBUI_TYPE),CPE)
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+ -cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_cpe.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+endif
+ifeq ($(CONFIG_WEBUI_TYPE),CPE_SW)
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+ -cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_cpe_sw.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+endif
+
+
+
+ifeq ($(PRJ_IS_MIN), yes)
+ -cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_min.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+ifeq ($(CONFIG_WIFI_MODULE), xr819)
+ -cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_xr819.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+endif
+ifeq ($(CONFIG_WIFI_MODULE), ssv6x5x)
+ -cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_ssv6x5x.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+endif
+endif
+ifeq ($(CONFIG_WIFI_MODULE), aic8800)
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+ -cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_aic8800.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+endif
+
+ifneq ($(CONFIG_USE_WEBUI_SECURITY),yes)
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/3rd/crypto-js.js
+ -cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/crypto-js-null.js $(ROOTFS_DIR)/etc_ro/web/js/3rd/crypto-js.js
+ -sed -i 's/PASSWORD_ENCODE:false,//' $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js
+endif
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/crypto-js-null.js
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_min.js
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_xr819.js
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_ssv6x5x.js
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_aic8800.js
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_cpe.js
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_cpe_sw.js
+ -rm -v $(ROOTFS_DIR)/etc_ro/web/makefile
+ifeq ($(CONFIG_USE_WEBUI_ZIP),yes)
+ (cd $(ROOTFS_DIR)/etc_ro && zip -r web.zip web)
+ (cd $(ROOTFS_DIR)/etc_ro && rm -rfv web)
+endif
+
+
diff --git a/lynq/MD310EU/ap/app/zte_webui/pic/res_logo_web.png b/lynq/MD310EU/ap/app/zte_webui/pic/res_logo_web.png
new file mode 100755
index 0000000..659b3d5
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/pic/res_logo_web.png
Binary files differ
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/adm_lan.html b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_lan.html
new file mode 100755
index 0000000..5b6b28b
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_lan.html
@@ -0,0 +1,107 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='advanced_settings'></h1>
+ </div>
+ </div>
+ </div>
+<div class="row">
+<div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li><a href="#wlan_sleep" data-trans="sleep_mode"></a></li>
+ <li class="active"><a href="#route_set" data-trans="router_setting"></a></li>
+ <li><a href="#filter_main" data-trans="firewall"></a></li>
+ <li data-bind="visible:hasUpdateCheck"><a href="#fota" data-trans="update_settings"></a></li>
+ <!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->
+ <li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>
+ <li><a href="#more" data-trans="others"></a></li>
+ </ul>
+ </div>
+</div>
+
+<div class="col-xs-10">
+<form id="frmLan" role="form">
+ <h3 class="form-title" data-trans="router_setting"></h3>
+ <div class="form-body margin-top-20">
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="ip_address" for="txtIpAddress" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <input id="txtIpAddress" name="txtIpAddress" data-bind="value: ipAddress" maxlength="15" type="text" class="required form-control"/>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label data-trans="subnet_mask" for="txtSubnetMask" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <input id="txtSubnetMask" name="txtSubnetMask" data-bind="value: subnetMask" maxlength="15" type="text" class="required form-control"/>
+ </div>
+ </div>
+ <div class="row form-group" data-bind="visible: showMacAddress() && hasWifi()">
+ <label data-trans="mac_address" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <label id="txtMacAddress" data-bind="text: macAddress" class="label-content"></label>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label class="col-xs-4 side-right" data-trans="dhcp_server"></label>
+ <div class="col-xs-8">
+ <div class="row">
+ <div class="col-xs-3">
+ <input id="dhcpEnable" name="dhcpServer" data-bind="checked: dhcpServer,click: dhcpServerHandler" type="radio" value="1"/>
+ <label data-trans="enable" for="dhcpEnable"></label>
+ </div>
+ <div class="col-xs-3">
+ <input id="dhcpDisable" name="dhcpServer" data-bind="checked: dhcpServer,click: dhcpServerHandler" type="radio" value="0"/>
+ <label data-trans="disable" for="dhcpDisable"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div data-bind='visible: dhcpServer() == "1"'>
+ <div class="row form-group">
+ <label data-trans='dhcp_ip_pool' for="txtDhcpIpPoolStart" class="col-xs-4 side-right"></label>
+ <div class="col-xs-8 form-inline">
+ <input id='txtDhcpIpPoolStart' name="txtDhcpIpPoolStart" data-bind="value: dhcpStart" maxlength="15" type="text" class="required rangeInput form-control"/>
+ -
+ <input id='txtDhcpIpPoolEnd' name="txtDhcpIpPoolEnd" data-bind="value: dhcpEnd" maxlength="15" type="text" class="required rangeInput form-control"/>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label for="txtDhcpLease" data-trans="dhcp_lease" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <div class="input-group">
+ <input id="txtDhcpLease" name="txtDhcpLease" data-bind="value: dhcpLease" maxlength="5" type="text" class="required form-control"/>
+ <div data-trans="hours" id="leaseLabel" class="input-group-addon"></div>
+
+ </div>
+ <div id="errorHolder"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input type="submit" formmethod="post" data-trans="apply" class="btn btn-primary"/>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="diconneted_operate_note"></li>
+ <li data-trans="lan_note_ip_address"></li>
+ <li data-trans="lan_note_subnet_mask"></li>
+ <li data-trans="lan_note_dhcp_server_enable"></li>
+ <li data-trans="lan_note_dhcp_server_disable"></li>
+ <li data-trans="lan_note_dhcp_ip_pool"></li>
+ <li data-trans="lan_note_dhcp_lease_time"></li>
+ </ul></div>
+ </div>
+</form>
+ </div>
+ </div>
+</div>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/adm_others.html b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_others.html
new file mode 100755
index 0000000..d1a22e6
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_others.html
@@ -0,0 +1,249 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='advanced_settings'></h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li><a href="#wlan_sleep" data-trans="sleep_mode"></a></li>
+ <li><a href="#route_set" data-trans="router_setting"></a></li>
+ <li><a href="#filter_main" data-trans="firewall"></a></li>
+ <li data-bind="visible:hasUpdateCheck"><a href="#fota" data-trans="update_settings"></a></li>
+ <!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->
+ <li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>
+ <li class="active"><a href="#more" data-trans="others"></a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="col-xs-10">
+ <form id="frmRestoreReset">
+ <div class="form-body">
+ <h3 data-trans="others_restart_reset" class="form-title"></h3>
+ <div class="row form-group">
+ <div data-trans="others_note_info" class="col-xs-12"></div>
+ </div>
+ <div class="row form-group">
+ <div class="col-xs-12 align-right">
+ <input data-trans="restart_button" data-bind="click: restart" type="button" class="btn btn-primary margin-right-20"/>
+ <input data-trans="restore_button" data-bind="visible: currentUserInChildGroup() == false, click: restore" type="button" class="btn btn-primary margin-right-20"/>
+ </div>
+ </div>
+ </div>
+ </form>
+
+ <!-- add by qumengjia for schedule restart start -->
+ <form id="frmScheduleRestart">
+ <div class="form-body">
+ <h3 data-trans="restart_schedule" class="form-title"></h3>
+ <div class="row form-group">
+ <label data-trans="enable_reboot_switch" class="col-xs-4 side-right"></label>
+ <div class="col-xs-8">
+ <div class="row">
+ <div class="col-xs-3">
+ <input id="restartEnable" data-bind="checked: scheduleSetting" type="radio" value="1"/>
+ <label data-trans="enable" for="restartEnable"></label>
+ </div>
+ <div class="col-xs-3">
+ <input id="restartDidable" data-bind="checked: scheduleSetting" type="radio" value="0"/>
+ <label data-trans="disable" for="restartDidable"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div data-bind='visible: scheduleSetting() == "1"' class="row form-group">
+ <label class="col-xs-4 side-right" data-trans='restart_schedule_time'></label>
+ <div class="col-xs-8">
+ <label data-trans="eyeryday" style="display:inline-block; width:auto; padding-right:0"></label>
+ <select id="restartHour" data-bind="options: scr_hours, value: scheduleHour, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select>
+ <label data-trans="hour" for="restartHour" style="display:inline-block; width:auto; padding-right:0"></label>
+ <select id="restartMinute" data-bind="options: scr_minutes, value: scheduleMinute, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select>
+ <label data-trans="minute" for="restartMinute" style="display:inline-block; width:auto; padding-right:0"></label>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input data-bind="click:scheduleRestart" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>
+ </div>
+ </div>
+ </form>
+ <!-- add by qumengjia for schedule restart end -->
+
+ <form id="frmtrunOffDevice" data-bind="visible: turnOffSupport">
+ <div class="form-body">
+ <h3 data-trans="others_turn_off" class="form-title"></h3>
+ <div class="row form-group">
+ <div class="col-xs-12 align-right">
+ <input data-bind="click: turnoff" data-trans="turnoff_button" type="button" class="btn btn-primary margin-right-20"/>
+ </div>
+ </div>
+ </div>
+ </form>
+
+ <form data-bind="visible: fastbootSupport">
+ <div class="form-body">
+ <h3 class="form-title" data-trans="fastboot_setting"></h3>
+ <div class="row form-group">
+ <label data-trans="fastboot_setting" class="col-xs-4 side-right"></label>
+ <div class="col-xs-8">
+ <div class="row">
+ <div class="col-xs-3">
+ <input id="fastEnable" name="fastboot" data-bind="checked: fastbootSetting, enable: fastbootEnableFlag" type="radio" value="1"/>
+ <label data-trans="enable" for="fastEnable"></label>
+ </div>
+ <div class="col-xs-3">
+ <input id="fastDisable" name="fastboot" data-bind="checked: fastbootSetting, enable: fastbootEnableFlag" type="radio" value="0"/>
+ <label data-trans="disable" for="fastDisable"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row form-group">
+ <div class="col-xs-12" data-trans="fastboot_note"></div>
+ </div>
+ <div class="row form-group">
+ <div class="col-xs-12 align-right">
+ <input data-bind="click: saveFastBoot, enable: fastbootEnableFlag" data-trans="apply" type="button" class="btn btn-primary margin-right-20"/>
+ </div>
+ </div>
+ </div>
+ </form>
+
+
+ <form id="sntpForm" data-bind="visible: SNTPSupport">
+ <div class="form-body">
+ <h3 class="form-title">SNTP</h3>
+ <div class="content">
+ <div class="row form-group">
+ <label class="col-xs-4 side-right" data-trans='local_current_time'></label>
+ <div class="col-xs-8">
+ <span class="span3" data-bind="text: localTime"></span>
+ <span> </span>
+ <span id="weekday" data-bind="text: day"></span>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label class="col-xs-4 side-right" data-trans='time_set_mode' for="sntpSetTimeMode"></label>
+ <div class="col-xs-4">
+ <select id="sntpSetTimeMode" class="form-control" data-transid="time_set_time" data-bind="options: timeSetModes, value: currentMode, optionsText: transOption('time_set_time'), optionsValue: 'value', event:{change: changeSetTimeMode}"></select>
+ </div>
+ </div>
+ <div id="manualSetTime" data-bind="visible: isManualSetTime">
+ <div class="row form-group">
+ <label class="col-xs-4 side-right" data-trans='time_set_time_manual'></label>
+
+ <div class="col-xs-8">
+ <select id="manualYear" data-bind="options: years, value: currentYear, optionsText: 'text', optionsValue: 'value', event:{change: initDateList}" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select>
+ <label data-trans="year" for="manualYear" style="display:inline-block; width:auto; padding-right:0"></label>
+
+ <select id="manualMonth" data-bind="options: months, value: currentMonth, optionsText: 'text', optionsValue: 'value', event: {change: initDateList}" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select>
+ <label data-trans="month" for="manualMonth" style="display:inline-block; width:auto; padding-right:0"></label>
+
+ <select id="manualDate" data-bind="options: dates, value: currentDate, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select>
+ <label data-trans="date" for="manualDate" style="display:inline-block; width:auto; padding-right:0"></label>
+
+ <select id="manualHour" data-bind="options: hours, value: currentHour, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select>
+ <label data-trans="hour" for="manualHour" style="display:inline-block; width:auto; padding-right:0"></label>
+
+ <select id="manualMinute" data-bind="options: minutes, value: currentMinute, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select>
+ <label data-trans="minute" for="manualMinute" style="display:inline-block; width:auto; padding-right:0"></label>
+ </div>
+ </div>
+ </div>
+ <div id="autoSntpTime" data-bind="visible: isAutoSntpTime">
+ <div id="sntp_server0" class="row form-group">
+ <label data-trans='stnp_server1' for="sntp_server1_select" class="col-xs-4 side-right"></label>
+ <div class="col-xs-4">
+ <select id="sntp_server1_select" data-bind="options: serverList, value: currentServer0, optionsText: 'text', optionsValue: 'value', event: {change: changeServerSelect}" class="form-control"></select>
+ </div>
+ <div class="col-xs-4">
+ <input id="sntp_other_server0" name="sntp_other_server0" data-bind="value:customServer0, visible:isOther0" type="text" class="required form-control"/>
+ </div>
+ </div>
+ <div id="sntp_server1" class="row form-group">
+ <label class="col-xs-4 side-right" data-trans='stnp_server2' for="stnp_server2_select"></label>
+ <div class="col-xs-4">
+ <select id="stnp_server2_select" data-bind="options: serverList, value: currentServer1, optionsText: 'text', optionsValue: 'value', event: {change: changeServerSelect}" class="form-control"></select>
+ </div>
+ <div class="col-xs-4">
+ <input id="sntp_other_server1" name="sntp_other_server1" data-bind="value:customServer1, visible:isOther1" type="text" class="required form-control"/>
+ </div>
+ </div>
+ <div id="sntp_server2" class="row form-group">
+ <label data-trans='stnp_server3' for="stnp_server3_select" class="col-xs-4 side-right"></label>
+ <div class="col-xs-4">
+ <select id="stnp_server3_select" class="form-control" data-bind="options: serverList, value: currentServer2, optionsText: 'text', optionsValue: 'value', event: {change: changeServerSelect}"></select>
+ </div>
+ <div class="col-xs-4">
+ <input id="sntp_other_server2" name="sntp_other_server2" data-bind="value:customServer2, visible:isOther2" type="text" class="required form-control"/>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label data-trans='time_zone' for="time_zone_select" class="col-xs-4 side-right"></label>
+ <div class="col-xs-4">
+ <select id="time_zone_select" data-bind="options: timeZones, value: currentTimeZone, optionsText: transOption('time_zone'), optionsValue: 'value'" data-transid="time_zone" class="form-control"></select>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input data-bind="" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>
+ </div>
+ </div>
+ </form>
+
+ <!-- add by qumengjia for ping diagnostics start -->
+ <form id="frmPingDiagnostics">
+ <div class="form-body">
+ <h3 data-trans="ping_diagnostics" class="form-title"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="ping_times" for="txtPingTimes" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <select id="restartHour" data-bind="options: src_times, value: pingTimes, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:167.5px; padding-right:5px; padding-left:5px" class="form-control"></select>
+ <!-- <input id="txtPingTimes" maxlength="15" type="text" class="required form-control"/> -->
+ </div>
+ </div>
+ <div class="row form-group">
+ <label data-trans="ping_url" for="txtPingURL" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <input id="txtPingURL" name="txtPingURL" data-bind="value: pingURL" type="text" class="required form-control"/>
+ <!-- <input id="txtPingURL" maxlength="15" type="text" class="required form-control"/> -->
+ </div>
+ </div>
+ <div class="row form-group">
+ <textarea id="fileContent" readonly data-bind="value: pingResult" style="width: 760px; height: 190px; border-radius: 6px;" class="col-xs-4 side-right"></textarea>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input data-bind="click:pingStart" data-trans="ping_start" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>
+ <input data-bind="click:pingClear" data-trans="ping_clear" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>
+ <!-- <input data-trans="ping_start" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/> -->
+ <!-- <input data-trans="ping_end" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/> -->
+ </div>
+ </div>
+ </form>
+ <!-- add by qumengjia for schedule ping diagnostics end -->
+
+ <div class="form-body">
+ <div class="content margin-top-20 line-height-30">
+ <div class="row">
+ <a href="#pin_mode">
+ <div data-trans="pin_management" class="col-xs-3 arrow-right">
+ </div>
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/adm_quick_set.html b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_quick_set.html
new file mode 100755
index 0000000..ee908d0
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_quick_set.html
@@ -0,0 +1,308 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='quick_setting'></h1>
+ <p data-trans='step1_exp1'></p>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-1 margin-top-15">
+ </div>
+ <div class="col-xs-11">
+
+<form id='quickSettingForm'>
+ <div class="form-body">
+ <div class="content">
+ <div class="row form-group side-right form-buttons">
+ <input id="btnBack" data-bind="visible:currentStep()>1,click:previous" data-trans="prev_step" type="button" class="btn btn-primary">
+ <input id="btnNext" data-bind="visible:currentStep()<5,disable: adBand()=='b' && adMode() == '2' && (selectedSecurityMode() == 'SHARED' || (selectedSecurityMode() == 'OPEN' && encryptType() == 'WEP'))" data-trans="next_step" type="submit" formmethod="post" class="btn btn-primary">
+ <input id="btnSave" data-bind="visible:currentStep()==5" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary">
+ </div>
+ <div data-bind="visible:currentStep()==1" style="display: none" id="step1">
+ <h3 data-trans="apn_settings" class="form-title"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="apn_settings" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <div class="row">
+ <div class="col-xs-4">
+ <input id="radAuto" name="apnMode" data-bind="checked: apnMode,disable: apnModeDisabled()" type="radio" value="auto"/>
+ <label data-trans="apn_auto_apn" for="radAuto"></label>
+ </div>
+ <div class="col-xs-4">
+ <input id="radManual" name="apnMode" data-bind="checked: apnMode,disable: apnModeDisabled()" type="radio" value="manual"/>
+ <label data-trans="apn_manual_apn" for="radManual"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="apnSetting" data-bind="visible:apnMode()=='manual'">
+ <div class="row form-group">
+ <label data-trans="apn_profile_name" for="profile_name" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="profile_name" name="txtProfileName" data-bind="value:profileName" disabled="disabled" maxlength="30" type="text" class=" form-control"/>
+ </div>
+ </div>
+ <div data-bind="visible:showIPv4" class="row form-group">
+ <label for="txtAPN" data-bind="attr:{'data-trans':transAPN}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="txtAPN" name="txtAPN" data-bind="value:apn,disable: apnDisabled()" maxlength="64" type="text" class="form-control required"/>
+ </div>
+ </div>
+ <div data-bind="visible:showIPv6" class="row form-group">
+ <label for="txtIPv6APN" data-bind="attr:{'data-trans':transAPNIPv6}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="txtIPv6APN" name="txtIPv6APN" data-bind="value:ipv6_apn,disable: apnDisabled()" maxlength="64" type="text" class="form-control required"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="diconneted_operate_note"></li>
+ <li data-trans="step2_auto_apn_explain"></li>
+ <li data-trans="step2_profile_name_explain"></li>
+ </ul>
+ </div>
+ </div>
+ <div id="step2" data-bind="visible:currentStep()==2" style="display: none">
+ <h3 data-trans="ppp_authentication" class="form-title"></h3>
+ <div class="content">
+ <div data-bind="visible:showIPv4" class="row form-group">
+ <label data-bind="attr:{'data-trans':transAuthMode}" for="selAuthMode" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <select id="selAuthMode" name="selAuthMode"
+ data-bind="options: authModes, disable: apnDisabled(), value: selectedAuthMode, optionsText: 'text', optionsValue: 'value'" class="form-control"></select>
+ </div>
+ </div>
+ <div data-bind="visible:showIPv4" class="row form-group">
+ <label data-bind="attr:{'data-trans':transUserName}" for="txtUserName" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="txtUserName" name="txtUserName"
+ data-bind="value:username,disable: apnDisabled()" maxlength="64" type="text" class=" form-control"/>
+ </div>
+ </div>
+ <div data-bind="visible:showIPv4" class="row form-group">
+ <label data-bind="attr:{'data-trans':transPassword}" for="txtSecretCode" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="txtSecretCode" name="txtSecretCode"
+ data-bind="value:password,disable: apnDisabled()" maxlength="64" type="password" class=" form-control"/>
+ </div>
+ </div>
+ <div data-bind="visible:showIPv6" class="row form-group">
+ <label data-bind="attr:{'data-trans':transAuthModeIPv6}" for="selIPv6AuthMode" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <select id="selIPv6AuthMode" name="selIPv6AuthMode"
+ data-bind="options: authModes, disable: apnDisabled(), value: ipv6_selectedAuthMode, optionsText: 'text', optionsValue: 'value'" class="form-control"></select>
+ </div>
+ </div>
+ <div data-bind="visible:showIPv6" class="row form-group">
+ <label class="col-xs-3 side-right" for="txtIPv6UserName" data-bind="attr:{'data-trans':transUserNameIPv6}"></label>
+ <div class="col-xs-6">
+ <input id="txtIPv6UserName" name="txtIPv6UserName"
+ data-bind="value:ipv6_username,disable: apnDisabled()" maxlength="64" type="text" class=" form-control"/>
+ </div>
+ </div>
+ <div data-bind="visible:showIPv6" class="row form-group">
+ <label data-bind="attr:{'data-trans':transPasswordIPv6}" for="txtIPv6SecretCode" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="txtIPv6SecretCode" name="txtIPv6SecretCode" data-bind="value:ipv6_password,disable: apnDisabled()" maxlength="64"
+ type="password" class="form-control"/>
+ </div>
+ </div>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="step3_authentication_apn_explain1"></li>
+ <li data-trans="step3_authentication_apn_explain2"></li>
+ <li data-trans="step3_authentication_apn_explain3"></li>
+ </ul>
+ </div>
+
+ </div>
+ <div id="step3" data-bind="visible:currentStep()==3" style="display: none">
+ <h3 class="form-title" data-trans="ssid_title"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="ssid_name" for="txtSSID" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="txtSSID" name="txtSSID" data-bind="disable:wifiDisabled,value:ssid" maxlength="32" type="text" class="form-control required"/>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label class="col-xs-3 side-right" data-trans="ssid_broadcast"></label>
+ <div class="col-xs-6">
+ <input id="radBroadcastEnable" data-bind="disable:wifiDisabled,checked: broadcast" name="radBroadcast"
+ type="radio" value="0"/>
+ <label for="radBroadcastEnable" data-trans="enable"></label>
+ <input id="radBroadcastDisable" name="radBroadcast"
+ data-bind="disable:wifiDisabled,checked: broadcast" type="radio" value="1"/>
+ <label data-trans="disable" for="radBroadcastDisable"></label>
+ </div>
+ </div>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="step4_ssid_explain"></li>
+ <li data-trans="wifi_basic_note_network_name_input"></li>
+ <li data-trans="step4_ssid_broadcast_explain1"></li>
+ </ul>
+ </div>
+
+ </div>
+ <div data-bind="visible:currentStep()==4" style="display: none" id="step4">
+ <h3 class="form-title" data-trans="security_mode"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label for="selSecurityMode" data-trans="security_mode" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <select id="selSecurityMode" name="selSecurityMode" data-transid='security_mode'
+ data-bind="disable:wifiDisabled,options: securityModes, value: selectedSecurityMode, optionsText: transOption('security_mode'), optionsValue: 'value'" class="form-control"></select>
+ </div>
+ </div>
+
+ <div data-bind='visible: selectedSecurityMode() == "OPEN" && hasWifiWep' class="row form-group">
+ <label for='selEncryptType' data-trans='ap_station_encrypt_type' class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <select id="selEncryptType" data-bind="value: encryptType,optionsValue: 'value'" class="form-control">
+ <option data-trans="ap_station_encrypt_type_none" value="NONE"></option>
+ <option data-trans="ap_station_encrypt_type_wep" value="WEP"></option>
+ </select>
+ </div>
+ </div>
+ <div data-bind='visible: (selectedSecurityMode() == "OPEN" && encryptType() == "WEP" && hasWifiWep) || (selectedSecurityMode() == "SHARED" && hasWifiWep)' class="row form-group">
+ <label data-trans='ap_station_wep_default_key' for='selWepKeyType' class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <select id="selWepKeyType" data-bind="value: keyID,optionsValue: 'value', event:{ change: profileChangeHandler}" class="form-control">
+ <option data-trans="ap_station_wep_key_0" value="0"></option>
+ <option data-trans="ap_station_wep_key_1" value="1"></option>
+ <option data-trans="ap_station_wep_key_2" value="2"></option>
+ <option data-trans="ap_station_wep_key_3" value="3"></option>
+ </select>
+ </div>
+ </div>
+ <div data-bind='visible: (selectedSecurityMode() == "OPEN" && encryptType() == "WEP" && hasWifiWep) || (selectedSecurityMode() == "SHARED" && hasWifiWep)' class="row form-group">
+ <label data-trans='ap_station_wep_key' for='pwdWepKey' class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id='pwdWepKey' name="pwdWepKey" type="password"
+ data-bind="value: wepPassword,visible:!showWifiPassword()" maxlength='26' class="required form-control"/>
+ <input id='txtWepKey' name="txtWepKey" type="text"
+ data-bind="value: wepPassword,visible:showWifiPassword()" maxlength='26' class="required form-control"/>
+ <div class="margin-top-10">
+ <p data-bind="css:{'checkbox_selected': showWifiPassword()}, click: showWifiPasswordHandler"
+ manualControl="true" class="checkbox">
+ <input id="showWepPassword" data-bind="checked:showWifiPassword" type="checkbox"/>
+ </p>
+ <label data-trans="display_password" for="showWepPassword" class="floatleft margintop5 lineheight25"/>
+ </div>
+ <div id="lblShowWepPassword" class="clear"></div>
+ </div>
+ </div>
+
+ <div data-bind="visible:selectedSecurityMode() == 'WPA2PSK' || selectedSecurityMode() == 'WPAPSKWPA2PSK' || selectedSecurityMode() == 'WPA3Personal' || selectedSecurityMode() == 'WPA2WPA3'" class="row form-group">
+ <label data-trans="pass_phrase" for="txtWPAKey" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="codeWPAKey" name="codeWPAKey" data-bind="disable:wifiDisabled,value:WPAKey,visible:!showWifiPassword()" maxlength='63' minlength='8' type="password" class="form-control required"/>
+ <input id="txtWPAKey" name="txtWPAKey" data-bind="disable:wifiDisabled,value:WPAKey,visible:showWifiPassword()" maxlength='63' minlength='8' type="text" class="form-control required"/>
+ <p data-bind="css:{'checkbox_selected': showWifiPassword()}, click: showWifiPasswordHandler" manualControl="true" class="checkbox floatleft margintop10 marginleft5 marginright5">
+ <input id="showWifiPassword" data-bind="checked:showWifiPassword" type="checkbox"/>
+ </p>
+ <label data-trans="display_password" for="showWifiPassword" class="floatleft margintop5 lineheight25"/>
+ <div id="lblShowWifiPassword" class="clear"></div>
+ </div>
+ </div>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="step5_encryption_mode_info"></li>
+ <li class="no-style">
+ <ul>
+ <li data-trans="step5_encryption_mode_explain1"></li>
+ <li data-bind='visible: hasWifiWep' data-trans="wifi_basic_note_shared"></li>
+ <li data-trans="step5_encryption_mode_explain2"></li>
+ <li data-trans="step5_encryption_mode_explain3"></li>
+ <li data-bind='visible: hasWifiWpa3' data-trans="wifi_basic_note_wpa3"></li>
+ <li data-bind='visible: hasWifiWpa23' data-trans="wifi_basic_note_wpa2_wpa3"></li>
+ </ul>
+ </li>
+ <li data-trans="step5_encryption_mode_explain4"></li>
+ </ul>
+ </div>
+
+ </div>
+ <div data-bind="visible:currentStep()==5" style="display: none" id="step5">
+ <h3 class="form-title" data-trans="step_name_6"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="apn_settings" class="col-xs-3 side-right"></label>
+ <label data-bind="text:apnMode_display,attr:{'data-trans':apnMode_trans}" class="col-xs-6"></label>
+ </div>
+ <div data-bind="visible:apnMode()=='manual'">
+ <div class="row form-group">
+ <label data-trans="apn_profile_name" class="col-xs-3 side-right"></label>
+ <label data-bind="text:profileName" class="col-xs-6"></label>
+ </div>
+ <div class="row form-group" data-bind="visible:showIPv4">
+ <label data-bind="attr:{'data-trans':transAPN}" class="col-xs-3 side-right"></label>
+ <label data-bind="text: apn,attr:{title:apn}" class="col-xs-6 ellipsis"></label>
+ </div>
+ <div class="row form-group" data-bind="visible:showIPv4">
+ <label data-bind="attr:{'data-trans':transAuthMode}" class="col-xs-3 side-right"></label>
+ <label data-bind="text:selectedAuthMode_display" class="col-xs-6"></label>
+ </div>
+ <div class="row form-group" data-bind="visible:showIPv4">
+ <label data-bind="attr:{'data-trans':transUserName}" class="col-xs-3 side-right"></label>
+ <label data-bind="text:username,attr:{title:username}" class="col-xs-6 ellipsis"></label>
+ </div>
+ <div class="row form-group" data-bind="visible:showIPv6">
+ <label data-bind="attr:{'data-trans':transAPNIPv6}" class="col-xs-3 side-right"></label>
+ <label data-bind="text:ipv6_apn" class="col-xs-6"></label>
+ </div>
+ <div class="row form-group" data-bind="visible:showIPv6">
+ <label data-bind="attr:{'data-trans':transAuthModeIPv6}" class="col-xs-3 side-right"></label>
+ <label data-bind="text:ipv6_selectedAuthMode_display" class="col-xs-6"></label>
+ </div>
+ <div class="row form-group" data-bind="visible:showIPv6">
+ <label data-bind="attr:{'data-trans':transUserNameIPv6}" class="col-xs-3 side-right"></label>
+ <label data-bind="text:ipv6_username,attr:{title:ipv6_username}" class="col-xs-6 ellipsis"></label>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label data-trans="ssid_name" class="col-xs-3 side-right"></label>
+ <label data-bind="text:ssid" class="col-xs-6"></label>
+ </div>
+ <div class="row form-group">
+ <label data-trans="ssid_broadcast" class="col-xs-3 side-right"></label>
+ <label data-bind="text:broadcast_display,attr:{'data-trans':broadcast_trans}" class="col-xs-6"></label>
+ </div>
+ <div class="row form-group">
+ <label data-trans="security_mode" class="col-xs-3 side-right"></label>
+ <label data-bind="text:selectedSecurityMode_display,attr:{'data-trans':selectedSecurityMode_trans}" class="col-xs-6"></label>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="step6_apply_explain"></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ </div>
+ </div>
+</form>
+
+ </div>
+ </div>
+</div>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/firewall.html b/lynq/MD310EU/ap/app/zte_webui/subpg/firewall.html
new file mode 100755
index 0000000..bf00b0c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/firewall.html
@@ -0,0 +1,69 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='advanced_settings'></h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li><a data-trans="sleep_mode" href="#wlan_sleep"></a></li>
+ <li><a data-trans="router_setting" href="#route_set"></a></li>
+ <li class="active"><a data-trans="firewall" href="#filter_main"></a></li>
+ <li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>
+ <!-- <li data-bind="visible:hasUssd"><a data-trans="USSD" href="#usat"></a></li> -->
+ <li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>
+ <li><a data-trans="others" href="#more"></a></li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="col-xs-10">
+ <div class="form-body">
+ <div class="content margin-top-20">
+ <div class="col-xs-4">
+ <div class="row">
+ <a href="#filter_port">
+ <div data-trans="port_filter" class="line-height-40 arrow-right cursorhand"></div>
+ </a>
+ </div>
+ <div class="row" style="display:none">
+ <a href="#map_port">
+ <div data-trans="port_map" class="line-height-40 arrow-right cursorhand"></div>
+ </a>
+ </div>
+ <div class="row" style="display:none">
+ <a href="#foward_port">
+ <div data-trans="port_forward" class="line-height-40 arrow-right cursorhand"></div>
+ </a>
+ </div>
+ <div data-bind="visible: hasUrlFilter" class="row">
+ <a href="#filter_url">
+ <div data-trans="url_filter" class="line-height-40 arrow-right cursorhand"></div>
+ </a>
+ </div>
+ <div class="row">
+ <a href="#universal_plug_and_play">
+ <div data-trans="upnp" class="line-height-40 arrow-right cursorhand"></div>
+ </a>
+ </div>
+ <div class="row">
+ <a href="#demilitarized_zone">
+ <div data-trans="dmz" class="line-height-40 arrow-right cursorhand"></div>
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/firewall_url_filter.html b/lynq/MD310EU/ap/app/zte_webui/subpg/firewall_url_filter.html
new file mode 100755
index 0000000..d53b01b
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/firewall_url_filter.html
Binary files differ
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/main.html b/lynq/MD310EU/ap/app/zte_webui/subpg/main.html
new file mode 100755
index 0000000..eb7a57c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/main.html
@@ -0,0 +1,233 @@
+
+<div class="row margin-top-20">
+<div class="type_items">
+ <ul>
+ <li><a href="#child_ctl" data-bind="visible: hasParentalControl" data-trans="parental_control" class="c0EC6DC"></a></li>
+ <li><a href="#msg_main" data-bind="visible: hasSms" data-trans="sms" class="cF53A58"></a></li>
+ <li><a href="#usat" data-bind="visible:hasUssd" data-trans="USSD"></a></li>
+ <li><a href="#pb_main" data-bind="visible: hasPhonebook" data-trans="phonebook" class="c00AEFF"></a></li>
+ <li><a href="#sdcard" data-bind="visible: isSupportSD" data-trans="sd" class="c2175FF"></a></li>
+ <li><a data-bind="attr: {href: notDataCard? '#wlan_sleep' : '#demilitarized_zone'}" data-trans="advanced_settings" class="cFFCE2B"></a></li>
+ <li><a href="#fast_set" data-bind="visible: isSupportQuicksetting()" data-trans="quick_setting" class="cFFCE2B"></a></li>
+ </ul>
+</div>
+</div>
+
+<div class="row margin-top-20" id="home_image">
+
+<div class="row">
+ <div style="position: relative">
+ <div class="internet_status_container">
+ <div data-bind=" css: {'item_icon_connect': cStatus()== 1, 'item_icon_disconnect': cStatus() != 1}"></div>
+ <h3 data-trans="net_surfing" class="home_h3"></h3>
+ <div class="net_surfing_list">
+ <ul>
+ <li><a id="h_connect_btn" href="javascript: void(0)" data-bind="visible: canConnect() && isShowHomeConnect(), click: connectHandler , css: {'h_connect_on': cStatus()== 1, 'h_connect_off': cStatus() != 1}" style="display: none;"></a></li>
+ <li><i class="up"></i><span data-bind="text: up_Speed"></span></li>
+ <li><i class="down"></i><span data-bind="text: down_Speed"></span></li>
+ <li><span data-bind="text: connected_Time"></span></li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="network_control_container">
+ <div class="item_icon"></div>
+ <h3 data-trans="my_router" class="home_h3"></h3>
+ <!--div id="h_network_type" data-bind="text: networkType, css: {'no-btn': !(canConnect() && isShowHomeConnect())}"></div-->
+ <div class="my_router_list">
+ <ul>
+ <li data-bind="visible: hasRj45"><a id="opmode" data-bind="click: showOpModeWindow, css: {'not-allowed': enableFlag}" href="javascript:void(0)"></a></li>
+ <li><a data-bind="click: showNetworkSettingsWindow" data-trans="settings_internet" href="javascript:void(0)"></a></li>
+ <!--li><div id="h_ssid"></div></li-->
+ <li data-bind="visible: notDataCard"><a data-trans="settings_wireless" href="#wlan_main"></a></li>
+ </ul>
+ </div>
+ </div>
+
+ <!--div id="h_connect_status" data-bind="visible:notDataCard, css: {'h_status_connected': cStatus()== 1, 'h_status_disconnected': cStatus()== 2, 'h_status_connecting': cStatus()== 3, 'h_status_disconnecting': cStatus()== 4, }">
+ </div-->
+
+ <div data-bind="visible: notDataCard" onclick="window.location.hash='#conn_device'" class="connected_devices_container">
+ <div class="item_icon"></div>
+ <h3 data-trans="station_info" class="home_h3" ></h3>
+ <div style="text-align:center;display:inline" class="margin-top-20">
+ <div id="h_wire_device" data-bind="visible: hasRj45 && isCPE">
+ <span data-bind="text: wireDeviceNum" style="font-size:70px;"><em></em></span><sub data-trans="device_unit" style="font-size: 16px;"></sub>
+ <span data-trans="cable" style="font-size:15px;text-align:center;display:block"></span>
+ </div>
+ <div id="h_wireless_device" style="display-block">
+ <span data-bind="text: wirelessDeviceNum" style="font-size:70px"></span><sub data-trans="device_unit" style="font-size: 16px;"></sub>
+ <span data-trans="wireless" style="font-size:15px;text-align:center;display:block"></span>
+ </div>
+ </div>
+ <!--a href="#conn_device" id="h_attached_device_link">
+ </a-->
+ </div>
+ </div>
+</div>
+</div>
+
+
+<div class="row margin-top-20 label-font-normal margin-bottom-20">
+ <div class="text-center traffic_control_container" data-bind="visible: showTraffic()">
+ <h4 data-trans="traffic_data_plan" style="font-size:14px;text-align:right;padding-right:15px"></h4>
+ <div style="display:inline-block">
+ <div id="traffic_graphic" style="width: 200px; height: 165px; visibility: visible;"></div>
+ </div>
+ <div style="text-align: left;padding-left:20px;font-size:18px">
+ <span style="background-color: #8CC916;" class="color_block"></span>
+ <span data-trans="traffic_used" class="color_block_desc"></span>
+ <span class="color_block_desc">:</span>
+ <span data-bind="text: trafficUsed" class="color_block_desc"></span>
+ </div>
+ <div class="statistics_list">
+ <ul>
+ <li><a href="#flow_ctl">
+ <div data-bind="visible: trafficAlertEnable">
+ <span data-bind="text: trafficLimited" class="line-height-20"></span>
+ <span data-trans="traffic_limit_data" class="line-height-20"></span>
+ </div>
+ <div data-bind="visible: trafficAlertEnable() == false">
+ <div data-trans="traffic_not_set_limited" class="line-height-20"></div>
+ </div>
+ </a></li>
+ </ul>
+ </div>
+ </div>
+
+
+ <div data-bind="css:{'device_info_container_hastraffic':showTraffic(),'device_info_container_notraffic':!showTraffic()}" class="device_info_container">
+ <h4 data-trans="device_info" style="font-size:14px;text-align:left;padding-left:15px;color:#fff"></h4>
+ <div style="color:#fff;position: relative;height: 210px;font-size: 18px;line-height: 1.5em;padding:20px 0px 0px 15px;">
+ <div class="row">
+ <label data-trans="sim_serial_number" class="col-xs-5"></label>
+ <label data-bind="text: simSerialNumber" class="col-xs-7"></label>
+ </div>
+ <div class="row">
+ <label data-trans="imei" class="col-xs-5"></label>
+ <label data-bind="text: imei" class="col-xs-7"></label>
+ </div>
+ <div class="row">
+ <label data-trans="imsi" class="col-xs-5"></label>
+ <label data-bind="text: imsi" class="col-xs-7"></label>
+ </div>
+ <div class="row">
+ <label data-trans="iccid" class="col-xs-5"></label>
+ <label data-bind="text: iccid" class="col-xs-7"></label>
+ </div>
+ <div class="row">
+ <label data-trans="cellid" class="col-xs-5"></label>
+ <label data-bind="text: cellid" class="col-xs-7"></label>
+ </div>
+ <!--div class="row" data-bind="visible: notDataCard">
+ <label class="col-xs-5" data-trans="wifi_range"></label>
+ <label class="col-xs-7" data-bind="attr: {'data-trans': wifiLongMode}"></label>
+ </div-->
+ <div class="row">
+ <label data-trans="signal_strength_label" class="col-xs-5"></label>
+ <label id="fresh_signal_strength" class="col-xs-7"></label>
+ </div>
+ <div class="row" data-bind="visible: hasWifi && showMultiSsid()">
+ <label data-trans="network_name_ssid1" class="col-xs-5"></label>
+ <label data-bind="text: ssid" style="word-wrap: break-word;" class="col-xs-7"></label>
+ </div>
+ <div class="row" data-bind="visible: hasWifi && !showMultiSsid()">
+ <label data-trans="network_name" class="col-xs-5"></label>
+ <label data-bind="text: ssid" style="word-wrap: break-word;" class="col-xs-7"></label>
+ </div>
+ </div>
+ <div style="text-align:right;">
+ <a href="javascript: void(0)" data-trans="detail_info" id="showDetailInfo" tabindex="0"></a>
+ </div>
+ </div>
+</div>
+
+
+<div id="h_qrcode" data-bind="visible: showQRCode" style="float:right" class="text-center">
+ <img id="qrcode_img" data-bind="attr: {src: qrcodeSrc}" src="./pic/res_blacktrans.png" width="111"/>
+</div>
+
+<script type="text/x-jquery-tmpl" id="detailInfoTmpl">
+<div class="row">
+ <label class="col-xs-6" data-trans="sim_serial_number" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= simSerialNumber %></label>
+</div>
+<div class="row">
+ <label data-trans="imei" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= imei %></label>
+</div>
+<div class="row">
+ <label data-trans="imsi" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= imsi %></label>
+</div>
+<div class="row">
+ <label data-trans="iccid" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= iccid %></label>
+</div>
+<div class="row">
+ <label data-trans="cellid" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= cellid %></label>
+</div>
+<div class="row">
+ <label data-trans="signal_strength_label" class="col-xs-6"></label>
+ <label class="col-xs-6" id="popoverSignalTxt"><%= signal %></label>
+</div>
+<% if(hasWifi){ %>
+<div class="row">
+ <label data-trans="<%= showMultiSsid ? 'network_name_ssid1': 'network_name' %>" class="col-xs-6"></label>
+ <label style="word-wrap: break-word; word-break: break-all;" class="col-xs-6"><%= ssid %></label>
+</div>
+<div class="row">
+ <label data-trans="<%= showMultiSsid ? 'max_access_num_ssid1': 'max_access_num' %>" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= max_access_num %></label>
+</div>
+ <% if(showMultiSsid){ %>
+ <div class="row">
+ <label data-trans="network_name_ssid2" class="col-xs-6"></label>
+ <label style="word-wrap: break-word; word-break: break-all;" class="col-xs-6"><%= m_ssid %></label>
+ </div>
+ <div class="row">
+ <label data-trans="max_access_num_ssid2" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= m_max_access_num %></label>
+ </div>
+ <% } %>
+<div class="row">
+ <label data-trans="wifi_range" class="col-xs-6"></label>
+ <label data-trans="<%= wifi_long_mode %>" class="col-xs-6"></label>
+</div>
+<% } %>
+<div class="row">
+ <label data-trans="lan_domain" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= lanDomain %></label>
+</div>
+<div class="row">
+ <label data-trans="ip_address" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= ipAddress %></label>
+</div>
+<% if(showMacAddress){ %>
+<div class="row">
+ <label data-trans="mac_address" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= macAddress %></label>
+</div>
+<% } %>
+<% if(showIpv4WanIpAddr){ %>
+<div class="row">
+ <label data-trans="wan_ip_address" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= wanIpAddress %></label>
+</div>
+<% } %>
+<% if(showIpv6WanIpAddr){ %>
+<div class="row">
+ <label data-trans="ipv6_wan_ip_address" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= ipv6WanIpAddress %></label>
+</div>
+<% } %>
+<div class="row">
+ <label data-trans="software_version" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= sw_version %></label>
+</div>
+<div class="row">
+ <label data-trans="hardware_version" class="col-xs-6"></label>
+ <label class="col-xs-6"><%= hw_version %></label>
+</div>
+</script>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/network_apn_set.html b/lynq/MD310EU/ap/app/zte_webui/subpg/network_apn_set.html
new file mode 100755
index 0000000..16cd939
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/network_apn_set.html
@@ -0,0 +1,221 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='net_setting'></h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li><a data-trans="dial_mode" href="#conn_set"></a></li>
+ <li><a data-trans="net_select" href="#network_choose"></a></li>
+ <li class="active"><a data-trans="apn_setting" href="#cgdcont_set"></a></li>
+ <li><a data-trans="net_info" href="#net_status"></a></li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="col-xs-10">
+
+<form id="apn_setting_form">
+ <div class="form-body">
+ <h3 data-trans="apn_setting" class="form-title"></h3>
+ <div class="content">
+ <!-- 当前APN -->
+ <div class="row form-group">
+ <label data-trans="apn_currentApn" class="col-xs-3 side-right"></label>
+ <label data-bind="text: defApn" class="col-xs-6"></label>
+ </div>
+ <!-- 模式 手动、自动 -->
+ <div class="row form-group">
+ <label data-trans="apn_mode" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <div class="row">
+ <div class="col-xs-4">
+ <input id="apnMode_auto" type="radio" name="apnMode" data-bind="checked: apnMode, event: {click: apnModeChangeHandler}, disable: autoApnChecked() == false && disableProfile() == true" value="auto"/>
+ <label for="apnMode_auto" data-trans="apn_auto_apn"></label>
+ </div>
+ <div class="col-xs-4">
+ <input id="apnMode_manual" type="radio" name="apnMode" data-bind="checked: apnMode, event: {click: apnModeChangeHandler}, disable: autoApnChecked() == false && disableProfile() == true" value="manual"/>
+ <label for="apnMode_manual" data-trans="apn_manual_apn"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="apn_form_container" data-bind="visible: showAutoApnDetail()">
+ <div class="row form-group">
+ <label class="col-xs-3 side-right" for="profile" data-trans="apn_profile"></label>
+ <div class="col-xs-4">
+ <select id="autoProfile" name="autoProfile" data-bind="options: autoProfiles, value: selectedAutoProfile, optionsText: 'text', optionsValue: 'value', disable: disableProfile, event:{ change: autoProfileChangeHandler}, visible: apnMode() == 'auto'" class="form-control"></select>
+ <select id="profile" name="profile" data-bind="options: profiles, value: selectedProfile, optionsText: 'text', optionsValue: 'value', disable: disableProfile, event:{ change: profileChangeHandler}, visible: apnMode() == 'manual'" class="form-control"></select>
+ </div>
+
+ <div class="col-xs-2">
+ <input type="button" data-bind="click: addAct, visible: autoApnChecked() == false && disableProfile() == false && hasCapacity() == true" data-trans="add_new" class="btn btn-primary"/>
+ <input type="button" data-bind="click: cancelAddAct, visible: autoApnChecked() == false && disableProfile() == true && hasCapacity() == true" data-trans="cancel" class="btn btn-primary"/>
+ </div>
+ </div>
+ <div data-bind="visible: supportIPv6()" class="row form-group">
+ <label for="apn_pdp_type" data-trans="apn_pdp_type" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <select id="apn_pdp_type" name="apn_pdp_type" data-bind="options: pdpTypes, value: selectedPdpType, optionsText: 'text', optionsValue: 'value', disable: checkInputDisable, event:{ change: pdpTypeChangeAlert}" class="form-control"></select>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label for="profile_name" data-trans="apn_profile_name" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="profile_name" type="text" name="profile_name" data-bind="value: profileName, disable: checkInputDisable" maxlength="15" class="required form-control"/>
+ </div>
+ </div>
+ <div id="ipv4_section" data-bind="visible: selectedPdpType() != 'IPv6'">
+ <div class="row form-group">
+ <label for="apn_ipv4_apn" data-bind="attr:{'data-trans': transApn}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_ipv4_apn" type="text" name="apn_ipv4_apn" data-bind="value: apn, disable: checkInputDisable" maxlength="64" class="required form-control"/>
+ </div>
+ </div>
+ <div class="row form-group" data-bind="visible: showApnDns()">
+ <label data-bind="attr:{'data-trans': transDnsMode}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_auto_dns_ipv4" type="radio" name="apn_auto_dns_ipv4" data-bind="checked: dnsMode, disable: checkInputDisable" value="auto"/>
+ <label for="apn_auto_dns_ipv4" data-trans="apn_auto_dns"></label>
+ <input id="apn_manual_dns_ipv4" type="radio" name="apn_manual_dns_ipv4" data-bind="checked: dnsMode, disable: checkInputDisable" value="manual"/>
+ <label for="apn_manual_dns_ipv4" data-trans="apn_manual_dns"></label>
+ </div>
+ </div>
+ <div data-bind="visible: showDns() && showApnDns()" class="row form-group">
+ <label for="apn_dns1_ipv4" data-bind="attr:{'data-trans': transDns1}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_dns1_ipv4" type="text" name="apn_dns1_ipv4" data-bind="value: dns1, disable: checkInputDisable" maxlength="15" class="required ipv4 form-control"/>
+ </div>
+ </div>
+ <div data-bind="visible: showDns() && showApnDns()" class="row form-group">
+ <label for="apn_dns2_ipv4" data-bind="attr:{'data-trans': transDns2}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_dns2_ipv4" type="text" name="apn_dns2_ipv4" data-bind="value: dns2, disable: checkInputDisable" maxlength="15" class="ipv4 form-control"/>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label for="apn_authentication_ipv4" data-bind="attr:{'data-trans': transAuth}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <select id="apn_authentication_ipv4" name="apn_authentication_ipv4" data-bind="options: authModes, disable: checkInputDisable, value: selectedAuthentication, optionsText: 'text', optionsValue: 'value'" class="form-control"></select>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label for="apn_user_name_ipv4" data-bind="attr:{'data-trans': transUserName}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_user_name_ipv4" type="text" name="apn_user_name_ipv4" data-bind="value: username, disable: checkInputDisable" maxlength="64" class="form-control"/>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label class="col-xs-3 side-right" for="apn_secretcode_ipv4" data-bind="attr:{'data-trans': transPassword}"></label>
+ <div class="col-xs-6">
+ <input id="apn_secretcode_ipv4" type="password" name="apn_secretcode_ipv4" data-bind="value: password,visible:!showPassword(), disable: checkInputDisable" maxlength="64" class="form-control"/>
+ <input id="apn_secretcode_ipv4_show" type="text" name="apn_secretcode_ipv4" data-bind="value: password,visible:showPassword(), disable: checkInputDisable" maxlength="64" class="form-control"/>
+ <div class="margin-top-10">
+ <p data-bind="css:{'checkbox_selected': showPassword()}, click: showPasswordHandler" manualControl="true" class="checkbox">
+ <input id="showPassword" data-bind="checked:showPassword" type="checkbox"/>
+ </p>
+ <label data-trans="display_password" class="floatleft lineheight25 margintop5"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- 以下是ipv6 -->
+
+ <div data-bind="visible: (selectedPdpType() == 'IPv4v6' && supportIpv4AndIpv6()) || selectedPdpType() == 'IPv6'">
+ <div class="row form-group">
+ <label for="apn_ipv6_apn" data-bind="attr:{'data-trans': transApnV6}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_ipv6_apn" type="text" name="apn_ipv6_apn" data-bind="value: apnV6, disable: checkInputDisable" maxlength="64" class="required form-control"/>
+ </div>
+ </div>
+ <div data-bind="visible: showApnDns()" class="row form-group">
+ <label data-bind="attr:{'data-trans': transDnsModeV6}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_auto_dns_ipv6" type="radio" name="dns_ipv6" data-bind="checked: dnsModeV6, disable: checkInputDisable" value="auto"/>
+ <label for="apn_auto_dns_ipv6" data-trans="apn_auto_dns"></label>
+ <input id="apn_manual_dns_ipv6" type="radio" name="dns_ipv6" data-bind="checked: dnsModeV6, disable: checkInputDisable" value="manual"/>
+ <label for="apn_manual_dns_ipv6" data-trans="apn_manual_dns"></label>
+ </div>
+ </div>
+ <div data-bind="visible: showDnsV6() && showApnDns()" class="row form-group">
+ <label for="apn_dns1_ipv6" data-bind="attr:{'data-trans': transDns1V6}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_dns1_ipv6" type="text" name="apn_dns1_ipv6" data-bind="value: dns1V6, disable: checkInputDisable" class="required ipv6 form-control"/>
+ </div>
+ </div>
+ <div class="row form-group" data-bind="visible: showDnsV6() && showApnDns()">
+ <label class="col-xs-3 side-right" for="apn_dns2_ipv6" data-bind="attr:{'data-trans': transDns2V6}"></label>
+ <div class="col-xs-6">
+ <input id="apn_dns2_ipv6" type="text" name="apn_dns2_ipv6" data-bind="value: dns2V6, disable: checkInputDisable" class="ipv6 form-control"/>
+ </div>
+ </div>
+
+ <div class="row form-group">
+ <label for="authentication_ipv6" data-bind="attr:{'data-trans': transAuthV6}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <select id="authentication_ipv6" name="authentication_ipv6" data-bind="options: authModes, disable: checkInputDisable, value: selectedAuthenticationV6, optionsText: 'text', optionsValue: 'value'" class="form-control"></select>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label for="apn_user_name_ipv6" data-bind="attr:{'data-trans': transUserNameV6}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_user_name_ipv6" type="text" name="apn_user_name_ipv6" data-bind="value: usernameV6, disable: checkInputDisable" maxlength="64" class="form-control"/>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label for="apn_secretcode_ipv6" data-bind="attr:{'data-trans': transPasswordV6}" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <input id="apn_secretcode_ipv6" type="password" name="apn_secretcode_ipv6" data-bind="value: passwordV6,visible:!showPassword(), disable: checkInputDisable" maxlength="64" class="form-control"/>
+ <input id="apn_secretcode_ipv6_show" type="text" name="apn_secretcode_ipv6" data-bind="value: passwordV6,visible:showPassword(), disable: checkInputDisable" maxlength="64" class="form-control"/>
+ <div class="margin-top-10">
+ <p data-bind="css:{'checkbox_selected': showPassword()}, click: showPasswordHandler" manualControl="true" class="checkbox">
+ <input id="showV6Password" data-bind="checked:showPassword" type="checkbox"/>
+ </p>
+ <label data-trans="display_password" class="floatleft lineheight25 margintop5"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label for="apn_secretcode_ipv6" data-trans="dial_num" class="col-xs-3 side-right"></label>
+ <label class="col-xs-6" data-bind="text: wanDial"></label>
+ </div>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input type="button" data-bind="click: setDefaultAct, visible: disableProfile() == false && setDefaultVisible() && !defaultCfg()" data-trans="set_default" class="btn btn-primary"/>
+ <input type="submit" formmethod="post" data-bind="visible: (!autoApnChecked() && !predeterminedCfg()) || disableProfile() == true" data-trans="apply" class="btn btn-primary"/>
+ <input type="button" data-bind="click: deleteAct, visible: !autoApnChecked() && !defaultCfg() && !predeterminedCfg() && !disableProfile()" data-trans="delete" class="btn btn-primary"/>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="apn_note_whole_page"></li>
+ <li data-trans="apn_note_mode"></li>
+ <li data-trans="apn_note_profile"></li>
+ <li data-trans="apn_note_pdp_type" data-bind="visible: supportIPv6()"></li>
+ <li data-trans="apn_note_profile_name"></li>
+ <li data-trans="apn_note_apn"></li>
+ <li data-trans="apn_note_dns_mode" data-bind="visible: showApnDns()"></li>
+ <li data-trans="apn_note_authentication"></li>
+ <li data-trans="apn_note_username"></li>
+ <li data-trans="apn_note_password"></li>
+ <li data-trans="apn_note_set_default"></li>
+ </ul>
+ </div>
+ </div>
+</form>
+ </div>
+</div>
+</div>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/network_dial_set.html b/lynq/MD310EU/ap/app/zte_webui/subpg/network_dial_set.html
new file mode 100755
index 0000000..a13017d
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/network_dial_set.html
@@ -0,0 +1,69 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='net_setting'></h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li class="active"><a data-trans="dial_mode" href="#conn_set"></a></li>
+ <li><a data-trans="net_select" href="#network_choose"></a></li>
+ <li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>
+ <li><a data-trans="net_info" href="#net_status"></a></li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="col-xs-10">
+
+<form>
+<div class="form-body">
+ <h3 data-trans="dial_mode" class="form-title"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans='dial_mode' class="col-xs-3 side-right"></label>
+ <div class="col-xs-2">
+ <input id='auto_mode' type="radio" name="modeGroup" value="auto_dial" data-bind="checked: selectMode, enable: enableFlag" />
+ <label for='auto_mode' data-trans='auto_select'></label>
+ </div>
+ <div class="col-xs-2">
+ <input id='manual_mode' type="radio" name="modeGroup" value="manual_dial" data-bind="checked: selectMode, enable: enableFlag" />
+ <label for='manual_mode' data-trans='manual_select'></label>
+ </div>
+ </div>
+
+ <div data-bind="visible: selectMode() == 'auto_dial'" class="row form-group">
+ <div class="col-xs-3"></div>
+ <div class="col-xs-8 label-absolute">
+ <p id="roamBtn" data-bind="css:{'checkbox_selected': isAllowedRoaming()=='on'}, click: setAllowedRoaming" manualControl="true"class="checkbox floatleft margintop5 checkboxToggle">
+ <input type="checkbox" id="isAllowedRoaming" value="on" data-bind="checked:isAllowedRoaming()=='on'" />
+ </p>
+ <label for="isAllowedRoaming" data-trans="dial_roaming_remind" class="update_inline floatleft lineheight25"></label>
+ </div>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input type="button" data-bind='click: save, enable: enableFlag' data-trans="apply" class="btn btn-primary"/>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="diconneted_operate_note"></li>
+ <li data-trans="dial_setting_note_automatic"></li>
+ <li data-trans="dial_setting_note_manual"></li>
+ </ul>
+ </div>
+</div>
+</form>
+ </div>
+</div>
+</div>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/network_info.html b/lynq/MD310EU/ap/app/zte_webui/subpg/network_info.html
new file mode 100755
index 0000000..84dabe4
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/network_info.html
@@ -0,0 +1,64 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='net_setting'></h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li><a data-trans="dial_mode" href="#conn_set"></a></li>
+ <li><a data-trans="net_select" href="#network_choose"></a></li>
+ <li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>
+ <li class="active"><a data-trans="net_info" href="#net_status"></a></li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="col-xs-10">
+ <form role="form">
+ <div class="form-body">
+ <h3 data-trans="net_info" class="form-title"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="pci" class="col-xs-5"></label>
+ <label data-bind="text: pci" class="col-xs-7"></label>
+ </div>
+ <div class="row form-group">
+ <label data-trans="sinr" class="col-xs-5"></label>
+ <label data-bind="text: sinr" class="col-xs-7"></label>
+ </div>
+ <div class="row form-group">
+ <label data-trans="rsrp" class="col-xs-5"></label>
+ <label data-bind="text: rsrp" class="col-xs-7"></label>
+ </div>
+ <div class="row form-group">
+ <label data-trans="rsrq" class="col-xs-5"></label>
+ <label data-bind="text: rsrq" class="col-xs-7"></label>
+ </div>
+ <div class="row form-group">
+ <label data-trans="plmn" class="col-xs-5"></label>
+ <label data-bind="text: plmn" class="col-xs-7"></label>
+ </div>
+ <div class="row form-group">
+ <label data-trans="cellid" class="col-xs-5"></label>
+ <label data-bind="text: cellid" class="col-xs-7"></label>
+ </div>
+ <div class="row form-group">
+ <label data-trans="band" class="col-xs-5"></label>
+ <label data-bind="text: band" class="col-xs-7"></label>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+</div>
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/network_net_select.html b/lynq/MD310EU/ap/app/zte_webui/subpg/network_net_select.html
new file mode 100755
index 0000000..fa6f286
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/network_net_select.html
@@ -0,0 +1,107 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='net_setting'></h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li><a data-trans="dial_mode" href="#conn_set"></a></li>
+ <li class="active"><a data-trans="net_select" href="#network_choose"></a></li>
+ <li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>
+ <li><a data-trans="net_info" href="#net_status"></a></li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="col-xs-10">
+
+<form role="form">
+<div class="form-body">
+ <h3 data-trans="net_select" class="form-title"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans='net_select' class="col-xs-4 side-right"></label>
+ <div class="col-xs-8">
+ <div class="row">
+ <div class="col-xs-4">
+ <input id='auto_select' type="radio" name="selectGroup" value="auto_select" data-bind="checked: selectMode, enable: enableFlag" />
+ <label for='auto_select' data-trans='auto_select'></label>
+ </div>
+ <div class="col-xs-6" style="display: none;">
+ <select id="type" data-transid='auto_select_type' data-bind="options: types, value: selectedType, optionsText: transOption('auto_select_type'), optionsValue: 'value', enable: enableFlag() && selectMode() == 'auto_select'" class="form-control"></select>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row form-group">
+ <label class="col-xs-4 side-right"></label>
+ <div class="col-xs-8">
+ <input id='manual_select' type="radio" name="selectGroup" value="manual_select" data-bind="checked: selectMode, enable: enableFlag" />
+ <label for='manual_select' data-trans='manual_select'></label>
+ </div>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input type="button" data-bind='click: save, visible: selectMode() == "auto_select", enable: enableFlag, css: {disabled: !enableFlag()}' data-trans='apply' class="btn btn-primary"/>
+ <input type="button" data-bind='click: search, visible: selectMode() != "auto_select", enable: enableFlag, css: {disabled: !enableFlag()}' data-trans='search' class="btn btn-primary"/>
+ </div>
+
+ <div data-bind='visible: networkList().length > 0 && selectMode() == "manual_select"' class="content">
+ <div class="form-title">
+ <h2 data-trans='network_list'></h2>
+ </div>
+ <div class="content">
+ <div class="ko-grid-container marginnone">
+ <table cellspacing="0" cellpadding="0" class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th width="12%" data-trans="option"></th>
+ <th width="16%" data-trans="net_status"></th>
+ <th width="21%" data-trans="network_provider"></th>
+ <th width="18%" data-trans="mccmnc"></th>
+ <th width="18%" data-trans="networktype"></th>
+ <th width="15%" data-trans="subnet"></th>
+ </tr>
+ </thead>
+ <tbody data-bind='foreach: networkList'>
+ <tr data-bind="css:{odd:$index()%2==1, even:$index()%2==0}">
+ <td><input type="radio" name="networkGroup"
+ data-bind='value: $root.networkValue($data), checked: $root.selectNetwork, attr: {id: $root.networkValue($data)}, enable: $root.enableFlag'/>
+ </td>
+ <td data-bind='attr: {"data-trans": $root.networkStatusId($data)}, text: $root.networkStatus($data)'></td>
+ <td data-bind='text: $root.operatorName($data)'></td>
+ <td data-bind='text: $root.networkText($data)'></td>
+ <td data-bind='attr: {"data-trans": $root.networkTypeId($data)}, text: $root.networkType($data)'></td>
+ <td data-bind='attr: {"data-trans": $root.subnetTypeId($data)}, text: $root.subnetworkType($data)'></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input type="button" data-bind='click: register, enable: selectNetwork() != "" && enableFlag, css: {disabled: selectNetwork() == "" || !enableFlag()}' data-trans='register' class="btn btn-primary"/>
+ </div>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="diconneted_operate_note"></li>
+ <li data-trans="net_select_note_automatic"></li>
+ <li data-trans="net_select_note_manual"></li>
+ </ul>
+ </div>
+</div>
+</form>
+ </div>
+</div>
+</div>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/ota_update.html b/lynq/MD310EU/ap/app/zte_webui/subpg/ota_update.html
new file mode 100755
index 0000000..bac683a
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/ota_update.html
@@ -0,0 +1,242 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='advanced_settings'></h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li data-bind="visible: isDataCard"><a href="#demilitarized_zone" data-trans="dmz_setting"></a></li>
+ <li data-bind="visible: isDataCard"><a href="#pin_mode" data-trans="pin_management"></a></li>
+ <li data-bind="visible: !isDataCard"><a href="#wlan_sleep" data-trans="sleep_mode"></a></li>
+ <li data-bind="visible: !isDataCard"><a href="#route_set" data-trans="router_setting"></a></li>
+ <li data-bind="visible: !isDataCard"><a href="#filter_main" data-trans="firewall"></a></li>
+ <li data-bind="visible:hasUpdateCheck" class="active"><a href="#fota" data-trans="update_settings"></a></li>
+ <!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->
+ <li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>
+ <li data-bind="visible: !isDataCard"><a href="#more" data-trans="others"></a></li>
+ </ul>
+ </div>
+ </div>
+
+<div class="col-xs-10">
+<form id="frmOTAUpdate" role="form" data-bind="visible: updateType() == 'mifi_fota'">
+ <!-- <h3 data-trans="ota_update_manual" class="form-title"></h3 -->
+ <div class="form-body margin-top-20">
+ <!--div class="content">
+ <div class="row">
+ <div class="col-xs-6">
+ <span data-trans="ota_last_update_check"></span>
+ <span data-bind="text: lastCheckTime"></span>
+ </div>
+ <div class="col-xs-6 align-right">
+ <input id="btnCheckNewVersion" data-bind="click:checkNewVersion" data-trans="ota_check_new_version" type="button" class="btn btn-primary margin-right-20"/>
+ </div>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="ota_check_new_version_desc"></li>
+ </ul>
+ </div>
+ </div-->
+
+ <!--div class="form-title" data-trans='ota_update_manual'></div>
+ <div class="content">
+ <span class="paddingleft25" data-trans="ota_check_new_version_desc"></span>
+ </div>
+ <div class="form-buttons">
+ <input id="btnCheckNewVersion" type="button" class="btn btn-primary" data-trans="ota_check_new_version"
+ data-bind="click:checkNewVersion"/>
+ </div>
+ <div class="form-title" data-trans='ota_update_setting'></div-->
+ <div class="content">
+ <!--
+ <h3 data-trans="ota_update_setting" class="form-title"></h3>
+ <div class="row">
+ <label data-trans="ota_auto_update_switch" class="col-xs-4 side-right"></label>
+ <div class="col-xs-8">
+ <div class="row form-group">
+ <div class="col-xs-3">
+ <input id="auto_update_enable" name="updateMode" data-bind="checked: updateMode" type="radio" value="1"/>
+ <label data-trans="enable" for="auto_update_enable"></label>
+ </div>
+ <div class="col-xs-3">
+ <input id="auto_update_disable" name="updateMode" data-bind="checked: updateMode" type="radio" value="0"/>
+ <label data-trans="disable" for="auto_update_disable"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row form-group" data-bind="visible: false">
+ <label data-trans="ota_update_interval_day" for="selInterValDay" class="col-xs-4 side-right"></label>
+
+ <div class="col-xs-3">
+ <select id="selInterValDay" name="selInterValDay" data-bind="value: updateIntervalDay" class="form-control">
+ <option data-trans="ota_update_every_day" value="1"></option>
+ <option data-trans="ota_update_15_day" value="15"></option>
+ <option data-trans="ota_update_30_day" value="30"></option>
+ </select>
+ </div>
+ </div>
+ <div class="row form-group" data-bind="visible: updateMode()=='1'">
+ <div class="col-xs-12 padding-top-10">
+ <p class="checkbox" data-bind="css:{'checkbox_selected': allowRoamingUpdate()=='1'}, click: clickAllowRoamingUpdate"
+ manualControl="true">
+ <input id="chkUpdateRoamPermission" name="chkUpdateRoamPermission" data-bind="checked:allowRoamingUpdate()=='1'" type="checkbox" value="1"/>
+ </p>
+ <label data-trans="ota_update_roaming_remind" class="update_inline floatleft"></label>
+ </div>
+ </div>
+
+ <div class="form-buttons">
+ <input id="btnApply" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary"/>
+ </div-->
+
+ <div class="row form-group">
+ <label data-trans="ota_manual_upgrade_url" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <input id="upgrade_url" type="text" size="128" data-bind="value:updateURL" class="required form-control">
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input id="btnOtaUpgApply" data-bind="click:ota_upgrade_apply" data-trans="download" type="submit" formmethod="post" class="btn btn-primary"/>
+ </div>
+
+ <div><br></div>
+ <div><br></div>
+ <div class="row form-group">
+ <label data-trans="wefota_check_new_version" class="col-xs-4 side-right"></label>
+ </div>
+ <div class="form-buttons">
+ <input id="btnOtaUpgCheck" data-bind="click:ota_upgrade_check" data-trans="ota_check_new_version" type="submit" formmethod="post" class="btn btn-primary"/>
+ </div>
+
+ <!--div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="fota_note1"></li>
+ </ul>
+ </div-->
+ </div>
+
+ </div>
+</form>
+<!--form id="frmNativeUpdate" data-bind="visible: updateType() == 'mifi_local'" method="post" name="UploadFile" id="UploadFile" action="../../cgi-bin/upload.cgi" enctype="multipart/form-data" target="ifr">
+ <div class="form-body">
+ <h3 class="form-title" data-trans="software_upload"></h3>
+ <table style="width:100%">
+ <input type="text" id="upfile" size="20" style="height:35px; width:200px; display:inline-block;" readonly />
+ <input type="button" class="btn btn-primary" data-trans='browse_btn' style="height:34px; width:81px;" />
+ <input id="fileName" class="form-control" type="file" name="fileName" style="margin-left: 15px;background-color:#E3E3E3;opacity:0;filter:alpha(opacity=0);position:absolute;left:0px; width:280px; display:inline-block;" />
+ <input class="btn btn-primary" id="fileuploadsubmit" type="submit" formmethod="post" data-trans="ota_title" style="float:right; margin-top:8px; margin-right: 20px;" />
+ </table>
+ <iframe name="ifr" id="ifr" style="display:none;"></iframe>
+ </div>
+</form-->
+
+
+<br><br>
+<form id="uploadForm" action="../../cgi-bin/upload/upload.cgi" method="post" enctype="multipart/form-data">
+ <h3 class="form-title" data-trans="local_upload"></h3>
+ <div class="row form-group col-xs-4 side-right">
+ <label for="fileInput" data-trans="software_upload" style="display: none;"></label>
+ <input class="required form-control btn btn-primary" type="file" id="fileInput" name="file" style="display: none;">
+ <label for="fileInput" class="required btn btn-primary" data-trans="browse_btn" style="width: 70px;"></label>
+ <span id="fileNameDisplay" style="margin-left: 10px; font-weight: normal;"></span>
+ </div>
+ <br><br>
+ <div style="text-align: right; padding-right: 20px;">
+ <button class="btn btn-primary" type="submit" data-trans="ota_title" id="submitButton" disabled></button>
+ </div>
+</form>
+
+
+ <div id="uploadSection" data-bind="visible: updateType() == 'mifi_local'">
+ <h3 class="form-title" data-trans="software_upload"></h3>
+ <iframe id="fileUploadIframe" name="fileUploadIframe" frameborder="0" height="0" scrolling="no" style="height:0px;width:0px;" width="0"></iframe>
+ <form id="fileUploadForm" name="fileUploadForm" action="../../cgi-bin/upload/upload.cgi" enctype="multipart/form-data" method="post" target="fileUploadIframe">
+ <input id="fileField" name="filename" dir="ltr" maxlength="200" type="file"/>
+ <div class="fileUploadDiv">
+ <input id="fileUploadApplyBtn" name="fileUploadApplyBtn" data-trans="ota_title" type="button" onclick="fileUploadSubmitClickHandler();" class="btn btn-primary margin-left-5 margin-top-2"/>
+ </div>
+ <div class="clear"></div>
+ </form>
+ </div>
+ <form data-bind="visible: updateType() == 'mifi_local'">
+ <div class="form-body">
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="local_note"></li>
+ </ul>
+ </div>
+ </div>
+ </form>
+</div>
+</div>
+</div>
+
+<script>
+ const fileInput = document.getElementById('fileInput');
+ const fileNameDisplay = document.getElementById('fileNameDisplay');
+ const submitButton = document.getElementById('submitButton');
+ const uploadForm = document.getElementById('uploadForm');
+
+ fileInput.addEventListener('change', function () {
+ const fileName = fileInput.files[0] ? fileInput.files[0].name : '';
+ fileNameDisplay.textContent = fileName;
+
+ if (fileName) {
+ submitButton.disabled = false;
+ } else {
+ submitButton.disabled = true;
+ }
+ });
+
+ uploadForm.addEventListener('submit', function (event) {
+ event.preventDefault();
+ showLoading("upload_file");
+
+ const formData = new FormData(uploadForm);
+ console.log("Form data submitted:", formData);
+
+ fetch(uploadForm.action, {
+ method: 'POST',
+ body: formData
+ })
+ .then(response => {
+ if (!response.ok) {
+ throw new Error(`HTTP error! Status: ${response.status}`);
+ }
+ return response.text();
+ })
+ .then(text => {
+ console.log("Server response:", text);
+ try {
+ const data = JSON.parse(text);
+ if (data.success) {
+ showAlert("start_update");
+ } else {
+ errorOverlay("verify_error");
+ }
+ } catch (error) {
+ console.error("Upload error:", error);
+ errorOverlay("File upload successful: Server returned non-JSON response.");
+ }
+ })
+ .catch(error => {
+ console.error("Upload error:", error);
+ errorOverlay("File upload failed!");
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/ussd.html b/lynq/MD310EU/ap/app/zte_webui/subpg/ussd.html
new file mode 100755
index 0000000..7310027
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/ussd.html
@@ -0,0 +1,85 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='USSD'></h1>
+ </div>
+ </div>
+ </div>
+<div class="row">
+ <!-- <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li><a data-trans="sleep_mode" href="#wlan_sleep"></a></li>
+ <li><a data-trans="router_setting" href="#route_set"></a></li>
+ <li><a data-trans="firewall" href="#filter_main"></a></li>
+ <li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>
+ <li class="active"><a data-trans="USSD" href="#usat"></a></li>
+ <li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>
+ <li><a data-trans="others" href="#more"></a></li>
+ </ul>
+ </div>
+ </div> -->
+
+ <div class="innerContainer">
+
+ <form id="frmUSSD">
+ <div class="col-xs-1 margin-top-15">
+ </div>
+ <div class="col-xs-11">
+ <h3 data-trans="USSD" class="form-title"></h3>
+ <div id="USSD_send_div" data-bind="visible: USSDLocation()==0" class="margin-top-20">
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="ussd_send_to" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <input id="USSD_send" type="text" size="20" data-bind="value:USSDSend,valueUpdate:'afterkeydown'" class="required form-control">
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input id="sendToNet" type="button" data-trans='ussd_send' data-bind="disable:USSDSend().length<=0,css:{disabled:USSDSend().length<=0},click:sendToNet" class="btn btn-primary marginright10" />
+ <!--input type="reset" data-trans='ussd_cancel' data-bind="disable:USSDSend().length<=0,css:{disabled:USSDSend().length<=0},click:resetUSSD" id="cancelToNet" class="btn btn-primary"/-->
+ </div>
+ </div>
+ </div>
+ <div id="USSD_reply_div" data-bind="visible: USSDLocation()==1" class="margin-top-20">
+ <!--<div class="form-title" data-trans='ussd_contents'></div>!-->
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="ussd_contents" class="col-xs-4 side-right"></label>
+ <div class="col-xs-3">
+ <textarea id="USSD_Content" rows="8" cols="50" readonly="readonly" name="USSD_Content"></textarea>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input type="button" data-trans='ussd_cancel' data-bind="click:noReplyCancel" class="btn btn-primary marginright10"/>
+ </div>
+ <div id="ussd_action" data-bind="visible: ussd_action()!=0">
+ <div class="row form-group">
+ <label class="col-xs-4 side-right" data-trans="ussd_reply_to"></label>
+ <div class="col-xs-3">
+ <input id="USSD_reply" type="text" name="USSD_reply" size="20" data-bind="value:USSDReply" class="required form-control">
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input type="button" data-trans='ussd_reply' data-bind="click:replyToNet" class="btn btn-primary marginright10"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="ussd_note1"></li>
+ </ul>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+</div>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_sleep_mode.html b/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_sleep_mode.html
new file mode 100755
index 0000000..8a3234c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_sleep_mode.html
@@ -0,0 +1,168 @@
+<div id="innerContainer">
+<div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title">
+ <h1 data-trans='advanced_settings'></h1>
+ </div>
+ </div>
+</div>
+<div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul>
+ <li class="active"><a data-trans="sleep_mode" href="#wlan_sleep"></a></li>
+ <li><a data-trans="router_setting" href="#route_set"></a></li>
+ <li><a data-trans="firewall" href="#filter_main"></a></li>
+ <li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>
+ <!-- <li data-bind="visible:hasUssd"><a data-trans="USSD" href="#usat"></a></li> -->
+ <li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>
+ <li><a data-trans="others" href="#more"></a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="col-xs-10">
+
+
+<div class="form-body margin-top-20">
+ <!--hide wifi range settings until sw implements it-->
+ <form id='wifiRangeForm'>
+ <h3 data-trans="wifi_range_settings" class="form-title"></h3>
+ <div class="content">
+ <div class="row">
+ <label data-trans='wifi_range' class="col-xs-3"></label>
+ <div class="col-xs-8">
+ <input id='short_mode' data-bind="checked: wifiRangeMode" name="rangeGroup" type="radio" value="short_mode"/>
+ <label data-bind="visible: !isCPE" data-trans='wifi_short_mode' for='short_mode'></label>
+ <label data-bind="visible: isCPE" data-trans='wifi_des_short_mode' for='short_mode'></label>
+ </div>
+ </div>
+ <div class="row">
+ <label class="col-xs-3"></label>
+ <div class="col-xs-8">
+ <input id='medium_mode' data-bind="checked: wifiRangeMode" name="rangeGroup" type="radio" value="medium_mode"/>
+ <label data-trans='wifi_medium_mode' for='medium_mode'></label>
+ </div>
+ </div>
+ <div class="row">
+ <label class="col-xs-3"></label>
+ <div class="col-xs-8">
+ <input id='long_mode' data-bind="checked: wifiRangeMode" name="rangeGroup" type="radio" value="long_mode"/>
+ <label data-trans='wifi_long_mode' for='long_mode'></label>
+ </div>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input data-trans='apply' type="submit" formmethod="post" class="btn btn-primary"/>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="wifi_range_note_range"></li>
+ <li class="no-style">
+ <ul data-bind="visible: !isCPE">
+ <li data-trans="wifi_range_note_short"></li>
+ <li data-trans="wifi_range_note_medium"></li>
+ <li data-trans="wifi_range_note_long"></li>
+ </ul>
+ <ul data-bind="visible: isCPE">
+ <li data-trans="wifi_range_note_short_cpe"></li>
+ <li data-trans="wifi_range_note_medium_cpe"></li>
+ <li data-trans="wifi_range_note_long_cpe"></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </form>
+ <form id="frmTsw" data-bind="visible: showTSWDiv">
+ <div class="form-body">
+ <h3 data-trans="time_sleep_wake_up" class="form-title"></h3>
+ <div class="content">
+ <div class="row form-group">
+ <label data-trans="tsw_settings" class="col-xs-3 side-right"></label>
+ <div class="col-xs-6">
+ <div class="row">
+ <div class="col-xs-4">
+ <input id="tswEnable" data-bind="checked: openEnable" name="tswGrp" type="radio" value="1"/>
+ <label data-trans="enable" for="tswEnable"></label>
+ </div>
+ <div class="col-xs-4">
+ <input id="tswDisable" data-bind="checked: openEnable" name="tswGrp" type="radio" value="0"/>
+ <label for="tswDisable" data-trans="disable"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div data-bind="visible: openEnable() == '1'" class="row form-group">
+ <div class="col-xs-3">
+ <span data-trans="tsw_timer_on"></span>
+ </div>
+ <div class="col-xs-9">
+ <div>
+ <input id="openH" data-bind="value: openH" min="0" max="23" maxlength="2" name="openH" style="width: 27px;display:inline-block;padding: 5px 4px;" type="text" class="required form-control"> :
+ <input id="openM" data-bind="value: openM" min="0" max="59" maxlength="2" name="openM" style="width: 27px;display:inline-block;padding: 5px 4px;" type="text" class="required form-control">
+ </div>
+ </div>
+ <div id="openErrorDiv" class="col-xs-9 col-md-offset-3"></div>
+ </div>
+ <div data-bind="visible: openEnable() == '1'" class="row form-group">
+ <div class="col-xs-3">
+ <span data-trans="tsw_timer_off"></span>
+ </div>
+ <div class="col-xs-9">
+ <input id="closeH" data-bind="value: closeH" min="0" max="23" maxlength="2" name="closeH" style="width: 27px;display:inline-block;padding: 5px 4px;" type="text" class="required form-control"> :
+ <input id="closeM" data-bind="value: closeM" min="0" max="59" maxlength="2" name="closeM" style="width: 27px;display:inline-block;padding: 5px 4px;" type="text" class="required form-control">
+ </div>
+ <div id="closeErrorDiv" class="col-xs-9 col-md-offset-3"></div>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input data-trans="apply" type="submit" formmethod="post" class="btn btn-primary"/>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="tsw_note"></li>
+ <li data-trans="tsw_note_on"></li>
+ <li data-trans="tsw_note_off"></li>
+ </ul>
+ </div>
+ </div>
+ </form>
+ <form id='sleepModeForm' data-bind="visible: showSleepDiv">
+ <h3 data-trans='wifi_sleep' class="form-title"></h3>
+ <div class="form-group">
+ <div class="row">
+ <label data-trans='wifi_sleep_mode' class="col-xs-3" for='power_save_mode'></label>
+ <div class="col-xs-4" style="border: none;">
+ <!-- <select id="power_save_mode" data-bind="options: option, value: wifiSleepedMode, optionsText: transOption('sleep_select'), optionsValue: 'value'" data-transid='sleep_select' class="form-control"></select> -->
+ <label id="power_save_mode" data-trans='sleep_select_1' style="border: none;"></label>
+ </div>
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="row">
+ <label data-trans='sleep_time' class="col-xs-3" for='mode'></label>
+ <div class="col-xs-4">
+ <select id="mode" data-bind="options: modes, value: selectedMode, optionsText: transOption('sleep_mode'), optionsValue: 'value'" data-transid='sleep_mode' class="form-control"></select>
+ </div>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input data-trans='apply' type="submit" formmethod="post" class="btn btn-primary"/>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="wifi_sleep_note_info"></li>
+ </ul>
+ </div>
+ </form>
+</div>
+ </div>
+</div>
+</div>
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_wps.html b/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_wps.html
new file mode 100755
index 0000000..0a96aa6
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_wps.html
@@ -0,0 +1,123 @@
+<div id="innerContainer">
+ <div class="row header-row">
+ <div class="col-xs-1">
+ <a href="#main">
+ <img alt="" src="pic/direct-back.png">
+ </a>
+ </div>
+ <div class="col-xs-11">
+ <div class="form-title form-title-multi">
+ <h1 data-trans='wifi_wireless_settings'></h1>
+ <p data-trans="wifi_main_sub_title"></p>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-2">
+ <div class="nav_right">
+ <ul data-bind="visible: isShowSSIDInfoDiv">
+ <li><a data-trans="multi_ssid_1" data-bind="attr:{'data-trans': hasMultiSSID ? 'multi_ssid_1':'ssid_title'}" href="#wlan_main"></a></li>
+ <li data-bind="visible: hasMultiSSID"><a data-trans="multi_ssid_2" href="#wlan_guset"></a></li>
+ <li class="active"><a data-trans="wps" href="#wlan_wps"></a></li>
+ <li data-bind="visible: hasAPStation"><a data-trans="ap_station" href="#wlan_station"></a></li>
+ <li><a data-trans="wifi_advance" href="#wlan_adv"></a></li>
+ <li data-bind="visible: hasWlanMacfilter"><a data-trans="mac_filter" href="#filter_mac"></a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="col-xs-10">
+
+<div class="form-body">
+ <form id="frmWifiSwitch" role="form">
+ <div class="content margin-top-20">
+ <div data-bind="visible: hasWifiSwitch" class="row form-group">
+ <label data-trans="wifi_switch" class="col-xs-4 side-right"></label>
+ <div class="col-xs-6">
+ <div class="row">
+ <div class="col-xs-4">
+ <input id="wifi_switch_enable"
+ data-bind="checked: wifi_enable" name="wifi_switch" type="radio" value="1"/>
+ <label data-trans="enable" for="wifi_switch_enable"></label>
+ </div>
+ <div class="col-xs-4">
+ <input id="wifi_switch_disable"
+ data-bind="checked: wifi_enable" name="wifi_switch" type="radio" value="0"/>
+ <label data-trans="disable" for="wifi_switch_disable"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div data-bind="visible: wifi_enable() == '1' && hasMultiSSID" class="row form-group">
+ <label data-trans="multi_ssid_enable" class="col-xs-4 side-right"></label>
+ <div class="col-xs-6">
+ <div class="row">
+ <div class="col-xs-4">
+ <input id="multi_ssid_switch_enable"
+ data-bind="checked: multi_ssid_enable" name="multi_ssid_switch" type="radio" value="1"/>
+ <label data-trans="enable" for="multi_ssid_switch_enable"></label>
+ </div>
+ <div class="col-xs-4">
+ <input id="multi_ssid_switch_disable"
+ data-bind="checked: multi_ssid_enable" name="multi_ssid_switch" type="radio" value="0"/>
+ <label data-trans="disable" for="multi_ssid_switch_disable"></label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div data-bind="visible: hasWifiSwitch || (wifi_enable() == '1' && hasMultiSSID)" class="form-buttons">
+ <input id="wifi_switch_apply" data-trans='apply' type="submit" formmethod="post" class="btn btn-primary"/>
+ <!--input id="wifi_switch_cancel" type="button" class="btn-1 " data-bind='click: function(){clear("switch");}' data-trans='cancel'/-->
+ </div>
+ </div>
+ </form>
+
+ <div data-bind="visible: isShowSSIDInfoDiv" class="content">
+ <form id='wpsForm' role="form">
+ <h3 data-bind="attr:{'data-trans': 'wps'}" class="form-title"></h3>
+ <div data-bind="visible: hasMultiSSID" class="row form-group">
+ <label data-trans='ssid_title' for="multiSSID" class="col-xs-4 side-right"></label>
+ <div class="col-xs-4">
+ <select id="multiSSID" data-bind="options: mulOption, value: wpsSSID, optionsValue: 'value', optionsText: 'text'" class="valid form-control">
+ </select>
+ </div>
+ </div>
+ <!-- <div class="row form-group">
+ <label data-trans="wps" class="col-xs-4 side-right"></label>
+ <div class="col-xs-6">
+ <div class="row">
+ <div class="col-xs-4">
+ <input id="pinMode" data-bind="checked: wpsType" name="wpsMode" type="radio" value="PIN"/>
+ <label data-trans="wps_pin" for="pinMode"></label>
+ </div>
+ <div class="col-xs-6">
+ <input id="txtPin" data-bind="value: wpsPin, enable: wpsType() == 'PIN', valueUpdate: 'keypress'" maxlength="9" name="txtPin" type="text" class="required margin-left-5 form-control"/>
+ </div>
+ </div>
+ </div>
+ </div> -->
+ <div class="row form-group">
+ <label data-trans="wps" class="col-xs-4 side-right"></label>
+ <label class="col-xs-4 side-right"></label>
+ <div class="col-xs-6">
+ <input id="pbcMode" data-bind="checked: wpsType" name="wpsMode" type="radio" value="PBC"/>
+ <label data-trans="wps_pbc" for="pbcMode"></label>
+ </div>
+ </div>
+ <div class="form-buttons">
+ <input data-bind="enable: wpsType() != '', css:{disabled: wpsType() == ''}" class="btn btn-primary" data-trans='apply' type="submit" formmethod="post"/>
+ </div>
+ <div class="form-note">
+ <div class="notes-title"> </div>
+ <ul class="notes-content">
+ <li data-trans="wps_note_all"></li>
+ <!-- <li data-trans="wps_note_pin"></li> -->
+ <li data-trans="wps_note_pbc"></li>
+ <li data-trans="wps_note_wait"></li>
+ </ul>
+ </div>
+ </form>
+ </div>
+</div>
+ </div>
+</div>
+</div>