/*
 * XML-RPC client class
 * @version 1.0
 * @author M.F.Endenburg
 * @copyright (c) Denbel Systems, 2008
 */
Denbel.load("rpc.XmlRpcClient");Denbel.load("rpc.XmlRpcMessage");Denbel.load("rpc.XmlRpcParameter");Denbel.rpc.XmlRpcClient=function(a){Denbel.rpc.XmlRpcClient.superclass.constructor.call(this,{url:a});var c=new Denbel.lang.Object();c.set("i4","int");c.set("int","int");c.set("struct","object");c.set("boolean","boolean");c.set("array","array");c.set("double","float");c.set("string","string");c.set("base64","base64");c.set("datetime.iso8601","date");Denbel.rpc.XmlRpcClient.rpcToEcmaConversion=c;var b=new Denbel.lang.Object();b.set("int","i4");b.set("int","int");b.set("object","struct");b.set("boolean","boolean");b.set("array","array");b.set("float","double");b.set("string","string");b.set("base64","base64");b.set("date","datetime.iso8601");Denbel.rpc.XmlRpcClient.ecmaToRpcConversion=b;};Denbel.rpc.XmlRpcClient.dataTypes=new Array("boolean","array","object","string","int","i4","dateTime.iso8601","double","base64");Denbel.rpc.XmlRpcClient.lastFault=null;Denbel.rpc.XmlRpcClient.rpcToEcmaConversion=null;Denbel.rpc.XmlRpcClient.ecmaToRpcConversion=null;Denbel.rpc.XmlRpcClient.lastResponse=null;Denbel.rpc.XmlRpcClient.convertXmlRpcToXml=function(g){var d=Denbel.rpc.XmlRpcClient.parseResponse(g);if(!YAHOO.lang.isArray(d)){YAHOO.log("Result data is invalid in XmlRpcClient.convertXmlRpcToXml","error");return null;}if(d.length==1){d=d[0];}var f=Denbel.util.XmlHelper.createXmlDocument();var h=f.createElement("data");var k=null;var b=null;var a=null;for(var e=0;e<d.length;e++){if(!d[e].properties){continue;}k=f.createElement("item");for(var c=0;c<d[e].properties.length;c++){a=d[e].properties[c];b=f.createElement(a);b.appendChild(f.createCDATASection(d[e].get(a)));k.appendChild(b);}h.appendChild(k);k=null;}f.appendChild(h);return f;};Denbel.rpc.XmlRpcClient.parseResponse=function(f){if(!f){YAHOO.log("No XMLDocument given","error","Denbel.rpc.XmlRpcClient");return null;}var k=Denbel.rpc.XmlRpcClient;var c=f.getElementsByTagName("param");if(c.length==0){var g=f.getElementsByTagName("fault");if(g.length>0){k.parseFault(g[0]);return null;}}k.lastFault=null;var b=null;var a=null;var h=null;var j=null;var e=new Array();for(var d=0;d<c.length;d++){b=c[d];if(!b){continue;}a=Denbel.util.XmlHelper.getNextChildElement(b);j=k.convertFromXml(a);e.push(j);}return e;};Denbel.rpc.XmlRpcClient.createXmlFromType=function(e,c,d){var b=null;var a=Denbel.rpc.XmlRpcClient;switch(c){case"array":b=a.createArrayStruct(e,d);break;case"object":b=a.createObjectStruct(e,d);break;case"null":case null:b=e.createElement("string");break;case"dateTime.iso8601":b=e.createElement(c);b.appendChild(e.createCDATASection(a.getISO8601DateString(d)));break;default:if(c=="string"&&(d.startsWith("__BASE64__")&&d.endsWith("__BASE64__"))){d=d.replace("__BASE64__","");d=d.replace("__BASE64__","");c="base64";}b=e.createElement(c);b.appendChild(e.createCDATASection(d));break;}return b;};Denbel.rpc.XmlRpcClient.createArrayStruct=function(e,h){if(!YAHOO.lang.isArray(h)){YAHOO.log("value is not an Array","error");return null;}var j=e.createElement("array");var g=e.createElement("data");var b=null;var a=null;var k=Denbel.rpc.XmlRpcClient;var c=null;for(var f=0;f<h.length;f++){c=k.getValueType(h[f]);b=e.createElement("value");a=this.createXmlFromType(e,c,h[f]);if(a!=null){b.appendChild(a);}g.appendChild(b);}j.appendChild(g);return j;};Denbel.rpc.XmlRpcClient.createObjectStruct=function(e,f){if(!YAHOO.lang.isObject(f)){YAHOO.log("value is not an object","error");return null;}var h=e.createElement("struct");var b=null;var a=null;var j=null;var c=null;var i=Denbel.rpc.XmlRpcClient;var d=null;for(var g in f){d=i.getValueType(f[g]);b=e.createElement("member");c=e.createElement("name");c.appendChild(e.createCDATASection(g));j=e.createElement("value");a=this.createXmlFromType(e,d,f[g]);j.appendChild(a);b.appendChild(c);b.appendChild(j);h.appendChild(b);}return h;};Denbel.rpc.XmlRpcClient.messageToString=function(b){var a=Denbel.rpc.XmlRpcClient.createRequest(b);return Denbel.util.XmlHelper.xmlToString(a);};Denbel.rpc.XmlRpcClient.createRequest=function(o){var f=Denbel.util.XmlHelper.createXmlDocument("1.0","utf-8");var j=f.createElement("methodCall");var c=f.createElement("methodName");c.appendChild(f.createTextNode(o.getMethod()));j.appendChild(c);var b=f.createElement("params");j.appendChild(b);var a=null;var l=null;var n=null;var e=null;var h=null;var k=null;var m=Denbel.rpc.XmlRpcClient;var d=o.getParameters();for(var g=0;g<d.length;g++){a=f.createElement("param");l=f.createElement("value");k=d[g].getValue();if(!d[g].isBase64()){h=m.getValueType(k);}else{h="base64";}n=m.createXmlFromType(f,h,k);if(n!=null){l.appendChild(n);}a.appendChild(l);b.appendChild(a);a=null;l=null;n=null;}f.appendChild(j);return f;};Denbel.rpc.XmlRpcClient.convertFromXml=function(f){if(f.tagName!="value"){YAHOO.log('convertFromXml: did not receive a "value" node',"error");return null;}var d=Denbel.util.XmlHelper.getNextChildElement(f);var c=d.tagName.toLowerCase();var b=Denbel.rpc.XmlRpcClient.rpcToEcmaConversion.get(c);var a=Denbel.rpc.XmlRpcClient;var e=null;switch(b){case"string":e=Denbel.util.XmlHelper.getElementValue(d);break;case"int":e=parseInt(Denbel.util.XmlHelper.getElementValue(d));break;case"boolean":e=((Denbel.util.XmlHelper.getElementValue(d)=="true")?true:false);break;case"date":e=a.parseISODate(Denbel.util.XmlHelper.getElementValue(d));break;case"float":case"double":e=parseFloat(Denbel.util.XmlHelper.getElementValue(d));break;case"array":e=a.createArrayFromStruct(f);break;case"object":e=a.createObjectFromStruct(f);break;case"base64":e=Denbel.core.Base64.decode(Denbel.util.XmlHelper.getElementValue(d));break;default:e=null;break;}return e;};Denbel.rpc.XmlRpcClient.parseISODate=function(h){if(!h||!YAHOO.lang.isString(h)){YAHOO.log("Invalid parameter type in XmlRpcClient.parseISODate","error");return null;}var b=h.split("T")[0];var a=h.split("T")[1];var d=a.substring(0,8);var f=a.substring(8);var c=b.split("-");var g=d.split(":");var e=new Date();e.setFullYear(c[0]);e.setMonth((c[1]-1));e.setDate(c[2]);e.setHours(g[0]);e.setMinutes(g[1]);e.setSeconds(g[2]);e.setMilliseconds(0);return e;};Denbel.rpc.XmlRpcClient.createArrayFromStruct=function(e){if(e.tagName!="value"){YAHOO.log('createArrayFromStruct did not receive a "value" node.',"error","Denbel.rpc.XmlRpcClient");return null;}var b=e.getElementsByTagName("data")[0].childNodes;var d=null;var a=Denbel.rpc.XmlRpcClient;var f=new Array();for(var c=0;c<b.length;c++){if(!b[c]||b[c].tagName!="value"){continue;}d=a.convertFromXml(b[c]);f.push(d);}return f;};Denbel.rpc.XmlRpcClient.createObjectFromStruct=function(g){if(g.tagName!="value"){YAHOO.log('createObjectFromStruct did not receive a "value" node',"error");return null;}var b=g.getElementsByTagName("struct")[0].childNodes;var c=null;var e=null;var a=Denbel.rpc.XmlRpcClient;var f=new Denbel.lang.Object();for(var d=0;d<b.length;d++){if(!b[d]){continue;}c=Denbel.util.XmlHelper.getElementValue(b[d].getElementsByTagName("name")[0]);e=a.convertFromXml(b[d].getElementsByTagName("value")[0]);f.set(c,e);}return f;};Denbel.rpc.XmlRpcClient.parseFault=function(b){if(!b){return;}var c=b.getElementsByTagName("value")[0];var a=Denbel.rpc.XmlRpcClient.createObjectFromStruct(c);Denbel.rpc.XmlRpcClient.lastFault=a;YAHOO.log("XmlRpcClient error ["+a.get("faultCode")+"]: "+a.get("faultString"),"error");};Denbel.rpc.XmlRpcClient.getValueType=function(c){if(c==null){return"null";}var b=null;if(YAHOO.lang.isBoolean(c)){b="boolean";}else{if(YAHOO.lang.isArray(c)){b="array";}else{if(YAHOO.lang.isNumber(c)){var a=c.toString();if(a.indexOf(".")>-1){b="double";}else{b="int";}}else{if(YAHOO.lang.isString(c)){b="string";}else{if(YAHOO.lang.isObject(c)){if(c.getFullYear){b="dateTime.iso8601";}else{b="object";}}}}}}if(!Denbel.util.inArray(b,Denbel.rpc.XmlRpcClient.dataTypes)){YAHOO.log("Unsupported data type for value in Denbel.rpc.XmlRpcParameter.getType()","error");return null;}return b;};YAHOO.extend(Denbel.rpc.XmlRpcClient,Denbel.rpc.Protocol,{connectionObject:null,createMessage:function(a){return new Denbel.rpc.XmlRpcMessage(a);},callService:function(b,e,a,d){if(!b){YAHOO.log("No XmlRpcMessage given","error");return;}if(a!==true){if(d){d+="&";}else{d="";}d+="nocache=1";}var c=Denbel.rpc.XmlRpcClient.createRequest(b);this.sendRequest(this.convertXmlToString(c),e,d);},convertXmlToString:function(a){return Denbel.util.XmlHelper.xmlToString(a);},getFault:function(){return Denbel.rpc.XmlRpcClient.lastFault;},sendRequest:function(b,d,c){if(!d||!d.success||!d.failure){YAHOO.log("Callback is not properly set up","error","Denbel.rpc.XmlRpcClient");return;}var a=this.cfg.url;if(c){a+="?"+c;}YAHOO.util.Connect.initHeader("X-Application-Id",Denbel.Website.createFP(),true);this.connectionObject=YAHOO.util.Connect.asyncRequest("post",a,{success:function(g){Denbel.rpc.XmlRpcClient.lastResponse=g.responseText;var f=Denbel.rpc.XmlRpcClient.parseResponse(g.responseXML);if(f){g.argument.callback.success.call(this,{data:f,fault:null,argument:g.argument.callback.argument,responseText:g.responseText,responseXML:g.responseXML,status:g.status,statusText:g.statusText,responseBody:g.responseBody});}else{g.argument.callback.failure.call(this,{data:null,fault:g.argument.obj.getFault(),argument:g.argument.callback.argument,responseText:g.responseText,responseXML:g.responseXML,status:g.status,statusText:g.statusText,responseBody:g.responseBody});}},failure:function(h){var g=null;try{Denbel.rpc.XmlRpcClient.lastResponse=h.responseText;g=Denbel.rpc.XmlRpcClient.parseResponse(h.responseXML);}catch(f){g=null;}h.argument.callback.failure.call(this,{data:g,fault:h.argument.obj.getFault(),status:h.status,statusText:h.statusText,argument:h.argument.callback.argument,responseText:h.responseText,responseXML:h.responseXML,status:h.status,statusText:h.statusText,responseBody:h.responseBody});},argument:{obj:this,callback:d}},b);},isInProgress:function(){if(this.connectionObject){return YAHOO.util.Connect.isCallInProgress(this.connectionObject);}return false;},abort:function(b,a){if(this.connectionObject){if(!a){a=false;}if(!b){b={success:function(c){},failure:function(c){},argument:null};}return YAHOO.util.Connect.abort(this.connectionObject,b,a);}return false;},setHeader:function(a,c,b){YAHOO.util.Connect.initHeader(a,c,b);},getISO8601DateString:function(b){if(!b){return null;}var f=b.getFullYear()+"-";var c=(b.getMonth()+1).toString();if(c.length<2){c="0"+c;}f+=c+"-";c=b.getDate().toString();if(c.length<2){c="0"+c;}f+=c+"T";c=b.getHours().toString();if(c.length<2){c="0"+c;}f+=c+":";c=b.getMinutes().toString();if(c.length<2){c="0"+c;}f+=c+":";c=b.getSeconds().toString();if(c.length<2){c="0"+c;}f+=c;c=b.getTimezoneOffset();var e=-(c/60);var a=parseInt(e);var d=((e-a)*60).toString();a=a.toString();if(a.substring(0,1)=="-"){if(a.length<3){a="-0"+a;}}else{if(a.substring(0,1)=="+"){if(a.length<3){a="+0"+a;}}else{if(a.length<2){a="+0"+a;}}}if(d.length<2){d="0"+d;}f+=a+":"+d;return f;},toString:function(){return"Denbel.rpc.XmlRpcClient";}});Denbel.rpc.XmlRpcMessage=function(a){Denbel.rpc.XmlRpcMessage.superclass.constructor.call(this);this.value=a;};YAHOO.extend(Denbel.rpc.XmlRpcMessage,Denbel.rpc.ProtocolMessage,{setMethod:function(a){this.value=a;},createAndAddParameter:function(b,a){if(!a){a=false;}var c=new Denbel.rpc.XmlRpcParameter(b,null,a);return this.addParameter(c);},addForm:function(b){if(YAHOO.lang.isString(b)){b=YAHOO.util.Dom.get(b);}if(!b){throw Error("No form");return null;}if(!YAHOO.lang.isFunction(YAHOO.lang.JSON.parse)){throw Error("JSON is missing");return null;}var d=null;var m=null;var k=null;var l=null;var h=null;var c=null;var a=-1;var f="{";var e=null;for(var g=0;g<b.elements.length;g++){c=b.elements[g];l=c.tagName.toLowerCase();h=c.getAttribute("type");if(l!="input"&&l!="select"&&l!="textarea"){continue;}if(l=="input"){if(h=="file"){YAHOO.log("file uploads are not supported with XML-RPC","error","Denbel.rpc.XmlRpcClient");continue;}}if(l=="input"&&(h=="button"||h=="submit"||h=="image")){continue;}d=c.name;if(!d||d==null||d==""){continue;}if(h=="checkbox"||h=="radio"){if(c.checked){k=c.value;}else{continue;}}else{k=c.value;}if(k.indexOf("\n")>-1||YAHOO.util.Dom.hasClass(c,"base64")){k="__BASE64__"+Denbel.core.Base64.encode(k)+"__BASE64__";}if(f.length>1){f+=",";}f+='"'+d+'":"'+k+'"';}f+="}";e=new Denbel.rpc.XmlRpcParameter(YAHOO.lang.JSON.parse(f));this.addParameter(e);},getMethod:function(){return this.value;},toString:function(){return"Denbel.rpc.XmlRpcMessage";}});Denbel.rpc.XmlRpcParameter=function(c,b,a){Denbel.rpc.XmlRpcParameter.superclass.constructor.call(this,b,c);if(!a){a=false;}if(YAHOO.lang.isString(c)){if(c.startsWith("__BASE64__")&&c.endsWith("__BASE64__")){a=true;c=c.replace("__BASE64__","");c=c.replace("__BASE64__","");}}this.value=c;this.base64=a;};YAHOO.extend(Denbel.rpc.XmlRpcParameter,Denbel.rpc.ProtocolParameter,{base64:false,getType:function(){return Denbel.rpc.XmlRpcClient.getValueType(this.value);},isBase64:function(){return this.base64;},toString:function(){return"Denbel.rpc.XmlRpcParameter";}});
