text: //>>built
  define("dojox/grid/enhanced/_Events", [
  	"dojo/_base/kernel",
  	"dojo/_base/declare",
  	"dojo/keys",
  	"dojo/_base/html",
  	"dojo/_base/event",
  	"dojox/grid/_Events"
  ], function(dojo, declare, keys, html, event, _Events){
  
  return declare("dojox.grid.enhanced._Events", null, {
  	// summary:
  	//		Overwrite some default events of DataGrid
  	//
  	// description:
  	//		Methods are copied or replaced for overwriting, this might be refined once
  	//		an overall plugin architecture is set up for DataGrid.
  
  	//_events: Object
  	//		Method map cached from dojox.grid._Events().
  	_events: null,
  
  	// headerCellActiveClass: String
  	//		css class to apply to grid header cells when activated(mouse down)
  	headerCellActiveClass: 'dojoxGridHeaderActive',
  	
  	// cellActiveClass: String
  	//		css class to apply to grid content cells when activated(mouse down)
  	cellActiveClass: 'dojoxGridCellActive',
  	
  	// rowActiveClass: String
  	//		css class to apply to grid rows when activated(mouse down)
  	rowActiveClass: 'dojoxGridRowActive',
  
  	constructor: function(inGrid){
  		//TODO - extend dojox.grid._Events rather than mixin for 1.8
  		this._events = new _Events();
  		//mixin "this" to Grid
  		inGrid.mixin(inGrid, this);
  	},
  	dokeyup: function(e){
  		// summary:
  		//		Grid key up event handler.
  		// e: Event
  		//		Un-decorated event object
  		this.focus.currentArea().keyup(e);
  	},
  	onKeyDown: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onKeyDown();
  		if(e.altKey || e.metaKey){ return; }
  		var focus = this.focus;
  		var editing = this.edit.isEditing();
  		switch(e.keyCode){
  			case keys.TAB:
  				if(e.ctrlKey){ return; }
  				focus.tab(e.shiftKey ? -1:1,e);
  				break;
  			case keys.UP_ARROW:
  			case keys.DOWN_ARROW:
  				if(editing){ return; }
  				focus.currentArea().move(e.keyCode == keys.UP_ARROW ? -1 : 1, 0, e);
  				break;
  			case keys.LEFT_ARROW:
  			case keys.RIGHT_ARROW:
  				if(editing){ return; }
  				var offset = (e.keyCode == keys.LEFT_ARROW) ? 1 : -1;
  				if(html._isBodyLtr()){ offset *= -1; }
  				focus.currentArea().move(0, offset, e);
  				break;
  			case keys.F10:
  				if(this.menus && e.shiftKey){
  					this.onRowContextMenu(e);
  				}
  				break;
  			default:
  				focus.currentArea().keydown(e);
  				break;
  		}
  	},
  	//TODO - make the following events more reasonalble - e.g. more accurate conditions
  	//events for row selectors
  	domouseup: function(e){
  		if(e.cellNode){
  			this.onMouseUp(e);
  		}else{
  			this.onRowSelectorMouseUp(e);
  		}
  	},
  	domousedown: function(e){
  		if(!e.cellNode){
  			this.onRowSelectorMouseDown(e);
  		}
  	},
  	onMouseUp: function(e){
  		// summary:
  		//		New - Event fired when mouse is up inside grid.
  		// e: Event
  		//		Decorated event object that contains reference to grid, cell, and rowIndex
  		this[e.rowIndex == -1 ? "onHeaderCellMouseUp" : "onCellMouseUp"](e);
  	},
  	onCellMouseDown: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onCellMouseDown()
  		html.addClass(e.cellNode, this.cellActiveClass);
  		html.addClass(e.rowNode, this.rowActiveClass);
  	},
  	onCellMouseUp: function(e){
  		// summary:
  		//		New - Event fired when mouse is up inside content cell.
  		// e: Event
  		//		Decorated event object that contains reference to grid, cell, and rowIndex
  		html.removeClass(e.cellNode, this.cellActiveClass);
  		html.removeClass(e.rowNode, this.rowActiveClass);
  	},
  	onCellClick: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onCellClick()
  
  		//invoke dojox.grid._Events.onCellClick()
  		this._events.onCellClick.call(this, e);
  		//move mouse events to the focus manager.
  		this.focus.contentMouseEvent(e);//TODO
  	},
  	onCellDblClick: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onCellDblClick()
  		if(this.pluginMgr.isFixedCell(e.cell)){ return; }
  		if(this._click.length > 1 && (!this._click[0] || !this._click[1])){
  			this._click[0] = this._click[1] = e;
  		}
  		//invoke dojox.grid._Events.onCellDblClick()
  		this._events.onCellDblClick.call(this, e);
  	},
  	onRowClick: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onRowClick()
  		this.edit.rowClick(e);
  		if(!e.cell || !this.plugin('indirectSelection')){
  			this.selection.clickSelectEvent(e);
  		}
  	},
  	onRowContextMenu: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onRowContextMenu()
  		if(!this.edit.isEditing() && this.menus){
  			this.showMenu(e);
  		}
  	},
  	onSelectedRegionContextMenu: function(e){
  		// summary:
  		//		New - Event fired when a selected region context menu is accessed via mouse right click.
  		// e: Event
  		//		Decorated event object which contains reference to grid and info of selected
  		//		regions(selection type - row|column, selected index - [...])
  		if(this.selectedRegionMenu){
  			this.selectedRegionMenu._openMyself({
  				target: e.target,
  				coords: e.keyCode !== keys.F10 && "pageX" in e ? {
  					x: e.pageX,
  					y: e.pageY
  				} : null
  			});
  			event.stop(e);
  		}
  	},
  	onHeaderCellMouseOut: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onHeaderCellMouseOut()
  		if(e.cellNode){
  			html.removeClass(e.cellNode, this.cellOverClass);
  			html.removeClass(e.cellNode, this.headerCellActiveClass);
  		}
  	},
  	onHeaderCellMouseDown: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onHeaderCellMouseDown()
  		if(e.cellNode){//TBD - apply to selection region for nested sorting?
  			html.addClass(e.cellNode, this.headerCellActiveClass);
  		}
  	},
  	onHeaderCellMouseUp: function(e){
  		// summary:
  		//		New event
  		if(e.cellNode){
  			html.removeClass(e.cellNode, this.headerCellActiveClass);
  		}
  	},
  	onHeaderCellClick: function(e){
  		// summary:
  		//		Overwritten, see dojox.grid._Events.onHeaderCellClick()
  		//move focus to header.
  		this.focus.currentArea("header");
  		//invoke dojox.grid._Events.onHeaderCellClick()
  		if(!e.cell.isRowSelector){
  			this._events.onHeaderCellClick.call(this, e);
  		}
  		//move mouse events to the focus manager.
  		this.focus.headerMouseEvent(e);
  	},
  	onRowSelectorMouseDown: function(e){
  		this.focus.focusArea("rowHeader", e);
  	},
  	
  	onRowSelectorMouseUp: function(e){},
  	
  	//triggered in _View, see Selector plugin
  	onMouseUpRow: function(e){
  		if(e.rowIndex != -1){
  			this.onRowMouseUp(e);
  		}
  	},
  	onRowMouseUp: function(e){}
  });
  });