docs: function ExplorerNavHandler(explorer, navDict, options) {
  		this.explorer = explorer;
  		this.model = this.explorer.model;
  		this._navDict = navDict;
  		
  		this._listeners = [];
  		this._selections = [];
  
  		this._currentColumn = 0;
  		var parentDiv = this._getEventListeningDiv();
  		this._parentDiv = parentDiv;
  		parentDiv.tabIndex = 0;
  		parentDiv.classList.add("selectionModelContainer"); //$NON-NLS-0$
  		var self = this;
  		this._modelIterator = new mTreeModelIterator.TreeModelIterator([], {
  			isExpanded: this.isExpanded.bind(this),		
  			getChildrenFunc: options.getChildrenFunc,
  			isExpandable: this.explorer.renderer.isExpandable ? 
  				function(model) { return self.explorer.renderer.isExpandable(model); } : 
  				function(model) { return self.isExpandable(model); },
  			forceExpandFunc: this.explorer.forceExpandFunc ? 
  				function(modelToExpand, childPosition, callback) {
  					return self.explorer.forceExpandFunc(modelToExpand, childPosition, callback);
  				} : undefined
  		});
  		this._init(options);
  		
  		var keyListener = function (e) { 
  			if(UiUtils.isFormElement(e.target)) {
  				// Not for us
  				return true;
  			}
  			if(self.explorer.preventDefaultFunc && self.explorer.preventDefaultFunc(e, self._modelIterator.cursor())){
  				return true;
  			}
  			if(e.keyCode === lib.KEY.DOWN) {
  				return self.onDownArrow(e);
  			} else if(e.keyCode === lib.KEY.UP) {
  				return self.onUpArrow(e);
  			} else if(e.keyCode === lib.KEY.RIGHT) {
  				return self.onRightArrow(e);
  			} else if(e.keyCode === lib.KEY.LEFT) {
  				return self.onLeftArrow(e);
  			} else if(e.keyCode === lib.KEY.SPACE) {
  				return self.onSpace(e);
  			} else if(e.keyCode === lib.KEY.ENTER) {
  				return self.onEnter(e);
  			} else if (e.keyCode === lib.KEY.TAB && e.shiftKey) {
  				if (document.activeElement.classList.contains("treeTableRow")) {
  					parentDiv.tabIndex = -1;
  				}
  			}
  		};
  		parentDiv.addEventListener("keydown", keyListener, false); //$NON-NLS-0$
  		this._listeners.push({type: "keydown", listener: keyListener}); //$NON-NLS-0$
  		var mouseListener = function (e) {
  			if(UiUtils.isFormElement(e.target)) {
  				// Not for us
  				return true;
  			}
  			if (e.shiftKey && self._shiftSelectionAnchor) {
  				lib.stop(e);
  			}
  		};
  		parentDiv.addEventListener("mousedown", mouseListener, false); //$NON-NLS-0$
  		this._listeners.push({type: "mousedown", listener: mouseListener}); //$NON-NLS-0$
  		var offsetParent = lib.getOffsetParent(this._parentDiv);
  		var scrollListener = function() {
  			self._scrollTop = offsetParent ? offsetParent.scrollTop : 0;
  		};
  		offsetParent.addEventListener("scroll", scrollListener);
  		this._listeners.push({type: "scroll", listener: scrollListener}); //$NON-NLS-0$
  		var l1 = this._blurListener = function (e) { 
  			self.toggleCursor(null, false, e);
  			if(self.explorer.onFocus){
  				self.explorer.onFocus(false);
  			}
  		};
  		parentDiv.addEventListener("blur", l1, false); //$NON-NLS-0$
  		this._listeners.push({type: "blur", listener: l1}); //$NON-NLS-0$
  		var l2 = this._focusListener = function (e) {
  			offsetParent.scrollTop = self._scrollTop;
  			self.toggleCursor(null, true, e);
  			if(self.explorer.onFocus){
  				self.explorer.onFocus(true);
  			}
  		};
  		parentDiv.addEventListener("focus", l2, false); //$NON-NLS-0$
  		this._listeners.push({type: "focus", listener: l2}); //$NON-NLS-0$
  		if(!options || options.setFocus !== false){
  			this.focus();
  		}
  	}