if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dijit._base.manager"] = true; dojo.provide("dijit._base.manager"); dojo.declare("dijit.WidgetSet", null, { // summary: // A set of widgets indexed by id constructor: function(){ this._hash={}; }, add: function(/*Widget*/ widget){ if(this._hash[widget.id]){ throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered"); } this._hash[widget.id]=widget; }, remove: function(/*String*/ id){ delete this._hash[id]; }, forEach: function(/*Function*/ func){ for(var id in this._hash){ func(this._hash[id]); } }, filter: function(/*Function*/ filter){ var res = new dijit.WidgetSet(); this.forEach(function(widget){ if(filter(widget)){ res.add(widget); } }); return res; // dijit.WidgetSet }, byId: function(/*String*/ id){ return this._hash[id]; }, byClass: function(/*String*/ cls){ return this.filter(function(widget){ return widget.declaredClass==cls; }); // dijit.WidgetSet } }); /*===== dijit.registry = { // summary: A list of widgets on a page. // description: Is an instance of dijit.WidgetSet }; =====*/ dijit.registry = new dijit.WidgetSet(); dijit._widgetTypeCtr = {}; dijit.getUniqueId = function(/*String*/widgetType){ // summary // Generates a unique id for a given widgetType var id; do{ id = widgetType + "_" + (widgetType in dijit._widgetTypeCtr ? ++dijit._widgetTypeCtr[widgetType] : dijit._widgetTypeCtr[widgetType] = 0); }while(dijit.byId(id)); return id; // String }; if(dojo.isIE){ // Only run this for IE because we think it's only necessary in that case, // and because it causes problems on FF. See bug #3531 for details. dojo.addOnUnload(function(){ dijit.registry.forEach(function(widget){ widget.destroy(); }); }); } dijit.byId = function(/*String|Widget*/id){ // summary: // Returns a widget by its id, or if passed a widget, no-op (like dojo.byId()) return (dojo.isString(id)) ? dijit.registry.byId(id) : id; // Widget }; dijit.byNode = function(/* DOMNode */ node){ // summary: // Returns the widget as referenced by node return dijit.registry.byId(node.getAttribute("widgetId")); // Widget }; dijit.getEnclosingWidget = function(/* DOMNode */ node){ // summary: // Returns the widget whose dom tree contains node or null if // the node is not contained within the dom tree of any widget while(node){ if(node.getAttribute && node.getAttribute("widgetId")){ return dijit.registry.byId(node.getAttribute("widgetId")); } node = node.parentNode; } return null; }; // elements that are tab-navigable if they have no tabindex value set // (except for "a", which must have an href attribute) dijit._tabElements = { area: true, button: true, input: true, object: true, select: true, textarea: true }; dijit._isElementShown = function(/*Element*/elem){ var style = dojo.style(elem); return (style.visibility != "hidden") && (style.visibility != "collapsed") && (style.display != "none"); } dijit.isTabNavigable = function(/*Element*/elem){ // summary: // Tests if an element is tab-navigable if(dojo.hasAttr(elem, "disabled")){ return false; } var hasTabindex = dojo.hasAttr(elem, "tabindex"); var tabindex = dojo.attr(elem, "tabindex"); if(hasTabindex && tabindex >= 0) { return true; // boolean } var name = elem.nodeName.toLowerCase(); if(((name == "a" && dojo.hasAttr(elem, "href")) || dijit._tabElements[name]) && (!hasTabindex || tabindex >= 0)){ return true; // boolean } return false; // boolean }; dijit._getTabNavigable = function(/*DOMNode*/root){ // summary: // Finds the following descendants of the specified root node: // * the first tab-navigable element in document order // without a tabindex or with tabindex="0" // * the last tab-navigable element in document order // without a tabindex or with tabindex="0" // * the first element in document order with the lowest // positive tabindex value // * the last element in document order with the highest // positive tabindex value var first, last, lowest, lowestTabindex, highest, highestTabindex; var walkTree = function(/*DOMNode*/parent){ dojo.query("> *", parent).forEach(function(child){ var isShown = dijit._isElementShown(child); if(isShown && dijit.isTabNavigable(child)){ var tabindex = dojo.attr(child, "tabindex"); if(!dojo.hasAttr(child, "tabindex") || tabindex == 0){ if(!first){ first = child; } last = child; }else if(tabindex > 0){ if(!lowest || tabindex < lowestTabindex){ lowestTabindex = tabindex; lowest = child; } if(!highest || tabindex >= highestTabindex){ highestTabindex = tabindex; highest = child; } } } if(isShown){ walkTree(child) } }); }; if(dijit._isElementShown(root)){ walkTree(root) } return { first: first, last: last, lowest: lowest, highest: highest }; } dijit.getFirstInTabbingOrder = function(/*String|DOMNode*/root){ // summary: // Finds the descendant of the specified root node // that is first in the tabbing order var elems = dijit._getTabNavigable(dojo.byId(root)); return elems.lowest ? elems.lowest : elems.first; // Element }; dijit.getLastInTabbingOrder = function(/*String|DOMNode*/root){ // summary: // Finds the descendant of the specified root node // that is last in the tabbing order var elems = dijit._getTabNavigable(dojo.byId(root)); return elems.last ? elems.last : elems.highest; // Element }; }