/**
* Internal utilities for working with the DOM.
* @name DOMUtils
* @namespace
* @private
*/
define(["lib/jquery", "lib/underscore"], function($, _) {
"use strict";
var DOMUtils = /** @lends DOMUtils */ {
/**
* Fires a custom event.
* @param {String} name Name of the event.
* @param {Element} el DOM element to fire the event on.
* @param {Object} props Additional properties for the event.
*
* @return {Boolean} Returns false if stopPropagation was called on the
* event, true otherwise.
*/
fire: function(name, el, props) {
var ev = DOMUtils.buildEvent(name, false, props);
el.dispatchEvent(ev);
return !ev._propStopped;
},
/**
* Builds a custom event.
* @param {String} name Name of the event.
* @param {Boolean} bubble Whether the event bubbles.
* @param {Object} [props] Additional properties for the event.
*/
buildEvent: function(name, bubble, props) {
var evObj = document.createEvent("CustomEvent");
evObj.initCustomEvent(name, bubble, bubble);
if(props) {
_.extend(evObj, props);
}
evObj.stopPropagation = function() {
evObj._propStopped = true;
};
evObj.preventDefault = function() {
evObj._defaultPrevented = true;
};
return evObj;
},
/**
* Fires a custom event that bubbles up the DOM.
* @param {String} name Name of the event.
* @param {Element} el DOM element to fire the event on.
* @param {Object} props Additional properties for the event.
*
* @return {Boolean} Returns false if preventDefault was called on the
* event, true otherwise.
*/
fireBubbling: function(name, el, props) {
var ev = DOMUtils.buildEvent(name, true, props);
el.dispatchEvent(ev);
return !ev._defaultPrevented;
},
/**
* Adds a link to a stylesheet into the head of a document.
*
* @param {String} path Path to the stylesheet, relative to the Lens
* root.
* @param {String} [id] Optional id to apply to the link tag.
*/
addStylesheet: function(path, id) {
var link = $("<link />", {
rel: "stylesheet",
type: "text/css",
href: Lens.rootUrl + "/" + path,
id: id,
});
$("head").append(link);
},
/**
* Unloads a stylesheet.
*
* @param {String} path Path to the stylesheet, relative to the Lens root.
*/
removeStylesheet: function(path) {
$("link[href=\"" + Lens.rootUrl + "/" + path + "\"]").remove();
},
/**
* Returns the topmost element at (x, y) and all of its parents. The
* most specific element will be the first item in the array, and the
* document element will be the last item.
*/
elementsAt: function(x, y) {
var el = document.elementFromPoint(x, y);
if(!el) {
return [];
}
var els = [el];
while(el.parentNode) {
el = el.parentNode;
els.push(el);
}
return els;
}
};
return DOMUtils;
});