| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 | 
							- /*
 
- 	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
 
- */
 
- if(!dojo._hasResource["dojox.wire.ml.Invocation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 
- dojo._hasResource["dojox.wire.ml.Invocation"] = true;
 
- dojo.provide("dojox.wire.ml.Invocation");
 
- dojo.require("dojox.wire.ml.Action");
 
- dojo.declare("dojox.wire.ml.Invocation", dojox.wire.ml.Action, {
 
- 	//	summary:
 
- 	//		A widget to invoke a method or publish a topic
 
- 	//	description:
 
- 	//		This widget represents a controller task to invoke a method or
 
- 	//		publish a topic when an event (a function) or a topic is issued.
 
- 	//	object:
 
- 	//		A scope of a method to invoke
 
- 	//	method:
 
- 	//		A name of a method to invoke
 
- 	//	topic:
 
- 	//		A name of a topic to publish
 
- 	//	parameters:
 
- 	//		Arguments for the method or the topic
 
- 	//	result:
 
- 	//		A property to store a return value of the method call
 
- 	//	error:
 
- 	//		A property to store an error on the method call
 
- 	object: "",
 
- 	method: "",
 
- 	topic: "",
 
- 	parameters: "",
 
- 	result: "",
 
- 	error: "",
 
- 	_run: function(){
 
- 		//	summary:
 
- 		//		Invoke a method or publish a topic
 
- 		//	description:
 
- 		//		If 'topic' is specified, the topic is published with arguments
 
- 		//		specified to 'parameters'.
 
- 		//		If 'method' and 'object' are specified, the method is invoked
 
- 		//		with arguments specified to 'parameters' and set the return
 
- 		//		value to a property specified to 'result'.
 
- 		//		'object', 'parameters' and 'result' can specify properties of
 
- 		//		a widget or an DOM element with the dotted notation.
 
- 		//		If 'parameters' are omitted, the arguments to this method are
 
- 		//		passed as is.
 
- 		if(this.topic){
 
- 			var args = this._getParameters(arguments);
 
- 			try{
 
- 				dojo.publish(this.topic, args);
 
- 				this.onComplete();
 
- 			}catch(e){
 
- 				this.onError(e);
 
- 			}
 
- 		}else if(this.method){
 
- 			var scope = (this.object ? dojox.wire.ml._getValue(this.object) : dojo.global);
 
- 			if(!scope){
 
- 				return; //undefined
 
- 			}
 
- 			var args = this._getParameters(arguments);
 
- 			var func = scope[this.method];
 
- 			if(!func){
 
- 				func = scope.callMethod;
 
- 				if(!func){
 
- 					return; //undefined
 
- 				}
 
- 				args = [this.method, args];
 
- 			}
 
- 			try{
 
- 				var connected = false;
 
- 				if(scope.getFeatures){
 
- 					var features = scope.getFeatures();
 
- 					if((this.method == "fetch" && features["dojo.data.api.Read"]) ||
 
- 						(this.method == "save" && features["dojo.data.api.Write"])){
 
- 						var arg = args[0];
 
- 						if(!arg.onComplete){
 
- 							arg.onComplete = function(){};
 
- 						}
 
- 						//dojo.connect(arg, "onComplete", this, "onComplete");
 
- 						this.connect(arg, "onComplete", "onComplete");
 
- 						if(!arg.onError){
 
- 							arg.onError = function(){};
 
- 						}
 
- 						//dojo.connect(arg, "onError", this, "onError");
 
- 						this.connect(arg, "onError", "onError");
 
- 						connected = true;
 
- 					}
 
- 				}
 
- 				var r = func.apply(scope, args);
 
- 				if(!connected){
 
- 					if(r && (r instanceof dojo.Deferred)){
 
- 						var self = this;
 
- 						r.addCallbacks(
 
- 							function(result){self.onComplete(result);},
 
- 							function(error){self.onError(error);}
 
- 						);
 
- 					}else{
 
- 						this.onComplete(r);
 
- 					}
 
- 				}
 
- 			}catch(e){
 
- 				this.onError(e);
 
- 			}
 
- 		}
 
- 	},
 
- 	onComplete: function(/*anything*/result){
 
- 		//	summary:
 
- 		//		A function called when the method or the topic publish
 
- 		//		completed
 
- 		//	description:
 
- 		//		If 'result' attribute is specified, the result object also set
 
- 		//		to the specified property.
 
- 		//	result:
 
- 		//		The return value of a method or undefined for a topic
 
- 		if(this.result){
 
- 			dojox.wire.ml._setValue(this.result, result);
 
- 		}
 
- 		if(this.error){ // clear error
 
- 			dojox.wire.ml._setValue(this.error, "");
 
- 		}
 
- 	},
 
- 	onError: function(/*anything*/error){
 
- 		//	summary:
 
- 		//		A function called on an error occurs
 
- 		//	description:
 
- 		//		If 'error' attribute is specified, the error object also set to
 
- 		//		the specified property.
 
- 		//	error:
 
- 		//		The exception or error occurred
 
- 		if(this.error){
 
- 			if(error && error.message){
 
- 				error = error.message;
 
- 			}
 
- 			dojox.wire.ml._setValue(this.error, error);
 
- 		}
 
- 	},
 
- 	_getParameters: function(/*Array*/args){
 
- 		//	summary:
 
- 		//		Returns arguments to a method or topic to invoke
 
- 		//	description:
 
- 		//		This method retunrs an array of arguments specified by
 
- 		//		'parameters' attribute, a comma-separated list of IDs and
 
- 		//		their properties in a dotted notation.
 
- 		//		If 'parameters' are omitted, the original arguments are
 
- 		//		used.
 
- 		//	args:
 
- 		//		Arguments to a trigger event or topic
 
- 		if(!this.parameters){
 
- 		 	// use arguments as is
 
- 			return args; //Array
 
- 		}
 
- 		var parameters = [];
 
- 		var list = this.parameters.split(",");
 
- 		if(list.length == 1){
 
- 			var parameter = dojox.wire.ml._getValue(dojo.trim(list[0]), args);
 
- 			if(dojo.isArray(parameter)){
 
- 				parameters = parameter;
 
- 			}else{
 
- 				parameters.push(parameter);
 
- 			}
 
- 		}else{
 
- 			for(var i in list){
 
- 				parameters.push(dojox.wire.ml._getValue(dojo.trim(list[i]), args));
 
- 			}
 
- 		}
 
- 		return parameters; //Array
 
- 	}
 
- });
 
- }
 
 
  |