		t._parseConfiguration=function(o,v,s,p,x,b){
			/*
				o = (validated) engine object
				v = (validated) task object
				s = page config name
				p = parent node
				x = object instance
				b = return value of parent impl
		
				cs = current config name
				p = page config node
				a = array of nodes
				h = iterator
				i = iterator
				n = node
						
				q = node query
						
				d = def node
						
				r = tmp val
				m = tmp val
				w = tmp val
				u = tmp val
				g = tmp val
				j = tmp val
				k = tmp val
				y = tmp node
				z = tmp nodeset
				f = tmp val
				c = tmp val
				e = tmp val
				l = tmp val
						
				nl = node length
						
				br = block recursion
						
				cx = context switch
				cxn = context switch type (object_ref probably)
				cxp = context switch path as an xpath, probably
						
				ck = context parent; the output html node is the outbound parent node.  This is used when importing data into self referenced configurations
				cn = context swap name, used with ck
										
				ab = abstract implementation
						
				sf = bool: is self
				ci = cached implementation
		
			*/
					
					
			var start_parse = new Date().getTime();
					
		
			var a,i,n,q,d,r,m,u,g,j,y,z,f,b,c,h,k,l,e=0,w,br,cx,cxv,cxp,ab,nr,sf=0,ck,nl,ci;
					
			/* self must have an engine_element, and that becomes the default parent */
			if(s == "self" && typeof p==DATATYPES.TYPE_UNDEFINED) p = o.engine_element;
			else if(typeof p==DATATYPES.TYPE_UNDEFINED)
				p = _x.queryNode(v.data.documentElement,"configuration",0,"id",s);/*_x.selectSingleNode(v.data,"configuration[@id = '" + s + "']",v.data.documentElement);*/
		
			if(p){
				a = p.childNodes;
				nl = a.length;
				for(i=0;i<nl;i++){
					n = a[i];
					br = 1;
		
					/* g = package name for implementation */
					/* k = bit used to specify whether the constructor is on the parent; eg: as with menuitems and resultitems */
					/* j = params array used when applying a constructor */
		
					d = ci = k = g = ab = cx = ck = 0;
					j = [];
					cs = s;
							
					if(s == "self") sf = 1;
		
					if(n.nodeType == 1){
						/*
						 * 2004/07/02
						 * Make sure to cast the node name to lower case
						 */
						q = n.nodeName.toLowerCase();
								
						/*
						 * 2004/07/20
						 * Cache experiment to try to improve performance on IE
						 * 
						 */
								
						w = o.engine_implementations[q];
						if(w){
		
							k = w.p;
							cx = w.cs;
							cxp = w.cp;
							z = w.z;
							ab = w.ab;
							br = w.nr;
							sf = w.sf;
							ck = w.ck;
							g = w.g;
							f = w.f;
							/*j = w.j;*/
							y = w.y;
							cn = w.cn;
							ci = 1;
		
									
							_m.sendMessage("Process cached implementation for " + q,"200.1");
									
						}
						else d = t.getObjectDefinition(v.data,q);/*_x.selectSingleNode(v.data,"object-definitions/definition[@id = '" + q + "' or matdef[@rid = '" + q + "']]",v.data.documentElement);*/
						if(d){
							/* y = implementation node; re-used throughout statement */
							y = d.getElementsByTagName("implementation");/*_x.selectSingleNode(v.data,"implementation",d);*/
							if(y.length) y = y[0];
							else y = 0;
									
							/* process implementation for element */
		
							if(y){
		
										
								_m.sendMessage("Process implementation for " + q,"200.1");
										
		
								z = y.getElementsByTagName("package");/*_x.selectSingleNode(v.data,"package",y);*/
								if(z.length) z = z[0];
								else z = 0;
										
								k = (y.getAttribute("use-parent")=="1"?1:0);
								cx = (y.getAttribute("context-switch") == "1"?1:0);
								cxp = y.getAttribute("context-path");
								cn = y.getAttribute("swap-name");
		
								ab = (y.getAttribute("abstract")=="1"?1:0);
								br = (y.getAttribute("no-recursion")=="1"?0:1);
		
								/* if this is a self reference, and the context switched, then push config reference to switchedself */
								if(cx && cs == "self"){
									/*cs = "switchedself";*/
		
											
									_m.sendMessage("Switched off 'self' for context change in " + q,"200.1");
											
									sf = 0;
									ck = 1;
								}
		
								if(cxp) cxp = t._parseORAParam(o,v,cxp,n,x,b,p,cs);
		
		
		
		
								if(z && (u = z.getAttribute("pid")) && ValidatePackage(u)){
									g = GetPackage(u);
											
									if(g && (u = z.getAttribute("mid")) ){
										if(typeof g[u] == DATATYPES.TYPE_FUNCTION) g = g[u](t._parseORAParam(o,v,z.getAttribute("midparam"),n,x,b,p,cs));
									}
											
								}
										
								w = {};
								w.p = k;
								w.cs = cx;
								w.cp = cxp;
								w.z = z;
								w.ab = ab;
								w.nr = br;
								w.sf = sf;
								w.ck = ck;
								w.g = g;
								/*
								// assigned later w.f = f;
								// assigned later w.c
								// assigned later w.z
								w.j = j;
								*/
								w.y = y;
								w.cn = cn;
								o.engine_implementations[q] = w;
										
		
							} /* end if (check_implemention) */
								
						} /* end  check for d */
		
						if(d || ci){
									
							if(ci){
								y = w.c;
							}
							else{
									
							y = y.getElementsByTagName("constructor");/*_x.selectSingleNode(v.data,"constructor[@name]",y);*/
							if(y.length) y = y[0];
							else y = 0;
									
							w.c = y;
							}
									
									
							/*
							 * 2004/07/21
							 * Don't cache the params because they include object
							 * references - everything would wind up being applied to
							 * the same object
							 */
									
							if(y){
								/*f = y.getAttribute("name");*/
										
								if(!ci){
										
		
									f = t._parseORAParam(o,v,y.getAttribute("name"),n,x,b,p,cs);
											
									z = y.getElementsByTagName("param");/*_x.selectNodes(v.data,"param",y);*/
										
									/*o.engine_implementations[q].f = f;*/
									w.f = f;
									w.z = z;
		
								}
								else
									z = w.z;
												
										
										
		
										
								w = z.length;
		
								for(h = 0; h < w;){
									m = z[h++];
									u = 0;
									if(m.getAttribute("value")){
										r = m.getAttribute("value");
										if(r.match(/^ora:/i))
											u = t._parseORAParam(o,v,r,n,x,b,p,cs);
										else
											u = r;
												
									}
									j[j.length]=u;
								}
							} /* end if (check_constructor) */
									
							/*
								g is a package
							*/
							nr = n.getAttribute("aid");
							nr = (typeof nr == DATATYPES.TYPE_STRING && nr.length ? nr : 0);
									
							if(nr)
								n.setAttribute("id",nr + (++t.object_config.status.engine_autoid_counter));
									
									
							try{
								if(!ab){
									if(typeof g==DATATYPES.TYPE_OBJECT && g != null && typeof g[f] == DATATYPES.TYPE_FUNCTION){
		
												
										/*_m.sendMessage("apply #1 " + f,"200.1");*/
												
		
										w = g[f].apply(0,j);
									}
									else if(k && typeof x[f] == DATATYPES.TYPE_FUNCTION){
		
												
										/*_m.sendMessage("apply #2 " + f,"200.1");*/
												
		
										w = x[f].apply(x,j);
									}
									else{
										_m.sendMessage("Unexpected implementation with g=" + g + " and f=" + f,"200.4");
									}
								} /* end if not abstracted */
								else{
									/*
										Abstracted: just push out w to x
									*/ 
									w = x;
								} /* end if abstracted*/
							}
							catch(e){
								alert("Parse Configuration:" + (e.description?e.description:e.message) + " from f = " + f + " and " + x);
							}
							/* if use parent */
							if(k){
								e = w;
								w = x;
							} /* end if use parent*/
									
							/* if use context parent */
							/*
							if(ck){
										
							}
							*/
							/* end if context parent*/
									
							l = o.engine_objects.length;
							/*
								reuse q
							*/
		
									
							q = n.getAttribute("rid");
							q = (typeof q == DATATYPES.TYPE_STRING && q.length ? q : 0);
		
							if(
								w != null
								&& 
								typeof w==DATATYPES.TYPE_OBJECT
								&&
								_j.registry.ObjectRegistry.isRegistered(w)
								&&
								typeof o.engine_object_index[w.object_id] != DATATYPES.TYPE_NUMBER
							){
								o.engine_objects[l] = {object:w,config:cs,rid:q};
								o.engine_object_index[w.object_id] = l;
					
								if(q && typeof o.engine_object_names[q] != DATATYPES.TYPE_NUMBER){
									o.engine_object_names[q] = l;
		
											
									_m.sendMessage("Register component " + n.nodeName + " (" + w.object_id + ") with friendly name " + q,"200.1");
											
		
								}
		
										
								else{
									_m.sendMessage("Register component " + n.nodeName + " (" + w.object_id + ") without friendly name","200.1");
								}
										
		
							}
		
							/*
								A context switch is used for importing xml data, where the return value
								of the object implementation is an XML document, and cxp is null or an xpath.
							*/
									
							/*
							 * 
							 * 2004/07/02
							 * BUG BUG 
							 * For 'ck' implementations, setInnerXHTML can't use custom
							 * elements such as import-xml 
							 */
							if(cx && w){
								if(ck && cn){
									k = document.createElement(cn);
									n.parentNode.appendChild(k);
									if(typeof k.swapNode != DATATYPES.TYPE_UNDEFINED) k.swapNode(n);
									n = k;
								}
								if(!w.documentElement){
											
									_m.sendMessage("setInnerXHTML #1 " + q + " (1)","200.1");
											
									_x.setInnerXHTML(n,w,0,(!ck ? v.data : 0));
											
								}
								else{
									/*
										If a data_path (dp) was used, assume it is for use to replace the context path from the config file.
									*/
									if(o.dp) cxp = o.dp;
		
									/* reuse nr */
					
									nr = (cxp?_x.selectSingleNode(w,cxp,w.documentElement):w.documentElement);
									if(!nr) nr = w.documentElement;
		
											
									_m.sendMessage("setInnerXHTML #2 " + q + " (1)","200.1");
											
		
									_x.setInnerXHTML(n,nr,0,(!ck ? v.data : 0));
		
								}
								/*
									Switch the context back to the parent
								*/
								w = x;
							}
									
							if(br) t._parseConfiguration(o,v,cs,n,w,e);
									
							if(w && w.object_type && w.object_type.match(/^xhtml_component$/)){
								w.post_init();
							}
									
						} /* end check for implementation or cached implementation */
						else{
							/* just copy the whole node */
							if(typeof x == DATATYPES.TYPE_UNDEFINED) x = o;
							if(typeof x == DATATYPES.TYPE_OBJECT && x != null && typeof x.getContainer == DATATYPES.TYPE_FUNCTION){
								if(!sf) _x.setInnerXHTML(x.getContainer(),n,true);
							}
									
							else{
								_m.sendMessage("No object definition for " + n.nodeName + " (1); treating as HTML","200.1");
							}
									
						}
					}
					else if(n.nodeType == 3){
						if(n.nodeValue.replace(/\s/g,"").length && typeof x == DATATYPES.TYPE_OBJECT && typeof x.getContainer == DATATYPES.TYPE_FUNCTION){
							if(!sf) _x.setInnerXHTML(x.getContainer(),n,1);
						}
								
						else{
							_m.sendMessage("No object definition for " + n.nodeName + " (3); treating as HTML","200.1");
						}
								
					}
		
				} /* end for(i;childNodes.length) */
			} /* end (if p) */
			else{
				_m.sendMessage("Page config for " + s + " not found.","200.4");
			}
		
					
			var stop_parse = new Date().getTime();
			_m.sendMessage("_parseConfiguration Parse Time: " + (stop_parse - start_parse) + " for " + nl + " nodes","200.1");
					
		
		};
