/* Class: PluginNSV Version: 1.0.1 Date: 2019/03/20 Description: Fix showURL function parsing error on local characters. */ function getNetProtocol() { if (!!window.WebSocket && window.WebSocket.prototype.send) { return 'WebSocket' } else return 'Http' } function PluginNSV() { this.NetProtocol = getNetProtocol() if (this.NetProtocol === 'WebSocket') { this.net = getWSNetObject() } else this.net = getHttpNetObject() } PluginNSV.prototype.InitPlugin = function(result_callback) { if (this.net == null) { result_callback(0) } this.func_callback = [] this.invoke_state = [] this.invoke_id = 10000 this.init_result = result_callback this.net.setStateCallback(this, this.net_state_callback) this.net.setDataCallback(this, this.net_data_callback) if (this.NetProtocol === 'WebSocket') { this.net.connect('localhost:10430') } else { this.net.connect('localhost:10431') } } PluginNSV.prototype.DestroyPlugin = function() { this.net.setStateCallback(null, null) this.net.setDataCallback(null, null) this.net.disconnect() this.func_callback = [] } PluginNSV.prototype.net_state_callback = function(object, state) { // current "this" object is the "net" scope. var plugin = object if (plugin.onStateChange) { plugin.onStateChange(state) } if (plugin.init_result) { plugin.init_result(state) plugin.init_result = null } } PluginNSV.prototype.net_data_callback = function(object, data) { var plugin = object var context = data.split(',') var msg_type = parseInt(context[0]) switch (msg_type) { case NSV_Msg_Type.Func_Invoke: { } break case NSV_Msg_Type.Func_Result: { var invoke_id = context[1] var func_id = context[2] var func_name = context[3] var state = (context[4] === '1') var args = [] var index = 0 for (var ele in context) { if (index > 4) { args.push(context[index]) } index++ } if (plugin.func_callback.hasOwnProperty(func_id)) { if ((typeof plugin.func_callback[func_id]) === 'function') { plugin.func_callback[func_id](state, args) } plugin.func_callback[func_id] = null if (plugin.invoke_state.hasOwnProperty(invoke_id)) { // clear invoke state clearTimeout(plugin.invoke_state[invoke_id].timer) plugin.invoke_state[invoke_id] = null } } } break case NSV_Msg_Type.Data_Event: { var id = parseInt(context[1]) switch (id) { case NSV_Event_Id.Event_Id_Click: { } break case NSV_Event_Id.Event_Id_Touch: { } break case NSV_Event_Id.Event_Id_Key: { } break case NSV_Event_Id.Event_Id_User: { var type = parseInt(context[2]) switch (type) { case NSV_User_Event.User_Event_Confirm: { if (!!plugin.onConfirm && (typeof plugin.onConfirm) === 'function') { // invoke callback function plugin.onConfirm() } } break case NSV_User_Event.User_Event_Clear: { if (!!plugin.onClear && (typeof plugin.onClear) === 'function') { // invoke callback function plugin.onClear() } } break case NSV_User_Event.User_Event_Cancel: { if (!!plugin.onCancel && (typeof plugin.onCancel) === 'function') { // invoke callback function plugin.onCancel() } } break } } break } } break case NSV_Msg_Type.Sys_State: { var id = parseInt(context[1]) switch (id) { case NSV_Sys_Id.Sys_Id_State: { /* state*/ if (plugin.onDevNotifyEvent != null && (typeof plugin.onDevNotifyEvent) === 'function') { var state = parseInt(context[2]) plugin.onDevNotifyEvent(state) } } break } } break } } PluginNSV.prototype.callbackTimeOut = function(sender, invoke_flag) { if (sender) { if (sender.invoke_state.hasOwnProperty(invoke_flag)) { var ele = sender.invoke_state[invoke_flag] if (ele.func) { var args = [] args.push('invoke function timeout') ele.func(0, args) } } } // alert("invoke timer"); } PluginNSV.prototype.invoke_interface = function(id, code, _callback) { this.func_callback[id] = _callback if (this.invoke_id >= 0xffff) { this.invoke_id = 10000 } var invoke_id = ++this.invoke_id var set = code.join(',') set = invoke_id.toString() + ',' + set this.net.write(set) // add invoke flag this.invoke_state[invoke_id.toString()] = { func: _callback, timer: setTimeout(this.callbackTimeOut, 2000, this, invoke_id.toString()) } } /* ============================================================================= plugin constants */ /* message type*/ var NSV_Msg_Type = { Func_Invoke: 1001, Func_Result: 1002, Data_Event: 1003, Sys_State: 1004 } /* function id*/ var NSV_Func_Id = { SetPenSizeRange: 1, GetPenSizeRange: 2, SetPenColor: 3, GetPenColor: 4, SetBKColor: 5, GetBKColor: 6, SetBorderColor: 7, GetBorderColor: 8, IsConnected: 9, ClearSign: 10, SaveImageToFile: 11, SaveImageToFileEx: 12, SaveSignToFile: 13, SetPenMode: 14, RegBtnClickEvent: 15, UnregBtnClickEvent: 16, SaveImageToBase64: 17, SaveSignToBase64: 18, GetScreenRect: 19, EnableSystemTouch: 20, SetScreenRotation: 21, MouseControl: 22, GetNSVVersion: 23, GetDeviceSN: 24 } /* function id extend*/ var NSV_Func_Id_Ex = { BeginSign: 81, EndSign: 82, MoveSignWindow: 83, ShowURL: 84, CloseURL: 85 } /* property id*/ var NSV_Property_Id = { Set_BorderVisible: 101, Get_BorderVisible: 102, Set_ExtendDisplay: 103, Get_ExtendDisplay: 104, Set_DisplayMapMode: 105, Get_DisplayMapMode: 106, Set_SignMode: 107, Get_SignMode: 108 } /* data event sub id*/ var NSV_Event_Id = { Event_Id_Click: 301, Event_Id_Touch: 302, Event_Id_Key: 303, Event_Id_User: 304 } var NSV_User_Event = { User_Event_Confirm: 1, User_Event_Clear: 2, User_Event_Cancel: 3 } /* system state event sub id*/ var NSV_Sys_Id = { Sys_Id_State: 401 } /* ============================================================================= plugin interface */ PluginNSV.prototype.setPenSizeRange = function(min, max, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SetPenSizeRange.toString() code.push(func_id_string) code.push('SetPenSizeRange') code.push(min.toString()) code.push(max.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[min,max])*/ PluginNSV.prototype.getPenSizeRange = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id.GetPenSizeRange.toString() code.push(func_id_string) code.push('GetPenSizeRange') this.invoke_interface(func_id_string, code, result_callback) } PluginNSV.prototype.setPenColor = function(r, g, b, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SetPenColor.toString() code.push(func_id_string) code.push('SetPenColor') code.push(r.toString()) code.push(g.toString()) code.push(b.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[r,g,b])*/ PluginNSV.prototype.getPenColor = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id.GetPenColor.toString() code.push(func_id_string) code.push('GetPenColor') this.invoke_interface(func_id_string, code, result_callback) } PluginNSV.prototype.setBKColor = function(r, g, b, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SetBKColor.toString() code.push(func_id_string) code.push('SetBKColor') code.push(r.toString()) code.push(g.toString()) code.push(b.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[r,g,b])*/ PluginNSV.prototype.getBKColor = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id.GetBKColor.toString() code.push(func_id_string) code.push('GetBKColor') this.invoke_interface(func_id_string, code, result_callback) } PluginNSV.prototype.setBorderColor = function(r, g, b, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SetBorderColor.toString() code.push(func_id_string) code.push('SetBorderColor') code.push(r.toString()) code.push(g.toString()) code.push(b.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[r,g,b])*/ PluginNSV.prototype.getBorderColor = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id.GetBorderColor.toString() code.push(func_id_string) code.push('GetBorderColor') this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[state])*/ PluginNSV.prototype.isConnected = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id.IsConnected.toString() code.push(func_id_string) code.push('IsConnected') this.invoke_interface(func_id_string, code, result_callback) } PluginNSV.prototype.clearSign = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id.ClearSign.toString() code.push(func_id_string) code.push('ClearSign') this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.saveImageToFile = function(path, format, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SaveImageToFile.toString() code.push(func_id_string) code.push('SaveImageToFile') code.push(path) code.push(format.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.saveImageToFileEx = function(path, format, width, height, quality, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SaveImageToFileEx.toString() code.push(func_id_string) code.push('SaveImageToFileEx') code.push(path) code.push(format.toString()) code.push(width.toString()) code.push(height.toString()) code.push(quality.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.saveSignToFile = function(path, width, height, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SaveSignToFile.toString() code.push(func_id_string) code.push('SaveSignToFile') code.push(path) code.push(width.toString()) code.push(height.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.setPenMode = function(mode, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SetPenMode.toString() code.push(func_id_string) code.push('SetPenMode') code.push(mode.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.regBtnClickEvent = function(btn_index, x, y, width, height, result_callback) { var code = [] var func_id_string = NSV_Func_Id.RegBtnClickEvent.toString() code.push(func_id_string) code.push('RegBtnClickEvent') code.push(btn_index.toString()) code.push(x.toString()) code.push(y.toString()) code.push(width.toString()) code.push(height.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.unregBtnClickEvent = function(btn_index, result_callback) { var code = [] var func_id_string = NSV_Func_Id.UnregBtnClickEvent.toString() code.push(func_id_string) code.push('UnregBtnClickEvent') code.push(btn_index.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[base64string])*/ PluginNSV.prototype.saveImageToBase64 = function(format, width, height, quality, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SaveImageToBase64.toString() code.push(func_id_string) code.push('SaveImageToBase64') code.push(format.toString()) code.push(width.toString()) code.push(height.toString()) code.push(quality.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[base64string])*/ PluginNSV.prototype.saveSignToBase64 = function(width, height, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SaveSignToBase64.toString() code.push(func_id_string) code.push('SaveSignToBase64') code.push(width.toString()) code.push(height.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[left,top,right,bottom])*/ PluginNSV.prototype.getScreenRect = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id.GetScreenRect.toString() code.push(func_id_string) code.push('GetScreenRect') this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.setScreenRotation = function(angle, result_callback) { var code = [] var func_id_string = NSV_Func_Id.SetScreenRotation.toString() code.push(func_id_string) code.push('SetScreenRotation') code.push(angle.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.mouseControl = function(enabled, result_callback) { var code = [] var func_id_string = NSV_Func_Id.MouseControl.toString() code.push(func_id_string) code.push('MouseControl') if (enabled && enabled !== '0' && enabled !== 0) { enabled = 1 } else { enabled = 0 } code.push(enabled.toString()) this.invoke_interface(func_id_string, code, result_callback) } /* ============================================================================= plugin interface extend */ /* callback func(state,args[])*/ PluginNSV.prototype.beginSign = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id_Ex.BeginSign.toString() code.push(func_id_string) code.push('BeginSign') this.invoke_interface(func_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.endSign = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id_Ex.EndSign.toString() code.push(func_id_string) code.push('EndSign') this.invoke_interface(func_id_string, code, result_callback) } PluginNSV.prototype.moveSignWindow = function(x, y, width, height, result_callback) { var code = [] var func_id_string = NSV_Func_Id_Ex.MoveSignWindow.toString() code.push(func_id_string) code.push('MoveSignWindow') code.push(x.toString()) code.push(y.toString()) code.push(width.toString()) code.push(height.toString()) this.invoke_interface(func_id_string, code, result_callback) } PluginNSV.prototype.showURL = function(url, result_callback) { var code = [] var func_id_string = NSV_Func_Id_Ex.ShowURL.toString() code.push(func_id_string) code.push('ShowURL') url = url.replace(/\\/ig, '/') if (url.search('\%') == -1) { url = encodeURI(url) } code.push(url) this.invoke_interface(func_id_string, code, result_callback) } PluginNSV.prototype.closeURL = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id_Ex.CloseURL.toString() code.push(func_id_string) code.push('CloseURL') this.invoke_interface(func_id_string, code, result_callback) } PluginNSV.prototype.GetDeviceSN = function(result_callback) { var code = [] var func_id_string = NSV_Func_Id.GetDeviceSN.toString() code.push(func_id_string) code.push('GetDeviceSN') this.invoke_interface(func_id_string, code, result_callback) } /* ============================================================================= plugin property */ /* callback func(state,args[])*/ PluginNSV.prototype.setBorderVisible = function(visible, result_callback) { var code = [] var property_id_string = NSV_Property_Id.Set_BorderVisible.toString() code.push(property_id_string) code.push('Set_BorderVisible') code.push((visible === false || visible === 'undefined' || visible == null) ? '0' : '1') this.invoke_interface(property_id_string, code, result_callback) } /* callback func(state,args[visible])*/ PluginNSV.prototype.getBorderVisible = function(result_callback) { var code = [] var property_id_string = NSV_Property_Id.Get_BorderVisible.toString() code.push(property_id_string) code.push('Get_BorderVisible') this.invoke_interface(property_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.setExtendDisplay = function(extend, result_callback) { var code = [] var property_id_string = NSV_Property_Id.Set_ExtendDisplay.toString() code.push(property_id_string) code.push('Set_ExtendDisplay') code.push((extend === false || extend === 'undefined' || extend === null) ? '0' : '1') this.invoke_interface(property_id_string, code, result_callback) } /* callback func(state,args[extend])*/ PluginNSV.prototype.getExtendDisplay = function(result_callback) { var code = [] var property_id_string = NSV_Property_Id.Get_ExtendDisplay.toString() code.push(property_id_string) code.push('Get_ExtendDisplay') this.invoke_interface(property_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.setDisplayMapMode = function(mode, result_callback) { var code = [] var property_id_string = NSV_Property_Id.Set_DisplayMapMode.toString() code.push(property_id_string) code.push('Set_DisplayMapMode') code.push(mode.toString()) this.invoke_interface(property_id_string, code, result_callback) } /* callback func(state,args[mode])*/ PluginNSV.prototype.getDisplayMapMode = function(result_callback) { var code = [] var property_id_string = NSV_Property_Id.Get_DisplayMapMode.toString() code.push(property_id_string) code.push('Get_DisplayMapMode') this.invoke_interface(property_id_string, code, result_callback) } /* callback func(state,args[])*/ PluginNSV.prototype.setSignMode = function(mode, result_callback) { var code = [] var property_id_string = NSV_Property_Id.Set_SignMode.toString() code.push(property_id_string) code.push('Set_SignMode') code.push(mode.toString()) this.invoke_interface(property_id_string, code, result_callback) } /* callback func(state,args[mode])*/ PluginNSV.prototype.getSignMode = function(result_callback) { var code = [] var property_id_string = NSV_Property_Id.Get_SignMode.toString() code.push(property_id_string) code.push('Get_SignMode') this.invoke_interface(property_id_string, code, result_callback) } /* ============================================================================= plugin service events */ /* callback func(state)*/ PluginNSV.prototype.onStateChange = null /* ============================================================================= plugin device events */ /* callback func(state)*/ PluginNSV.prototype.onDevNotifyEvent = null /* callback func(index)*/ PluginNSV.prototype.onBtnClickEvent = null /* callback func(index)*/ PluginNSV.prototype.onTouchEvent = null /* callback func(physical_key,virtual_key)*/ PluginNSV.prototype.onKeyEvent = null /* ============================================================================= plugin extended events */ /* callback func()*/ PluginNSV.prototype.onConfirm = null /* callback func()*/ PluginNSV.prototype.onClear = null /* callback func()*/ PluginNSV.prototype.onCancel = null /* ============================================================================= WSNetObject class */ function getWSNetObject() { return { ws: null, url: null, time_out: 3000, time_out_func: null, state_callback: null, state_object: null, data_callback: null, data_object: null, timer_reconn: null, connect: function(url) { if (!(!!window.WebSocket && window.WebSocket.prototype.send)) { return null } this.url = url url = 'ws://' + url this.ws = new WebSocket(url) this.ws.owner = this this.ws.onopen = function() { var owner = this.owner if (owner.state_callback) { owner.state_callback(owner.state_object, 1) } } this.ws.onclose = function(evt) { var owner = this.owner if (owner.state_callback) { owner.state_callback(owner.state_object, 0) } } this.ws.onmessage = function(evt) { var owner = this.owner if (owner.data_callback) { owner.data_callback(owner.data_object, evt.data) } } this.ws.onerror = function(evt) { var owner = this.owner owner.disconnect() } return true }, disconnect: function() { if (this.ws != null) { this.ws.close() this.ws = null } }, reconnect: function() { this.disconnect() this.connect(this.url) }, beginReconnect: function() { if (this.timer_reconn == null) { this.timer_reconn = setInterval(callback_reconn(this), this.time_out) } }, endReconnect: function() { if (this.timer_reconn != null) { clearInterval(this.timer_reconn) this.timer_reconn = null } }, getConnectionState: function() { if (this.ws) { return (this.ws.readyState === WebSocket.OPEN) } return false }, setStateCallback: function(object, func) { this.state_object = object this.state_callback = func }, setDataCallback: function(object, func) { this.data_object = object this.data_callback = func }, write: function(data) { if (this.getConnectionState()) { try { this.ws.send(data) } catch (e) { return false } return true } return false } } } function _callback_reconn(obj) { // console.log("reconnect..."); if (obj != null) { obj.reconnect() } } var callback_reconn = function(obj) { return function() { _callback_reconn(obj) } } /* ============================================================================= HttpNetObject class */ function getHttpNetObject() { return { http: null, url: null, time_out: 3000, time_out_func: null, state_callback: null, state_object: null, data_callback: null, data_object: null, timer_reconn: null, connect: function(url) { if (url.substring(0, 7) !== 'http://') { url = 'http://' + url this.url = url this.http = new NSV_Ajax(url) this.http.owner = this this.http.onopen = function() { var owner = this.owner if (owner.state_callback) { owner.state_callback(owner.state_object, 1) } } this.http.onclose = function(evt) { var owner = this.owner if (owner.state_callback) { owner.state_callback(owner.state_object, 0) } } this.http.onmessage = function(data) { var owner = this.owner if (owner.data_callback) { owner.data_callback(owner.data_object, data) } } this.http.onerror = function(evt) { console.log(evt) } } }, disconnect: function() { if (this.http != null) { this.http.close() this.http = null } }, getConnectionState: function() { if (this.http) { return (this.http.state === NSV_Ajax_State.Open) } return false }, setStateCallback: function(object, func) { this.state_object = object this.state_callback = func }, setDataCallback: function(object, func) { this.data_object = object this.data_callback = func }, write: function(data) { if (this.getConnectionState()) { try { this.http.send(data) } catch (e) { return false } return true } return false } } } /* ============================================================================= Class: NSV_Ajax Version: 1.0.0 Date: 2018/12/17 */ function getXMLHttpRequest() { if (window.XMLHttpRequest) { return new XMLHttpRequest() } else if (window.ActiveXObject) { return ActiveXObject('Microsoft.XMLHttp') } } function NSV_Ajax(url) { if (url.substring(0, 7) !== 'http://') { url = 'http://' + url } this.state = NSV_Ajax_State.Closed this.http_url = url this.http_url_event = url.substring(0, url.length - 5) + (parseInt(url.substring(url.length - 5, url.length)) + 1) this.handShake() } /* ================================================== constant */ var NSV_Ajax_State = { Closed: 0, Open: 1 } var NSV_Ajax_Protocol = { Connect: 'connect', Data: 'data', Close: 'close' } /* ================================================== property */ NSV_Ajax.prototype.state = NSV_Ajax_State.Closed NSV_Ajax.prototype.http_url = '' NSV_Ajax.prototype.http_url_event = '' NSV_Ajax.prototype.xhrRecv = null NSV_Ajax.prototype.PumpMessage = null // open event NSV_Ajax.prototype.onopen = null // close event NSV_Ajax.prototype.onclose = null // message event NSV_Ajax.prototype.onmessage = null // error event NSV_Ajax.prototype.onerror = null /* ================================================== method */ NSV_Ajax.prototype.handShake = function() { if (this.http_url) { var xhr = getXMLHttpRequest() xhr.open('POST', this.http_url, true) xhr.responseType = 'text' xhr.timeout = 2000 xhr.setRequestHeader('msg-type', '' + NSV_Ajax_Protocol.Connect) xhr.owner = this xhr.onreadystatechange = function() { if (this.readyState === 4) { try { if (this.status === 200) { if (this.responseText === 'OK') { // server is running this.owner.state = NSV_Ajax_State.Open // activate open event if (!!this.owner.onopen && (typeof this.owner.onopen) === 'function') { this.owner.onopen() } this.owner.postRecvRequest(this.owner) } } } catch (e) { if (!!this.owner.onerror && (typeof this.owner.onerror) === 'function') { // this.owner.onclose(); this.owner.onerror(e) } } } } xhr.ontimeout = function(e) { if (!!this.owner.onerror && (typeof this.owner.onerror) === 'function') { this.owner.onclose() // this.owner.onerror(e); } } xhr.send('HandShake') } } NSV_Ajax.prototype.postRecvRequest = function(owner) { if (this.http_url) { /* create a new http connection*/ this.xhrRecv = getXMLHttpRequest() this.xhrRecv.open('POST', this.http_url_event, true) this.xhrRecv.setRequestHeader('msg-type', '' + NSV_Ajax_Protocol.Data) this.xhrRecv.responseType = 'text' this.xhrRecv.owner = owner this.xhrRecv.onreadystatechange = function() { if (this.readyState === 4) { if (this.status === 200) { if (!!this.owner.onmessage && (typeof this.owner.onmessage) === 'function') { this.owner.onmessage(this.responseText) } // this.owner.recvHandler(this.responseText); this.owner.postRecvRequest(owner) } } } this.xhrRecv.send('Recv') } } NSV_Ajax.prototype.recvHandler = function(data) { console.log(data) } NSV_Ajax.prototype.postSendRequest = function(data, _callback, timeout) { if (this.http_url) { var xhr = getXMLHttpRequest() xhr.open('POST', this.http_url, true) xhr.responseType = 'text' xhr.setRequestHeader('msg-type', '' + NSV_Ajax_Protocol.Data) // bind callback xhr.owner = this xhr.send_callback = _callback if (!!timeout && timeout > 0) { xhr.timeout = timeout } xhr.onreadystatechange = function() { if (this.readyState === 4) { if (this.status === 200) { if (!!this.send_callback && (typeof this.send_callback) === 'function') { this.send_callback(this.responseText) this.owner.onmessage(this.responseText) // console.log("send result"+this.responseText); } } } } xhr.send(data) } } NSV_Ajax.prototype.close = function() { this.state = NSV_Ajax_State.Closed } NSV_Ajax.prototype.send = function(data) { this.postSendRequest(data, this.recvHandler, 2000) }