diff options
Diffstat (limited to 'themes/base/htdocs/luci-static/resources/xhr.js')
-rw-r--r-- | themes/base/htdocs/luci-static/resources/xhr.js | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/themes/base/htdocs/luci-static/resources/xhr.js b/themes/base/htdocs/luci-static/resources/xhr.js new file mode 100644 index 0000000000..7e2e3b090b --- /dev/null +++ b/themes/base/htdocs/luci-static/resources/xhr.js @@ -0,0 +1,150 @@ +/* + * xhr.js - XMLHttpRequest helper class + * (c) 2008-2010 Jo-Philipp Wich + */ + +XHR = function() +{ + this.reinit = function() + { + if( window.XMLHttpRequest ) { + this._xmlHttp = new XMLHttpRequest(); + } + else if( window.ActiveXObject ) { + this._xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + else { + alert("xhr.js: XMLHttpRequest is not supported by this browser!"); + } + } + + this.busy = function() { + switch( this._xmlHttp.readyState ) + { + case 1: + case 2: + case 3: + return true; + + default: + return false; + } + } + + this.abort = function() { + if( this.busy() ) + this._xmlHttp.abort(); + } + + this.get = function(url,data,callback) + { + this.reinit(); + + var xhr = this._xmlHttp; + var code = this._encode( data ); + + url = 'http://' + location.hostname + + ( location.port ? ':' + location.port : '' ) + url; + + if( code ) + if( url.substr(url.length-1,1) == '&' ) + url += code; + else + url += '?' + code; + + xhr.open( 'GET', url, true ); + + xhr.onreadystatechange = function() + { + if( xhr.readyState == 4 ) { + callback( xhr ); + } + } + + xhr.send( null ); + } + + this.post = function(url,data,callback) + { + this.reinit(); + + var xhr = this._xmlHttp; + var code = this._encode( data ); + + xhr.onreadystatechange = function() + { + 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 ); + } + + this.cancel = function() + { + this._xmlHttp.onreadystatechange = function(){}; + this._xmlHttp.abort(); + } + + this.send_form = function(form,callback,extra_values) + { + var code = ''; + + for( var i = 0; i < form.elements.length; i++ ) + { + var e = form.elements[i]; + + if( e.options ) + { + code += ( code ? '&' : '' ) + + form.elements[i].name + '=' + encodeURIComponent( + e.options[e.selectedIndex].value + ); + } + 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 ); + } + } + else + { + 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] ); + + return( + ( form.method == 'get' ) + ? this.get( form.getAttribute('action'), code, callback ) + : this.post( form.getAttribute('action'), code, callback ) + ); + } + + this._encode = function(obj) + { + if( typeof obj == 'object' ) + { + var code = ''; + var self = this; + + for( var k in obj ) + code += ( code ? '&' : '' ) + + k + '=' + encodeURIComponent( obj[k] ); + return code; + } + + return obj; + } +} |