/* 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 */ if(!dojo._hasResource["dojox.grid._FocusManager"]){dojo._hasResource["dojox.grid._FocusManager"]=true;dojo.provide("dojox.grid._FocusManager");dojo.require("dojox.grid.util");dojo.declare("dojox.grid._FocusManager",null,{constructor:function(_1){this.grid=_1;this.cell=null;this.rowIndex=-1;this._connects=[];this.headerMenu=this.grid.headerMenu;this._connects.push(dojo.connect(this.grid.domNode,"onfocus",this,"doFocus"));this._connects.push(dojo.connect(this.grid.domNode,"onblur",this,"doBlur"));this._connects.push(dojo.connect(this.grid.domNode,"oncontextmenu",this,"doContextMenu"));this._connects.push(dojo.connect(this.grid.lastFocusNode,"onfocus",this,"doLastNodeFocus"));this._connects.push(dojo.connect(this.grid.lastFocusNode,"onblur",this,"doLastNodeBlur"));this._connects.push(dojo.connect(this.grid,"_onFetchComplete",this,"_delayedCellFocus"));this._connects.push(dojo.connect(this.grid,"postrender",this,"_delayedHeaderFocus"));},destroy:function(){dojo.forEach(this._connects,dojo.disconnect);delete this.grid;delete this.cell;},_colHeadNode:null,_colHeadFocusIdx:null,_contextMenuBindNode:null,tabbingOut:false,focusClass:"dojoxGridCellFocus",focusView:null,initFocusView:function(){this.focusView=this.grid.views.getFirstScrollingView()||this.focusView;this._initColumnHeaders();},isFocusCell:function(_2,_3){return (this.cell==_2)&&(this.rowIndex==_3);},isLastFocusCell:function(){if(this.cell){return (this.rowIndex==this.grid.rowCount-1)&&(this.cell.index==this.grid.layout.cellCount-1);}return false;},isFirstFocusCell:function(){if(this.cell){return (this.rowIndex===0)&&(this.cell.index===0);}return false;},isNoFocusCell:function(){return (this.rowIndex<0)||!this.cell;},isNavHeader:function(){return (!!this._colHeadNode);},getHeaderIndex:function(){if(this._colHeadNode){return dojo.indexOf(this._findHeaderCells(),this._colHeadNode);}else{return -1;}},_focusifyCellNode:function(_4){var n=this.cell&&this.cell.getNode(this.rowIndex);if(n){dojo.toggleClass(n,this.focusClass,_4);if(_4){var sl=this.scrollIntoView();try{if(!this.grid.edit.isEditing()){dojox.grid.util.fire(n,"focus");if(sl){this.cell.view.scrollboxNode.scrollLeft=sl;}}}catch(e){}}}},_delayedCellFocus:function(){if(this.isNavHeader()||!this.grid._focused){return;}var n=this.cell&&this.cell.getNode(this.rowIndex);if(n){try{if(!this.grid.edit.isEditing()){dojo.toggleClass(n,this.focusClass,true);this.blurHeader();dojox.grid.util.fire(n,"focus");}}catch(e){}}},_delayedHeaderFocus:function(){if(this.isNavHeader()){this.focusHeader();this.grid.domNode.focus();}},_initColumnHeaders:function(){var _5=this._findHeaderCells();for(var i=0;i<_5.length;i++){this._connects.push(dojo.connect(_5[i],"onfocus",this,"doColHeaderFocus"));this._connects.push(dojo.connect(_5[i],"onblur",this,"doColHeaderBlur"));}},_findHeaderCells:function(){var _6=dojo.query("th",this.grid.viewsHeaderNode);var _7=[];for(var i=0;i<_6.length;i++){var _8=_6[i];var _9=dojo.hasAttr(_8,"tabIndex");var _a=dojo.attr(_8,"tabIndex");if(_9&&_a<0){_7.push(_8);}}return _7;},_setActiveColHeader:function(_b,_c,_d){dojo.attr(this.grid.domNode,"aria-activedescendant",_b.id);if(_d!=null&&_d>=0&&_d!=_c){dojo.toggleClass(this._findHeaderCells()[_d],this.focusClass,false);}dojo.toggleClass(_b,this.focusClass,true);this._colHeadNode=_b;this._colHeadFocusIdx=_c;this._scrollHeader(this._colHeadFocusIdx);},scrollIntoView:function(){var _e=(this.cell?this._scrollInfo(this.cell):null);if(!_e||!_e.s){return null;}var rt=this.grid.scroller.findScrollTop(this.rowIndex);if(_e.n&&_e.sr){if(_e.n.offsetLeft+_e.n.offsetWidth>_e.sr.l+_e.sr.w){_e.s.scrollLeft=_e.n.offsetLeft+_e.n.offsetWidth-_e.sr.w;}else{if(_e.n.offsetLeft<_e.sr.l){_e.s.scrollLeft=_e.n.offsetLeft;}}}if(_e.r&&_e.sr){if(rt+_e.r.offsetHeight>_e.sr.t+_e.sr.h){this.grid.setScrollTop(rt+_e.r.offsetHeight-_e.sr.h);}else{if(rt<_e.sr.t){this.grid.setScrollTop(rt);}}}return _e.s.scrollLeft;},_scrollInfo:function(_f,_10){if(_f){var cl=_f,sbn=cl.view.scrollboxNode,_11={w:sbn.clientWidth,l:sbn.scrollLeft,t:sbn.scrollTop,h:sbn.clientHeight},rn=cl.view.getRowNode(this.rowIndex);return {c:cl,s:sbn,sr:_11,n:(_10?_10:_f.getNode(this.rowIndex)),r:rn};}return null;},_scrollHeader:function(_12){var _13=null;if(this._colHeadNode){var _14=this.grid.getCell(_12);_13=this._scrollInfo(_14,_14.getNode(0));}if(_13&&_13.s&&_13.sr&&_13.n){var _15=_13.sr.l+_13.sr.w;if(_13.n.offsetLeft+_13.n.offsetWidth>_15){_13.s.scrollLeft=_13.n.offsetLeft+_13.n.offsetWidth-_13.sr.w;}else{if(_13.n.offsetLeft<_13.sr.l){_13.s.scrollLeft=_13.n.offsetLeft;}else{if(dojo.isIE<=7&&_14&&_14.view.headerNode){_14.view.headerNode.scrollLeft=_13.s.scrollLeft;}}}}},_isHeaderHidden:function(){var _16=this.focusView;if(!_16){for(var i=0,_17;(_17=this.grid.views.views[i]);i++){if(_17.headerNode){_16=_17;break;}}}return (_16&&dojo.getComputedStyle(_16.headerNode).display=="none");},colSizeAdjust:function(e,_18,_19){var _1a=this._findHeaderCells();var _1b=this.focusView;if(!_1b){for(var i=0,_1c;(_1c=this.grid.views.views[i]);i++){if(_1c.header.tableMap.map){_1b=_1c;break;}}}var _1d=_1a[_18];if(!_1b||(_18==_1a.length-1&&_18===0)){return;}_1b.content.baseDecorateEvent(e);e.cellNode=_1d;e.cellIndex=_1b.content.getCellNodeIndex(e.cellNode);e.cell=(e.cellIndex>=0?this.grid.getCell(e.cellIndex):null);if(_1b.header.canResize(e)){var _1e={l:_19};var _1f=_1b.header.colResizeSetup(e,false);_1b.header.doResizeColumn(_1f,null,_1e);_1b.update();}},styleRow:function(_20){return;},setFocusIndex:function(_21,_22){this.setFocusCell(this.grid.getCell(_22),_21);},setFocusCell:function(_23,_24){if(_23&&!this.isFocusCell(_23,_24)){this.tabbingOut=false;if(this._colHeadNode){this.blurHeader();}this._colHeadNode=this._colHeadFocusIdx=null;this.focusGridView();this._focusifyCellNode(false);this.cell=_23;this.rowIndex=_24;this._focusifyCellNode(true);}if(dojo.isOpera){setTimeout(dojo.hitch(this.grid,"onCellFocus",this.cell,this.rowIndex),1);}else{this.grid.onCellFocus(this.cell,this.rowIndex);}},next:function(){if(this.cell){var row=this.rowIndex,col=this.cell.index+1,cc=this.grid.layout.cellCount-1,rc=this.grid.rowCount-1;if(col>cc){col=0;row++;}if(row>rc){col=cc;row=rc;}if(this.grid.edit.isEditing()){var _25=this.grid.getCell(col);if(!this.isLastFocusCell()&&!_25.editable){this.cell=_25;this.rowIndex=row;this.next();return;}}this.setFocusIndex(row,col);}},previous:function(){if(this.cell){var row=(this.rowIndex||0),col=(this.cell.index||0)-1;if(col<0){col=this.grid.layout.cellCount-1;row--;}if(row<0){row=0;col=0;}if(this.grid.edit.isEditing()){var _26=this.grid.getCell(col);if(!this.isFirstFocusCell()&&!_26.editable){this.cell=_26;this.rowIndex=row;this.previous();return;}}this.setFocusIndex(row,col);}},move:function(_27,_28){var _29=_28<0?-1:1;if(this.isNavHeader()){var _2a=this._findHeaderCells();var _2b=currentIdx=dojo.indexOf(_2a,this._colHeadNode);currentIdx+=_28;while(currentIdx>=0&¤tIdx<_2a.length&&_2a[currentIdx].style.display=="none"){currentIdx+=_29;}if((currentIdx>=0)&&(currentIdx<_2a.length)){this._setActiveColHeader(_2a[currentIdx],currentIdx,_2b);}}else{if(this.cell){var sc=this.grid.scroller,r=this.rowIndex,rc=this.grid.rowCount-1,row=Math.min(rc,Math.max(0,r+_27));if(_27){if(_27>0){if(row>sc.getLastPageRow(sc.page)){this.grid.setScrollTop(this.grid.scrollTop+sc.findScrollTop(row)-sc.findScrollTop(r));}}else{if(_27<0){if(row<=sc.getPageRow(sc.page)){this.grid.setScrollTop(this.grid.scrollTop-sc.findScrollTop(r)-sc.findScrollTop(row));}}}}var cc=this.grid.layout.cellCount-1,i=this.cell.index,col=Math.min(cc,Math.max(0,i+_28));var _2c=this.grid.getCell(col);while(col>=0&&col=0&&this._colHeadFocusIdx<_34.length&&this._colHeadNode.style.display=="none"){this._colHeadFocusIdx++;this._colHeadNode=_34[this._colHeadFocusIdx];}if(this._colHeadNode&&this._colHeadNode.style.display!="none"){if(this.headerMenu&&this._contextMenuBindNode!=this.grid.domNode){this.headerMenu.unBindDomNode(this.grid.viewsHeaderNode);this.headerMenu.bindDomNode(this.grid.domNode);this._contextMenuBindNode=this.grid.domNode;}this._setActiveColHeader(this._colHeadNode,this._colHeadFocusIdx,_35);this._scrollHeader(this._colHeadFocusIdx);this._focusifyCellNode(false);}else{this.findAndFocusGridCell();}},blurHeader:function(){dojo.removeClass(this._colHeadNode,this.focusClass);dojo.removeAttr(this.grid.domNode,"aria-activedescendant");if(this.headerMenu&&this._contextMenuBindNode==this.grid.domNode){var _36=this.grid.viewsHeaderNode;this.headerMenu.unBindDomNode(this.grid.domNode);this.headerMenu.bindDomNode(_36);this._contextMenuBindNode=_36;}},doFocus:function(e){if(e&&e.target!=e.currentTarget){dojo.stopEvent(e);return;}if(!this.tabbingOut){this.focusHeader();}this.tabbingOut=false;dojo.stopEvent(e);},doBlur:function(e){dojo.stopEvent(e);},doContextMenu:function(e){if(!this.headerMenu){dojo.stopEvent(e);}},doLastNodeFocus:function(e){if(this.tabbingOut){this._focusifyCellNode(false);}else{if(this.grid.rowCount>0){if(this.isNoFocusCell()){this.setFocusIndex(0,0);}this._focusifyCellNode(true);}else{this.focusHeader();}}this.tabbingOut=false;dojo.stopEvent(e);},doLastNodeBlur:function(e){dojo.stopEvent(e);},doColHeaderFocus:function(e){this._setActiveColHeader(e.target,dojo.attr(e.target,"idx"),this._colHeadFocusIdx);this._scrollHeader(this.getHeaderIndex());dojo.stopEvent(e);},doColHeaderBlur:function(e){dojo.toggleClass(e.target,this.focusClass,false);}});}