/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.rpc.RpcService"]){
dojo._hasResource["dojo.rpc.RpcService"]=true;
dojo.provide("dojo.rpc.RpcService");
dojo.declare("dojo.rpc.RpcService",null,{constructor:function(_1){
if(_1){
if((dojo.isString(_1))||(_1 instanceof dojo._Url)){
if(_1 instanceof dojo._Url){
var _2=_1+"";
}else{
_2=_1;
}
var _3=dojo.xhrGet({url:_2,handleAs:"json-comment-optional",sync:true});
_3.addCallback(this,"processSmd");
_3.addErrback(function(){
throw new Error("Unable to load SMD from "+_1);
});
}else{
if(_1.smdStr){
this.processSmd(dojo.eval("("+_1.smdStr+")"));
}else{
if(_1.serviceUrl){
this.serviceUrl=_1.serviceUrl;
}
this.timeout=_1.timeout||3000;
if("strictArgChecks" in _1){
this.strictArgChecks=_1.strictArgChecks;
}
this.processSmd(_1);
}
}
}
},strictArgChecks:true,serviceUrl:"",parseResults:function(_4){
return _4;
},errorCallback:function(_5){
return function(_6){
_5.errback(_6.message);
};
},resultCallback:function(_7){
var tf=dojo.hitch(this,function(_9){
if(_9.error!=null){
var _a;
if(typeof _9.error=="object"){
_a=new Error(_9.error.message);
_a.code=_9.error.code;
_a.error=_9.error.error;
}else{
_a=new Error(_9.error);
}
_a.id=_9.id;
_a.errorObject=_9;
_7.errback(_a);
}else{
_7.callback(this.parseResults(_9));
}
});
return tf;
},generateMethod:function(_b,_c,_d){
return dojo.hitch(this,function(){
var _e=new dojo.Deferred();
if((this.strictArgChecks)&&(_c!=null)&&(arguments.length!=_c.length)){
throw new Error("Invalid number of parameters for remote method.");
}else{
this.bind(_b,dojo._toArray(arguments),_e,_d);
}
return _e;
});
},processSmd:function(_f){
if(_f.methods){
dojo.forEach(_f.methods,function(m){
if(m&&m.name){
this[m.name]=this.generateMethod(m.name,m.parameters,m.url||m.serviceUrl||m.serviceURL);
if(!dojo.isFunction(this[m.name])){
throw new Error("RpcService: Failed to create"+m.name+"()");
}
}
},this);
}
this.serviceUrl=_f.serviceUrl||_f.serviceURL;
this.required=_f.required;
this.smd=_f;
}});
}