/*
	Copyright (c) 2004-2012, 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
*/

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