/**
* @class Ext.dd.Registry
* Provides easy access to all drag drop components that are registered on a page. Items can be retrieved either
* directly by DOM node id, or by passing in the drag drop event that occurred and looking up the event target.
* @singleton
*/
Ext.dd.Registry = function(){
var elements = {};
var handles = {};
var autoIdSeed = 0;
var getId = function(el, autogen){
if(typeof el == "string"){
return el;
}
var id = el.id;
if(!id && autogen !== false){
id = "extdd-" + (++autoIdSeed);
el.id = id;
}
return id;
};
return {
/**
* Resgister a drag drop element
* @param {String/HTMLElement) element The id or DOM node to register
* @param {Object} data (optional) An custom data object that will be passed between the elements that are involved
* in drag drop operations. You can populate this object with any arbitrary properties that your own code
* knows how to interpret, plus there are some specific properties known to the Registry that should be
* populated in the data object (if applicable):
*
Value Description
--------- ------------------------------------------
handles Array of DOM nodes that trigger dragging
for the element being registered
isHandle True if the element passed in triggers
dragging itself, else false
*/
register : function(el, data){
data = data || {};
if(typeof el == "string"){
el = document.getElementById(el);
}
data.ddel = el;
elements[getId(el)] = data;
if(data.isHandle !== false){
handles[data.ddel.id] = data;
}
if(data.handles){
var hs = data.handles;
for(var i = 0, len = hs.length; i < len; i++){
handles[getId(hs[i])] = data;
}
}
},
/**
* Unregister a drag drop element
* @param {String/HTMLElement) element The id or DOM node to unregister
*/
unregister : function(el){
var id = getId(el, false);
var data = elements[id];
if(data){
delete elements[id];
if(data.handles){
var hs = data.handles;
for(var i = 0, len = hs.length; i < len; i++){
delete handles[getId(hs[i], false)];
}
}
}
},
/**
* Returns the handle registered for a DOM Node by id
* @param {String/HTMLElement} id The DOM node or id to look up
* @return {Object} handle The custom handle data
*/
getHandle : function(id){
if(typeof id != "string"){ // must be element?
id = id.id;
}
return handles[id];
},
/**
* Returns the handle that is registered for the DOM node that is the target of the event
* @param {Event} e The event
* @return {Object} handle The custom handle data
*/
getHandleFromEvent : function(e){
var t = Ext.lib.Event.getTarget(e);
return t ? handles[t.id] : null;
},
/**
* Returns a custom data object that is registered for a DOM node by id
* @param {String/HTMLElement} id The DOM node or id to look up
* @return {Object} data The custom data
*/
getTarget : function(id){
if(typeof id != "string"){ // must be element?
id = id.id;
}
return elements[id];
},
/**
* Returns a custom data object that is registered for the DOM node that is the target of the event
* @param {Event} e The event
* @return {Object} data The custom data
*/
getTargetFromEvent : function(e){
var t = Ext.lib.Event.getTarget(e);
return t ? elements[t.id] || handles[t.id] : null;
}
};
}();