1 // jXHR.js (JSON-P XHR)
\r
2 // v0.1 (c) Kyle Simpson
\r
4 // modified by gueron Jonathan to work with strophe lib
\r
5 // for http://www.iadvize.com
\r
8 var SETTIMEOUT = global.setTimeout, // for better compression
\r
9 doc = global.document,
\r
10 callback_counter = 0;
\r
12 global.jXHR = function() {
\r
19 function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } }
\r
22 script_loaded = false;
\r
26 fireReadyStateChange(0);
\r
29 function ThrowError(msg) {
\r
31 publicAPI.onerror.call(publicAPI,msg,script_url);
\r
33 //throw new Error(msg);
\r
37 function handleScriptLoad() {
\r
38 if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; }
\r
39 this.onload = this.onreadystatechange = null; // prevent memory leak
\r
40 script_loaded = true;
\r
41 if (publicAPI.readyState !== 4) ThrowError("handleScriptLoad: Script failed to load ["+script_url+"].");
\r
45 function parseXMLString(xmlStr) {
\r
47 if(window.DOMParser) {
\r
48 var parser = new DOMParser();
\r
49 xmlDoc = parser.parseFromString(xmlStr,"text/xml");
\r
52 xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
\r
53 xmlDoc.async="false";
\r
54 xmlDoc.loadXML(xmlStr);
\r
59 function fireReadyStateChange(rs,args) {
\r
62 publicAPI.readyState = rs;
\r
64 publicAPI.responseText = args[0].reply;
\r
65 publicAPI.responseXML = parseXMLString(args[0].reply);
\r
67 if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args);
\r
72 onreadystatechange:null,
\r
78 open:function(method,url){
\r
80 var internal_callback = "cb"+(callback_counter++);
\r
82 global.jXHR[icb] = function() {
\r
83 try { fireReadyStateChange.call(publicAPI,4,arguments); }
\r
85 publicAPI.readyState = -1;
\r
86 ThrowError("Script failed to run ["+script_url+"].");
\r
88 global.jXHR[icb] = null;
\r
90 })(internal_callback);
\r
91 script_url = url + '?callback=?jXHR&data=';
\r
92 script_url = script_url.replace(/=\?jXHR/,"=jXHR."+internal_callback);
\r
93 fireReadyStateChange(1);
\r
95 send:function(data){
\r
96 script_url = script_url + encodeURIComponent(data);
\r
97 SETTIMEOUT(function(){
\r
98 scriptElem = doc.createElement("script");
\r
99 scriptElem.setAttribute("type","text/javascript");
\r
100 scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);};
\r
101 scriptElem.setAttribute("src",script_url);
\r
102 doc.getElementsByTagName("head")[0].appendChild(scriptElem);
\r
104 fireReadyStateChange(2);
\r
106 abort:function(){},
\r
107 setRequestHeader:function(){}, // noop
\r
108 getResponseHeader:function(){return "";}, // basically noop
\r
109 getAllResponseHeaders:function(){return [];} // ditto
\r