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>

Reply via email to