File diff 000000000000 → 000000000000
themes/bootstrap3/static/js/jXHR.js
Show inline comments
 
new file 100644
 
// jXHR.js (JSON-P XHR)
 
// v0.1 (c) Kyle Simpson
 
// MIT License
 

	
 
(function(global){
 
	var SETTIMEOUT = global.setTimeout, // for better compression
 
		doc = global.document,
 
		callback_counter = 0;
 

	
 
	global.jXHR = function() {
 
		var script_url,
 
			script_loaded,
 
			jsonp_callback,
 
			scriptElem,
 
			publicAPI = null;
 

	
 
		function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } }
 

	
 
		function reset() {
 
			script_loaded = false;
 
			script_url = "";
 
			removeScript();
 
			scriptElem = null;
 
			fireReadyStateChange(0);
 
		}
 

	
 
		function ThrowError(msg) {
 
			try { publicAPI.onerror.call(publicAPI,msg,script_url); } catch (err) { throw new Error(msg); }
 
		}
 

	
 
		function handleScriptLoad() {
 
			if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; }
 
			this.onload = this.onreadystatechange = null; // prevent memory leak
 
			script_loaded = true;
 
			if (publicAPI.readyState !== 4) ThrowError("Script failed to load ["+script_url+"].");
 
			removeScript();
 
		}
 

	
 
		function fireReadyStateChange(rs,args) {
 
			args = args || [];
 
			publicAPI.readyState = rs;
 
			if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args);
 
		}
 

	
 
		publicAPI = {
 
			onerror:null,
 
			onreadystatechange:null,
 
			readyState:0,
 
			open:function(method,url){
 
				reset();
 
				internal_callback = "cb"+(callback_counter++);
 
				(function(icb){
 
					global.jXHR[icb] = function() {
 
						try { fireReadyStateChange.call(publicAPI,4,arguments); }
 
						catch(err) {
 
							publicAPI.readyState = -1;
 
							ThrowError("Script failed to run ["+script_url+"].");
 
						}
 
						global.jXHR[icb] = null;
 
					};
 
				})(internal_callback);
 
				script_url = url.replace(/=\?/,"=jXHR."+internal_callback);
 
				fireReadyStateChange(1);
 
			},
 
			send:function(){
 
				SETTIMEOUT(function(){
 
					scriptElem = doc.createElement("script");
 
					scriptElem.setAttribute("type","text/javascript");
 
					scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);};
 
					scriptElem.setAttribute("src",script_url);
 
					doc.getElementsByTagName("head")[0].appendChild(scriptElem);
 
				},0);
 
				fireReadyStateChange(2);
 
			},
 
			setRequestHeader:function(){}, // noop
 
			getResponseHeader:function(){return "";}, // basically noop
 
			getAllResponseHeaders:function(){return [];} // ditto
 
		};
 

	
 
		reset();
 

	
 
		return publicAPI;
 
	};
 
})(window);