]> git.mxchange.org Git - friendica-addons.git/blob - jappixmini/jappix/js/jxhr.js
Merge branch '3.6-rc'
[friendica-addons.git] / jappixmini / jappix / js / jxhr.js
1 // jXHR.js (JSON-P XHR)\r
2 // v0.1 (c) Kyle Simpson\r
3 // MIT License\r
4 // modified by gueron Jonathan to work with strophe lib\r
5 // for http://www.iadvize.com\r
6 \r
7 (function(global){\r
8         var SETTIMEOUT = global.setTimeout, // for better compression\r
9                 doc = global.document,\r
10                 callback_counter = 0;\r
11                 \r
12         global.jXHR = function() {\r
13                 var script_url,\r
14                         script_loaded,\r
15                         jsonp_callback,\r
16                         scriptElem,\r
17                         publicAPI = null;\r
18                         \r
19                 function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } }\r
20                         \r
21                 function reset() {\r
22                         script_loaded = false;\r
23                         script_url = "";\r
24                         removeScript();\r
25                         scriptElem = null;\r
26                         fireReadyStateChange(0);\r
27                 }\r
28                 \r
29                 function ThrowError(msg) {\r
30                         try { \r
31                                 publicAPI.onerror.call(publicAPI,msg,script_url); \r
32                         } catch (err) { \r
33                                 //throw new Error(msg); \r
34                         }\r
35                 }\r
36 \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
42                         removeScript();\r
43                 }\r
44                 \r
45                 function parseXMLString(xmlStr) {\r
46                         var xmlDoc = null;\r
47                         if(window.DOMParser) {\r
48                                 var parser = new DOMParser();\r
49                                 xmlDoc = parser.parseFromString(xmlStr,"text/xml");\r
50                         }\r
51                         else {\r
52                                 xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); \r
53                                 xmlDoc.async="false";\r
54                                 xmlDoc.loadXML(xmlStr);\r
55                         }\r
56                         return xmlDoc;\r
57                 }\r
58                 \r
59                 function fireReadyStateChange(rs,args) {\r
60                 \r
61                         args = args || [];\r
62                         publicAPI.readyState = rs;\r
63                         if (rs == 4) {\r
64                                 publicAPI.responseText = args[0].reply;\r
65                                 publicAPI.responseXML = parseXMLString(args[0].reply);\r
66                         }\r
67                         if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args);\r
68                 }\r
69                                 \r
70                 publicAPI = {\r
71                         onerror:null,\r
72                         onreadystatechange:null,\r
73                         readyState:0,\r
74                         status:200,\r
75                         responseBody: null,\r
76                         responseText: null,\r
77                         responseXML: null,\r
78                         open:function(method,url){\r
79                                 reset();\r
80                                 var internal_callback = "cb"+(callback_counter++);\r
81                                 (function(icb){\r
82                                         global.jXHR[icb] = function() {\r
83                                                 try { fireReadyStateChange.call(publicAPI,4,arguments); } \r
84                                                 catch(err) { \r
85                                                         publicAPI.readyState = -1;\r
86                                                         ThrowError("Script failed to run ["+script_url+"]."); \r
87                                                 }\r
88                                                 global.jXHR[icb] = null;\r
89                                         };\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
94                         },\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
103                                 },0);\r
104                                 fireReadyStateChange(2);\r
105                         },\r
106                         abort:function(){},\r
107                         setRequestHeader:function(){}, // noop\r
108                         getResponseHeader:function(){return "";}, // basically noop\r
109                         getAllResponseHeaders:function(){return [];} // ditto\r
110                 };\r
111 \r
112                 reset();\r
113                 \r
114                 return publicAPI;\r
115         };\r
116 })(window);\r