195 lines
5.5 KiB
JavaScript
195 lines
5.5 KiB
JavaScript
|
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
|
||
|
};
|
||
|
|
||
|
}
|