function xmlrpc_2_js_type(a){switch(a.toLowerCase()){case"base64":case"string":return"string";case"datetime.iso8601":return"Date";case"int":case"i4":return"integer";case"struct":return"object";case"array":return"array";case"double":return"number";case"undefined":return"mixed";case"boolean":case"null":default:return a.toLowerCase()}}function wrap_xmlrpc_method(client,methodname,extra_options){if(extra_options===undefined){extra_options={}}var signum=extra_options.signum!=undefined?parseInt(extra_options.signum):0;var timeout=extra_options.timeout!=undefined?parseInt(extra_options.timeout):0;var protocol=extra_options.protocol!=undefined?extra_options.protocol:"";var newfuncname=extra_options.new_function_name!=undefined?extra_options.new_function_name:"";var encode_js_objects=extra_options.encode_js_objs!=undefined?Boolean(extra_options.encode_js_objs):false;var decode_js_objects=extra_options.decode_js_objs!=undefined?Boolean(extra_options.decode_js_objs):false;var simple_client_copy=extra_options.simple_client_copy!=undefined?parseInt(extra_options.simple_client_copy):0;var buildit=extra_options.return_source!=undefined?!(extra_options.return_source):true;var prefix=extra_options.prefix!=undefined?extra_options.prefix:"xmlrpc";if(extra_options.return_on_fault!=undefined){var decode_fault=true;var fault_response=extra_options.return_on_fault}else{var decode_fault=false;var fault_response=""}var debug=extra_options.debug!=undefined?(extra_options.debug):0;var msgclass=prefix+"msg";var valclass=prefix+"val";var decodefunc=prefix+"_decode";var msg=new this[msgclass]("system.methodSignature");msg.addParam(new this[valclass](methodname));client.setDebug(debug);var response=client.send(msg,timeout,protocol);if(response.faultCode()){xmlrpc_error_log("XML-RPC: could not retrieve method signature from remote server for method "+methodname);return false}else{var msig=response.value();if(client.return_type!="jsvals"){msig=this[decodefunc](msig)}if(!(msig instanceof Array)||msig.length<=signum){xmlrpc_error_log("XML-RPC: could not retrieve method signature nr."+signum+" from remote server for method "+methodname);return false}else{var msig=msig[signum];var mdesc="";if(buildit){var xmlrpcfuncname=""}else{if(newfuncname!=""){var xmlrpcfuncname=newfuncname}else{var xmlrpcfuncname=prefix+"_"+methodname.replace(/\./g,"_").replace(/[^a-zA-Z0-9_\x7f-\xff]/g,"")}msg=new this[msgclass]("system.methodHelp");msg.addParam(new this[valclass](methodname));response=client.send(msg,timeout,protocol);if(!response.faultCode()){mdesc=response.value();if(client.return_type!="jsvals"){mdesc=mdesc.scalarVal()}}}var results=build_remote_method_wrapper_code(client,methodname,xmlrpcfuncname,msig,mdesc,timeout,protocol,simple_client_copy,prefix,decode_js_objects,encode_js_objects,decode_fault,fault_response);if(buildit){var func=false;eval("func = "+results.source);if(func){return func}else{xmlrpc_error_log("XML-RPC: could not create function "+xmlrpcfuncname+" to wrap remote method "+methodname);return false}}else{results["function"]=xmlrpcfuncname;return results}}}}function wrap_xmlrpc_server(client,extra_options){if(extra_options===undefined){extra_options={}}var methodfilter=extra_options.method_filter!==undefined?extra_options.method_filter:"";var signum=extra_options.signum!==undefined?parseInt(extra_options.signum):0;var timeout=extra_options.timeout!==undefined?parseInt(extra_options.timeout):0;var protocol=extra_options.protocol!==undefined?extra_options.protocol:"";var newclassname=extra_options.new_class_name!==undefined?extra_options.new_class_name:"";var encode_js_objects=extra_options.encode_js_objs!==undefined?Boolean(extra_options.encode_js_objs):false;var decode_js_objects=extra_options.decode_js_objs!==undefined?Boolena(extra_options.decode_js_objs):false;var verbatim_client_copy=extra_options.simple_client_copy!==undefined?!Boolean(extra_options.simple_client_copy):true;var buildit=extra_options.return_source!==undefined?!Boolean(extra_options.return_source):true;var prefix=extra_options.prefix!==undefined?extra_options.prefix:"xmlrpc";var msgclass=prefix+"msg";var decodefunc=prefix+"_decode";var msg=new this[msgclass]("system.listMethods");var response=client.send(msg,timeout,protocol);if(response.faultCode()){xmlrpc_error_log("XML-RPC: could not retrieve method list from remote server");return false}else{var mlist=response.value();if(client.return_type!="jsvals"){mlist=this[decodefunc](mlist)}if(!(mlist instanceof Array)||!mlist.length){xmlrpc_error_log("XML-RPC: could not retrieve meaningful method list from remote server");return false}else{if(newclassname!=""){var xmlrpcclassname=newclassname}else{var xmlrpcclassname=prefix+"_"+client.server.replace(/\./g,"_").replace(/[^a-zA-Z0-9_\x7f-\xff]/g,"")+"_client"}var source="function "+xmlrpcclassname+"()\n{\nvar client;\n\n";source+=build_client_wrapper_code(client,verbatim_client_copy,prefix);source+="this.client = client;\n\n";var opts={simple_client_copy:2,return_source:true,timeout:timeout,protocol:protocol,encode_js_objs:encode_js_objects,prefix:prefix,decode_js_objs:decode_js_objects};for(var i=0;i<mlist.length;i++){var mname=mlist[i];if(methodfilter==""||mname.search(methodfilter)!=-1){var new_function_name=mname.replace(/\./,"_").replace(/[^a-zA-Z0-9_\x7f-\xff]/,"");opts.new_function_name=" ";var methodwrap=wrap_xmlrpc_method(client,mname,opts);if(methodwrap){if(!buildit){source+=methodwrap.docstring}source+="this."+new_function_name+" = "+methodwrap.source+"\n"}else{xmlrpc_error_log("XML-RPC: will not create class method to wrap remote method "+mname)}}}source+="}\n";if(buildit){var func=false;eval("func = "+source);if(func){return func}else{xmlrpc_error_log("XML-RPC: could not create class "+xmlrpcclassname+" to wrap remote server "+client.server);return false}}else{return{"class":xmlrpcclassname,code:source,docstring:""}}}}}function build_remote_method_wrapper_code(f,e,h,j,d,k,m,t,q,o,b,l,s){var a="function "+h+" (";if(t<2){var n=build_client_wrapper_code(f,t,q);n+="if (debug !== undefined) client.setDebug(debug);\n";var g=""}else{var n="";var g="this."}n+="var msg = new "+q+"msg('"+e+"');\n";if(d!=""){d="/**\n* "+d.replace(/\*\//g,"* /")+"\n"}else{d="/**\nFunction "+h+"\n"}var u=[];var c=j.length;for(var r=1;r<c;++r){u[r-1]="p"+r;ptype=j[r];if(ptype=="i4"||ptype=="int"||ptype=="boolean"||ptype=="double"||ptype=="string"||ptype=="base64"||ptype=="null"){n+="var p"+r+" = new "+q+"val(p"+r+", '"+ptype+"');\n"}else{if(b){n+="var p"+r+" = "+q+"_encode(p"+r+", {'encode_js_objs': true};\n"}else{n+="var p"+r+" = "+q+"_encode(p"+r+");\n"}}n+="msg.addParam(p"+r+");\n";d+="* @param "+xmlrpc_2_js_type(ptype)+" p"+r+"\n"}if(t<2){u[r-1]="debug";d+="* @param int debug when 1 (or 2) will enable debugging of the underlying "+q+" call (defaults to 0)\n"}u=u.join(", ");d+="* @return "+xmlrpc_2_js_type(j[0])+" (or an "+q+"resp obj instance if call fails)\n*/\n";n+="var res = "+g+"client.send(msg, "+k+", '"+m+"');\n";if(l){if(typeof(s)=="string"&&(s.indexOf("%faultCode%")!=-1||s.indexOf("%faultString%")!=-1)){var p="'"+s.replace(/'/g,"''").replace(/\%faultCode\%/g,"' + res.faultCode() + '").replace(/\%faultString\%/g,"' + res.faultString() + '")+"'"}else{var p=var_export(s,true)}}else{var p="res"}if(o){n+="if (res.faultCode()) return "+p+"; else return "+q+"_decode(res.value(), {'decode_js_objs': true});"}else{n+="if (res.faultCode()) return "+p+"; else return "+q+"_decode(res.value());"}a=a+u+") {\n"+n+"\n}\n";return{source:a,docstring:d}}function build_client_wrapper_code(b,a,e){var d="client = new "+e+"_client('"+b.path.replace(/'/g,"'")+"', '"+b.server.replace(/'/g,"'")+"', "+b.port+");\n";if(a){for(var c in b){if(c!="debug"&&c!="return_type"&&typeof b[c]!="function"){val=var_export(b[c],true);d+="client."+c+" = "+val+";\n"}}d+="client.return_type = '"+e+"vals';\n"}return d};
