diff options
-rw-r--r-- | themes/base/htdocs/luci-static/resources/xhr.js | 123 |
1 files changed, 82 insertions, 41 deletions
diff --git a/themes/base/htdocs/luci-static/resources/xhr.js b/themes/base/htdocs/luci-static/resources/xhr.js index 23bf96e02..453c2ba4e 100644 --- a/themes/base/htdocs/luci-static/resources/xhr.js +++ b/themes/base/htdocs/luci-static/resources/xhr.js @@ -7,10 +7,10 @@ XHR = function() { this.reinit = function() { - if( window.XMLHttpRequest ) { + if (window.XMLHttpRequest) { this._xmlHttp = new XMLHttpRequest(); } - else if( window.ActiveXObject ) { + else if (window.ActiveXObject) { this._xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else { @@ -19,7 +19,10 @@ XHR = function() } this.busy = function() { - switch( this._xmlHttp.readyState ) + if (!this._xmlHttp) + return false; + + switch (this._xmlHttp.readyState) { case 1: case 2: @@ -32,7 +35,7 @@ XHR = function() } this.abort = function() { - if( this.busy() ) + if (this.busy()) this._xmlHttp.abort(); } @@ -41,23 +44,23 @@ XHR = function() this.reinit(); var xhr = this._xmlHttp; - var code = this._encode( data ); + var code = this._encode(data); url = location.protocol + '//' + location.host + url; - if( code ) - if( url.substr(url.length-1,1) == '&' ) + if (code) + if (url.substr(url.length-1,1) == '&') url += code; else url += '?' + code; - xhr.open( 'GET', url, true ); + xhr.open('GET', url, true); xhr.onreadystatechange = function() { - if( xhr.readyState == 4 ) { + if (xhr.readyState == 4) { var json = null; - if( xhr.getResponseHeader("Content-Type") == "application/json" ) { + if (xhr.getResponseHeader("Content-Type") == "application/json") { try { json = eval('(' + xhr.responseText + ')'); } @@ -66,11 +69,11 @@ XHR = function() } } - callback( xhr, json ); + callback(xhr, json); } } - xhr.send( null ); + xhr.send(null); } this.post = function(url,data,callback) @@ -78,19 +81,19 @@ XHR = function() this.reinit(); var xhr = this._xmlHttp; - var code = this._encode( data ); + var code = this._encode(data); xhr.onreadystatechange = function() { - if( xhr.readyState == 4 ) - callback( xhr ); + if (xhr.readyState == 4) + callback(xhr); } - xhr.open( 'POST', url, true ); - xhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ); - xhr.setRequestHeader( 'Content-length', code.length ); - xhr.setRequestHeader( 'Connection', 'close' ); - xhr.send( code ); + xhr.open('POST', url, true); + xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + xhr.setRequestHeader('Content-length', code.length); + xhr.setRequestHeader('Connection', 'close'); + xhr.send(code); } this.cancel = function() @@ -103,41 +106,41 @@ XHR = function() { var code = ''; - for( var i = 0; i < form.elements.length; i++ ) + for (var i = 0; i < form.elements.length; i++) { var e = form.elements[i]; - if( e.options ) + if (e.options) { - code += ( code ? '&' : '' ) + + code += (code ? '&' : '') + form.elements[i].name + '=' + encodeURIComponent( e.options[e.selectedIndex].value ); } - else if( e.length ) + else if (e.length) { - for( var j = 0; j < e.length; j++ ) - if( e[j].name ) { - code += ( code ? '&' : '' ) + - e[j].name + '=' + encodeURIComponent( e[j].value ); + for (var j = 0; j < e.length; j++) + if (e[j].name) { + code += (code ? '&' : '') + + e[j].name + '=' + encodeURIComponent(e[j].value); } } else { - code += ( code ? '&' : '' ) + - e.name + '=' + encodeURIComponent( e.value ); + code += (code ? '&' : '') + + e.name + '=' + encodeURIComponent(e.value); } } - if( typeof extra_values == 'object' ) - for( var key in extra_values ) - code += ( code ? '&' : '' ) + - key + '=' + encodeURIComponent( extra_values[key] ); + if (typeof extra_values == 'object') + for (var key in extra_values) + code += (code ? '&' : '') + + key + '=' + encodeURIComponent(extra_values[key]); return( - ( form.method == 'get' ) - ? this.get( form.getAttribute('action'), code, callback ) - : this.post( form.getAttribute('action'), code, callback ) + (form.method == 'get') + ? this.get(form.getAttribute('action'), code, callback) + : this.post(form.getAttribute('action'), code, callback) ); } @@ -146,14 +149,14 @@ XHR = function() obj = obj ? obj : { }; obj['_'] = Math.random(); - if( typeof obj == 'object' ) + if (typeof obj == 'object') { var code = ''; var self = this; - for( var k in obj ) - code += ( code ? '&' : '' ) + - k + '=' + encodeURIComponent( obj[k] ); + for (var k in obj) + code += (code ? '&' : '') + + k + '=' + encodeURIComponent(obj[k]); return code; } @@ -161,3 +164,41 @@ XHR = function() return obj; } } + +XHR.get = function(url, data, callback) +{ + (new XHR()).get(url, data, callback); +} + +XHR.poll = function(interval, url, data, callback) +{ + if (isNaN(interval) || interval <= 1) + interval = 5; + + if (!XHR._q) + { + XHR._t = 0; + XHR._q = [ ]; + } + + XHR._q.push({ + interval: interval, + callback: callback, + url: url, + data: data, + xhr: new XHR() + }); + + if (!XHR._i) + { + XHR._i = window.setInterval(function() { + for (var i = 0, e = XHR._q[0]; i < XHR._q.length; e = XHR._q[++i]) + { + if (!(XHR._t % e.interval) && !e.xhr.busy()) + e.xhr.get(e.url, e.data, e.callback); + } + + XHR._t++; + }, 1000); + } +} |