diff options
Diffstat (limited to 'includes/js/dijit/_base/manager.js')
-rw-r--r-- | includes/js/dijit/_base/manager.js | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/includes/js/dijit/_base/manager.js b/includes/js/dijit/_base/manager.js new file mode 100644 index 0000000..cfb5337 --- /dev/null +++ b/includes/js/dijit/_base/manager.js @@ -0,0 +1,194 @@ +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 +}; + +} |