Advertisement
Guest User

Untitled

a guest
Sep 8th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.84 KB | None | 0 0
  1. /*****************************************************************************\
  2. Javascript "SOAP Client" library
  3.  
  4. @version: 2.4 - 2007.12.21
  5. @author: Matteo Casati - http://www.guru4.net/
  6.  
  7. \*****************************************************************************/
  8.  
  9. function SOAPClientParameters()
  10. {
  11. var _pl = new Array();
  12. this.add = function(name, value)
  13. {
  14. _pl[name] = value;
  15. return this;
  16. }
  17. this.toXml = function()
  18. {
  19. var xml = "";
  20. for(var p in _pl)
  21. {
  22. switch(typeof(_pl[p]))
  23. {
  24. case "string":
  25. case "number":
  26. case "boolean":
  27. case "object":
  28. xml += "<" + p + ">" + SOAPClientParameters._serialize(_pl[p]) + "</" + p + ">";
  29. break;
  30. default:
  31. break;
  32. }
  33. }
  34. return xml;
  35. }
  36. }
  37. SOAPClientParameters._serialize = function(o)
  38. {
  39. var s = "";
  40. switch(typeof(o))
  41. {
  42. case "string":
  43. s += o.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); break;
  44. case "number":
  45. case "boolean":
  46. s += o.toString(); break;
  47. case "object":
  48. // Date
  49. if(o.constructor.toString().indexOf("function Date()") > -1)
  50. {
  51.  
  52. var year = o.getFullYear().toString();
  53. var month = (o.getMonth() + 1).toString(); month = (month.length == 1) ? "0" + month : month;
  54. var date = o.getDate().toString(); date = (date.length == 1) ? "0" + date : date;
  55. var hours = o.getHours().toString(); hours = (hours.length == 1) ? "0" + hours : hours;
  56. var minutes = o.getMinutes().toString(); minutes = (minutes.length == 1) ? "0" + minutes : minutes;
  57. var seconds = o.getSeconds().toString(); seconds = (seconds.length == 1) ? "0" + seconds : seconds;
  58. var milliseconds = o.getMilliseconds().toString();
  59. var tzminutes = Math.abs(o.getTimezoneOffset());
  60. var tzhours = 0;
  61. while(tzminutes >= 60)
  62. {
  63. tzhours++;
  64. tzminutes -= 60;
  65. }
  66. tzminutes = (tzminutes.toString().length == 1) ? "0" + tzminutes.toString() : tzminutes.toString();
  67. tzhours = (tzhours.toString().length == 1) ? "0" + tzhours.toString() : tzhours.toString();
  68. var timezone = ((o.getTimezoneOffset() < 0) ? "+" : "-") + tzhours + ":" + tzminutes;
  69. s += year + "-" + month + "-" + date + "T" + hours + ":" + minutes + ":" + seconds + "." + milliseconds + timezone;
  70. }
  71. // Array
  72. else if(o.constructor.toString().indexOf("function Array()") > -1)
  73. {
  74. for(var p in o)
  75. {
  76. if(!isNaN(p)) // linear array
  77. {
  78. (/function\s+(\w*)\s*\(/ig).exec(o[p].constructor.toString());
  79. var type = RegExp.$1;
  80. switch(type)
  81. {
  82. case "":
  83. type = typeof(o[p]);
  84. case "String":
  85. type = "string"; break;
  86. case "Number":
  87. type = "int"; break;
  88. case "Boolean":
  89. type = "bool"; break;
  90. case "Date":
  91. type = "DateTime"; break;
  92. }
  93. s += "<" + type + ">" + SOAPClientParameters._serialize(o[p]) + "</" + type + ">"
  94. }
  95. else // associative array
  96. s += "<" + p + ">" + SOAPClientParameters._serialize(o[p]) + "</" + p + ">"
  97. }
  98. }
  99. // Object or custom function
  100. else
  101. for(var p in o)
  102. s += "<" + p + ">" + SOAPClientParameters._serialize(o[p]) + "</" + p + ">";
  103. break;
  104. default:
  105. break; // throw new Error(500, "SOAPClientParameters: type '" + typeof(o) + "' is not supported");
  106. }
  107. return s;
  108. }
  109.  
  110. function SOAPClient() {}
  111.  
  112. SOAPClient.username = null;
  113. SOAPClient.password = null;
  114.  
  115. SOAPClient.invoke = function(url, wsdl, method, parameters, async, callback)
  116. {
  117. if(async)
  118. SOAPClient._loadWsdl(url, wsdl, method, parameters, async, callback);
  119. else
  120. return SOAPClient._loadWsdl(url, wsdl, method, parameters, async, callback);
  121. }
  122.  
  123. // private: wsdl cache
  124. SOAPClient_cacheWsdl = new Array();
  125.  
  126. // private: invoke async
  127. SOAPClient._loadWsdl = function(url, wsdl_url, method, parameters, async, callback)
  128. {
  129. // load from cache?
  130. var wsdl = SOAPClient_cacheWsdl[wsdl_url];
  131. if(wsdl + "" != "" && wsdl + "" != "undefined")
  132. return SOAPClient._sendSoapRequest(url, method, parameters, async, callback, wsdl);
  133. // get wsdl
  134. var xmlHttp = SOAPClient._getXmlHttp();
  135. xmlHttp.open("GET", wsdl_url + "?wsdl", async);
  136. if(async)
  137. {
  138. xmlHttp.onreadystatechange = function()
  139. {
  140. if(xmlHttp.readyState == 4)
  141. SOAPClient._onLoadWsdl(url, wsdl_url, method, parameters, async, callback, xmlHttp);
  142. }
  143. }
  144. xmlHttp.send(null);
  145. if (!async)
  146. return SOAPClient._onLoadWsdl(url, wsdl_url, method, parameters, async, callback, xmlHttp);
  147. }
  148. SOAPClient._onLoadWsdl = function(url, wsdl_url, method, parameters, async, callback, req)
  149. {
  150. var wsdl = req.responseXML;
  151. SOAPClient_cacheWsdl[wsdl_url] = wsdl; // save a copy in cache
  152. return SOAPClient._sendSoapRequest(url, method, parameters, async, callback, wsdl);
  153. }
  154. SOAPClient._sendSoapRequest = function(url, method, parameters, async, callback, wsdl)
  155. {
  156. // get namespace
  157. var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value;
  158. // build SOAP request
  159. var sr =
  160. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  161. "<soap:Envelope " +
  162. "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
  163. "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
  164. "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
  165. "<soap:Body>" +
  166. "<" + method + " xmlns=\"" + ns + "\">" +
  167. parameters.toXml() +
  168. "</" + method + "></soap:Body></soap:Envelope>";
  169. // send request
  170. var xmlHttp = SOAPClient._getXmlHttp();
  171. if (SOAPClient.userName && SOAPClient.password){
  172. xmlHttp.open("POST", url, async, SOAPClient.userName, SOAPClient.password);
  173. // Some WS implementations (i.e. BEA WebLogic Server 10.0 JAX-WS) don't support Challenge/Response HTTP BASIC, so we send authorization headers in the first request
  174. xmlHttp.setRequestHeader("Authorization", "Basic " + SOAPClient._toBase64(SOAPClient.userName + ":" + SOAPClient.password));
  175. }
  176. else
  177. xmlHttp.open("POST", url, async);
  178. var soapaction = ((ns.lastIndexOf("/") != ns.length - 1) ? ns + "/" : ns) + encodeURIComponent(method);
  179. xmlHttp.setRequestHeader("SOAPAction", soapaction);
  180. xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
  181. if(async)
  182. {
  183. xmlHttp.onreadystatechange = function()
  184. {
  185. if(xmlHttp.readyState == 4)
  186. SOAPClient._onSendSoapRequest(method, async, callback, wsdl, xmlHttp);
  187. }
  188. }
  189. xmlHttp.send(sr);
  190. if (!async)
  191. return SOAPClient._onSendSoapRequest(method, async, callback, wsdl, xmlHttp);
  192. }
  193.  
  194. SOAPClient._onSendSoapRequest = function(method, async, callback, wsdl, req)
  195. {
  196. var o = null;
  197. var nd = SOAPClient._getElementsByTagName(req.responseXML, method + "Result");
  198. if(nd.length == 0)
  199. nd = SOAPClient._getElementsByTagName(req.responseXML, "return"); // PHP web Service?
  200. if(nd.length == 0)
  201. {
  202. if(req.responseXML.getElementsByTagName("faultcode").length > 0)
  203. {
  204. if(async || callback)
  205. o = new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);
  206. else
  207. throw new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);
  208. }
  209. }
  210. else
  211. o = SOAPClient._soapresult2object(nd[0], wsdl);
  212. if(callback)
  213. callback(o, req.responseXML);
  214. if(!async)
  215. return o;
  216. }
  217. SOAPClient._soapresult2object = function(node, wsdl)
  218. {
  219. var wsdlTypes = SOAPClient._getTypesFromWsdl(wsdl);
  220. return SOAPClient._node2object(node, wsdlTypes);
  221. }
  222. SOAPClient._node2object = function(node, wsdlTypes)
  223. {
  224. // null node
  225. if(node == null)
  226. return null;
  227. // text node
  228. if(node.nodeType == 3 || node.nodeType == 4)
  229. return SOAPClient._extractValue(node, wsdlTypes);
  230. // leaf node
  231. if (node.childNodes.length == 1 && (node.childNodes[0].nodeType == 3 || node.childNodes[0].nodeType == 4))
  232. return SOAPClient._node2object(node.childNodes[0], wsdlTypes);
  233. var isarray = SOAPClient._getTypeFromWsdl(node.nodeName, wsdlTypes).toLowerCase().indexOf("arrayof") != -1;
  234. // object node
  235. if(!isarray)
  236. {
  237. var obj = null;
  238. if(node.hasChildNodes())
  239. obj = new Object();
  240. for(var i = 0; i < node.childNodes.length; i++)
  241. {
  242. var p = SOAPClient._node2object(node.childNodes[i], wsdlTypes);
  243. obj[node.childNodes[i].nodeName] = p;
  244. }
  245. return obj;
  246. }
  247. // list node
  248. else
  249. {
  250. // create node ref
  251. var l = new Array();
  252. for(var i = 0; i < node.childNodes.length; i++)
  253. l[l.length] = SOAPClient._node2object(node.childNodes[i], wsdlTypes);
  254. return l;
  255. }
  256. return null;
  257. }
  258. SOAPClient._extractValue = function(node, wsdlTypes)
  259. {
  260. var value = node.nodeValue;
  261. switch(SOAPClient._getTypeFromWsdl(node.parentNode.nodeName, wsdlTypes).toLowerCase())
  262. {
  263. default:
  264. case "s:string":
  265. return (value != null) ? value + "" : "";
  266. case "s:boolean":
  267. return value + "" == "true";
  268. case "s:int":
  269. case "s:long":
  270. return (value != null) ? parseInt(value + "", 10) : 0;
  271. case "s:double":
  272. return (value != null) ? parseFloat(value + "") : 0;
  273. case "s:datetime":
  274. if(value == null)
  275. return null;
  276. else
  277. {
  278. value = value + "";
  279. value = value.substring(0, (value.lastIndexOf(".") == -1 ? value.length : value.lastIndexOf(".")));
  280. value = value.replace(/T/gi," ");
  281. value = value.replace(/-/gi,"/");
  282. var d = new Date();
  283. d.setTime(Date.parse(value));
  284. return d;
  285. }
  286. }
  287. }
  288. SOAPClient._getTypesFromWsdl = function(wsdl)
  289. {
  290. var wsdlTypes = new Array();
  291. // IE
  292. var ell = wsdl.getElementsByTagName("s:element");
  293. var useNamedItem = true;
  294. // MOZ
  295. if(ell.length == 0)
  296. {
  297. ell = wsdl.getElementsByTagName("element");
  298. useNamedItem = false;
  299. }
  300. for(var i = 0; i < ell.length; i++)
  301. {
  302. if(useNamedItem)
  303. {
  304. if(ell[i].attributes.getNamedItem("name") != null && ell[i].attributes.getNamedItem("type") != null)
  305. wsdlTypes[ell[i].attributes.getNamedItem("name").nodeValue] = ell[i].attributes.getNamedItem("type").nodeValue;
  306. }
  307. else
  308. {
  309. if(ell[i].attributes["name"] != null && ell[i].attributes["type"] != null)
  310. wsdlTypes[ell[i].attributes["name"].value] = ell[i].attributes["type"].value;
  311. }
  312. }
  313. return wsdlTypes;
  314. }
  315. SOAPClient._getTypeFromWsdl = function(elementname, wsdlTypes)
  316. {
  317. var type = wsdlTypes[elementname] + "";
  318. return (type == "undefined") ? "" : type;
  319. }
  320. // private: utils
  321. SOAPClient._getElementsByTagName = function(document, tagName)
  322. {
  323. try
  324. {
  325. // trying to get node omitting any namespaces (latest versions of MSXML.XMLDocument)
  326. return document.selectNodes(".//*[local-name()=\""+ tagName +"\"]");
  327. }
  328. catch (ex) {}
  329. // old XML parser support
  330. return document.getElementsByTagName(tagName);
  331. }
  332. // private: xmlhttp factory
  333. SOAPClient._getXmlHttp = function()
  334. {
  335. try
  336. {
  337. if(window.XMLHttpRequest)
  338. {
  339. var req = new XMLHttpRequest();
  340. // some versions of Moz do not support the readyState property and the onreadystate event so we patch it!
  341. if(req.readyState == null)
  342. {
  343. req.readyState = 1;
  344. req.addEventListener("load",
  345. function()
  346. {
  347. req.readyState = 4;
  348. if(typeof req.onreadystatechange == "function")
  349. req.onreadystatechange();
  350. },
  351. false);
  352. }
  353. return req;
  354. }
  355. if(window.ActiveXObject)
  356. return new ActiveXObject(SOAPClient._getXmlHttpProgID());
  357. }
  358. catch (ex) {}
  359. throw new Error("Your browser does not support XmlHttp objects");
  360. }
  361. SOAPClient._getXmlHttpProgID = function()
  362. {
  363. if(SOAPClient._getXmlHttpProgID.progid)
  364. return SOAPClient._getXmlHttpProgID.progid;
  365. var progids = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
  366. var o;
  367. for(var i = 0; i < progids.length; i++)
  368. {
  369. try
  370. {
  371. o = new ActiveXObject(progids[i]);
  372. return SOAPClient._getXmlHttpProgID.progid = progids[i];
  373. }
  374. catch (ex) {};
  375. }
  376. throw new Error("Could not find an installed XML parser");
  377. }
  378.  
  379. SOAPClient._toBase64 = function(input)
  380. {
  381. var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  382. var output = "";
  383. var chr1, chr2, chr3;
  384. var enc1, enc2, enc3, enc4;
  385. var i = 0;
  386.  
  387. do {
  388. chr1 = input.charCodeAt(i++);
  389. chr2 = input.charCodeAt(i++);
  390. chr3 = input.charCodeAt(i++);
  391.  
  392. enc1 = chr1 >> 2;
  393. enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  394. enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  395. enc4 = chr3 & 63;
  396.  
  397. if (isNaN(chr2)) {
  398. enc3 = enc4 = 64;
  399. } else if (isNaN(chr3)) {
  400. enc4 = 64;
  401. }
  402.  
  403. output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
  404. keyStr.charAt(enc3) + keyStr.charAt(enc4);
  405. } while (i < input.length);
  406.  
  407. return output;
  408. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement