You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/03/22 17:05:00 UTC

[08/54] [partial] camel git commit: CAMEL-7263: Remove not maintained and deprecated camel-web module.

http://git-wip-us.apache.org/repos/asf/camel/blob/9f5e32db/components/camel-web/src/main/webapp/js/dojox/grid/DataGrid.js.uncompressed.js
----------------------------------------------------------------------
diff --git a/components/camel-web/src/main/webapp/js/dojox/grid/DataGrid.js.uncompressed.js b/components/camel-web/src/main/webapp/js/dojox/grid/DataGrid.js.uncompressed.js
deleted file mode 100644
index a76bfef..0000000
--- a/components/camel-web/src/main/webapp/js/dojox/grid/DataGrid.js.uncompressed.js
+++ /dev/null
@@ -1,9545 +0,0 @@
-/*
-	Copyright (c) 2004-2009, 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
-*/
-
-/*
-	This is a compiled version of Dojo, built for deployment and not for
-	development. To get an editable version, please visit:
-
-		http://dojotoolkit.org
-
-	for documentation and information on getting the source.
-*/
-
-if(!dojo._hasResource["dijit._KeyNavContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._KeyNavContainer"] = true;
-dojo.provide("dijit._KeyNavContainer");
-
-
-dojo.declare("dijit._KeyNavContainer",
-	[dijit._Container],
-	{
-
-		// summary:
-		//		A _Container with keyboard navigation of its children.
-		// description:
-		//		To use this mixin, call connectKeyNavHandlers() in
-		//		postCreate() and call startupKeyNavChildren() in startup().
-		//		It provides normalized keyboard and focusing code for Container
-		//		widgets.
-/*=====
-		// focusedChild: [protected] Widget
-		//		The currently focused child widget, or null if there isn't one
-		focusedChild: null,
-=====*/
-
-		// tabIndex: Integer
-		//		Tab index of the container; same as HTML tabindex attribute.
-		//		Note then when user tabs into the container, focus is immediately
-		//		moved to the first item in the container.
-		tabIndex: "0",
-
-
-		_keyNavCodes: {},
-
-		connectKeyNavHandlers: function(/*dojo.keys[]*/ prevKeyCodes, /*dojo.keys[]*/ nextKeyCodes){
-			// summary:
-			//		Call in postCreate() to attach the keyboard handlers
-			//		to the container.
-			// preKeyCodes: dojo.keys[]
-			//		Key codes for navigating to the previous child.
-			// nextKeyCodes: dojo.keys[]
-			//		Key codes for navigating to the next child.
-			// tags:
-			//		protected
-
-			var keyCodes = this._keyNavCodes = {};
-			var prev = dojo.hitch(this, this.focusPrev);
-			var next = dojo.hitch(this, this.focusNext);
-			dojo.forEach(prevKeyCodes, function(code){ keyCodes[code] = prev; });
-			dojo.forEach(nextKeyCodes, function(code){ keyCodes[code] = next; });
-			this.connect(this.domNode, "onkeypress", "_onContainerKeypress");
-			this.connect(this.domNode, "onfocus", "_onContainerFocus");
-		},
-
-		startupKeyNavChildren: function(){
-			// summary:
-			//		Call in startup() to set child tabindexes to -1
-			// tags:
-			//		protected
-			dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
-		},
-
-		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
-			// summary:
-			//		Add a child to our _Container
-			dijit._KeyNavContainer.superclass.addChild.apply(this, arguments);
-			this._startupChild(widget);
-		},
-
-		focus: function(){
-			// summary:
-			//		Default focus() implementation: focus the first child.
-			this.focusFirstChild();
-		},
-
-		focusFirstChild: function(){
-			// summary:
-			//		Focus the first focusable child in the container.
-			// tags:
-			//		protected
-			this.focusChild(this._getFirstFocusableChild());
-		},
-
-		focusNext: function(){
-			// summary:
-			//		Focus the next widget or focal node (for widgets
-			//		with multiple focal nodes) within this container.
-			// tags:
-			//		protected
-			if(this.focusedChild && this.focusedChild.hasNextFocalNode
-					&& this.focusedChild.hasNextFocalNode()){
-				this.focusedChild.focusNext();
-				return;
-			}
-			var child = this._getNextFocusableChild(this.focusedChild, 1);
-			if(child.getFocalNodes){
-				this.focusChild(child, child.getFocalNodes()[0]);
-			}else{
-				this.focusChild(child);
-			}
-		},
-
-		focusPrev: function(){
-			// summary:
-			//		Focus the previous widget or focal node (for widgets
-			//		with multiple focal nodes) within this container.
-			// tags:
-			//		protected
-			if(this.focusedChild && this.focusedChild.hasPrevFocalNode
-					&& this.focusedChild.hasPrevFocalNode()){
-				this.focusedChild.focusPrev();
-				return;
-			}
-			var child = this._getNextFocusableChild(this.focusedChild, -1);
-			if(child.getFocalNodes){
-				var nodes = child.getFocalNodes();
-				this.focusChild(child, nodes[nodes.length-1]);
-			}else{
-				this.focusChild(child);
-			}
-		},
-
-		focusChild: function(/*Widget*/ widget, /*Node?*/ node){
-			// summary:
-			//		Focus widget. Optionally focus 'node' within widget.
-			// tags:
-			//		protected
-			if(widget){
-				if(this.focusedChild && widget !== this.focusedChild){
-					this._onChildBlur(this.focusedChild);
-				}
-				this.focusedChild = widget;
-				if(node && widget.focusFocalNode){
-					widget.focusFocalNode(node);
-				}else{
-					widget.focus();
-				}
-			}
-		},
-
-		_startupChild: function(/*Widget*/ widget){
-			// summary:
-			//		Set tabindex="-1" on focusable widgets so that we
-			// 		can focus them programmatically and by clicking.
-			//		Connect focus and blur handlers.
-			// tags:
-			//		private
-			if(widget.getFocalNodes){
-				dojo.forEach(widget.getFocalNodes(), function(node){
-					dojo.attr(node, "tabindex", -1);
-					this._connectNode(node);
-				}, this);
-			}else{
-				var node = widget.focusNode || widget.domNode;
-				if(widget.isFocusable()){
-					dojo.attr(node, "tabindex", -1);
-				}
-				this._connectNode(node);
-			}
-		},
-
-		_connectNode: function(/*Element*/ node){
-			// summary:
-			//		Monitor focus and blur events on the node
-			// tags:
-			//		private
-			this.connect(node, "onfocus", "_onNodeFocus");
-			this.connect(node, "onblur", "_onNodeBlur");
-		},
-
-		_onContainerFocus: function(evt){
-			// summary:
-			//		Handler for when the container gets focus
-			// description:
-			//		Initially the container itself has a tabIndex, but when it gets
-			//		focus, switch focus to first child...
-			// tags:
-			//		private
-
-			// Note that we can't use _onFocus() because switching focus from the
-			// _onFocus() handler confuses the focus.js code
-			// (because it causes _onFocusNode() to be called recursively)
-
-			// focus bubbles on Firefox,
-			// so just make sure that focus has really gone to the container
-			if(evt.target !== this.domNode){ return; }
-
-			this.focusFirstChild();
-			
-			// and then remove the container's tabIndex,
-			// so that tab or shift-tab will go to the fields after/before
-			// the container, rather than the container itself
-			dojo.removeAttr(this.domNode, "tabIndex");
-		},
-
-		_onBlur: function(evt){
-			// When focus is moved away the container, and it's descendant (popup) widgets,
-			// then restore the container's tabIndex so that user can tab to it again.
-			// Note that using _onBlur() so that this doesn't happen when focus is shifted
-			// to one of my child widgets (typically a popup)
-			if(this.tabIndex){
-				dojo.attr(this.domNode, "tabindex", this.tabIndex);
-			}
-			// TODO: this.inherited(arguments);
-		},
-
-		_onContainerKeypress: function(evt){
-			// summary:
-			//		When a key is pressed, if it's an arrow key etc. then
-			//		it's handled here.
-			// tags:
-			//		private
-			if(evt.ctrlKey || evt.altKey){ return; }
-			var func = this._keyNavCodes[evt.charOrCode];
-			if(func){
-				func();
-				dojo.stopEvent(evt);
-			}
-		},
-
-		_onNodeFocus: function(evt){
-			// summary:
-			//		Handler for onfocus event on a child node
-			// tags:
-			//		private
-
-			// record the child that has been focused
-			var widget = dijit.getEnclosingWidget(evt.target);
-			if(widget && widget.isFocusable()){
-				this.focusedChild = widget;
-			}
-			dojo.stopEvent(evt);
-		},
-
-		_onNodeBlur: function(evt){
-			// summary:
-			//		Handler for onblur event on a child node
-			// tags:
-			//		private
-			dojo.stopEvent(evt);
-		},
-
-		_onChildBlur: function(/*Widget*/ widget){
-			// summary:
-			//		Called when focus leaves a child widget to go
-			//		to a sibling widget.
-			// tags:
-			//		protected
-		},
-
-		_getFirstFocusableChild: function(){
-			// summary:
-			//		Returns first child that can be focused
-			return this._getNextFocusableChild(null, 1);
-		},
-
-		_getNextFocusableChild: function(child, dir){
-			// summary:
-			//		Returns the next or previous focusable child, compared
-			//		to "child"
-			// child: Widget
-			//		The current widget
-			// dir: Integer
-			//		* 1 = after
-			//		* -1 = before
-			if(child){
-				child = this._getSiblingOfChild(child, dir);
-			}
-			var children = this.getChildren();
-			for(var i=0; i < children.length; i++){
-				if(!child){
-					child = children[(dir>0) ? 0 : (children.length-1)];
-				}
-				if(child.isFocusable()){
-					return child;
-				}
-				child = this._getSiblingOfChild(child, dir);
-			}
-			// no focusable child found
-			return null;
-		}
-	}
-);
-
-}
-
-if(!dojo._hasResource["dijit.MenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.MenuItem"] = true;
-dojo.provide("dijit.MenuItem");
-
-
-
-
-
-dojo.declare("dijit.MenuItem",
-		[dijit._Widget, dijit._Templated, dijit._Contained],
-		{
-		// summary:
-		//		A line item in a Menu Widget
-
-		// Make 3 columns
-		// icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
-		templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" waiRole=\"presentation\">\n\t\t<div dojoAttachPoint=\"arrowWrapper\" style=\"visibility: hidden\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuExpand\">\n\t\t\t<span class=\"dijitMenuExpandA11y\">+</span>\n\t\t</div>\n\t</td>\n</tr>\n",
-
-		attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
-			label: { node: "containerNode", type: "innerHTML" },
-			iconClass: { node: "iconNode", type: "class" }
-		}),
-
-		// label: String
-		//		Menu text
-		label: '',
-
-		// iconClass: String
-		//		Class to apply to DOMNode to make it display an icon.
-		iconClass: "",
-
-		// accelKey: String
-		//		Text for the accelerator (shortcut) key combination.
-		//		Note that although Menu can display accelerator keys there
-		//		is no infrastructure to actually catch and execute these
-		//		accelerators.
-		accelKey: "",
-
-		// disabled: Boolean
-		//		If true, the menu item is disabled.
-		//		If false, the menu item is enabled.
-		disabled: false,
-
-		_fillContent: function(/*DomNode*/ source){
-			// If button label is specified as srcNodeRef.innerHTML rather than
-			// this.params.label, handle it here.
-			if(source && !("label" in this.params)){
-				this.attr('label', source.innerHTML);
-			}
-		},
-
-		postCreate: function(){
-			dojo.setSelectable(this.domNode, false);
-			dojo.attr(this.containerNode, "id", this.id+"_text");
-			dijit.setWaiState(this.domNode, "labelledby", this.id+"_text");
-		},
-
-		_onHover: function(){
-			// summary:
-			//		Handler when mouse is moved onto menu item
-			// tags:
-			//		protected
-			dojo.addClass(this.domNode, 'dijitMenuItemHover');
-			this.getParent().onItemHover(this);
-		},
-
-		_onUnhover: function(){
-			// summary:
-			//		Handler when mouse is moved off of menu item,
-			//		possibly to a child menu, or maybe to a sibling
-			//		menuitem or somewhere else entirely.
-			// tags:
-			//		protected
-
-			// if we are unhovering the currently selected item
-			// then unselect it
-			dojo.removeClass(this.domNode, 'dijitMenuItemHover');
-			this.getParent().onItemUnhover(this);
-		},
-
-		_onClick: function(evt){
-			// summary:
-			//		Internal handler for click events on MenuItem.
-			// tags:
-			//		private
-			this.getParent().onItemClick(this, evt);
-			dojo.stopEvent(evt);
-		},
-
-		onClick: function(/*Event*/ evt){
-			// summary:
-			//		User defined function to handle clicks
-			// tags:
-			//		callback
-		},
-
-		focus: function(){
-			// summary:
-			//		Focus on this MenuItem
-			try{
-				dijit.focus(this.focusNode);
-			}catch(e){
-				// this throws on IE (at least) in some scenarios
-			}
-		},
-
-		_onFocus: function(){
-			// summary:
-			//		This is called by the focus manager when focus
-			//		goes to this MenuItem or a child menu.
-			// tags:
-			//		protected
-			this._setSelected(true);
-
-			// TODO: this.inherited(arguments);
-		},
-
-		_setSelected: function(selected){
-			// summary:
-			//		Indicate that this node is the currently selected one
-			// tags:
-			//		private
-
-			/***
-			 * TODO: remove this method and calls to it, when _onBlur() is working for MenuItem.
-			 * Currently _onBlur() gets called when focus is moved from the MenuItem to a child menu.
-			 * That's not supposed to happen, but the problem is:
-			 * In order to allow dijit.popup's getTopPopup()  work,a sub menu's popupParent
-			 * points to the parent Menu, bypassing the parent MenuItem... thus the
-			 * MenuItem is not in the chain of active widgets and gets a premature call to
-			 * _onBlur()
-			 */
-			
-			dojo.toggleClass(this.domNode, "dijitMenuItemSelected", selected);
-		},
-
-		setLabel: function(/*String*/ content){
-			// summary:
-			//		Deprecated.   Use attr('label', ...) instead.
-			// tags:
-			//		deprecated
-			dojo.deprecated("dijit.MenuItem.setLabel() is deprecated.  Use attr('label', ...) instead.", "", "2.0");
-			this.attr("label", content);
-		},
-
-		setDisabled: function(/*Boolean*/ disabled){
-			// summary:
-			//		Deprecated.   Use attr('disabled', bool) instead.
-			// tags:
-			//		deprecated
-			dojo.deprecated("dijit.Menu.setDisabled() is deprecated.  Use attr('disabled', bool) instead.", "", "2.0");
-			this.attr('disabled', disabled);
-		},
-		_setDisabledAttr: function(/*Boolean*/ value){
-			// summary:
-			//		Hook for attr('disabled', ...) to work.
-			//		Enable or disable this menu item.
-			this.disabled = value;
-			dojo[value ? "addClass" : "removeClass"](this.domNode, 'dijitMenuItemDisabled');
-			dijit.setWaiState(this.focusNode, 'disabled', value ? 'true' : 'false');
-		},
-		_setAccelKeyAttr: function(/*String*/ value){
-			// summary:
-			//		Hook for attr('accelKey', ...) to work.
-			//		Set accelKey on this menu item.
-			this.accelKey=value;
-
-			this.accelKeyNode.style.display=value?"":"none";
-			this.accelKeyNode.innerHTML=value;
-			//have to use colSpan to make it work in IE
-			dojo.attr(this.containerNode,'colSpan',value?"1":"2");
-		}
-	});
-
-}
-
-if(!dojo._hasResource["dijit.PopupMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.PopupMenuItem"] = true;
-dojo.provide("dijit.PopupMenuItem");
-
-
-
-dojo.declare("dijit.PopupMenuItem",
-		dijit.MenuItem,
-		{
-		_fillContent: function(){
-			// summary: 
-			//		When Menu is declared in markup, this code gets the menu label and
-			//		the popup widget from the srcNodeRef.
-			// description:
-			//		srcNodeRefinnerHTML contains both the menu item text and a popup widget
-			//		The first part holds the menu item text and the second part is the popup
-			// example: 
-			// |	<div dojoType="dijit.PopupMenuItem">
-			// |		<span>pick me</span>
-			// |		<popup> ... </popup>
-			// |	</div>
-			// tags:
-			//		protected
-
-			if(this.srcNodeRef){
-				var nodes = dojo.query("*", this.srcNodeRef);
-				dijit.PopupMenuItem.superclass._fillContent.call(this, nodes[0]);
-
-				// save pointer to srcNode so we can grab the drop down widget after it's instantiated
-				this.dropDownContainer = this.srcNodeRef;
-			}
-		},
-
-		startup: function(){
-			if(this._started){ return; }
-			this.inherited(arguments);
-
-			// we didn't copy the dropdown widget from the this.srcNodeRef, so it's in no-man's
-			// land now.  move it to dojo.doc.body.
-			if(!this.popup){
-				var node = dojo.query("[widgetId]", this.dropDownContainer)[0];
-				this.popup = dijit.byNode(node);
-			}
-			dojo.body().appendChild(this.popup.domNode);
-
-			this.popup.domNode.style.display="none";
-			if(this.arrowWrapper){
-				dojo.style(this.arrowWrapper, "visibility", "");
-			}
-			dijit.setWaiState(this.focusNode, "haspopup", "true");
-		},
-		
-		destroyDescendants: function(){
-			if(this.popup){
-				this.popup.destroyRecursive();
-				delete this.popup;
-			}
-			this.inherited(arguments);
-		}
-	});
-
-
-}
-
-if(!dojo._hasResource["dijit.CheckedMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.CheckedMenuItem"] = true;
-dojo.provide("dijit.CheckedMenuItem");
-
-
-
-dojo.declare("dijit.CheckedMenuItem",
-		dijit.MenuItem,
-		{
-		// summary:
-		//		A checkbox-like menu item for toggling on and off
-		
-		templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">&#10003;</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" waiRole=\"presentation\">\n\t</td>\n</tr>\n",
-
-		// checked: Boolean
-		//		Our checked state
-		checked: false,
-		_setCheckedAttr: function(/*Boolean*/ checked){
-			// summary:
-			//		Hook so attr('checked', bool) works.
-			//		Sets the class and state for the check box.
-			dojo.toggleClass(this.domNode, "dijitCheckedMenuItemChecked", checked);
-			dijit.setWaiState(this.domNode, "checked", checked);
-			this.checked = checked;
-		},
-
-		onChange: function(/*Boolean*/ checked){
-			// summary:
-			//		User defined function to handle check/uncheck events
-			// tags:
-			//		callback
-		},
-
-		_onClick: function(/*Event*/ e){
-			// summary:
-			//		Clicking this item just toggles its state
-			// tags:
-			//		private
-			if(!this.disabled){
-				this.attr("checked", !this.checked);
-				this.onChange(this.checked);
-			}
-			this.inherited(arguments);
-		}
-	});
-
-}
-
-if(!dojo._hasResource["dijit.MenuSeparator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.MenuSeparator"] = true;
-dojo.provide("dijit.MenuSeparator");
-
-
-
-
-
-dojo.declare("dijit.MenuSeparator",
-		[dijit._Widget, dijit._Templated, dijit._Contained],
-		{
-		// summary:
-		//		A line between two menu items
-
-		templateString:"<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n",
-
-		postCreate: function(){
-			dojo.setSelectable(this.domNode, false);
-		},
-		
-		isFocusable: function(){
-			// summary:
-			//		Override to always return false
-			// tags:
-			//		protected
-
-			return false; // Boolean
-		}
-	});
-
-
-}
-
-if(!dojo._hasResource["dijit.Menu"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Menu"] = true;
-dojo.provide("dijit.Menu");
-
-
-
-
-
-dojo.declare("dijit._MenuBase",
-	[dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
-{
-	// summary:
-	//		Base class for Menu and MenuBar
-
-	// parentMenu: [readonly] Widget
-	//		pointer to menu that displayed me
-	parentMenu: null,
-
-	// popupDelay: Integer
-	//		number of milliseconds before hovering (without clicking) causes the popup to automatically open.
-	popupDelay: 500,
-
-	startup: function(){
-		if(this._started){ return; }
-
-		dojo.forEach(this.getChildren(), function(child){ child.startup(); });
-		this.startupKeyNavChildren();
-
-		this.inherited(arguments);
-	},
-
-	onExecute: function(){
-		// summary:
-		//		Attach point for notification about when a menu item has been executed.
-		//		This is an internal mechanism used for Menus to signal to their parent to
-		//		close them, because they are about to execute the onClick handler.   In
-		//		general developers should not attach to or override this method.
-		// tags:
-		//		protected
-	},
-
-	onCancel: function(/*Boolean*/ closeAll){
-		// summary:
-		//		Attach point for notification about when the user cancels the current menu
-		//		This is an internal mechanism used for Menus to signal to their parent to
-		//		close them.  In general developers should not attach to or override this method.
-		// tags:
-		//		protected
-	},
-
-	_moveToPopup: function(/*Event*/ evt){
-		// summary:
-		//		This handles the right arrow key (left arrow key on RTL systems),
-		//		which will either open a submenu, or move to the next item in the
-		//		ancestor MenuBar
-		// tags:
-		//		private
-
-		if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){
-			this.focusedChild._onClick(evt);
-		}else{
-			var topMenu = this._getTopMenu();
-			if(topMenu && topMenu._isMenuBar){
-				topMenu.focusNext();
-			}
-		}
-	},
-
-	onItemHover: function(/*MenuItem*/ item){
-		// summary:
-		//		Called when cursor is over a MenuItem.
-		// tags:
-		//		protected
-
-		// Don't do anything unless user has "activated" the menu by:
-		//		1) clicking it
-		//		2) tabbing into it
-		//		3) opening it from a parent menu (which automatically focuses it)
-		if(this.isActive){
-			this.focusChild(item);
-	
-			if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
-				this.hover_timer = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay);
-			}
-		}
-	},
-
-	_onChildBlur: function(item){
-		// summary:
-		//		Called when a child MenuItem becomes inactive because focus
-		//		has been removed from the MenuItem *and* it's descendant menus.
-		// tags:
-		//		private
-
-		item._setSelected(false);
-
-		// Close all popups that are open and descendants of this menu
-		dijit.popup.close(item.popup);
-		this._stopPopupTimer();
-	},
-
-	onItemUnhover: function(/*MenuItem*/ item){
-		// summary:
-		//		Callback fires when mouse exits a MenuItem
-		// tags:
-		//		protected
-		if(this.isActive){
-			this._stopPopupTimer();
-		}
-	},
-
-	_stopPopupTimer: function(){
-		// summary:
-		//		Cancels the popup timer because the user has stop hovering
-		//		on the MenuItem, etc.
-		// tags:
-		//		private
-		if(this.hover_timer){
-			clearTimeout(this.hover_timer);
-			this.hover_timer = null;
-		}
-	},
-
-	_getTopMenu: function(){
-		// summary:
-		//		Returns the top menu in this chain of Menus
-		// tags:
-		//		private
-		for(var top=this; top.parentMenu; top=top.parentMenu);
-		return top;
-	},
-
-	onItemClick: function(/*Widget*/ item, /*Event*/ evt){
-		// summary:
-		//		Handle clicks on an item.
-		// tags:
-		//		private
-		if(item.disabled){ return false; }
-
-		this.focusChild(item);
-
-		if(item.popup){
-			if(!this.is_open){
-				this._openPopup();
-			}
-		}else{
-			// before calling user defined handler, close hierarchy of menus
-			// and restore focus to place it was when menu was opened
-			this.onExecute();
-
-			// user defined handler for click
-			item.onClick(evt);
-		}
-	},
-
-	_openPopup: function(){
-		// summary:
-		//		Open the popup to the side of/underneath the current menu item
-		// tags:
-		//		protected
-
-		this._stopPopupTimer();
-		var from_item = this.focusedChild;
-		var popup = from_item.popup;
-
-		if(popup.isShowingNow){ return; }
-		popup.parentMenu = this;
-		var self = this;
-		dijit.popup.open({
-			parent: this,
-			popup: popup,
-			around: from_item.domNode,
-			orient: this._orient || (this.isLeftToRight() ? {'TR': 'TL', 'TL': 'TR'} : {'TL': 'TR', 'TR': 'TL'}),
-			onCancel: function(){
-				// called when the child menu is canceled
-				dijit.popup.close(popup);
-				from_item.focus();	// put focus back on my node
-				self.currentPopup = null;
-			},
-			onExecute: dojo.hitch(this, "_onDescendantExecute")
-		});
-
-		this.currentPopup = popup;
-
-		if(popup.focus){
-			// If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar),
-			// if the cursor happens to collide with the popup, it will generate an onmouseover event
-			// even though the mouse wasn't moved.   Use a setTimeout() to call popup.focus so that
-			// our focus() call overrides the onmouseover event, rather than vice-versa.  (#8742)
-			setTimeout(dojo.hitch(popup, "focus"), 0);
-		}
-	},
-
-	onOpen: function(/*Event*/ e){
-		// summary:
-		//		Callback when this menu is opened.
-		//		This is called by the popup manager as notification that the menu
-		//		was opened.
-		// tags:
-		//		private
-
-		this.isShowingNow = true;
-	},
-
-	onClose: function(){
-		// summary:
-		//		Callback when this menu is closed.
-		//		This is called by the popup manager as notification that the menu
-		//		was closed.
-		// tags:
-		//		private
-
-		this._stopPopupTimer();
-		this.parentMenu = null;
-		this.isShowingNow = false;
-		this.currentPopup = null;
-		if(this.focusedChild){
-			this._onChildBlur(this.focusedChild);
-			this.focusedChild = null;
-		}
-	},
-
-	_onFocus: function(){
-		// summary:
-		//		Called when this Menu gets focus from:
-		//			1) clicking it
-		//			2) tabbing into it
-		//			3) being opened by a parent menu.
-		//		This is not called just from mouse hover.
-		// tags:
-		//		protected
-		this.isActive = true;
-		dojo.addClass(this.domNode, "dijitMenuActive");
-		dojo.removeClass(this.domNode, "dijitMenuPassive");
-		this.inherited(arguments);
-	},
-	
-	_onBlur: function(){
-		// summary:
-		//		Called when focus is moved away from this Menu and it's submenus.
-		// tags:
-		//		protected
-		this.isActive = false;
-		dojo.removeClass(this.domNode, "dijitMenuActive");
-		dojo.addClass(this.domNode, "dijitMenuPassive");
-
-		// If user blurs/clicks away from a MenuBar (or always visible Menu), then close all popped up submenus etc.
-		this.onClose();
-
-		this.inherited(arguments);
-	},
-
-	_onDescendantExecute: function(){
-		// summary:
-		//		Called when submenu is clicked.  Close hierarchy of menus.
-		// tags:
-		//		private
-		this.onClose();
-	}
-});
-
-dojo.declare("dijit.Menu",
-	dijit._MenuBase,
-	{
-	// summary
-	//		A context menu you can assign to multiple elements
-
-	// TODO: most of the code in here is just for context menu (right-click menu)
-	// support.  In retrospect that should have been a separate class (dijit.ContextMenu).
-	// Split them for 2.0
-
-	constructor: function(){
-		this._bindings = [];
-	},
-
-	templateString:"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n",
-
-	// targetNodeIds: [const] String[]
-	//		Array of dom node ids of nodes to attach to.
-	//		Fill this with nodeIds upon widget creation and it becomes context menu for those nodes.
-	targetNodeIds: [],
-
-	// contextMenuForWindow: [const] Boolean
-	//		If true, right clicking anywhere on the window will cause this context menu to open.
-	//		If false, must specify targetNodeIds.
-	contextMenuForWindow: false,
-
-	// leftClickToOpen: [const] Boolean
-	//		If true, menu will open on left click instead of right click, similiar to a file menu.
-	leftClickToOpen: false,
-	
-	// _contextMenuWithMouse: [private] Boolean
-	//		Used to record mouse and keyboard events to determine if a context
-	//		menu is being opened with the keyboard or the mouse.
-	_contextMenuWithMouse: false,
-
-	postCreate: function(){
-		if(this.contextMenuForWindow){
-			this.bindDomNode(dojo.body());
-		}else{
-			dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
-		}
-		var k = dojo.keys, l = this.isLeftToRight();
-		this._openSubMenuKey = l ? k.RIGHT_ARROW : k.LEFT_ARROW;
-		this._closeSubMenuKey = l ? k.LEFT_ARROW : k.RIGHT_ARROW;
-		this.connectKeyNavHandlers([k.UP_ARROW], [k.DOWN_ARROW]);
-	},
-
-	_onKeyPress: function(/*Event*/ evt){
-		// summary:
-		//		Handle keyboard based menu navigation.
-		// tags:
-		//		protected
-
-		if(evt.ctrlKey || evt.altKey){ return; }
-
-		switch(evt.charOrCode){
-			case this._openSubMenuKey:
-				this._moveToPopup(evt);
-				dojo.stopEvent(evt);
-				break;
-			case this._closeSubMenuKey:
-				if(this.parentMenu){
-					if(this.parentMenu._isMenuBar){
-						this.parentMenu.focusPrev();
-					}else{
-						this.onCancel(false);
-					}
-				}else{
-					dojo.stopEvent(evt);
-				}
-				break;
-		}
-	},
-
-	// thanks burstlib!
-	_iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
-		// summary:
-		//		Returns the window reference of the passed iframe
-		// tags:
-		//		private
-		var win = dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(iframe_el)) ||
-			// Moz. TODO: is this available when defaultView isn't?
-			dijit.Menu._iframeContentDocument(iframe_el)['__parent__'] ||
-			(iframe_el.name && dojo.doc.frames[iframe_el.name]) || null;
-		return win;	//	Window
-	},
-
-	_iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){
-		// summary:
-		//		Returns a reference to the document object inside iframe_el
-		// tags:
-		//		protected
-		var doc = iframe_el.contentDocument // W3
-			|| (iframe_el.contentWindow && iframe_el.contentWindow.document) // IE
-			|| (iframe_el.name && dojo.doc.frames[iframe_el.name] && dojo.doc.frames[iframe_el.name].document)
-			|| null;
-		return doc;	//	HTMLDocument
-	},
-
-	bindDomNode: function(/*String|DomNode*/ node){
-		// summary:
-		//		Attach menu to given node
-		node = dojo.byId(node);
-
-		//TODO: this is to support context popups in Editor.  Maybe this shouldn't be in dijit.Menu
-		var win = dijit.getDocumentWindow(node.ownerDocument);
-		if(node.tagName.toLowerCase()=="iframe"){
-			win = this._iframeContentWindow(node);
-			node = dojo.withGlobal(win, dojo.body);
-		}
-
-		// to capture these events at the top level,
-		// attach to document, not body
-		var cn = (node == dojo.body() ? dojo.doc : node);
-
-		node[this.id] = this._bindings.push([
-			dojo.connect(cn, (this.leftClickToOpen)?"onclick":"oncontextmenu", this, "_openMyself"),
-			dojo.connect(cn, "onkeydown", this, "_contextKey"),
-			dojo.connect(cn, "onmousedown", this, "_contextMouse")
-		]);
-	},
-
-	unBindDomNode: function(/*String|DomNode*/ nodeName){
-		// summary:
-		//		Detach menu from given node
-		var node = dojo.byId(nodeName);
-		if(node){
-			var bid = node[this.id]-1, b = this._bindings[bid];
-			dojo.forEach(b, dojo.disconnect);
-			delete this._bindings[bid];
-		}
-	},
-
-	_contextKey: function(e){
-		// summary:
-		//		Code to handle popping up editor using F10 key rather than mouse
-		// tags:
-		//		private
-		this._contextMenuWithMouse = false;
-		if(e.keyCode == dojo.keys.F10){
-			dojo.stopEvent(e);
-			if(e.shiftKey && e.type=="keydown"){
-				// FF: copying the wrong property from e will cause the system
-				// context menu to appear in spite of stopEvent. Don't know
-				// exactly which properties cause this effect.
-				var _e = { target: e.target, pageX: e.pageX, pageY: e.pageY };
-				_e.preventDefault = _e.stopPropagation = function(){};
-				// IE: without the delay, focus work in "open" causes the system
-				// context menu to appear in spite of stopEvent.
-				window.setTimeout(dojo.hitch(this, function(){ this._openMyself(_e); }), 1);
-			}
-		}
-	},
-
-	_contextMouse: function(e){
-		// summary:
-		//		Helper to remember when we opened the context menu with the mouse instead
-		//		of with the keyboard
-		// tags:
-		//		private
-		this._contextMenuWithMouse = true;
-	},
-
-	_openMyself: function(/*Event*/ e){
-		// summary:
-		//		Internal function for opening myself when the user
-		//		does a right-click or something similar
-		// tags:
-		//		private
-
-		if(this.leftClickToOpen&&e.button>0){
-			return;
-		}
-		dojo.stopEvent(e);
-
-		// Get coordinates.
-		// if we are opening the menu with the mouse or on safari open
-		// the menu at the mouse cursor
-		// (Safari does not have a keyboard command to open the context menu
-		// and we don't currently have a reliable way to determine
-		// _contextMenuWithMouse on Safari)
-		var x,y;
-		if(dojo.isSafari || this._contextMenuWithMouse){
-			x=e.pageX;
-			y=e.pageY;
-		}else{
-			// otherwise open near e.target
-			var coords = dojo.coords(e.target, true);
-			x = coords.x + 10;
-			y = coords.y + 10;
-		}
-
-		var self=this;
-		var savedFocus = dijit.getFocus(this);
-		function closeAndRestoreFocus(){
-			// user has clicked on a menu or popup
-			dijit.focus(savedFocus);
-			dijit.popup.close(self);
-		}
-		dijit.popup.open({
-			popup: this,
-			x: x,
-			y: y,
-			onExecute: closeAndRestoreFocus,
-			onCancel: closeAndRestoreFocus,
-			orient: this.isLeftToRight() ? 'L' : 'R'
-		});
-		this.focus();
-
-		this._onBlur = function(){
-			this.inherited('_onBlur', arguments);
-			// Usually the parent closes the child widget but if this is a context
-			// menu then there is no parent
-			dijit.popup.close(this);
-			// don't try to restore focus; user has clicked another part of the screen
-			// and set focus there
-		};
-	},
-
-	uninitialize: function(){
- 		dojo.forEach(this.targetNodeIds, this.unBindDomNode, this);
- 		this.inherited(arguments);
-	}
-}
-);
-
-// Back-compat (TODO: remove in 2.0)
-
-
-
-
-
-
-}
-
-if(!dojo._hasResource["dojox.html.metrics"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.html.metrics"] = true;
-dojo.provide("dojox.html.metrics");
-
-(function(){
-	var dhm = dojox.html.metrics;
-
-	//	derived from Morris John's emResized measurer
-	dhm.getFontMeasurements = function(){
-		//	summary
-		//	Returns an object that has pixel equivilents of standard font size values.
-		var heights = {
-			'1em':0, '1ex':0, '100%':0, '12pt':0, '16px':0, 'xx-small':0, 'x-small':0,
-			'small':0, 'medium':0, 'large':0, 'x-large':0, 'xx-large':0
-		};
-	
-		if(dojo.isIE){
-			//	we do a font-size fix if and only if one isn't applied already.
-			//	NOTE: If someone set the fontSize on the HTML Element, this will kill it.
-			dojo.doc.documentElement.style.fontSize="100%";
-		}
-	
-		//	set up the measuring node.
-		var div=dojo.doc.createElement("div");
-		var ds = div.style;
-		ds.position="absolute";
-		ds.left="-100px";
-		ds.top="0";
-		ds.width="30px";
-		ds.height="1000em";
-		ds.border="0";
-		ds.margin="0";
-		ds.padding="0";
-		ds.outline="0";
-		ds.lineHeight="1";
-		ds.overflow="hidden";
-		dojo.body().appendChild(div);
-	
-		//	do the measurements.
-		for(var p in heights){
-			ds.fontSize = p;
-			heights[p] = Math.round(div.offsetHeight * 12/16) * 16/12 / 1000;
-		}
-		
-		dojo.body().removeChild(div);
-		div = null;
-		return heights; 	//	object
-	};
-
-	var fontMeasurements = null;
-	
-	dhm.getCachedFontMeasurements = function(recalculate){
-		if(recalculate || !fontMeasurements){
-			fontMeasurements = dhm.getFontMeasurements();
-		}
-		return fontMeasurements;
-	};
-
-	var measuringNode = null, empty = {};
-	dhm.getTextBox = function(/* String */ text, /* Object */ style, /* String? */ className){
-		var m;
-		if(!measuringNode){
-			m = measuringNode = dojo.doc.createElement("div");
-			m.style.position = "absolute";
-			m.style.left = "-10000px";
-			m.style.top = "0";
-			dojo.body().appendChild(m);
-		}else{
-			m = measuringNode;
-		}
-		// reset styles
-		m.className = "";
-		m.style.border = "0";
-		m.style.margin = "0";
-		m.style.padding = "0";
-		m.style.outline = "0";
-		// set new style
-		if(arguments.length > 1 && style){
-			for(var i in style){
-				if(i in empty){ continue; }
-				m.style[i] = style[i];
-			}
-		}
-		// set classes
-		if(arguments.length > 2 && className){
-			m.className = className;
-		}
-		// take a measure
-		m.innerHTML = text;
-		return dojo.marginBox(m);
-	};
-
-	//	determine the scrollbar sizes on load.
-	var scroll={ w:16, h:16 };
-	dhm.getScrollbar=function(){ return { w:scroll.w, h:scroll.h }; };
-
-	dhm._fontResizeNode = null;
-
-	dhm.initOnFontResize = function(interval){
-		var f = dhm._fontResizeNode = dojo.doc.createElement("iframe");
-		var fs = f.style;
-		fs.position = "absolute";
-		fs.width = "5em";
-		fs.height = "10em";
-		fs.top = "-10000px";
-		f.src = dojo.config["dojoBlankHtmlUrl"] || dojo.moduleUrl("dojo", "resources/blank.html");
-		dojo.body().appendChild(f);
-
-		if(dojo.isIE){
-			f.onreadystatechange = function(){
-				if(f.contentWindow.document.readyState == "complete"){
-					f.onresize = Function('window.parent.'+dojox._scopeName+'.html.metrics._fontresize()');
-				}
-			};
-		}else{
-			f.onload = function(){
-				f.contentWindow.onresize = Function('window.parent.'+dojox._scopeName+'.html.metrics._fontresize()');
-			};
-		}
-		dhm.initOnFontResize = function(){};
-	};
-
-	dhm.onFontResize = function(){};
-	dhm._fontresize = function(){
-		dhm.onFontResize();
-	}
-
-	dojo.addOnUnload(function(){
-		// destroy our font resize iframe if we have one
-		var f = dhm._fontResizeNode;
-		if(f){
-			if(dojo.isIE && f.onresize){
-				f.onresize = null;
-			}else if(f.contentWindow && f.contentWindow.onresize){
-				f.contentWindow.onresize = null;
-			}
-			dhm._fontResizeNode = null;
-		}
-	});
-
-	dojo.addOnLoad(function(){
-		// getScrollbar metrics node
-		try{
-			var n=dojo.doc.createElement("div");
-			n.style.cssText = "top:0;left:0;width:100px;height:100px;overflow:scroll;position:absolute;visibility:hidden;";
-			dojo.body().appendChild(n);
-			scroll.w = n.offsetWidth - n.clientWidth;
-			scroll.h = n.offsetHeight - n.clientHeight;
-			dojo.body().removeChild(n);
-			//
-			delete n;
-		}catch(e){}
-
-		// text size poll setup
-		if("fontSizeWatch" in dojo.config && !!dojo.config.fontSizeWatch){
-			dhm.initOnFontResize();
-		}
-	});
-})();
-
-}
-
-if(!dojo._hasResource["dojox.grid.util"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid.util"] = true;
-dojo.provide("dojox.grid.util");
-
-// summary: grid utility library
-(function(){
-	var dgu = dojox.grid.util;
-
-	dgu.na = '...';
-	dgu.rowIndexTag = "gridRowIndex";
-	dgu.gridViewTag = "gridView";
-
-
-	dgu.fire = function(ob, ev, args){
-		var fn = ob && ev && ob[ev];
-		return fn && (args ? fn.apply(ob, args) : ob[ev]());
-	};
-	
-	dgu.setStyleHeightPx = function(inElement, inHeight){
-		if(inHeight >= 0){
-			var s = inElement.style;
-			var v = inHeight + 'px';
-			if(inElement && s['height'] != v){
-				s['height'] = v;
-			}
-		}
-	};
-	
-	dgu.mouseEvents = [ 'mouseover', 'mouseout', /*'mousemove',*/ 'mousedown', 'mouseup', 'click', 'dblclick', 'contextmenu' ];
-
-	dgu.keyEvents = [ 'keyup', 'keydown', 'keypress' ];
-
-	dgu.funnelEvents = function(inNode, inObject, inMethod, inEvents){
-		var evts = (inEvents ? inEvents : dgu.mouseEvents.concat(dgu.keyEvents));
-		for (var i=0, l=evts.length; i<l; i++){
-			inObject.connect(inNode, 'on' + evts[i], inMethod);
-		}
-	},
-
-	dgu.removeNode = function(inNode){
-		inNode = dojo.byId(inNode);
-		inNode && inNode.parentNode && inNode.parentNode.removeChild(inNode);
-		return inNode;
-	};
-	
-	dgu.arrayCompare = function(inA, inB){
-		for(var i=0,l=inA.length; i<l; i++){
-			if(inA[i] != inB[i]){return false;}
-		}
-		return (inA.length == inB.length);
-	};
-	
-	dgu.arrayInsert = function(inArray, inIndex, inValue){
-		if(inArray.length <= inIndex){
-			inArray[inIndex] = inValue;
-		}else{
-			inArray.splice(inIndex, 0, inValue);
-		}
-	};
-	
-	dgu.arrayRemove = function(inArray, inIndex){
-		inArray.splice(inIndex, 1);
-	};
-	
-	dgu.arraySwap = function(inArray, inI, inJ){
-		var cache = inArray[inI];
-		inArray[inI] = inArray[inJ];
-		inArray[inJ] = cache;
-	};
-})();
-
-}
-
-if(!dojo._hasResource["dojox.grid._Scroller"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid._Scroller"] = true;
-dojo.provide("dojox.grid._Scroller");
-
-(function(){
-	var indexInParent = function(inNode){
-		var i=0, n, p=inNode.parentNode;
-		while((n = p.childNodes[i++])){
-			if(n == inNode){
-				return i - 1;
-			}
-		}
-		return -1;
-	};
-	
-	var cleanNode = function(inNode){
-		if(!inNode){
-			return;
-		}
-		var filter = function(inW){
-			return inW.domNode && dojo.isDescendant(inW.domNode, inNode, true);
-		}
-		var ws = dijit.registry.filter(filter);
-		for(var i=0, w; (w=ws[i]); i++){
-			w.destroy();
-		}
-		delete ws;
-	};
-
-	var getTagName = function(inNodeOrId){
-		var node = dojo.byId(inNodeOrId);
-		return (node && node.tagName ? node.tagName.toLowerCase() : '');
-	};
-	
-	var nodeKids = function(inNode, inTag){
-		var result = [];
-		var i=0, n;
-		while((n = inNode.childNodes[i++])){
-			if(getTagName(n) == inTag){
-				result.push(n);
-			}
-		}
-		return result;
-	};
-	
-	var divkids = function(inNode){
-		return nodeKids(inNode, 'div');
-	};
-
-	dojo.declare("dojox.grid._Scroller", null, {
-		constructor: function(inContentNodes){
-			this.setContentNodes(inContentNodes);
-			this.pageHeights = [];
-			this.pageNodes = [];
-			this.stack = [];
-		},
-		// specified
-		rowCount: 0, // total number of rows to manage
-		defaultRowHeight: 32, // default height of a row
-		keepRows: 100, // maximum number of rows that should exist at one time
-		contentNode: null, // node to contain pages
-		scrollboxNode: null, // node that controls scrolling
-		// calculated
-		defaultPageHeight: 0, // default height of a page
-		keepPages: 10, // maximum number of pages that should exists at one time
-		pageCount: 0,
-		windowHeight: 0,
-		firstVisibleRow: 0,
-		lastVisibleRow: 0,
-		averageRowHeight: 0, // the average height of a row
-		// private
-		page: 0,
-		pageTop: 0,
-		// init
-		init: function(inRowCount, inKeepRows, inRowsPerPage){
-			switch(arguments.length){
-				case 3: this.rowsPerPage = inRowsPerPage;
-				case 2: this.keepRows = inKeepRows;
-				case 1: this.rowCount = inRowCount;
-			}
-			this.defaultPageHeight = this.defaultRowHeight * this.rowsPerPage;
-			this.pageCount = this._getPageCount(this.rowCount, this.rowsPerPage);
-			this.setKeepInfo(this.keepRows);
-			this.invalidate();
-			if(this.scrollboxNode){
-				this.scrollboxNode.scrollTop = 0;
-				this.scroll(0);
-				this.scrollboxNode.onscroll = dojo.hitch(this, 'onscroll');
-			}
-		},
-		_getPageCount: function(rowCount, rowsPerPage){
-			return rowCount ? (Math.ceil(rowCount / rowsPerPage) || 1) : 0;
-		},
-		destroy: function(){
-			this.invalidateNodes();
-			delete this.contentNodes;
-			delete this.contentNode;
-			delete this.scrollboxNode;
-		},
-		setKeepInfo: function(inKeepRows){
-			this.keepRows = inKeepRows;
-			this.keepPages = !this.keepRows ? this.keepRows : Math.max(Math.ceil(this.keepRows / this.rowsPerPage), 2);
-		},
-		// nodes
-		setContentNodes: function(inNodes){
-			this.contentNodes = inNodes;
-			this.colCount = (this.contentNodes ? this.contentNodes.length : 0);
-			this.pageNodes = [];
-			for(var i=0; i<this.colCount; i++){
-				this.pageNodes[i] = [];
-			}
-		},
-		getDefaultNodes: function(){
-			return this.pageNodes[0] || [];
-		},
-		// updating
-		invalidate: function(){
-			this.invalidateNodes();
-			this.pageHeights = [];
-			this.height = (this.pageCount ? (this.pageCount - 1)* this.defaultPageHeight + this.calcLastPageHeight() : 0);
-			this.resize();
-		},
-		updateRowCount: function(inRowCount){
-			this.invalidateNodes();
-			this.rowCount = inRowCount;
-			// update page count, adjust document height
-			var oldPageCount = this.pageCount;
-			this.pageCount = this._getPageCount(this.rowCount, this.rowsPerPage);
-			if(this.pageCount < oldPageCount){
-				for(var i=oldPageCount-1; i>=this.pageCount; i--){
-					this.height -= this.getPageHeight(i);
-					delete this.pageHeights[i]
-				}
-			}else if(this.pageCount > oldPageCount){
-				this.height += this.defaultPageHeight * (this.pageCount - oldPageCount - 1) + this.calcLastPageHeight();
-			}
-			this.resize();
-		},
-		// implementation for page manager
-		pageExists: function(inPageIndex){
-			return Boolean(this.getDefaultPageNode(inPageIndex));
-		},
-		measurePage: function(inPageIndex){
-			var n = this.getDefaultPageNode(inPageIndex);
-			return (n&&n.innerHTML) ? n.offsetHeight : 0;
-		},
-		positionPage: function(inPageIndex, inPos){
-			for(var i=0; i<this.colCount; i++){
-				this.pageNodes[i][inPageIndex].style.top = inPos + 'px';
-			}
-		},
-		repositionPages: function(inPageIndex){
-			var nodes = this.getDefaultNodes();
-			var last = 0;
-
-			for(var i=0; i<this.stack.length; i++){
-				last = Math.max(this.stack[i], last);
-			}
-			//
-			var n = nodes[inPageIndex];
-			var y = (n ? this.getPageNodePosition(n) + this.getPageHeight(inPageIndex) : 0);
-			//
-			//
-			for(var p=inPageIndex+1; p<=last; p++){
-				n = nodes[p];
-				if(n){
-					//
-					if(this.getPageNodePosition(n) == y){
-						return;
-					}
-					//
-					this.positionPage(p, y);
-				}
-				y += this.getPageHeight(p);
-			}
-		},
-		installPage: function(inPageIndex){
-			for(var i=0; i<this.colCount; i++){
-				this.contentNodes[i].appendChild(this.pageNodes[i][inPageIndex]);
-			}
-		},
-		preparePage: function(inPageIndex, inReuseNode){
-			var p = (inReuseNode ? this.popPage() : null);
-			for(var i=0; i<this.colCount; i++){
-				var nodes = this.pageNodes[i];
-				var new_p = (p === null ? this.createPageNode() : this.invalidatePageNode(p, nodes));
-				new_p.pageIndex = inPageIndex;
-				new_p.id = (this._pageIdPrefix || "") + 'page-' + inPageIndex;
-				nodes[inPageIndex] = new_p;
-			}
-		},
-		// rendering implementation
-		renderPage: function(inPageIndex){
-			var nodes = [];
-			for(var i=0; i<this.colCount; i++){
-				nodes[i] = this.pageNodes[i][inPageIndex];
-			}
-			for(var i=0, j=inPageIndex*this.rowsPerPage; (i<this.rowsPerPage)&&(j<this.rowCount); i++, j++){
-				this.renderRow(j, nodes);
-			}
-		},
-		removePage: function(inPageIndex){
-			for(var i=0, j=inPageIndex*this.rowsPerPage; i<this.rowsPerPage; i++, j++){
-				this.removeRow(j);
-			}
-		},
-		destroyPage: function(inPageIndex){
-			for(var i=0; i<this.colCount; i++){
-				var n = this.invalidatePageNode(inPageIndex, this.pageNodes[i]);
-				if(n){
-					dojo.destroy(n);
-				}
-			}
-		},
-		pacify: function(inShouldPacify){
-		},
-		// pacification
-		pacifying: false,
-		pacifyTicks: 200,
-		setPacifying: function(inPacifying){
-			if(this.pacifying != inPacifying){
-				this.pacifying = inPacifying;
-				this.pacify(this.pacifying);
-			}
-		},
-		startPacify: function(){
-			this.startPacifyTicks = new Date().getTime();
-		},
-		doPacify: function(){
-			var result = (new Date().getTime() - this.startPacifyTicks) > this.pacifyTicks;
-			this.setPacifying(true);
-			this.startPacify();
-			return result;
-		},
-		endPacify: function(){
-			this.setPacifying(false);
-		},
-		// default sizing implementation
-		resize: function(){
-			if(this.scrollboxNode){
-				this.windowHeight = this.scrollboxNode.clientHeight;
-			}
-			for(var i=0; i<this.colCount; i++){
-				dojox.grid.util.setStyleHeightPx(this.contentNodes[i], this.height);
-			}
-			
-			// Calculate the average row height and update the defaults (row and page).
-			this.needPage(this.page, this.pageTop);
-			var rowsOnPage = (this.page < this.pageCount - 1) ? this.rowsPerPage : ((this.rowCount % this.rowsPerPage) || this.rowsPerPage);
-			var pageHeight = this.getPageHeight(this.page);
-			this.averageRowHeight = (pageHeight > 0 && rowsOnPage > 0) ? (pageHeight / rowsOnPage) : 0;
-		},
-		calcLastPageHeight: function(){
-			if(!this.pageCount){
-				return 0;
-			}
-			var lastPage = this.pageCount - 1;
-			var lastPageHeight = ((this.rowCount % this.rowsPerPage)||(this.rowsPerPage)) * this.defaultRowHeight;
-			this.pageHeights[lastPage] = lastPageHeight;
-			return lastPageHeight;
-		},
-		updateContentHeight: function(inDh){
-			this.height += inDh;
-			this.resize();
-		},
-		updatePageHeight: function(inPageIndex){
-			if(this.pageExists(inPageIndex)){
-				var oh = this.getPageHeight(inPageIndex);
-				var h = (this.measurePage(inPageIndex))||(oh);
-				this.pageHeights[inPageIndex] = h;
-				if((h)&&(oh != h)){
-					this.updateContentHeight(h - oh)
-					this.repositionPages(inPageIndex);
-				}
-			}
-		},
-		rowHeightChanged: function(inRowIndex){
-			this.updatePageHeight(Math.floor(inRowIndex / this.rowsPerPage));
-		},
-		// scroller core
-		invalidateNodes: function(){
-			while(this.stack.length){
-				this.destroyPage(this.popPage());
-			}
-		},
-		createPageNode: function(){
-			var p = document.createElement('div');
-			p.style.position = 'absolute';
-			//p.style.width = '100%';
-			p.style[dojo._isBodyLtr() ? "left" : "right"] = '0';
-			return p;
-		},
-		getPageHeight: function(inPageIndex){
-			var ph = this.pageHeights[inPageIndex];
-			return (ph !== undefined ? ph : this.defaultPageHeight);
-		},
-		// FIXME: this is not a stack, it's a FIFO list
-		pushPage: function(inPageIndex){
-			return this.stack.push(inPageIndex);
-		},
-		popPage: function(){
-			return this.stack.shift();
-		},
-		findPage: function(inTop){
-			var i = 0, h = 0;
-			for(var ph = 0; i<this.pageCount; i++, h += ph){
-				ph = this.getPageHeight(i);
-				if(h + ph >= inTop){
-					break;
-				}
-			}
-			this.page = i;
-			this.pageTop = h;
-		},
-		buildPage: function(inPageIndex, inReuseNode, inPos){
-			this.preparePage(inPageIndex, inReuseNode);
-			this.positionPage(inPageIndex, inPos);
-			// order of operations is key below
-			this.installPage(inPageIndex);
-			this.renderPage(inPageIndex);
-			// order of operations is key above
-			this.pushPage(inPageIndex);
-		},
-		needPage: function(inPageIndex, inPos){
-			var h = this.getPageHeight(inPageIndex), oh = h;
-			if(!this.pageExists(inPageIndex)){
-				this.buildPage(inPageIndex, this.keepPages&&(this.stack.length >= this.keepPages), inPos);
-				h = this.measurePage(inPageIndex) || h;
-				this.pageHeights[inPageIndex] = h;
-				if(h && (oh != h)){
-					this.updateContentHeight(h - oh)
-				}
-			}else{
-				this.positionPage(inPageIndex, inPos);
-			}
-			return h;
-		},
-		onscroll: function(){
-			this.scroll(this.scrollboxNode.scrollTop);
-		},
-		scroll: function(inTop){
-			this.grid.scrollTop = inTop;
-			if(this.colCount){
-				this.startPacify();
-				this.findPage(inTop);
-				var h = this.height;
-				var b = this.getScrollBottom(inTop);
-				for(var p=this.page, y=this.pageTop; (p<this.pageCount)&&((b<0)||(y<b)); p++){
-					y += this.needPage(p, y);
-				}
-				this.firstVisibleRow = this.getFirstVisibleRow(this.page, this.pageTop, inTop);
-				this.lastVisibleRow = this.getLastVisibleRow(p - 1, y, b);
-				// indicates some page size has been updated
-				if(h != this.height){
-					this.repositionPages(p-1);
-				}
-				this.endPacify();
-			}
-		},
-		getScrollBottom: function(inTop){
-			return (this.windowHeight >= 0 ? inTop + this.windowHeight : -1);
-		},
-		// events
-		processNodeEvent: function(e, inNode){
-			var t = e.target;
-			while(t && (t != inNode) && t.parentNode && (t.parentNode.parentNode != inNode)){
-				t = t.parentNode;
-			}
-			if(!t || !t.parentNode || (t.parentNode.parentNode != inNode)){
-				return false;
-			}
-			var page = t.parentNode;
-			e.topRowIndex = page.pageIndex * this.rowsPerPage;
-			e.rowIndex = e.topRowIndex + indexInParent(t);
-			e.rowTarget = t;
-			return true;
-		},
-		processEvent: function(e){
-			return this.processNodeEvent(e, this.contentNode);
-		},
-		// virtual rendering interface
-		renderRow: function(inRowIndex, inPageNode){
-		},
-		removeRow: function(inRowIndex){
-		},
-		// page node operations
-		getDefaultPageNode: function(inPageIndex){
-			return this.getDefaultNodes()[inPageIndex];
-		},
-		positionPageNode: function(inNode, inPos){
-		},
-		getPageNodePosition: function(inNode){
-			return inNode.offsetTop;
-		},
-		invalidatePageNode: function(inPageIndex, inNodes){
-			var p = inNodes[inPageIndex];
-			if(p){
-				delete inNodes[inPageIndex];
-				this.removePage(inPageIndex, p);
-				cleanNode(p);
-				p.innerHTML = '';
-			}
-			return p;
-		},
-		// scroll control
-		getPageRow: function(inPage){
-			return inPage * this.rowsPerPage;
-		},
-		getLastPageRow: function(inPage){
-			return Math.min(this.rowCount, this.getPageRow(inPage + 1)) - 1;
-		},
-		getFirstVisibleRow: function(inPage, inPageTop, inScrollTop){
-			if(!this.pageExists(inPage)){
-				return 0;
-			}
-			var row = this.getPageRow(inPage);
-			var nodes = this.getDefaultNodes();
-			var rows = divkids(nodes[inPage]);
-			for(var i=0,l=rows.length; i<l && inPageTop<inScrollTop; i++, row++){
-				inPageTop += rows[i].offsetHeight;
-			}
-			return (row ? row - 1 : row);
-		},
-		getLastVisibleRow: function(inPage, inBottom, inScrollBottom){
-			if(!this.pageExists(inPage)){
-				return 0;
-			}
-			var nodes = this.getDefaultNodes();
-			var row = this.getLastPageRow(inPage);
-			var rows = divkids(nodes[inPage]);
-			for(var i=rows.length-1; i>=0 && inBottom>inScrollBottom; i--, row--){
-				inBottom -= rows[i].offsetHeight;
-			}
-			return row + 1;
-		},
-		findTopRow: function(inScrollTop){
-			var nodes = this.getDefaultNodes();
-			var rows = divkids(nodes[this.page]);
-			for(var i=0,l=rows.length,t=this.pageTop,h; i<l; i++){
-				h = rows[i].offsetHeight;
-				t += h;
-				if(t >= inScrollTop){
-					this.offset = h - (t - inScrollTop);
-					return i + this.page * this.rowsPerPage;
-				}
-			}
-			return -1;
-		},
-		findScrollTop: function(inRow){
-			var rowPage = Math.floor(inRow / this.rowsPerPage);
-			var t = 0;
-			for(var i=0; i<rowPage; i++){
-				t += this.getPageHeight(i);
-			}
-			this.pageTop = t;
-			this.needPage(rowPage, this.pageTop);
-
-			var nodes = this.getDefaultNodes();
-			var rows = divkids(nodes[rowPage]);
-			var r = inRow - this.rowsPerPage * rowPage;
-			for(var i=0,l=rows.length; i<l && i<r; i++){
-				t += rows[i].offsetHeight;
-			}
-			return t;
-		},
-		dummy: 0
-	});
-})();
-
-}
-
-if(!dojo._hasResource["dojox.grid.cells._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid.cells._base"] = true;
-dojo.provide("dojox.grid.cells._base");
-
-
-
-(function(){
-	var focusSelectNode = function(inNode){
-		try{
-			dojox.grid.util.fire(inNode, "focus");
-			dojox.grid.util.fire(inNode, "select");
-		}catch(e){// IE sux bad
-		}
-	};
-	
-	var whenIdle = function(/*inContext, inMethod, args ...*/){
-		setTimeout(dojo.hitch.apply(dojo, arguments), 0);
-	};
-
-	var dgc = dojox.grid.cells;
-
-	dojo.declare("dojox.grid.cells._Base", null, {
-		// summary:
-		//	Respresents a grid cell and contains information about column options and methods
-		//	for retrieving cell related information.
-		//	Each column in a grid layout has a cell object and most events and many methods
-		//	provide access to these objects.
-		styles: '',
-		classes: '',
-		editable: false,
-		alwaysEditing: false,
-		formatter: null,
-		defaultValue: '...',
-		value: null,
-		hidden: false,
-		noresize: false,
-		//private
-		_valueProp: "value",
-		_formatPending: false,
-
-		constructor: function(inProps){
-			this._props = inProps || {};
-			dojo.mixin(this, inProps);
-		},
-
-		// data source
-		format: function(inRowIndex, inItem){
-			// summary:
-			//	provides the html for a given grid cell.
-			// inRowIndex: int
-			// grid row index
-			// returns: html for a given grid cell
-			var f, i=this.grid.edit.info, d=this.get ? this.get(inRowIndex, inItem) : (this.value || this.defaultValue);
-			if(this.editable && (this.alwaysEditing || (i.rowIndex==inRowIndex && i.cell==this))){
-				return this.formatEditing(d, inRowIndex);
-			}else{
-				var v = (d != this.defaultValue && (f = this.formatter)) ? f.call(this, d, inRowIndex) : d;
-				return (typeof v == "undefined" ? this.defaultValue : v);
-			}
-		},
-		formatEditing: function(inDatum, inRowIndex){
-			// summary:
-			//	formats the cell for editing
-			// inDatum: anything
-			//	cell data to edit
-			// inRowIndex: int
-			//	grid row index
-			// returns: string of html to place in grid cell
-		},
-		// utility
-		getNode: function(inRowIndex){
-			// summary:
-			//	gets the dom node for a given grid cell.
-			// inRowIndex: int
-			// grid row index
-			// returns: dom node for a given grid cell
-			return this.view.getCellNode(inRowIndex, this.index);
-		},
-		getHeaderNode: function(){
-			return this.view.getHeaderCellNode(this.index);
-		},
-		getEditNode: function(inRowIndex){
-			return (this.getNode(inRowIndex) || 0).firstChild || 0;
-		},
-		canResize: function(){
-			var uw = this.unitWidth;
-			return uw && (uw=='auto');
-		},
-		isFlex: function(){
-			var uw = this.unitWidth;
-			return uw && dojo.isString(uw) && (uw=='auto' || uw.slice(-1)=='%');
-		},
-		// edit support
-		applyEdit: function(inValue, inRowIndex){
-			this.grid.edit.applyCellEdit(inValue, this, inRowIndex);
-		},
-		cancelEdit: function(inRowIndex){
-			this.grid.doCancelEdit(inRowIndex);
-		},
-		_onEditBlur: function(inRowIndex){
-			if(this.grid.edit.isEditCell(inRowIndex, this.index)){
-				//
-				this.grid.edit.apply();
-			}
-		},
-		registerOnBlur: function(inNode, inRowIndex){
-			if(this.commitOnBlur){
-				dojo.connect(inNode, "onblur", function(e){
-					// hack: if editor still thinks this editor is current some ms after it blurs, assume we've focused away from grid
-					setTimeout(dojo.hitch(this, "_onEditBlur", inRowIndex), 250);
-				});
-			}
-		},
-		//protected
-		needFormatNode: function(inDatum, inRowIndex){
-			this._formatPending = true;
-			whenIdle(this, "_formatNode", inDatum, inRowIndex);
-		},
-		cancelFormatNode: function(){
-			this._formatPending = false;
-		},
-		//private
-		_formatNode: function(inDatum, inRowIndex){
-			if(this._formatPending){
-				this._formatPending = false;
-				// make cell selectable
-				dojo.setSelectable(this.grid.domNode, true);
-				this.formatNode(this.getEditNode(inRowIndex), inDatum, inRowIndex);
-			}
-		},
-		//protected
-		formatNode: function(inNode, inDatum, inRowIndex){
-			// summary:
-			//	format the editing dom node. Use when editor is a widget.
-			// inNode: dom node
-			// dom node for the editor
-			// inDatum: anything
-			//	cell data to edit
-			// inRowIndex: int
-			//	grid row index
-			if(dojo.isIE){
-				// IE sux bad
-				whenIdle(this, "focus", inRowIndex, inNode);
-			}else{
-				this.focus(inRowIndex, inNode);
-			}
-		},
-		dispatchEvent: function(m, e){
-			if(m in this){
-				return this[m](e);
-			}
-		},
-		//public
-		getValue: function(inRowIndex){
-			// summary:
-			//	returns value entered into editor
-			// inRowIndex: int
-			// grid row index
-			// returns:
-			//	value of editor
-			return this.getEditNode(inRowIndex)[this._valueProp];
-		},
-		setValue: function(inRowIndex, inValue){
-			// summary:
-			//	set the value of the grid editor
-			// inRowIndex: int
-			// grid row index
-			// inValue: anything
-			//	value of editor
-			var n = this.getEditNode(inRowIndex);
-			if(n){
-				n[this._valueProp] = inValue
-			};
-		},
-		focus: function(inRowIndex, inNode){
-			// summary:
-			//	focus the grid editor
-			// inRowIndex: int
-			// grid row index
-			// inNode: dom node
-			//	editor node
-			focusSelectNode(inNode || this.getEditNode(inRowIndex));
-		},
-		save: function(inRowIndex){
-			// summary:
-			//	save editor state
-			// inRowIndex: int
-			// grid row index
-			this.value = this.value || this.getValue(inRowIndex);
-			//
-		},
-		restore: function(inRowIndex){
-			// summary:
-			//	restore editor state
-			// inRowIndex: int
-			// grid row index
-			this.setValue(inRowIndex, this.value);
-			//
-		},
-		//protected
-		_finish: function(inRowIndex){
-			// summary:
-			//	called when editing is completed to clean up editor
-			// inRowIndex: int
-			// grid row index
-			dojo.setSelectable(this.grid.domNode, false);
-			this.cancelFormatNode();
-		},
-		//public
-		apply: function(inRowIndex){
-			// summary:
-			//	apply edit from cell editor
-			// inRowIndex: int
-			// grid row index
-			this.applyEdit(this.getValue(inRowIndex), inRowIndex);
-			this._finish(inRowIndex);
-		},
-		cancel: function(inRowIndex){
-			// summary:
-			//	cancel cell edit
-			// inRowIndex: int
-			// grid row index
-			this.cancelEdit(inRowIndex);
-			this._finish(inRowIndex);
-		}
-	});
-	dgc._Base.markupFactory = function(node, cellDef){
-		var d = dojo;
-		var formatter = d.trim(d.attr(node, "formatter")||"");
-		if(formatter){
-			cellDef.formatter = dojo.getObject(formatter);
-		}
-		var get = d.trim(d.attr(node, "get")||"");
-		if(get){
-			cellDef.get = dojo.getObject(get);
-		}
-		var getBoolAttr = function(attr){
-			var value = d.trim(d.attr(node, attr)||"");
-			return value ? !(value.toLowerCase()=="false") : undefined;
-		}
-		cellDef.sortDesc = getBoolAttr("sortDesc");
-		cellDef.editable = getBoolAttr("editable");
-		cellDef.alwaysEditing = getBoolAttr("alwaysEditing");
-		cellDef.noresize = getBoolAttr("noresize");
-
-		var value = d.trim(d.attr(node, "loadingText")||d.attr(node, "defaultValue")||"");
-		if(value){
-			cellDef.defaultValue = value;
-		}
-
-		var getStrAttr = function(attr){
-			return d.trim(d.attr(node, attr)||"")||undefined;
-		};
-		cellDef.styles = getStrAttr("styles");
-		cellDef.headerStyles = getStrAttr("headerStyles");
-		cellDef.cellStyles = getStrAttr("cellStyles");
-		cellDef.classes = getStrAttr("classes");
-		cellDef.headerClasses = getStrAttr("headerClasses");
-		cellDef.cellClasses = getStrAttr("cellClasses");
-	}
-
-	dojo.declare("dojox.grid.cells.Cell", dgc._Base, {
-		// summary
-		// grid cell that provides a standard text input box upon editing
-		constructor: function(){
-			this.keyFilter = this.keyFilter;
-		},
-		// keyFilter: RegExp
-		//		optional regex for disallowing keypresses
-		keyFilter: null,
-		formatEditing: function(inDatum, inRowIndex){
-			this.needFormatNode(inDatum, inRowIndex);
-			return '<input class="dojoxGridInput" type="text" value="' + inDatum + '">';
-		},
-		formatNode: function(inNode, inDatum, inRowIndex){
-			this.inherited(arguments);
-			// FIXME: feels too specific for this interface
-			this.registerOnBlur(inNode, inRowIndex);
-		},
-		doKey: function(e){
-			if(this.keyFilter){
-				var key = String.fromCharCode(e.charCode);
-				if(key.search(this.keyFilter) == -1){
-					dojo.stopEvent(e);
-				}
-			}
-		},
-		_finish: function(inRowIndex){
-			this.inherited(arguments);
-			var n = this.getEditNode(inRowIndex);
-			try{
-				dojox.grid.util.fire(n, "blur");
-			}catch(e){}
-		}
-	});
-	dgc.Cell.markupFactory = function(node, cellDef){
-		dgc._Base.markupFactory(node, cellDef);
-		var d = dojo;
-		var keyFilter = d.trim(d.attr(node, "keyFilter")||"");
-		if(keyFilter){
-			cellDef.keyFilter = new RegExp(keyFilter);
-		}
-	}
-
-	dojo.declare("dojox.grid.cells.RowIndex", dgc.Cell, {
-		name: 'Row',
-
-		postscript: function(){
-			this.editable = false;
-		},
-		get: function(inRowIndex){
-			return inRowIndex + 1;
-		}
-	});
-	dgc.RowIndex.markupFactory = function(node, cellDef){
-		dgc.Cell.markupFactory(node, cellDef);
-	}
-
-	dojo.declare("dojox.grid.cells.Select", dgc.Cell, {
-		// summary:
-		// grid cell that provides a standard select for editing
-
-		// options: Array
-		// 		text of each item
-		options: null,
-
-		// values: Array
-		//		value for each item
-		values: null,
-
-		// returnIndex: Integer
-		// 		editor returns only the index of the selected option and not the value
-		returnIndex: -1,
-
-		constructor: function(inCell){
-			this.values = this.values || this.options;
-		},
-		formatEditing: function(inDatum, inRowIndex){
-			this.needFormatNode(inDatum, inRowIndex);
-			var h = [ '<select class="dojoxGridSelect">' ];
-			for (var i=0, o, v; ((o=this.options[i]) !== undefined)&&((v=this.values[i]) !== undefined); i++){
-				h.push("<option", (inDatum==v ? ' selected' : ''), ' value="' + v + '"', ">", o, "</option>");
-			}
-			h.push('</select>');
-			return h.join('');
-		},
-		getValue: function(inRowIndex){
-			var n = this.getEditNode(inRowIndex);
-			if(n){
-				var i = n.selectedIndex, o = n.options[i];
-				return this.returnIndex > -1 ? i : o.value || o.innerHTML;
-			}
-		}
-	});
-	dgc.Select.markupFactory = function(node, cell){
-		dgc.Cell.markupFactory(node, cell);
-		var d=dojo;
-		var options = d.trim(d.attr(node, "options")||"");
-		if(options){
-			var o = options.split(',');
-			if(o[0] != options){
-				cell.options = o;
-			}
-		}
-		var values = d.trim(d.attr(node, "values")||"");
-		if(values){
-			var v = values.split(',');
-			if(v[0] != values){
-				cell.values = v;
-			}
-		}
-	}
-
-	dojo.declare("dojox.grid.cells.AlwaysEdit", dgc.Cell, {
-		// summary:
-		// grid cell that is always in an editable state, regardless of grid editing state
-		alwaysEditing: true,
-		_formatNode: function(inDatum, inRowIndex){
-			this.formatNode(this.getEditNode(inRowIndex), inDatum, inRowIndex);
-		},
-		applyStaticValue: function(inRowIndex){
-			var e = this.grid.edit;
-			e.applyCellEdit(this.getValue(inRowIndex), this, inRowIndex);
-			e.start(this, inRowIndex, true);
-		}
-	});
-	dgc.AlwaysEdit.markupFactory = function(node, cell){
-		dgc.Cell.markupFactory(node, cell);
-	}
-
-	dojo.declare("dojox.grid.cells.Bool", dgc.AlwaysEdit, {
-		// summary:
-		// grid cell that provides a standard checkbox that is always on for editing
-		_valueProp: "checked",
-		formatEditing: function(inDatum, inRowIndex){
-			return '<input class="dojoxGridInput" type="checkbox"' + (inDatum ? ' checked="checked"' : '') + ' style="width: auto" />';
-		},
-		doclick: function(e){
-			if(e.target.tagName == 'INPUT'){
-				this.applyStaticValue(e.rowIndex);
-			}
-		}
-	});
-	dgc.Bool.markupFactory = function(node, cell){
-		dgc.AlwaysEdit.markupFactory(node, cell);
-	}
-})();
-
-}
-
-if(!dojo._hasResource["dojox.grid.cells"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid.cells"] = true;
-dojo.provide("dojox.grid.cells");
-
-
-}
-
-if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.common"] = true;
-dojo.provide("dojo.dnd.common");
-
-dojo.dnd._isMac = navigator.appVersion.indexOf("Macintosh") >= 0;
-dojo.dnd._copyKey = dojo.dnd._isMac ? "metaKey" : "ctrlKey";
-
-dojo.dnd.getCopyKeyState = function(e) {
-	// summary: abstracts away the difference between selection on Mac and PC,
-	//	and returns the state of the "copy" key to be pressed.
-	// e: Event: mouse event
-	return e[dojo.dnd._copyKey];	// Boolean
-};
-
-dojo.dnd._uniqueId = 0;
-dojo.dnd.getUniqueId = function(){
-	// summary: returns a unique string for use with any DOM element
-	var id;
-	do{
-		id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
-	}while(dojo.byId(id));
-	return id;
-};
-
-dojo.dnd._empty = {};
-
-dojo.dnd.isFormElement = function(/*Event*/ e){
-	// summary: returns true, if user clicked on a form element
-	var t = e.target;
-	if(t.nodeType == 3 /*TEXT_NODE*/){
-		t = t.parentNode;
-	}
-	return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0;	// Boolean
-};
-
-// doesn't take into account when multiple buttons are pressed
-dojo.dnd._lmb = dojo.isIE ? 1 : 0;	// left mouse button
-
-dojo.dnd._isLmbPressed = dojo.isIE ?
-	function(e){ return e.button & 1; } : // intentional bit-and
-	function(e){ return e.button === 0; };
-
-}
-
-if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.autoscroll"] = true;
-dojo.provide("dojo.dnd.autoscroll");
-
-dojo.dnd.getViewport = function(){
-	// summary: returns a viewport size (visible part of the window)
-
-	// FIXME: need more docs!!
-	var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
-	if(dojo.isMozilla){
-		return {w: dd.clientWidth, h: w.innerHeight};	// Object
-	}else if(!dojo.isOpera && w.innerWidth){
-		return {w: w.innerWidth, h: w.innerHeight};		// Object
-	}else if (!dojo.isOpera && dd && dd.clientWidth){
-		return {w: dd.clientWidth, h: dd.clientHeight};	// Object
-	}else if (b.clientWidth){
-		return {w: b.clientWidth, h: b.clientHeight};	// Object
-	}
-	return null;	// Object
-};
-
-dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
-dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
-
-dojo.dnd.V_AUTOSCROLL_VALUE = 16;
-dojo.dnd.H_AUTOSCROLL_VALUE = 16;
-
-dojo.dnd.autoScroll = function(e){
-	// summary:
-	//		a handler for onmousemove event, which scrolls the window, if
-	//		necesary
-	// e: Event:
-	//		onmousemove event
-
-	// FIXME: needs more docs!
-	var v = dojo.dnd.getViewport(), dx = 0, dy = 0;
-	if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
-		dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
-	}else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
-		dx = dojo.dnd.H_AUTOSCROLL_VALUE;
-	}
-	if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
-		dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
-	}else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
-		dy = dojo.dnd.V_AUTOSCROLL_VALUE;
-	}
-	window.scrollBy(dx, dy);
-};
-
-dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
-dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
-
-dojo.dnd.autoScrollNodes = function(e){
-	// summary:
-	//		a handler for onmousemove event, which scrolls the first avaialble
-	//		Dom element, it falls back to dojo.dnd.autoScroll()
-	// e: Event:
-	//		onmousemove event
-
-	// FIXME: needs more docs!
-	for(var n = e.target; n;){
-		if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
-			var s = dojo.getComputedStyle(n);
-			if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){
-				var b = dojo._getContentBox(n, s), t = dojo._abs(n, true);
-				//
-				var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2), 
-					h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
-					rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0;
-				if(dojo.isWebKit || dojo.isOpera){
-					// FIXME: this code should not be here, it should be taken into account 
-					// either by the event fixing code, or the dojo._abs()
-					// FIXME: this code doesn't work on Opera 9.5 Beta
-					rx += dojo.body().scrollLeft, ry += dojo.body().scrollTop;
-				}
-				if(rx > 0 && rx < b.w){
-					if(rx < w){
-						dx = -w;
-					}else if(rx > b.w - w){
-						dx = w;
-					}
-				}
-				//
-				if(ry > 0 && ry < b.h){
-					if(ry < h){
-						dy = -h;
-					}else if(ry > b.h - h){
-						dy = h;
-					}
-				}
-				var oldLeft = n.scrollLeft, oldTop = n.scrollTop;
-				n.scrollLeft = n.scrollLeft + dx;
-				n.scrollTop  = n.scrollTop  + dy;
-				if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; }
-			}
-		}
-		try{
-			n = n.parentNode;
-		}catch(x){
-			n = null;
-		}
-	}
-	dojo.dnd.autoScroll(e);
-};
-
-}
-
-if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Mover"] = true;
-dojo.provide("dojo.dnd.Mover");
-
-
-
-
-dojo.declare("dojo.dnd.Mover", null, {
-	constructor: function(node, e, host){
-		// summary: an object, which makes a node follow the mouse, 
-		//	used as a default mover, and as a base class for custom movers
-		// node: Node: a node (or node's id) to be moved
-		// e: Event: a mouse event, which started the move;
-		//	only pageX and pageY properties are used
-		// host: Object?: object which implements the functionality of the move,
-		//	 and defines proper events (onMoveStart and onMoveStop)
-		this.node = dojo.byId(node);
-		this.marginBox = {l: e.pageX, t: e.pageY};
-		this.mouseButton = e.button;
-		var h = this.host = host, d = node.ownerDocument, 
-			firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
-		this.events = [
-			dojo.connect(d, "onmousemove", this, "onMouseMove"),
-			dojo.connect(d, "onmouseup",   this, "onMouseUp"),
-			// cancel text selection and text dragging
-			dojo.connect(d, "ondragstart",   dojo.stopEvent),
-			dojo.connect(d.body, "onselectstart", dojo.stopEvent),
-			firstEvent
-		];
-		// notify that the move has started
-		if(h && h.onMoveStart){
-			h.onMoveStart(this);
-		}
-	},
-	// mouse event processors
-	onMouseMove: function(e){
-		// summary: event processor for onmousemove
-		// e: Event: mouse event
-		dojo.dnd.autoScroll(e);
-		var m = this.marginBox;
-		this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY});
-		dojo.stopEvent(e);
-	},
-	onMouseUp: function(e){
-		if(dojo.isWebKit && dojo.dnd._isMac && this.mouseButton == 2 ? 
-				e.button == 0 : this.mouseButton == e.button){
-			this.destroy();
-		}
-		dojo.stopEvent(e);
-	},
-	// utilities
-	onFirstMove: function(){
-		// summary: makes the node absolute; it is meant to be called only once
-		var s = this.node.style, l, t, h = this.host;
-		switch(s.position){
-			case "relative":
-			case "absolute":
-				// assume that left and top values are in pixels already
-				l = Math.round(parseFloat(s.left));
-				t = Math.round(parseFloat(s.top));
-				break;
-			default:
-				s.position = "absolute";	// enforcing the absolute mode
-				var m = dojo.marginBox(this.node);
-				// event.pageX/pageY (which we used to generate the initial
-				// margin box) includes padding and margin set on the body.
-				// However, setting the node's position to absolute and then
-				// doing dojo.marginBox on it *doesn't* take that additional
-				// space into account - so we need to subtract the combined
-				// padding and margin.  We use getComputedStyle and
-				// _getMarginBox/_getContentBox to avoid the extra lookup of
-				// the computed style. 
-				var b = dojo.doc.body;
-				var bs = dojo.getComputedStyle(b);
-				var bm = dojo._getMarginBox(b, bs);
-				var bc = dojo._getContentBox(b, bs);
-				l = m.l - (bc.l - bm.l);
-				t = m.t - (bc.t - bm.t);
-				break;
-		}
-		this.marginBox.l = l - this.marginBox.l;
-		this.marginBox.t = t - this.marginBox.t;
-		if(h && h.onFirstMove){
-			h.onFirstMove(this);
-		}
-		dojo.disconnect(this.events.pop());
-	},
-	destroy: function(){
-		// summary: stops the move, deletes all references, so the object can be garbage-collected
-		dojo.forEach(this.events, dojo.disconnect);
-		// undo global settings
-		var h = this.host;
-		if(h && h.onMoveStop){
-			h.onMoveStop(this);
-		}
-		// destroy objects
-		this.events = this.node = this.host = null;
-	}
-});
-
-}
-
-if(!dojo._hasResource["dojo.dnd.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Moveable"] = true;
-dojo.provide("dojo.dnd.Moveable");
-
-
-
-dojo.declare("dojo.dnd.Moveable", null, {
-	// object attributes (for markup)
-	handle: "",
-	delay: 0,
-	skip: false,
-	
-	constructor: function(node, params){
-		// summary: an object, which makes a node moveable
-		// node: Node: a node (or node's id) to be moved
-		// params: Object: an optional object with additional parameters;
-		//	following parameters are recognized:
-		//		handle: Node: a node (or node's id), which is used as a mouse handle
-		//			if omitted, the node itself is used as a handle
-		//		delay: Number: delay move by this number of pixels
-		//		skip: Boolean: skip move of form elements
-		//		mover: Object: a constructor of custom Mover
-		this.node = dojo.byId(node);
-		if(!params){ params = {}; }
-		this.handle = params.handle ? dojo.byId(params.handle) : null;
-		if(!this.handle){ this.handle = this.node; }
-		this.delay = params.delay > 0 ? params.delay : 0;
-		this.skip  = params.skip;
-		this.mover = params.mover ? params.mover : dojo.dnd.Mover;
-		this.events = [
-			dojo.connect(this.handle, "onmousedown", this, "onMouseDown"),
-			// cancel text selection and text dragging
-			dojo.connect(this.handle, "ondragstart",   this, "onSelectStart"),
-			dojo.connect(this.handle, "onselectstart", this, "onSelectStart")
-		];
-	},
-
-	// markup methods
-	markupFactory: function(params, node){
-		return new dojo.dnd.Moveable(node, params);
-	},
-
-	// methods
-	destroy: function(){
-		// summary: stops watching for possible move, deletes all references, so the object can be garbage-collected
-		dojo.forEach(this.events, dojo.disconnect);
-		this.events = this.node = this.handle = null;
-	},
-	
-	// mouse event processors
-	onMouseDown: function(e){
-		// summary: event processor for onmousedown, creates a Mover for the node
-		// e: Event: mouse event
-		if(this.skip && dojo.dnd.isFormElement(e)){ return; }
-		if(this.delay){
-			this.events.push(
-				dojo.connect(this.handle, "onmousemove", this, "onMouseMove"),
-				dojo.connect(this.handle, "onmouseup", this, "onMouseUp")
-			);
-			this._lastX = e.pageX;
-			this._lastY = e.pageY;
-		}else{
-			this.onDragDetected(e);
-		}
-		dojo.stopEvent(e);
-	},
-	onMouseMove: function(e){
-		// summary: event processor for onmousemove, used only for delayed drags
-		// e: Event: mouse event
-		if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
-			this.onMouseUp(e);
-			this.onDragDetected(e);
-		}
-		dojo.stopEvent(e);
-	},
-	onMouseUp: function(e){
-		// summary: event processor for onmouseup, used only for delayed drags
-		// e: Event: mouse event
-		for(var i = 0; i < 2; ++i){
-			dojo.disconnect(this.events.pop());
-		}
-		dojo.stopEvent(e);
-	},
-	onSelectStart: function(e){
-		// summary: event processor for onselectevent and ondragevent
-		// e: Event: mouse event
-		if(!this.skip || !dojo.dnd.isFormElement(e)){
-			dojo.stopEvent(e);
-		}
-	},
-	
-	// local events
-	onDragDetected: function(/* Event */ e){
-		// summary: called when the drag is detected,
-		// responsible for creation of the mover
-		new this.mover(this.node, e, this);
-	},
-	onMoveStart: function(/* dojo.dnd.Mover */ mover){
-		// summary: called before every move operation
-		dojo.publish("/dnd/move/start", [mover]);
-		dojo.addClass(dojo.body(), "dojoMove"); 
-		dojo.addClass(this.node, "dojoMoveItem"); 
-	},
-	onMoveStop: function(/* dojo.dnd.Mover */ mover){
-		// summary: called after every move operation
-		dojo.publish("/dnd/move/stop", [mover]);
-		dojo.removeClass(dojo.body(), "dojoMove");
-		dojo.removeClass(this.node, "dojoMoveItem");
-	},
-	onFirstMove: function(/* dojo.dnd.Mover */ mover){
-		// summary: called during the very first move notification,
-		//	can be used to initialize coordinates, can be overwritten.
-		
-		// default implementation does nothing
-	},
-	onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
-		// summary: called during every move notification,
-		//	should actually move the node, can be overwritten.
-		this.onMoving(mover, leftTop);
-		var s = mover.node.style;
-		s.left = leftTop.l + "px";
-		s.top  = leftTop.t + "px";
-		this.onMoved(mover, leftTop);
-	},
-	onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
-		// summary: called before every incremental move,
-		//	can be overwritten.
-		
-		// default implementation does nothing
-	},
-	onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
-		// summary: called after every incremental move,
-		//	can be overwritten.
-		
-		// default implementation does nothing
-	}
-});
-
-}
-
-if(!dojo._hasResource["dojox.grid._Builder"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid._Builder"] = true;
-dojo.provide("dojox.grid._Builder");
-
-
-
-
-(function(){
-	var dg = dojox.grid;
-
-	var getTdIndex = function(td){
-		return td.cellIndex >=0 ? td.cellIndex : dojo.indexOf(td.parentNode.cells, td);
-	};
-	
-	var getTrIndex = function(tr){
-		return tr.rowIndex >=0 ? tr.rowIndex : dojo.indexOf(tr.parentNode.childNodes, tr);
-	};
-	
-	var getTr = function(rowOwner, index){
-		return rowOwner && ((rowOwner.rows||0)[index] || rowOwner.childNodes[index]);
-	};
-
-	var findTable = function(node){
-		for(var n=node; n && n.tagName!='TABLE'; n=n.parentNode);
-		return n;
-	};
-	
-	var ascendDom = function(inNode, inWhile){
-		for(var n=inNode; n && inWhile(n); n=n.parentNode);
-		return n;
-	};
-	
-	var makeNotTagName = function(inTagName){
-		var name = inTagName.toUpperCase();
-		return function(node){ return node.tagName != name; };
-	};
-
-	var rowIndexTag = dojox.grid.util.rowIndexTag;
-	var gridViewTag = dojox.grid.util.gridViewTag;
-
-	// base class for generating markup for the views
-	dg._Builder = dojo.extend(function(view){
-		if(view){
-			this.view = view;
-			this.grid = view.grid;
-		}
-	},{
-		view: null,
-		// boilerplate HTML
-		_table: '<table class="dojoxGridRowTable" border="0" cellspacing="0" cellpadding="0" role="wairole:presentation"',
-
-		// Returns the table variable as an array - and with the view width, if specified
-		getTableArray: function(){
-			var html = [this._table];
-			if(this.view.viewWidth){
-				html.push([' style="width:', this.view.viewWidth, ';"'].join(''));
-			}
-			html.push('>');
-			return html;
-		},
-		
-		// generate starting tags for a cell
-		generateCellMarkup: function(inCell, inMoreStyles, inMoreClasses, isHeader){
-			var result = [], html;
-			var waiPrefix = dojo.isFF<3 ? "wairole:" : "";
-			if(isHeader){
-				html = ['<th tabIndex="-1" role="', waiPrefix, 'columnheader"'];
-			}else{
-				html = ['<td tabIndex="-1" role="', waiPrefix, 'gridcell"'];
-			}
-			inCell.colSpan && html.push(' colspan="', inCell.colSpan, '"');
-			inCell.rowSpan && html.push(' rowspan="', inCell.rowSpan, '"');
-			html.push(' class="dojoxGridCell ');
-			inCell.classes && html.push(inCell.classes, ' ');
-			inMoreClasses && html.push(inMoreClasses, ' ');
-			// result[0] => td opener, style
-			result.push(html.join(''));
-			// SLOT: result[1] => td classes 
-			result.push('');
-			html = ['" idx="', inCell.index, '" style="'];
-			if(inMoreStyles && inMoreStyles[inMoreStyles.length-1] != ';'){
-				inMoreStyles += ';';
-			}
-			html.push(inCell.styles, inMoreStyles||'', inCell.hidden?'display:none;':'');
-			inCell.unitWidth && html.push('width:', inCell.unitWidth, ';');
-			// result[2] => markup
-			result.push(html.join(''));
-			// SLOT: result[3] => td style 
-			result.push('');
-			html = [ '"' ];
-			inCell.attrs && html.push(" ", inCell.attrs);
-			html.push('>');
-			// result[4] => td postfix
-			result.push(html.join(''));
-			// SLOT: result[5] => content
-			result.push('');
-			// result[6] => td closes
-			result.push('</td>');
-			return result; // Array
-		},
-
-		// cell finding
-		isCellNode: function(inNode){
-			return Boolean(inNode && inNode!=dojo.doc && dojo.attr(inNode, "idx"));
-		},
-		
-		getCellNodeIndex: function(inCellNode){
-			return inCellNode ? Number(dojo.attr(inCellNode, "idx")) : -1;
-		},
-		
-		getCellNode: function(inRowNode, inCellIndex){
-			for(var i=0, row; row=getTr(inRowNode.firstChild, i); i++){
-				for(var j=0, cell; cell=row.cells[j]; j++){
-					if(this.getCellNodeIndex(cell) == inCellIndex){
-						return cell;
-					}
-				}
-			}
-		},
-		
-		findCellTarget: function(inSourceNode, inTopNode){
-			var n = inSourceNode;
-			while(n && (!this.isCellNode(n) || (n.offsetParent && gridViewTag in n.offsetParent.parentNode && n.offsetParent.parentNode[gridViewTag] != this.view.id)) && (n!=inTopNode)){
-				n = n.parentNode;
-			}
-			return n!=inTopNode ? n : null 
-		},
-		
-		// event decoration
-		baseDecorateEvent: function(e){
-			e.dispatch = 'do' + e.type;
-			e.grid = this.grid;
-			e.sourceView = this.view;
-			e.cellNode = this.findCellTarget(e.target, e.rowNode);
-			e.cellIndex = this.getCellNodeIndex(e.cellNode);
-			e.cell = (e.cellIndex >= 0 ? this.grid.getCell(e.cellIndex) : null);
-		},
-		
-		// event dispatch
-		findTarget: function(inSource, inTag){
-			var n = inSource;
-			while(n && (n!=this.domNode) && (!(inTag in n) || (gridViewTag in n && n[gridViewTag] != this.view.id))){
-				n = n.parentNode;
-			}
-			return (n != this.domNode) ? n : null; 
-		},
-
-		findRowTarget: function(inSource){
-			return this.findTarget(inSource, rowIndexTag);
-		},
-
-		isIntraNodeEvent: function(e){
-			try{
-				return (e.cellNode && e.relatedTarget && dojo.isDescendant(e.relatedTarget, e.cellNode));
-			}catch(x){
-				// e.relatedTarget has permission problem in FF if it's an input: https://bugzilla.mozilla.org/show_bug.cgi?id=208427
-				return false;
-			}
-		},
-
-		isIntraRowEvent: function(e){
-			try{
-				var row = e.relatedTarget && this.findRowTarget(e.relatedTarget);
-				return !row && (e.rowIndex==-1) || row && (e.rowIndex==row.gridRowIndex);			
-			}catch(x){
-				// e.relatedTarget on INPUT has permission problem in FF: https://bugzilla.mozilla.org/show_bug.cgi?id=208427
-				return false;
-			}
-		},
-
-		dispatchEvent: function(e){
-			if(e.dispatch in this){
-				return this[e.dispatch](e);
-			}
-		},
-
-		// dispatched event handlers
-		domouseover: function(e){
-			if(e.cellNode && (e.cellNode!=this.lastOverCellNode)){
-				this.lastOverCellNode = e.cellNode;
-				this.grid.onMouseOver(e);
-			}
-			this.grid.onMouseOverRow(e);
-		},
-
-		domouseout: function(e){
-			if(e.cellNode && (e.cellNode==this.lastOverCellNode) && !this.isIntraNodeEvent(e, this.lastOverCellNode)){
-				this.lastOverCellNode = null;
-				this.grid.onMouseOut(e);
-				if(!this.isIntraRowEvent(e)){
-					this.grid.onMouseOutRow(e);
-				}
-			}
-		},
-		
-		domousedown: function(e){
-			if (e.cellNode)
-				this.grid.onMouseDown(e);
-			this.grid.onMouseDownRow(e)
-		}
-	});
-
-	// Produces html for grid data content. Owned by grid and used internally 
-	// for rendering data. Override to implement custom rendering.
-	dg._ContentBuilder = dojo.extend(function(view){
-		dg._Builder.call(this, view);
-	},dg._Builder.prototype,{
-		update: function(){
-			this.prepareHtml();
-		},
-
-		// cache html for rendering data rows
-		prepareHtml: function(){
-			var defaultGet=this.grid.get, cells=this.view.structure.cells;
-			for(var j=0, row; (row=cells[j]); j++){
-				for(var i=0, cell; (cell=row[i]); i++){
-					cell.get = cell.get || (cell.value == undefined) && defaultGet;
-					cell.markup = this.generateCellMarkup(cell, cell.cellStyles, cell.cellClasses, false);
-				}
-			}
-		},
-
-		// time critical: generate html using cache and data source
-		generateHtml: function(inDataIndex, inRowIndex){
-			var
-				html = this.getTableArray(),
-				v = this.view,
-				cells = v.structure.cells,
-				item = this.grid.getItem(inRowIndex);
-
-			dojox.grid.util.fire(this.view, "onBeforeRow", [inRowIndex, cells]);
-			for(var j=0, row; (row=cells[j]); j++){
-				if(row.hidden || row.header){
-					continue;
-				}
-				html.push(!row.invisible ? '<tr>' : '<tr class="dojoxGridInvisible">');
-				for(var i=0, cell, m, cc, cs; (cell=row[i]); i++){
-					m = cell.markup, cc = cell.customClasses = [], cs = cell.customStyles = [];
-					// content (format can fill in cc and cs as side-effects)
-					m[5] = cell.format(inRowIndex, item);
-					// classes
-					m[1] = cc.join(' ');
-					// styles
-					m[3] = cs.join(';');
-					// in-place concat
-					html.push.apply(html, m);
-				}
-				html.push('</tr>');
-			}
-			html.push('</table>');
-			return html.join(''); // String
-		},
-
-		decorateEvent: function(e){
-			e.rowNode = this.findRowTarget(e.target);
-			if(!e.rowNode){return false};
-			e.rowIndex = e.rowNode[rowIndexTag];
-			this.baseDecorateEvent(e);
-			e.cell = this.grid.getCell(e.cellIndex);
-			return true; // Boolean
-		}
-	});
-
-	// Produces html for grid header content. Owned by grid and used internally 
-	// for rendering data. Override to implement custom rendering.
-	dg._HeaderBuilder = dojo.extend(function(view){
-		this.moveable = null;
-		dg._Builder.call(this, view);
-	},dg._Builder.prototype,{
-		_skipBogusClicks: false,
-		overResizeWidth: 4,
-		minColWidth: 1,
-		
-		update: function(){
-			if(this.tableMap){
-				this.tableMap.mapRows(this.view.structure.cells);
-			}else{
-				this.tableMap = new dg._TableMap(this.view.structure.cells);
-			}
-		},
-
-		generateHtml: function(inGetValue, inValue){
-			var html = this.getTableArray(), cells = this.view.s

<TRUNCATED>