context: dojo.parser = new function(){	var d = dojo;	function val2type(/*Object*/ value){		// summary:		//		Returns name of type of given value.		if(d.isString(value)){ return "string"; }		if(typeof value == "number"){ return "number"; }		if(typeof value == "boolean"){ return "boolean"; }		if(d.isFunction(value)){ return "function"; }		if(d.isArray(value)){ return "array"; } // typeof [] == "object"		if(value instanceof Date) { return "date"; } // assume timestamp		if(value instanceof d._Url){ return "url"; }		return "object";	}	function str2obj(/*String*/ value, /*String*/ type){		// summary:		//		Convert given string value to given type		switch(type){			case "string":				return value;			case "number":				return value.length ? Number(value) : NaN;			case "boolean":				// for checked/disabled value might be "" or "checked".  interpret as true.				return typeof value == "boolean" ? value : !(value.toLowerCase()=="false");			case "function":				if(d.isFunction(value)){					// IE gives us a function, even when we say something like onClick="foo"					// (in which case it gives us an invalid function "function(){ foo }"). 					//  Therefore, convert to string					value=value.toString();					value=d.trim(value.substring(value.indexOf('{')+1, value.length-1));				}				try{					if(value.search(/[^\w\.]+/i) != -1){						// TODO: "this" here won't work						value = d.parser._nameAnonFunc(new Function(value), this);					}					return d.getObject(value, false);				}catch(e){ return new Function(); }			case "array":				return value.split(/\s*,\s*/);			case "date":				switch(value){					case "": return new Date("");	// the NaN of dates					case "now": return new Date();	// current date					default: return d.date.stamp.fromISOString(value);				}			case "url":				return d.baseUrl + value;			default:				return d.fromJson(value);		}	}	var instanceClasses = {		// map from fully qualified name (like "dijit.Button") to structure like		// { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }	};		function getClassInfo(/*String*/ className){		// className:		//		fully qualified name (like "dijit.Button")		// returns:		//		structure like		//			{ 		//				cls: dijit.Button, 		//				params: { label: "string", disabled: "boolean"}		//			}		if(!instanceClasses[className]){			// get pointer to widget class			var cls = d.getObject(className);			if(!d.isFunction(cls)){				throw new Error("Could not load class '" + className +					"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");			}			var proto = cls.prototype;				// get table of parameter names & types			var params={};			for(var name in proto){				if(name.charAt(0)=="_"){ continue; } 	// skip internal properties				var defVal = proto[name];				params[name]=val2type(defVal);			}			instanceClasses[className] = { cls: cls, params: params };		}		return instanceClasses[className];	}	this._functionFromScript = function(script){		var preamble = "";		var suffix = "";		var argsStr = script.getAttribute("args");		if(argsStr){			d.forEach(argsStr.split(/\s*,\s*/), function(part, idx){				preamble += "var "+part+" = arguments["+idx+"]; ";			});		}		var withStr = script.getAttribute("with");		if(withStr && withStr.length){			d.forEach(withStr.split(/\s*,\s*/), function(part){				preamble += "with("+part+"){";				suffix += "}";			});		}		return new Function(preamble+script.innerHTML+suffix);	}	this._wireUpMethod = function(instance, script){		var nf = this._functionFromScript(script);		// if there's a destination, connect it to that, otherwise run it now		var source = script.getAttribute("event");		if(source){			var mode = script.getAttribute("type");			if(mode && (mode == "dojo/connect")){				// FIXME: need to implement EL here!!				d.connect(instance, source, null, nf);			}else{ 				// otherwise we assume it's type "dojo/method", and therefore a				// replacement				instance[source] = nf;			}		}else{			nf.call(instance);		}	}	this.instantiate = function(nodes){		// summary:		//		Takes array of nodes, and turns them into class instances and		//		potentially calls a layout method to allow them to connect with		//		any children				var thelist = [];		d.forEach(nodes, function(node){			if(!node){ return; }			var type = node.getAttribute("dojoType");			if((!type)||(!type.length)){ return; }			var clsInfo = getClassInfo(type);			var clazz = clsInfo.cls;			var ps = clazz._noScript||clazz.prototype._noScript;			// read parameters (ie, attributes).			// clsInfo.params lists expected params like {"checked": "boolean", "n": "number"}			var params = {};			var attributes = node.attributes;			for(var name in clsInfo.params){				var item = attributes.getNamedItem(name);				if(!item || (!item.specified && (!dojo.isIE || name.toLowerCase()!="value"))){ continue; }				var _type = clsInfo.params[name];				params[name] = str2obj(item.value, _type);			}			// FIXME (perf): making two iterations of the DOM to find the			// <script> elements feels dirty. Still need a separate iteration			// if we do it another way, though, so we should probably benchmark			// the various approaches at some point.			if(!ps){				// preambles are magic. Handle it.				var preambles = d.query("> script[type='dojo/method'][event='preamble']", node).orphan();				if(preambles.length){					// we only support one preamble. So be it.					params.preamble = d.parser._functionFromScript(preambles[0]);				}				// grab the rest of the scripts for processing later				var scripts = d.query("> script[type^='dojo/']", node).orphan();			}			var markupFactory = clazz["markupFactory"];			if(!markupFactory && clazz["prototype"]){				markupFactory = clazz.prototype["markupFactory"];			}			// create the instance			var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node);			thelist.push(instance);			// map it to the JS namespace if that makes sense			var jsname = node.getAttribute("jsId");			if(jsname){				d.setObject(jsname, instance);			}			// check to see if we need to hook up events for non-declare()-built classes			if(!ps){				scripts.forEach(function(script){					d.parser._wireUpMethod(instance, script);				});			}		});		// Call startup on each top level instance if it makes sense (as for		// widgets).  Parent widgets will recursively call startup on their		// (non-top level) children		d.forEach(thelist, function(instance){			if(	instance  && 				(instance.startup) && 				((!instance.getParent) || (!instance.getParent()))			){				instance.startup();			}		});		return thelist;	};	this.parse = function(/*DomNode?*/ rootNode){		// summary:		//		Search specified node (or root node) recursively for class instances,		//		and instantiate them Searches for		//		dojoType="qualified.class.name"		var list = d.query('[dojoType]', rootNode);		// go build the object instances		var instances = this.instantiate(list);				// FIXME: clean up any dangling scripts that we may need to run		/*		var scripts = d.query("script[type='dojo/method']", rootNode).orphan();		scripts.forEach(function(script){			wireUpMethod(instance, script);		});		*/		return instances;	};}();
meta: 4497	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/4497/eaacea0d713d5f899684c54f4e26800e56e9a77f/parser.js/clean/parser.js