dom.js revision 714c99c63f063a26ffb2afb6feb6522bfe6ae2c7
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync(function(Y) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync * The DOM utility provides a cross-browser abtraction layer
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * normalizing DOM tasks, and adds extra helper functionality
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * for other common tasks.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @module dom
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @submodule dom-base
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
fea6ef0d00f1b8ba0bdbb77a515a0c6a057b5a6fvboxsync/**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Provides DOM helper methods.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @class DOM
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncvar NODE_TYPE = 'nodeType',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync OWNER_DOCUMENT = 'ownerDocument',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync DEFAULT_VIEW = 'defaultView',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync PARENT_WINDOW = 'parentWindow',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync TAG_NAME = 'tagName',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync PARENT_NODE = 'parentNode',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync FIRST_CHILD = 'firstChild',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync PREVIOUS_SIBLING = 'previousSibling',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync NEXT_SIBLING = 'nextSibling',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync CONTAINS = 'contains',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync EMPTY_STRING = '',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync documentElement = document.documentElement,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync re_tag = /<([a-z]+)/i;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncY.DOM = {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Returns the HTMLElement with the given ID (Wrapper for document.getElementById).
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method byId
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} id the id attribute
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {Object} doc optional The document to search. Defaults to current document
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {HTMLElement | null} The HTMLElement with the id, or null if none found.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync byId: function(id, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // handle dupe IDs and IE name collision
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return Y.DOM.allById(id, doc)[0] || null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // @deprecated
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync children: function(node, tag) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var ret = [];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (node) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync tag = tag || '*';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = Y.Selector.query('> ' + tag, node);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // @deprecated
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync firstByTag: function(tag, root) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var ret;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync root = root || Y.config.doc;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (tag && root.getElementsByTagName) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = root.getElementsByTagName(tag)[0];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
31988929eef82021c176bc5a498145a958eebf14vboxsync
31988929eef82021c176bc5a498145a958eebf14vboxsync return ret || null;
31988929eef82021c176bc5a498145a958eebf14vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Returns the text content of the HTMLElement.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method getText
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element The html element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {String} The text content of the element (includes text of any descending elements).
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync getText: (documentElement.textContent !== undefined) ?
31988929eef82021c176bc5a498145a958eebf14vboxsync function(element) {
31988929eef82021c176bc5a498145a958eebf14vboxsync var ret = '';
31988929eef82021c176bc5a498145a958eebf14vboxsync if (element) {
31988929eef82021c176bc5a498145a958eebf14vboxsync ret = element.textContent;
31988929eef82021c176bc5a498145a958eebf14vboxsync }
31988929eef82021c176bc5a498145a958eebf14vboxsync return ret || '';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } : function(element) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var ret = '';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (element) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = element.innerText;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret || '';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
31988929eef82021c176bc5a498145a958eebf14vboxsync * Sets the text content of the HTMLElement.
31988929eef82021c176bc5a498145a958eebf14vboxsync * @method setText
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element The html element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} content The content to add.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync setText: (documentElement.textContent !== undefined) ?
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync function(element, content) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (element) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync element.textContent = content;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } : function(element, content) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (element) {
31988929eef82021c176bc5a498145a958eebf14vboxsync element.innerText = content;
31988929eef82021c176bc5a498145a958eebf14vboxsync }
31988929eef82021c176bc5a498145a958eebf14vboxsync },
31988929eef82021c176bc5a498145a958eebf14vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /*
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Finds the previous sibling of the element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method previous
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @deprecated Use elementByAxis
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync * @param {HTMLElement} element The html element.
31988929eef82021c176bc5a498145a958eebf14vboxsync * @param {Function} fn optional An optional boolean test to apply.
31988929eef82021c176bc5a498145a958eebf14vboxsync * The optional function is passed the current DOM node being tested as its only argument.
31988929eef82021c176bc5a498145a958eebf14vboxsync * If no function is given, the first sibling is returned.
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {HTMLElement | null} The matching DOM node or null if none found.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync previous: function(element, fn, all) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return Y.DOM.elementByAxis(element, PREVIOUS_SIBLING, fn, all);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /*
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Finds the next sibling of the element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method next
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @deprecated Use elementByAxis
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element The html element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {Function} fn optional An optional boolean test to apply.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * The optional function is passed the current DOM node being tested as its only argument.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * If no function is given, the first sibling is returned.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync * @return {HTMLElement | null} The matching DOM node or null if none found.
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync next: function(element, fn, all) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return Y.DOM.elementByAxis(element, NEXT_SIBLING, fn, all);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /*
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Finds the ancestor of the element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method ancestor
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @deprecated Use elementByAxis
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element The html element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {Function} fn optional An optional boolean test to apply.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * The optional function is passed the current DOM node being tested as its only argument.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * If no function is given, the parentNode is returned.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {Boolean} testSelf optional Whether or not to include the element in the scan
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {HTMLElement | null} The matching DOM node or null if none found.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ancestor: function(element, fn, testSelf) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var ret = null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (testSelf) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = (!fn || fn(element)) ? element : null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret || Y.DOM.elementByAxis(element, PARENT_NODE, fn, null);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Searches the element by the given axis for the first matching element.
31988929eef82021c176bc5a498145a958eebf14vboxsync * @method elementByAxis
31988929eef82021c176bc5a498145a958eebf14vboxsync * @param {HTMLElement} element The html element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} axis The axis to search (parentNode, nextSibling, previousSibling).
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {Function} fn optional An optional boolean test to apply.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {Boolean} all optional Whether all node types should be returned, or just element nodes.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * The optional function is passed the current HTMLElement being tested as its only argument.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * If no function is given, the first element is returned.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {HTMLElement | null} The matching element or null if none found.
31988929eef82021c176bc5a498145a958eebf14vboxsync */
31988929eef82021c176bc5a498145a958eebf14vboxsync elementByAxis: function(element, axis, fn, all) {
31988929eef82021c176bc5a498145a958eebf14vboxsync while (element && (element = element[axis])) { // NOTE: assignment
31988929eef82021c176bc5a498145a958eebf14vboxsync if ( (all || element[TAG_NAME]) && (!fn || fn(element)) ) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return element;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return null;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Determines whether or not one HTMLElement is or contains another HTMLElement.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method contains
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element The containing html element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} needle The html element that may be contained.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {Boolean} Whether or not the element is or contains the needle.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync contains: function(element, needle) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var ret = false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
31988929eef82021c176bc5a498145a958eebf14vboxsync if ( !needle || !element || !needle[NODE_TYPE] || !element[NODE_TYPE]) {
31988929eef82021c176bc5a498145a958eebf14vboxsync ret = false;
31988929eef82021c176bc5a498145a958eebf14vboxsync } else if (element[CONTAINS]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (Y.UA.opera || needle[NODE_TYPE] === 1) { // IE & SAF contains fail if needle not an ELEMENT_NODE
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = element[CONTAINS](needle);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = Y.DOM._bruteContains(element, needle);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else if (element[COMPARE_DOCUMENT_POSITION]) { // gecko
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (element === needle || !!(element[COMPARE_DOCUMENT_POSITION](needle) & 16)) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Determines whether or not the HTMLElement is part of the document.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method inDoc
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element The containing html element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} doc optional The document to check.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {Boolean} Whether or not the element is attached to the document.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync inDoc: function(element, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // there may be multiple elements with the same ID
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync doc = doc || element[OWNER_DOCUMENT];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var nodes = [],
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = false,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync i,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync node,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync query;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync element.id = element.id || Y.guid();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodes = Y.DOM.allById(element.id, doc);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (i = 0; node = nodes[i++];) { // check for a match
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (node === element) {
93f5f6843c0a4cea3703d1bf930fe0fab1a228c2vboxsync ret = true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync break;
93f5f6843c0a4cea3703d1bf930fe0fab1a228c2vboxsync }
93f5f6843c0a4cea3703d1bf930fe0fab1a228c2vboxsync }
93f5f6843c0a4cea3703d1bf930fe0fab1a228c2vboxsync
93f5f6843c0a4cea3703d1bf930fe0fab1a228c2vboxsync return ret;
93f5f6843c0a4cea3703d1bf930fe0fab1a228c2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync allById: function(id, root) {
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync root = root || Y.config.doc;
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync var nodes = [],
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = [],
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync i,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync node;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (root.querySelectorAll) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = root.querySelectorAll('[id="' + id + '"]');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else if (root.all) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodes = root.all(id);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (nodes && nodes.nodeType) { // root.all may return one or many
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodes = [nodes];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (nodes && nodes.length) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (i = 0; node = nodes[i++];) { // check for a match
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync if (node.id === id) { // avoid false positive for node.name
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret.push(node);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = [Y.DOM._getDoc(root).getElementById(id)];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
31988929eef82021c176bc5a498145a958eebf14vboxsync /**
31988929eef82021c176bc5a498145a958eebf14vboxsync * Creates a new dom node using the provided markup string.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method create
835df1bfeff649dc86c98779242a7bd1041bcc97vboxsync * @param {String} html The markup used to create the element
835df1bfeff649dc86c98779242a7bd1041bcc97vboxsync * @param {HTMLDocument} doc An optional document context
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync create: function(html, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (typeof html === 'string') {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync html = Y.Lang.trim(html); // match IE which trims whitespace from innerHTML
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync doc = doc || Y.config.doc;
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync var m = re_tag.exec(html),
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync create = Y.DOM._create,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync custom = Y.DOM.creators,
31988929eef82021c176bc5a498145a958eebf14vboxsync ret = null,
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync tag, nodes;
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync if (m && custom[m[1]]) {
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync if (typeof custom[m[1]] === 'function') {
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync create = custom[m[1]];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync tag = custom[m[1]];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
bbdca808499ba58705084ab5693c8f62c4accf2bvboxsync }
bbdca808499ba58705084ab5693c8f62c4accf2bvboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodes = create(html, doc, tag).childNodes;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (nodes.length === 1) { // return single node, breaking parentNode ref from "fragment"
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = nodes[0].parentNode.removeChild(nodes[0]);
31988929eef82021c176bc5a498145a958eebf14vboxsync } else { // return multiple nodes as a fragment
31988929eef82021c176bc5a498145a958eebf14vboxsync ret = Y.DOM._nl2frag(nodes, doc);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _nl2frag: function(nodes, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var ret = null,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync i, len;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (nodes && (nodes.push || nodes.item) && nodes[0]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync doc = doc || nodes[0].ownerDocument;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = doc.createDocumentFragment();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (nodes.item) { // convert live list to static array
76c869b82c29ec35452aa898ae9fdf303defc00avboxsync nodes = Y.Array(nodes, 0, true);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync for (i = 0, len = nodes.length; i < len; i++) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret.appendChild(nodes[i]);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } // else inline with log for minification
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync else { Y.log('unable to convert ' + nodes + ' to fragment', 'warn', 'dom'); }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync CUSTOM_ATTRIBUTES: (!documentElement.hasAttribute) ? { // IE < 8
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync 'for': 'htmlFor',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync 'class': 'className'
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } : { // w3c
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync 'htmlFor': 'for',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync 'className': 'class'
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Provides a normalized attribute interface.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method setAttibute
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String | HTMLElement} el The target element for the attribute.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} attr The attribute to set.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} val The value of the attribute.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync setAttribute: function(el, attr, val, ieAttr) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (el && el.setAttribute) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync el.setAttribute(attr, val, ieAttr);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Provides a normalized attribute interface.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method getAttibute
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String | HTMLElement} el The target element for the attribute.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} attr The attribute to get.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {String} The current value of the attribute.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync getAttribute: function(el, attr, ieAttr) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ieAttr = (ieAttr !== undefined) ? ieAttr : 2;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var ret = '';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (el && el.getAttribute) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = el.getAttribute(attr, ieAttr);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (ret === null) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = ''; // per DOM spec
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret;
3ce47c86fed0023f16816fcb603d80cc47041be7vboxsync },
3ce47c86fed0023f16816fcb603d80cc47041be7vboxsync
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync isWindow: function(obj) {
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync return obj.alert && obj.document;
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync },
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _fragClones: {},
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _create: function(html, doc, tag) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync tag = tag || 'div';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
a9b2eecd26888c8b3674f72efe7da158ae64ef0avboxsync var frag = Y.DOM._fragClones[tag];
a9b2eecd26888c8b3674f72efe7da158ae64ef0avboxsync if (frag) {
31988929eef82021c176bc5a498145a958eebf14vboxsync frag = frag.cloneNode(false);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync frag = Y.DOM._fragClones[tag] = doc.createElement(tag);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync frag.innerHTML = html;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return frag;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _removeChildNodes: function(node) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync while (node.firstChild) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync node.removeChild(node.firstChild);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Inserts content in a node at the given location
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method addHTML
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} node The node to insert into
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} content The content to be inserted
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync * @param {String} where Where to insert the content; default is after lastChild
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync */
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync addHTML: function(node, content, where) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (typeof content === 'string') {
80f22f2b8464072b7820a58a38cd5d3b41ac8bdevboxsync content = Y.Lang.trim(content); // match IE which trims whitespace from innerHTML
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var nodeParent = node.parentNode,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync newNode;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (content) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (content.nodeType) { // domNode
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync newNode = content;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else { // create from string and cache
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync newNode = Y.DOM.create(content);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (where) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (where.nodeType) { // insert regardless of relationship to node
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // TODO: check if node.contains(where)?
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync where.parentNode.insertBefore(newNode, where);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync switch (where) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync case 'replace':
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync while (node.firstChild) {
438dd62b5c796170381bedd039e4d946b1625630vboxsync node.removeChild(node.firstChild);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (newNode) { // allow empty content to clear node
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync node.appendChild(newNode);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync break;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync case 'before':
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodeParent.insertBefore(newNode, node);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync break;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync case 'after':
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (node.nextSibling) { // IE errors if refNode is null
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodeParent.insertBefore(newNode, node.nextSibling);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodeParent.appendChild(newNode);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
bed3536da2b2c1b8ed37bbcee5237ffc3727f4a6vboxsync break;
bed3536da2b2c1b8ed37bbcee5237ffc3727f4a6vboxsync default:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync node.appendChild(newNode);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync } else {
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync node.appendChild(newNode);
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync }
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync return newNode;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync VALUE_SETTERS: {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync select: function(node, val) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var option = Y.Selector.query('option[value="' + val + '"]', node, true);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (option) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync node.selectedIndex = Y.Array.indexOf(node.getElementsByTagName('option'), option);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.log('option: ' + val + 'not found, unable to set value on select', 'warn', 'dom');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync VALUE_GETTERS: {},
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync getValue: function(node) {
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync var ret = '', // TODO: return null?
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync getter;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (node && node[TAG_NAME]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync getter = Y.DOM.VALUE_GETTERS[node[TAG_NAME].toLowerCase()];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync if (getter) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = getter(node);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = node.value;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
949fa097f20d6eed3c7d43598a41900ec11d70aevboxsync }
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync // workaround for IE8 JSON stringify bug
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync // which converts empty string values to null
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (ret === EMPTY_STRING) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = EMPTY_STRING; // for real
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (typeof ret === 'string') ? ret : '';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync setValue: function(node, val) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var setter;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync if (node && node[TAG_NAME]) {
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync setter = Y.DOM.VALUE_SETTERS[node[TAG_NAME].toLowerCase()];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
bbe4e467791368c2eae04fa77527efb6b27040c4vboxsync if (setter) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync setter(node, val);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
bbe4e467791368c2eae04fa77527efb6b27040c4vboxsync node.value = val;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
bbe4e467791368c2eae04fa77527efb6b27040c4vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync siblings: function(node, fn) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var nodes = [],
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync sibling = node;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync while ((sibling = sibling[PREVIOUS_SIBLING])) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (sibling[TAG_NAME] && (!fn || fn(sibling))) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodes.unshift(sibling);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync sibling = node;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync while ((sibling = sibling[NEXT_SIBLING])) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (sibling[TAG_NAME] && (!fn || fn(sibling))) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync nodes.push(sibling);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return nodes;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Brute force version of contains.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Used for browsers without contains support for non-HTMLElement Nodes (textNodes, etc).
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method _bruteContains
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @private
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element The containing html element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} needle The html element that may be contained.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {Boolean} Whether or not the element is or contains the needle.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _bruteContains: function(element, needle) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync while (needle) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (element === needle) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync needle = needle.parentNode;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync// TODO: move to Lang?
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Memoizes dynamic regular expressions to boost runtime performance.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method _getRegExp
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @private
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} str The string to convert to a regular expression.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {String} flags optional An optinal string of flags.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {RegExp} An instance of RegExp
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _getRegExp: function(str, flags) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync flags = flags || '';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.DOM._regexCache = Y.DOM._regexCache || {};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!Y.DOM._regexCache[str + flags]) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.DOM._regexCache[str + flags] = new RegExp(str, flags);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return Y.DOM._regexCache[str + flags];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync// TODO: make getDoc/Win true privates?
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * returns the appropriate document.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method _getDoc
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @private
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element optional Target element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {Object} The document for the given element or the default document.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _getDoc: function(element) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var doc = Y.config.doc;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (element) {
bed3536da2b2c1b8ed37bbcee5237ffc3727f4a6vboxsync doc = (element[NODE_TYPE] === 9) ? element : // element === document
bed3536da2b2c1b8ed37bbcee5237ffc3727f4a6vboxsync element[OWNER_DOCUMENT] || // element === DOM node
3083fdfbe74feec68ba2648e604853692468340avboxsync element.document || // element === window
3083fdfbe74feec68ba2648e604853692468340avboxsync Y.config.doc; // default
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return doc;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * returns the appropriate window.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @method _getWin
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @private
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param {HTMLElement} element optional Target element.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @return {Object} The window for the given element or the default window.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _getWin: function(element) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var doc = Y.DOM._getDoc(element);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return doc[DEFAULT_VIEW] || doc[PARENT_WINDOW] || Y.config.win;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _batch: function(nodes, fn, arg1, arg2, arg3, etc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync fn = (typeof name === 'string') ? Y.DOM[fn] : fn;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var result,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret = [];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (fn && nodes) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.each(nodes, function(node) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if ((result = fn.call(Y.DOM, node, arg1, arg2, arg3, etc)) !== undefined) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ret[ret.length] = result;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ret.length ? ret : nodes;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync creators: {},
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync _IESimpleCreate: function(html, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync doc = doc || Y.config.doc;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return doc.createElement(html);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync(function(Y) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var creators = Y.DOM.creators,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync create = Y.DOM.create,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync re_tbody = /(?:\/(?:thead|tfoot|tbody|caption|col|colgroup)>)+\s*<tbody/,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync TABLE_OPEN = '<table>',
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync TABLE_CLOSE = '</table>';
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync if (Y.UA.ie) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.mix(creators, {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // TODO: thead/tfoot with nested tbody
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // IE adds TBODY when creating TABLE elements (which may share this impl)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync tbody: function(html, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var frag = create(TABLE_OPEN + html + TABLE_CLOSE, doc),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync tb = frag.children.tags('tbody')[0];
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync if (frag.children.length > 1 && tb && !re_tbody.test(html)) {
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync tb[PARENT_NODE].removeChild(tb); // strip extraneous tbody
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return frag;
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync },
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync script: function(html, doc) {
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync var frag = doc.createElement('div');
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync frag.innerHTML = '-' + html;
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync frag.removeChild(frag[FIRST_CHILD]);
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync return frag;
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync }
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync }, true);
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync
604cdaa1280834e8cd6f17571cc1a6ff75e8e492vboxsync Y.mix(Y.DOM.VALUE_GETTERS, {
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync button: function(node) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (node.attributes && node.attributes.value) ? node.attributes.value.value : '';
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
31988929eef82021c176bc5a498145a958eebf14vboxsync });
31988929eef82021c176bc5a498145a958eebf14vboxsync
31988929eef82021c176bc5a498145a958eebf14vboxsync Y.mix(Y.DOM.VALUE_SETTERS, {
31988929eef82021c176bc5a498145a958eebf14vboxsync // IE: node.value changes the button text, which should be handled via innerHTML
31988929eef82021c176bc5a498145a958eebf14vboxsync button: function(node, val) {
e68b9c523da6665d5ef2c73b60ee8544ac954f5dvboxsync var attr = node.attributes.value;
7bfef19105e8da158ace0a3c24061448972226a6vboxsync if (!attr) {
31988929eef82021c176bc5a498145a958eebf14vboxsync attr = node[OWNER_DOCUMENT].createAttribute('value');
31988929eef82021c176bc5a498145a958eebf14vboxsync node.setAttributeNode(attr);
31988929eef82021c176bc5a498145a958eebf14vboxsync }
31988929eef82021c176bc5a498145a958eebf14vboxsync
31988929eef82021c176bc5a498145a958eebf14vboxsync attr.value = val;
31988929eef82021c176bc5a498145a958eebf14vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (Y.UA.gecko || Y.UA.ie) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.mix(creators, {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync option: function(html, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return create('<select>' + html + '</select>', doc);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync tr: function(html, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return create('<tbody>' + html + '</tbody>', doc);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync td: function(html, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return create('<tr>' + html + '</tr>', doc);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync },
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync tbody: function(html, doc) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return create(TABLE_OPEN + html + TABLE_CLOSE, doc);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.mix(creators, {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync legend: 'fieldset',
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync th: creators.td,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync thead: creators.tbody,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync tfoot: creators.tbody,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync caption: creators.tbody,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync colgroup: creators.tbody,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync col: creators.tbody,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync optgroup: creators.option
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Y.mix(Y.DOM.VALUE_GETTERS, {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync option: function(node) {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync var attrs = node.attributes;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (attrs.value && attrs.value.specified) ? node.value : node.text;
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync },
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync select: function(node) {
31988929eef82021c176bc5a498145a958eebf14vboxsync var val = node.value,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync options = node.options;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (options && val === '') {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync // TODO: implement multipe select
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (node.multiple) {
dd1de51db071be42f2acdf532c49c851b78b0812vboxsync Y.log('multiple select normalization not implemented', 'warn', 'DOM');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync } else {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync val = Y.DOM.getValue(options[node.selectedIndex], 'value');
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return val;
edee492e4d399b1f7c3ea2ab555df208bb426a87vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync });
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync})(Y);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync})(Y);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync