function SOAPClientParameters() { var _pl = new Array(); this.add = function(name, value) { _pl[name] = value; return this; } this.toXml = function() { var xml = ""; for (var p in _pl) { if (typeof(_pl[p]) != "function") xml += "<" + p + ">" + _pl[p].toString().replace(/&/g, "&").replace(//g, ">") + ""; } return xml; } } function SOAPClient() { } SOAPClient.invoke = function(url, method, parameters, async, callback) { if (async) SOAPClient._loadWsdl(url, method, parameters, async, callback); else return SOAPClient._loadWsdl(url, method, parameters, async, callback); } SOAPClient._loadWsdl = function(url, method, parameters, async, callback) { // load from cache? var wsdl = SOAPClient_cacheWsdl[url]; if (wsdl + "" != "" && wsdl + "" != "undefined") return SOAPClient._sendSoapRequest(url, method, parameters, async, callback, wsdl); // get wsdl var xmlHttp = SOAPClient._getXmlHttp(); xmlHttp.open("GET", url + "?wsdl", async); if (async) { xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) SOAPClient._onLoadWsdl(url, method, parameters, async, callback, xmlHttp); } } xmlHttp.send(null); if (!async) return SOAPClient._onLoadWsdl(url, method, parameters, async, callback, xmlHttp); } SOAPClient_cacheWsdl = new Array(); SOAPClient._onLoadWsdl = function(url, method, parameters, async, callback, req) { var wsdl = req.responseXML; SOAPClient_cacheWsdl[url] = wsdl; return SOAPClient._sendSoapRequest(url, method, parameters, async, callback, wsdl); } SOAPClient._sendSoapRequest = function(url, method, parameters, async, callback, wsdl) { var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value; var sr = "<" + method + " xmlns=\"" + ns + "\">" + parameters.toXml() + ""; var xmlHttp = SOAPClient._getXmlHttp(); xmlHttp.open("POST", url, async); var soapaction = ((ns.lastIndexOf("/") != ns.length - 1) ? ns + "/" : ns) + method; xmlHttp.setRequestHeader("SOAPAction", soapaction); xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); if (async) { xmlHttp.onreadystatechange = function() { if(xmlHttp.readyState == 4) SOAPClient._onSendSoapRequest(method, async, callback, wsdl, xmlHttp); } } xmlHttp.send(sr); if (!async) return SOAPClient._onSendSoapRequest(method, async, callback, wsdl, xmlHttp); } SOAPClient._onSendSoapRequest = function(method, async, callback, wsdl, req) { var o = null; var nd = SOAPClient._getElementsByTagName(req.responseXML, "response"); if (nd.length == 0) { if (req.responseXML.getElementsByTagName("faultcode").length > 0) throw new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue); } else o = SOAPClient._soapresult2object(nd[0], wsdl); if (callback) callback(o, req.responseXML); if (!async) return o; } SOAPClient._soapresult2object = function(node, wsdl) { return SOAPClient._node2object(node, wsdl); } SOAPClient._node2object = function(node, wsdl) { // null node if (node == null) return null; // text node if (node.nodeType == 3 || node.nodeType == 4) return SOAPClient._extractValue(node, wsdl); // leaf node if (node.childNodes.length == 1 && (node.childNodes[0].nodeType == 3 || node.childNodes[0].nodeType == 4)) return SOAPClient._node2object(node.childNodes[0], wsdl); var isarray = false; if (node.attributes.getNamedItem("SOAP-ENC:arrayType") != null) isarray = SOAPClient._getArrayNameFromWsdl(node.attributes.getNamedItem("SOAP-ENC:arrayType").nodeValue.substring(4), wsdl) != ""; // object node if (!isarray) { var obj = null; if (node.hasChildNodes()) obj = new Object(); for (var i = 0; i < node.childNodes.length; i++) { var p = SOAPClient._node2object(node.childNodes[i], wsdl); obj[node.childNodes[i].nodeName] = p; } return obj; } // list node else { // create node ref var l = new Array(); for(var i = 0; i < node.childNodes.length; i++) l[l.length] = SOAPClient._node2object(node.childNodes[i], wsdl); return l; } return null; } SOAPClient._extractValue = function(node, wsdl) { var value = node.nodeValue; if (value == null) return null; switch(SOAPClient._getTypeFromWsdl(node.parentNode.nodeName, wsdl).toLowerCase()) { case 'xsd:string': return value; case 'xsd:boolean': return value + "" == "true"; case 'xsd:byte': return (value == '255') ? null : value; case 'xsd:unnsignedbyte': return (value == '510') ? null : value; case 'xsd:short': return (value == '32767') ? null : value; case 'xsd:unsignedshort': return (value == '65534') ? null : value; case "xsd:int": case "xsd:long": return (value != null && value != '2147483647') ? parseInt(value + '', 10) : null; case "xsd:unsignedint": case "xsd:unsignedlong": case "xsd:double": return (value != null && value != '4294967295') ? parseInt(value + '', 10) : null; case "xsd:float": case "xsd:decimal": return (value != null && value != '4294967295') ? parseFloat(value + '') : null; case "xsd:datetime": return (value != null && value != '1940-01-01T00:00:00') ? value.replace(/T/gi, ' ') : null; /* return null; else { var dt = new Date(); var dtArray = value.split('T'); var tmp = dtArray[1].split(':'); dt.setUTCHours(tmp[0], tmp[1], tmp[2]); tmp = dtArray[0].split('-'); dt.setUTCFullYear(tmp[0], tmp[1], tmp[2]); return dt.formatDate('YYYY-M-d hh:mm:ss'); value = value + ""; // value = value.substring(0, value.lastIndexOf(".")); value = value.replace(/T/gi, ' '); value = value.replace(/-/gi, '/'); var d = new Date(); d.setTime(Date.parse(value)); return d; /* tmp = document.getElementById('semesterStartDate').value.split("-"); var semesterStartDate = new Date(parseInt(tmp[0]),parseInt(tmp[1]-1),parseInt(tmp[2]-0)); }*/ default: return value; break; } /* case 'xsd:byte': if ($this->IsNull()) return 255; case 'xsd:unsignedByte': if ($this->IsNull()) return 510; case 'xsd:short': if ($this->IsNull()) return 32767; case 'xsd:unsignedShort': if ($this->IsNull()) return 65534; case 'xsd:int': case 'xsd:long': if ($this->IsNull()) return 2147483647; case 'xsd:unsignedInt': case 'xsd:unsignedLong': case 'xsd:float': case 'xsd:decimal': if ($this->IsNull()) return 4294967295; case 'xsd:dateTime': if ($this->IsNull()) return '1940-01-01T00:00:00'; else return str_replace(' ', 'T', $this->m_Value); case 'xsd:string': if ($this->IsNull()) return 'NULL';*/ } SOAPClient._getTypeFromWsdl = function(elementname, wsdl) { var ell = wsdl.getElementsByTagName("xsd:element");// IE if (ell.length == 0) { ell = wsdl.getElementsByTagName("element"); // MOZ } for(var i = 0; i < ell.length; i++) { if (ell[i].attributes["name"] + "" == "undefined") // IE { if (ell[i].attributes.getNamedItem("name") != null && ell[i].attributes.getNamedItem("name").nodeValue == elementname && ell[i].attributes.getNamedItem("type") != null) return ell[i].attributes.getNamedItem("type").nodeValue; } else // MOZ { if (ell[i].attributes["name"] != null && ell[i].attributes["name"].value == elementname && ell[i].attributes["type"] != null) return ell[i].attributes["type"].value; } } return ""; } SOAPClient._getArrayNameFromWsdl = function(elementname, wsdl) { elementname = elementname.substring(0, elementname.indexOf('[')) + "List"; var ell = wsdl.getElementsByTagName("xsd:complexType");// IE if (ell.length == 0) { ell = wsdl.getElementsByTagName("complexType"); // MOZ } for(var i = 0; i < ell.length; i++) { if (ell[i].attributes["name"] + "" == "undefined") // IE { if (ell[i].attributes.getNamedItem("name") != null && ell[i].attributes.getNamedItem("name").nodeValue == elementname) return ell[i].attributes.getNamedItem("name").nodeValue; } else // MOZ { if (ell[i].attributes["name"] != null && ell[i].attributes["name"].value == elementname) return ell[i].attributes["name"].value; } } return ""; } SOAPClient._getElementsByTagName = function(document, tagName) { /* try { return document.selectNodes(".//*[local-name()=\""+ tagName +"\"]"); } catch (ex) { alert("EXCEP: " + ex); }*/ return document.getElementsByTagName(tagName); } SOAPClient._getXmlHttp = function() { try { if(window.XMLHttpRequest) { var req = new XMLHttpRequest(); if (req.readyState == null) { req.readyState = 1; req.addEventListener("load", function() { req.readyState = 4; if (typeof req.onreadystatechange == "function") req.onreadystatechange(); },false); } return req; } if (window.ActiveXObject) return new ActiveXObject(SOAPClient._getXmlHttpProgID()); } catch (ex) { } throw new Error("Your browser does not support XmlHttp objects"); } SOAPClient._getXmlHttpProgID = function() { if (SOAPClient._getXmlHttpProgID.progid) return SOAPClient._getXmlHttpProgID.progid; var progids = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]; var o; for (var i = 0; i < progids.length; i++) { try { o = new ActiveXObject(progids[i]); return SOAPClient._getXmlHttpProgID.progid = progids[i]; } catch (ex) { }; } throw new Error("Could not find an installed XML parser"); }