themes/base: xhr.js: clean code style, implement XHR.get() and XHR.poll() convenience...
authorJo-Philipp Wich <jow@openwrt.org>
Mon, 26 Sep 2011 00:05:17 +0000 (00:05 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Mon, 26 Sep 2011 00:05:17 +0000 (00:05 +0000)
themes/base/htdocs/luci-static/resources/xhr.js

index 23bf96e0210d5f6f5d02c0cc902236270deb1c17..453c2ba4e8c4a774a65ac753e87851ab848e08c2 100644 (file)
@@ -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);
+       }
+}