summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2011-09-26 00:05:17 +0000
committerJo-Philipp Wich <jow@openwrt.org>2011-09-26 00:05:17 +0000
commitb2b3b181d830d4b10250c7a9a1d7014a314dc763 (patch)
treed2a95cd5302385bdb0017c1c43a750c5358c670a
parent2829139f35a6123b0e40c16cf2813fed808d61e6 (diff)
themes/base: xhr.js: clean code style, implement XHR.get() and XHR.poll() convenience functions
-rw-r--r--themes/base/htdocs/luci-static/resources/xhr.js123
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);
+ }
+}