if((this["before"])&&(this.before.length>0)){  dojo.lang.forEach(this.before.concat(new Array()), unRollSquelch); } 
	run: function(){		// summary:		//		execute the connection represented by this join point. The		//		arguments passed to run() will be passed to the function and		//		its listeners.		var obj = this.object||dj_global;		var args = arguments;		// optimization. We only compute once the array version of the arguments		// pseudo-arr in order to prevent building it each time advice is unrolled.		var aargs = [];		for(var x=0; x<args.length; x++){			aargs[x] = args[x];		}		var unrollAdvice  = function(marr){ 			if(!marr){				dojo.debug("Null argument to unrollAdvice()");				return;			}		  			var callObj = marr[0]||dj_global;			var callFunc = marr[1];						if(!callObj[callFunc]){				dojo.raise("function \"" + callFunc + "\" does not exist on \"" + callObj + "\"");			}						var aroundObj = marr[2]||dj_global;			var aroundFunc = marr[3];			var msg = marr[6];			var maxCount = marr[7];			if(maxCount > -1){				if(maxCount == 0){					return;				}				marr[7]--;			}			var undef;			var to = {				args: [],				jp_: this,				object: obj,				proceed: function(){					return callObj[callFunc].apply(callObj, to.args);				}			};			to.args = aargs;			var delay = parseInt(marr[4]);			var hasDelay = ((!isNaN(delay))&&(marr[4]!==null)&&(typeof marr[4] != "undefined"));			if(marr[5]){				var rate = parseInt(marr[5]);				var cur = new Date();				var timerSet = false;				if((marr["last"])&&((cur-marr.last)<=rate)){					if(dojo.event._canTimeout){						if(marr["delayTimer"]){							clearTimeout(marr.delayTimer);						}						var tod = parseInt(rate*2); // is rate*2 naive?						var mcpy = dojo.lang.shallowCopy(marr);						marr.delayTimer = setTimeout(function(){							// FIXME: on IE at least, event objects from the							// browser can go out of scope. How (or should?) we							// deal with it?							mcpy[5] = 0;							unrollAdvice(mcpy);						}, tod);					}					return;				}else{					marr.last = cur;				}			}			// FIXME: need to enforce rates for a connection here!			if(aroundFunc){				// NOTE: around advice can't delay since we might otherwise depend				// on execution order!				aroundObj[aroundFunc].call(aroundObj, to);			}else{				// var tmjp = dojo.event.MethodJoinPoint.getForMethod(obj, methname);				if((hasDelay)&&((dojo.render.html)||(dojo.render.svg))){  // FIXME: the render checks are grotty!					dj_global["setTimeout"](function(){						if(msg){							callObj[callFunc].call(callObj, to); 						}else{							callObj[callFunc].apply(callObj, args); 						}					}, delay);				}else{ // many environments can't support delay!					if(msg){						callObj[callFunc].call(callObj, to); 					}else{						callObj[callFunc].apply(callObj, args); 					}				}			}		};		var unRollSquelch = function(){			if(this.squelch){				try{					return unrollAdvice.apply(this, arguments);				}catch(e){ 					dojo.debug(e);				}			}else{				return unrollAdvice.apply(this, arguments);			}		};		if((this["before"])&&(this.before.length>0)){			// pass a cloned array, if this event disconnects this event forEach on this.before wont work			dojo.lang.forEach(this.before.concat(new Array()), unRollSquelch);		}		var result;		try{			if((this["around"])&&(this.around.length>0)){				var mi = new dojo.event.MethodInvocation(this, obj, args);				result = mi.proceed();			}else if(this.methodfunc){				result = this.object[this.methodname].apply(this.object, args);			}		}catch(e){ 			if(!this.squelch){ 				dojo.debug(e,"when calling",this.methodname,"on",this.object,"with arguments",args);				dojo.raise(e);			} 		}		if((this["after"])&&(this.after.length>0)){			// see comment on this.before above			dojo.lang.forEach(this.after.concat(new Array()), unRollSquelch);		}		return (this.methodfunc) ? result : null;	},
6315	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/6315/2f1d2cb699c9d9329e8b782b0463156e211cb0f6/struts_dojo.js.uncompressed.js/buggy/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js.uncompressed.js