]> git.pond.sub.org Git - eow/blobdiff - static/dojo-release-1.1.1/dijit/_base/manager.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dijit / _base / manager.js
diff --git a/static/dojo-release-1.1.1/dijit/_base/manager.js b/static/dojo-release-1.1.1/dijit/_base/manager.js
new file mode 100644 (file)
index 0000000..cfb5337
--- /dev/null
@@ -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
+};
+
+}