dom-debug.js revision d913de804d806a22bae4363ccbdac36dd6403399
afe3ab588a6b2992efe5a9b22ed038545ba3cdbfLennart PoetteringYUI.add('dom-base', function(Y) {
c343be283b7152554bac0c02493a4e1759c163f7Kay Sievers
b3ae710c251d0ce5cf2cef63208e325497b5e323Zbigniew Jędrzejewski-Szmek(function(Y) {
b3ae710c251d0ce5cf2cef63208e325497b5e323Zbigniew Jędrzejewski-Szmek/**
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers * The DOM utility provides a cross-browser abtraction layer
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers * normalizing DOM tasks, and adds extra helper functionality
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers * for other common tasks.
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers * @module dom
afe3ab588a6b2992efe5a9b22ed038545ba3cdbfLennart Poettering * @submodule dom-base
d19e85f0d474ed1882561b458d528cbae49f640eZbigniew Jędrzejewski-Szmek *
d19e85f0d474ed1882561b458d528cbae49f640eZbigniew Jędrzejewski-Szmek */
d19e85f0d474ed1882561b458d528cbae49f640eZbigniew Jędrzejewski-Szmek
d19e85f0d474ed1882561b458d528cbae49f640eZbigniew Jędrzejewski-Szmek/**
d19e85f0d474ed1882561b458d528cbae49f640eZbigniew Jędrzejewski-Szmek * Provides DOM helper methods.
3f85ef0f05ffc51e19f86fb83a1c51e8e3cd6817Harald Hoyer * @class DOM
afe3ab588a6b2992efe5a9b22ed038545ba3cdbfLennart Poettering *
afe3ab588a6b2992efe5a9b22ed038545ba3cdbfLennart Poettering */
afea8d3853d0f76b3845729ff00e75d281f43a1bZbigniew Jędrzejewski-Szmekvar NODE_TYPE = 'nodeType',
3e495a6651609d0a45b62aab5c3ed5a3b40e11abZbigniew Jędrzejewski-Szmek OWNER_DOCUMENT = 'ownerDocument',
3e495a6651609d0a45b62aab5c3ed5a3b40e11abZbigniew Jędrzejewski-Szmek DEFAULT_VIEW = 'defaultView',
3e495a6651609d0a45b62aab5c3ed5a3b40e11abZbigniew Jędrzejewski-Szmek PARENT_WINDOW = 'parentWindow',
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering TAG_NAME = 'tagName',
f85857df75cfedbc0d10b8ca2400188dc8f4c22eLennart Poettering PARENT_NODE = 'parentNode',
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering FIRST_CHILD = 'firstChild',
bafb15bab99887d1b6b8a35136531bac6c3876a6Lennart Poettering PREVIOUS_SIBLING = 'previousSibling',
81429136905a6204875174b60a179333b7f3c9e4Kay Sievers NEXT_SIBLING = 'nextSibling',
e7b4d43ec3d5eb0099a3978f98a46f3c15443b23Lennart Poettering CONTAINS = 'contains',
58f55364fa00a6a4706df2c4a01c6967f432e531Lennart Poettering COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',
58f55364fa00a6a4706df2c4a01c6967f432e531Lennart Poettering EMPTY_STRING = '',
83a1ff25e5228b0a5b2cc942fd4f964d10bb73b0Zbigniew Jędrzejewski-Szmek
83a1ff25e5228b0a5b2cc942fd4f964d10bb73b0Zbigniew Jędrzejewski-Szmek documentElement = document.documentElement,
83a1ff25e5228b0a5b2cc942fd4f964d10bb73b0Zbigniew Jędrzejewski-Szmek
83a1ff25e5228b0a5b2cc942fd4f964d10bb73b0Zbigniew Jędrzejewski-Szmek re_tag = /<([a-z]+)/i;
83a1ff25e5228b0a5b2cc942fd4f964d10bb73b0Zbigniew Jędrzejewski-Szmek
6ce02c2a3a2aa888c3e074ae235d94808a165f9aLennart PoetteringY.DOM = {
6ce02c2a3a2aa888c3e074ae235d94808a165f9aLennart Poettering /**
5ad65d628facbce5219ac2749bc835ab92ca6c39Lennart Poettering * Returns the HTMLElement with the given ID (Wrapper for document.getElementById).
5ad65d628facbce5219ac2749bc835ab92ca6c39Lennart Poettering * @method byId
f93b36affa5ac5710cd84bfb8ff0dafabe99fbf1Lennart Poettering * @param {String} id the id attribute
f93b36affa5ac5710cd84bfb8ff0dafabe99fbf1Lennart Poettering * @param {Object} doc optional The document to search. Defaults to current document
20760dcf5df7e253c21a51886cdb02dee612730bLennart Poettering * @return {HTMLElement | null} The HTMLElement with the id, or null if none found.
20760dcf5df7e253c21a51886cdb02dee612730bLennart Poettering */
20760dcf5df7e253c21a51886cdb02dee612730bLennart Poettering byId: function(id, doc) {
20760dcf5df7e253c21a51886cdb02dee612730bLennart Poettering doc = doc || Y.config.doc;
20760dcf5df7e253c21a51886cdb02dee612730bLennart Poettering // TODO: IE Name
20760dcf5df7e253c21a51886cdb02dee612730bLennart Poettering return doc.getElementById(id);
20760dcf5df7e253c21a51886cdb02dee612730bLennart Poettering },
20760dcf5df7e253c21a51886cdb02dee612730bLennart Poettering
df22b0bbfde403b3fa71f3c2f1e2ca38af946388Lennart Poettering // @deprecated
df22b0bbfde403b3fa71f3c2f1e2ca38af946388Lennart Poettering children: function(node, tag) {
df22b0bbfde403b3fa71f3c2f1e2ca38af946388Lennart Poettering var ret = [];
df22b0bbfde403b3fa71f3c2f1e2ca38af946388Lennart Poettering if (node) {
df22b0bbfde403b3fa71f3c2f1e2ca38af946388Lennart Poettering tag = tag || '*';
df22b0bbfde403b3fa71f3c2f1e2ca38af946388Lennart Poettering ret = Y.Selector.query('> ' + tag, node);
df22b0bbfde403b3fa71f3c2f1e2ca38af946388Lennart Poettering }
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering return ret;
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering },
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering // @deprecated
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering firstByTag: function(tag, root) {
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering var ret;
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering root = root || Y.config.doc;
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering if (tag && root.getElementsByTagName) {
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering ret = root.getElementsByTagName(tag)[0];
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering }
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering return ret || null;
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering },
b9be39bfb4ed8e43a7c445831131e44be998eb32Lennart Poettering
c05482281c32bd408808b14c5fb03e706e65602dLennart Poettering /**
c05482281c32bd408808b14c5fb03e706e65602dLennart Poettering * Returns the text content of the HTMLElement.
c05482281c32bd408808b14c5fb03e706e65602dLennart Poettering * @method getText
2aeed6760e9759d95418bdb2e80d0032ffcb768eLennart Poettering * @param {HTMLElement} element The html element.
2aeed6760e9759d95418bdb2e80d0032ffcb768eLennart Poettering * @return {String} The text content of the element (includes text of any descending elements).
2aeed6760e9759d95418bdb2e80d0032ffcb768eLennart Poettering */
2aeed6760e9759d95418bdb2e80d0032ffcb768eLennart Poettering getText: (documentElement.textContent !== undefined) ?
e5f774df567952786e6ded933f2a34c430a33b23Lennart Poettering function(element) {
e5f774df567952786e6ded933f2a34c430a33b23Lennart Poettering var ret = '';
e5f774df567952786e6ded933f2a34c430a33b23Lennart Poettering if (element) {
e0ec8950935ce587935e299c22232fbf4a2664c9Lennart Poettering ret = element.textContent;
e0ec8950935ce587935e299c22232fbf4a2664c9Lennart Poettering }
73cb77549536deab85d8d1261b5381e87d80ab23Lennart Poettering return ret || '';
73cb77549536deab85d8d1261b5381e87d80ab23Lennart Poettering } : function(element) {
73cb77549536deab85d8d1261b5381e87d80ab23Lennart Poettering var ret = '';
84bef24dd3ad050bab8ecdcd130d0d9794005fa0Lennart Poettering if (element) {
84bef24dd3ad050bab8ecdcd130d0d9794005fa0Lennart Poettering ret = element.innerText;
84bef24dd3ad050bab8ecdcd130d0d9794005fa0Lennart Poettering }
477e75ef9ea6bb2e7e8cc76278c442942110f227Lennart Poettering return ret || '';
477e75ef9ea6bb2e7e8cc76278c442942110f227Lennart Poettering },
477e75ef9ea6bb2e7e8cc76278c442942110f227Lennart Poettering
477e75ef9ea6bb2e7e8cc76278c442942110f227Lennart Poettering /**
477e75ef9ea6bb2e7e8cc76278c442942110f227Lennart Poettering * Sets the text content of the HTMLElement.
477e75ef9ea6bb2e7e8cc76278c442942110f227Lennart Poettering * @method setText
477e75ef9ea6bb2e7e8cc76278c442942110f227Lennart Poettering * @param {HTMLElement} element The html element.
477e75ef9ea6bb2e7e8cc76278c442942110f227Lennart Poettering * @param {String} content The content to add.
7dfb0404b3b6882d582a571f61a52b2f56961675Lennart Poettering */
7dfb0404b3b6882d582a571f61a52b2f56961675Lennart Poettering setText: (documentElement.textContent !== undefined) ?
7dfb0404b3b6882d582a571f61a52b2f56961675Lennart Poettering function(element, content) {
7dfb0404b3b6882d582a571f61a52b2f56961675Lennart Poettering if (element) {
7dfb0404b3b6882d582a571f61a52b2f56961675Lennart Poettering element.textContent = content;
2bc39683c0cada86c9dc39e5f3d0ea475cf12e57Lennart Poettering }
2bc39683c0cada86c9dc39e5f3d0ea475cf12e57Lennart Poettering } : function(element, content) {
2bc39683c0cada86c9dc39e5f3d0ea475cf12e57Lennart Poettering if (element) {
687f6a0ba77872299b9fb1f2f04d31c977088a63Lennart Poettering element.innerText = content;
687f6a0ba77872299b9fb1f2f04d31c977088a63Lennart Poettering }
687f6a0ba77872299b9fb1f2f04d31c977088a63Lennart Poettering },
687f6a0ba77872299b9fb1f2f04d31c977088a63Lennart Poettering
687f6a0ba77872299b9fb1f2f04d31c977088a63Lennart Poettering /*
687f6a0ba77872299b9fb1f2f04d31c977088a63Lennart Poettering * Finds the previous sibling of the element.
2bc39683c0cada86c9dc39e5f3d0ea475cf12e57Lennart Poettering * @method previous
2bc39683c0cada86c9dc39e5f3d0ea475cf12e57Lennart Poettering * @deprecated Use elementByAxis
687f6a0ba77872299b9fb1f2f04d31c977088a63Lennart Poettering * @param {HTMLElement} element The html element.
31a11e8f30449a81867e8fd081e3e76cf6664bb4Lennart Poettering * @param {Function} fn optional An optional boolean test to apply.
31a11e8f30449a81867e8fd081e3e76cf6664bb4Lennart Poettering * The optional function is passed the current DOM node being tested as its only argument.
dbdee28bfadd6d8bd93cb34c85ce1fc325dd8120Lennart Poettering * If no function is given, the first sibling is returned.
dbdee28bfadd6d8bd93cb34c85ce1fc325dd8120Lennart Poettering * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
17fe56148c44dfa5583a8643c1918fd6eccf2aeeLennart Poettering * @return {HTMLElement | null} The matching DOM node or null if none found.
17fe56148c44dfa5583a8643c1918fd6eccf2aeeLennart Poettering */
17fe56148c44dfa5583a8643c1918fd6eccf2aeeLennart Poettering previous: function(element, fn, all) {
17fe56148c44dfa5583a8643c1918fd6eccf2aeeLennart Poettering return Y.DOM.elementByAxis(element, PREVIOUS_SIBLING, fn, all);
7687f85ea6bab434324bb985e2898bf6373891bfLennart Poettering },
7687f85ea6bab434324bb985e2898bf6373891bfLennart Poettering
7687f85ea6bab434324bb985e2898bf6373891bfLennart Poettering /*
7687f85ea6bab434324bb985e2898bf6373891bfLennart Poettering * Finds the next sibling of the element.
02c74033ed65e7825d1b87ee051820c9fbfa0f50Lennart Poettering * @method next
02c74033ed65e7825d1b87ee051820c9fbfa0f50Lennart Poettering * @deprecated Use elementByAxis
c14db9b32ab90738973071d31f259d1a457d7b4aLennart Poettering * @param {HTMLElement} element The html element.
c14db9b32ab90738973071d31f259d1a457d7b4aLennart Poettering * @param {Function} fn optional An optional boolean test to apply.
fa607802f332e06f4044c3eb38dbea41076c803dLennart Poettering * The optional function is passed the current DOM node being tested as its only argument.
fa607802f332e06f4044c3eb38dbea41076c803dLennart Poettering * If no function is given, the first sibling is returned.
cc98b3025eeb89addb76a27390cb2baca4eab8b9Torstein Husebø * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
a47e6701bfc45519a4e038daa52e9236e932f59aLennart Poettering * @return {HTMLElement | null} The matching DOM node or null if none found.
fa607802f332e06f4044c3eb38dbea41076c803dLennart Poettering */
a47e6701bfc45519a4e038daa52e9236e932f59aLennart Poettering next: function(element, fn, all) {
92ff080be100aff15f292e2631921131c610afe7Lennart Poettering return Y.DOM.elementByAxis(element, NEXT_SIBLING, fn, all);
b80c66ba9836456de5260e4a1b696ba25561f613Lennart Poettering },
bd69054b0987b40a0df87d40772893f6f8a078daLennart Poettering
bd69054b0987b40a0df87d40772893f6f8a078daLennart Poettering /*
c3a0d00d6dd6f5997d673e133ef6f9f856550b0aLennart Poettering * Finds the ancestor of the element.
c3a0d00d6dd6f5997d673e133ef6f9f856550b0aLennart Poettering * @method ancestor
c3a0d00d6dd6f5997d673e133ef6f9f856550b0aLennart Poettering * @deprecated Use elementByAxis
c3a0d00d6dd6f5997d673e133ef6f9f856550b0aLennart Poettering * @param {HTMLElement} element The html element.
c3a0d00d6dd6f5997d673e133ef6f9f856550b0aLennart Poettering * @param {Function} fn optional An optional boolean test to apply.
c3a0d00d6dd6f5997d673e133ef6f9f856550b0aLennart Poettering * The optional function is passed the current DOM node being tested as its only argument.
de146bb2aac13361ade3050d37696499ac4ca9aeLennart Poettering * If no function is given, the parentNode is returned.
de146bb2aac13361ade3050d37696499ac4ca9aeLennart Poettering * @param {Boolean} testSelf optional Whether or not to include the element in the scan
358ba19e5e18304258f053e30e6120a3b6adf322Lennart Poettering * @return {HTMLElement | null} The matching DOM node or null if none found.
358ba19e5e18304258f053e30e6120a3b6adf322Lennart Poettering */
91f4347ef7bde17418b365ed3a97a752fe65bd50Lennart Poettering ancestor: function(element, fn, testSelf) {
358ba19e5e18304258f053e30e6120a3b6adf322Lennart Poettering var ret = null;
de146bb2aac13361ade3050d37696499ac4ca9aeLennart Poettering if (testSelf) {
de146bb2aac13361ade3050d37696499ac4ca9aeLennart Poettering ret = (!fn || fn(element)) ? element : null;
5b728e6ba17c39e0787ad81b96a5582f4390f091Lennart Poettering
5b728e6ba17c39e0787ad81b96a5582f4390f091Lennart Poettering }
c3a0d00d6dd6f5997d673e133ef6f9f856550b0aLennart Poettering return ret || Y.DOM.elementByAxis(element, PARENT_NODE, fn, null);
c3a0d00d6dd6f5997d673e133ef6f9f856550b0aLennart Poettering },
82e6c50c473f4be8df77c7a510577f1975eedddbLennart Poettering
82e6c50c473f4be8df77c7a510577f1975eedddbLennart Poettering /**
d2f81fb00cc3c49e21b31000ba7d37b81a260257Lennart Poettering * Searches the element by the given axis for the first matching element.
d2f81fb00cc3c49e21b31000ba7d37b81a260257Lennart Poettering * @method elementByAxis
98cd2651988619bf606f0b27825440c4638a7e0bLennart Poettering * @param {HTMLElement} element The html element.
b7307642391c8ebb9724c99e6b33239e2c0ff944Lennart Poettering * @param {String} axis The axis to search (parentNode, nextSibling, previousSibling).
b7307642391c8ebb9724c99e6b33239e2c0ff944Lennart Poettering * @param {Function} fn optional An optional boolean test to apply.
2a441c8afe7c81f74cc2ceccdf9a71301cd39d4dLennart Poettering * @param {Boolean} all optional Whether all node types should be returned, or just element nodes.
2a441c8afe7c81f74cc2ceccdf9a71301cd39d4dLennart Poettering * The optional function is passed the current HTMLElement being tested as its only argument.
2a441c8afe7c81f74cc2ceccdf9a71301cd39d4dLennart Poettering * If no function is given, the first element is returned.
2a441c8afe7c81f74cc2ceccdf9a71301cd39d4dLennart Poettering * @return {HTMLElement | null} The matching element or null if none found.
2a441c8afe7c81f74cc2ceccdf9a71301cd39d4dLennart Poettering */
40ff4a4abd76d71408e598ed02d7860b8465fa9aLennart Poettering elementByAxis: function(element, axis, fn, all) {
40ff4a4abd76d71408e598ed02d7860b8465fa9aLennart Poettering while (element && (element = element[axis])) { // NOTE: assignment
40ff4a4abd76d71408e598ed02d7860b8465fa9aLennart Poettering if ( (all || element[TAG_NAME]) && (!fn || fn(element)) ) {
40ff4a4abd76d71408e598ed02d7860b8465fa9aLennart Poettering return element;
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering }
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering }
f131770b1465fbf423881f16ba85523a05f846feVeres Lajos return null;
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering },
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering /**
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering * Determines whether or not one HTMLElement is or contains another HTMLElement.
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering * @method contains
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering * @param {HTMLElement} element The containing html element.
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering * @param {HTMLElement} needle The html element that may be contained.
0a86c1a9d8066267b878dfeddc5e0087dda6a37bLennart Poettering * @return {Boolean} Whether or not the element is or contains the needle.
41114e81b562bcee52be1ef94c684ace2362ca54Lennart Poettering */
41114e81b562bcee52be1ef94c684ace2362ca54Lennart Poettering contains: function(element, needle) {
e3286870fdf20c3c93e944b24fd9af53620f7dbaLennart Poettering var ret = false;
e3286870fdf20c3c93e944b24fd9af53620f7dbaLennart Poettering
e3286870fdf20c3c93e944b24fd9af53620f7dbaLennart Poettering if ( !needle || !element || !needle[NODE_TYPE] || !element[NODE_TYPE]) {
e3286870fdf20c3c93e944b24fd9af53620f7dbaLennart Poettering ret = false;
e3286870fdf20c3c93e944b24fd9af53620f7dbaLennart Poettering } else if (element[CONTAINS]) {
e3286870fdf20c3c93e944b24fd9af53620f7dbaLennart Poettering if (Y.UA.opera || needle[NODE_TYPE] === 1) { // IE & SAF contains fail if needle not an ELEMENT_NODE
e3286870fdf20c3c93e944b24fd9af53620f7dbaLennart Poettering ret = element[CONTAINS](needle);
a195cbad3796dfda3d1016e4819c612c859e3c7bLennart Poettering } else {
a195cbad3796dfda3d1016e4819c612c859e3c7bLennart Poettering ret = Y.DOM._bruteContains(element, needle);
8514b67754c5ff7fa628929b3d27131010c21842Lennart Poettering }
8514b67754c5ff7fa628929b3d27131010c21842Lennart Poettering } else if (element[COMPARE_DOCUMENT_POSITION]) { // gecko
6c78f43c7b0e54e695af49917fda79b584f46830Lennart Poettering if (element === needle || !!(element[COMPARE_DOCUMENT_POSITION](needle) & 16)) {
6c78f43c7b0e54e695af49917fda79b584f46830Lennart Poettering ret = true;
7b0fce617c48eda32b2d4e04b5f0e4376e8c0106Lennart Poettering }
7b0fce617c48eda32b2d4e04b5f0e4376e8c0106Lennart Poettering }
7b0fce617c48eda32b2d4e04b5f0e4376e8c0106Lennart Poettering
7b0fce617c48eda32b2d4e04b5f0e4376e8c0106Lennart Poettering return ret;
7b0fce617c48eda32b2d4e04b5f0e4376e8c0106Lennart Poettering },
b568ef14a75dffb7182e0acbdec743b31df2a597Lennart Poettering
c2d5b3c94d0c082ef29597fb230f8b88b124bab8Lennart Poettering /**
264b8070715d2d19344c4991ace21147d998f56dLennart Poettering * Determines whether or not the HTMLElement is part of the document.
264b8070715d2d19344c4991ace21147d998f56dLennart Poettering * @method inDoc
7e27f3121e5a10629302b5221eb21345f832724aLennart Poettering * @param {HTMLElement} element The containing html element.
7e27f3121e5a10629302b5221eb21345f832724aLennart Poettering * @param {HTMLElement} doc optional The document to check.
f81e67f79fa856aa2ecffad4d014772ce981745cLennart Poettering * @return {Boolean} Whether or not the element is attached to the document.
f81e67f79fa856aa2ecffad4d014772ce981745cLennart Poettering */
d48b7bd271b1e70924c8485d2f95c2f5a1ae77cbLennart Poettering inDoc: function(element, doc) {
d48b7bd271b1e70924c8485d2f95c2f5a1ae77cbLennart Poettering // there may be multiple elements with the same ID
25e14499c4c5b02229d05a5bc26c3693ade5f987Lennart Poettering doc = doc || element[OWNER_DOCUMENT];
25e14499c4c5b02229d05a5bc26c3693ade5f987Lennart Poettering var nodes = [],
758c4d7a391c0e024737053c815bf3924653b8c5Lennart Poettering ret = false,
758c4d7a391c0e024737053c815bf3924653b8c5Lennart Poettering i,
821cc13ddae40fb7608458b44aaa7a3fd33d56d9Lennart Poettering node,
821cc13ddae40fb7608458b44aaa7a3fd33d56d9Lennart Poettering query;
8483d73ff158ee0d51ccbba09a470cc6ae9b071aLennart Poettering
8483d73ff158ee0d51ccbba09a470cc6ae9b071aLennart Poettering element.id = element.id || Y.guid();
8483d73ff158ee0d51ccbba09a470cc6ae9b071aLennart Poettering
8483d73ff158ee0d51ccbba09a470cc6ae9b071aLennart Poettering nodes = Y.DOM.allById(element.id, doc);
8483d73ff158ee0d51ccbba09a470cc6ae9b071aLennart Poettering for (i = 0; node = nodes[i++];) { // check for a match
8483d73ff158ee0d51ccbba09a470cc6ae9b071aLennart Poettering if (node === element) {
8483d73ff158ee0d51ccbba09a470cc6ae9b071aLennart Poettering ret = true;
25e773eeb4f853804e1bf0dbd9a184f23e9b2a97Kay Sievers break;
b857e042d621ffb98a652f33850b431fafbece43Lennart Poettering }
6dab5bb18151c80fc39bd51f03dcff40b920de3eLennart Poettering }
6dab5bb18151c80fc39bd51f03dcff40b920de3eLennart Poettering
384a4be2b00cb95ce215dd343cc9aa77adc9b1ecLennart Poettering return ret;
384a4be2b00cb95ce215dd343cc9aa77adc9b1ecLennart Poettering
706d97503df83d141d241b645d2c920d691b3d62Lennart Poettering },
706d97503df83d141d241b645d2c920d691b3d62Lennart Poettering
3bcde97e8502c48b53f7420e2433ca68e601662dLennart Poettering allById: function(id, root) {
3bcde97e8502c48b53f7420e2433ca68e601662dLennart Poettering root = root || Y.config.doc;
533bb267f13e2f7b4d7b78de30e821dc81c82335Lennart Poettering var nodes = [],
533bb267f13e2f7b4d7b78de30e821dc81c82335Lennart Poettering ret = [],
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering i,
533bb267f13e2f7b4d7b78de30e821dc81c82335Lennart Poettering node;
b42de08aa4c97636e42c28c7bce08f0d7c2a719aZbigniew Jędrzejewski-Szmek
b42de08aa4c97636e42c28c7bce08f0d7c2a719aZbigniew Jędrzejewski-Szmek if (root.querySelectorAll) {
b42de08aa4c97636e42c28c7bce08f0d7c2a719aZbigniew Jędrzejewski-Szmek ret = root.querySelectorAll('[id="' + id + '"]');
b42de08aa4c97636e42c28c7bce08f0d7c2a719aZbigniew Jędrzejewski-Szmek } else if (root.all) {
202aea456dfb279cd34da7bfd1880f6ac0fd849fLennart Poettering nodes = root.all(id);
42aeb14a4a0fa7d43da96a8ed0fb0e180a2dd5c8Lennart Poettering if (nodes && nodes.nodeType) { // root.all may return one or many
42aeb14a4a0fa7d43da96a8ed0fb0e180a2dd5c8Lennart Poettering nodes = [nodes];
42aeb14a4a0fa7d43da96a8ed0fb0e180a2dd5c8Lennart Poettering }
42aeb14a4a0fa7d43da96a8ed0fb0e180a2dd5c8Lennart Poettering
14a32924c9b46817c92ae11c1147a59dcb62012bLennart Poettering if (nodes && nodes.length) {
14a32924c9b46817c92ae11c1147a59dcb62012bLennart Poettering for (i = 0; node = nodes[i++];) { // check for a match
14a32924c9b46817c92ae11c1147a59dcb62012bLennart Poettering if (node.id === id) { // avoid false positive for node.name
14a32924c9b46817c92ae11c1147a59dcb62012bLennart Poettering ret.push(node);
14a32924c9b46817c92ae11c1147a59dcb62012bLennart Poettering }
14a32924c9b46817c92ae11c1147a59dcb62012bLennart Poettering }
563b1bdc09efe0cf94dd3f514f30376ca854c1ceLennart Poettering }
563b1bdc09efe0cf94dd3f514f30376ca854c1ceLennart Poettering }
5dcf983854c2e8314dbee239180255490ec8ae1cLennart Poettering return ret;
5dcf983854c2e8314dbee239180255490ec8ae1cLennart Poettering },
5dcf983854c2e8314dbee239180255490ec8ae1cLennart Poettering
b873d33ec9583c92a0c2bc6807d010720fa31595Lennart Poettering /**
d61bb44a89fde3042c7c15ea4975239f7dcb0cb0Lennart Poettering * Creates a new dom node using the provided markup string.
ed220efd6657822332b9563ec53c5ab9f3c33220Lennart Poettering * @method create
ed220efd6657822332b9563ec53c5ab9f3c33220Lennart Poettering * @param {String} html The markup used to create the element
41488fe9024a8955d19811620fd55dcc56a5b2baLennart Poettering * @param {HTMLDocument} doc An optional document context
41488fe9024a8955d19811620fd55dcc56a5b2baLennart Poettering */
41488fe9024a8955d19811620fd55dcc56a5b2baLennart Poettering create: function(html, doc) {
41488fe9024a8955d19811620fd55dcc56a5b2baLennart Poettering if (typeof html === 'string') {
41488fe9024a8955d19811620fd55dcc56a5b2baLennart Poettering html = Y.Lang.trim(html); // match IE which trims whitespace from innerHTML
41488fe9024a8955d19811620fd55dcc56a5b2baLennart Poettering }
41488fe9024a8955d19811620fd55dcc56a5b2baLennart Poettering
41488fe9024a8955d19811620fd55dcc56a5b2baLennart Poettering doc = doc || Y.config.doc;
ca70bec9261977336c94f44d5fcf37e1c495326aLennart Poettering var m = re_tag.exec(html),
ca70bec9261977336c94f44d5fcf37e1c495326aLennart Poettering create = Y.DOM._create,
ca70bec9261977336c94f44d5fcf37e1c495326aLennart Poettering custom = Y.DOM.creators,
1dbe0a6efda7b1d35957eab7e1d56a2c69d806d9Lennart Poettering ret = null,
1dbe0a6efda7b1d35957eab7e1d56a2c69d806d9Lennart Poettering tag, nodes;
157a180e4fc827606833a6724834ba7b0246d650Tom Gundersen
157a180e4fc827606833a6724834ba7b0246d650Tom Gundersen if (m && custom[m[1]]) {
823f4a91ebd8942a2c1ff31050dc55eaa60f6ffcLukas Nykryn if (typeof custom[m[1]] === 'function') {
b873d33ec9583c92a0c2bc6807d010720fa31595Lennart Poettering create = custom[m[1]];
9d6db739ce1eaa3eace21801fd606d523b73c8f4Lennart Poettering } else {
1dbe0a6efda7b1d35957eab7e1d56a2c69d806d9Lennart Poettering tag = custom[m[1]];
1dbe0a6efda7b1d35957eab7e1d56a2c69d806d9Lennart Poettering }
9d6db739ce1eaa3eace21801fd606d523b73c8f4Lennart Poettering }
ff3d6560bead6879a2fed1bf99bfe8273b3723f1Zbigniew Jędrzejewski-Szmek
ff3d6560bead6879a2fed1bf99bfe8273b3723f1Zbigniew Jędrzejewski-Szmek nodes = create(html, doc, tag).childNodes;
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek
23c4091dc2b85d117512e89233fdeb47d1ff3d92Lennart Poettering if (nodes.length === 1) { // return single node, breaking parentNode ref from "fragment"
23c4091dc2b85d117512e89233fdeb47d1ff3d92Lennart Poettering ret = nodes[0].parentNode.removeChild(nodes[0]);
9d6db739ce1eaa3eace21801fd606d523b73c8f4Lennart Poettering } else { // return multiple nodes as a fragment
0f47ed0a052c0da743404f23ac3532aaabd23655Lennart Poettering ret = Y.DOM._nl2frag(nodes, doc);
9d6db739ce1eaa3eace21801fd606d523b73c8f4Lennart Poettering }
bc07548926ec5ed7b13df8d3656654f238e0b9a7Lennart Poettering
bc07548926ec5ed7b13df8d3656654f238e0b9a7Lennart Poettering return ret;
b6b63571ae3eca1741d54172922961af972b8f20Lennart Poettering },
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering _nl2frag: function(nodes, doc) {
3f77a1b19f5a8ce33566f7f6e28e94c08ea30841Kay Sievers var ret = null,
e2a69298819b58f008be61d314f8ab95ccaec427Lennart Poettering i, len;
e2a69298819b58f008be61d314f8ab95ccaec427Lennart Poettering
2834ffe78d7fd8be118429aa1449ac72641638c2Lennart Poettering if (nodes && (nodes.push || nodes.item) && nodes[0]) {
2834ffe78d7fd8be118429aa1449ac72641638c2Lennart Poettering doc = doc || nodes[0].ownerDocument;
a940778fb1dd16479f455bab3ac6cbdbc5b06165Lennart Poettering ret = doc.createDocumentFragment();
a940778fb1dd16479f455bab3ac6cbdbc5b06165Lennart Poettering
a01647e53727107d82382bc5c9d98c894e8f386cLennart Poettering if (nodes.item) { // convert live list to static array
3c779fa59d1825d7db2a9516669d34ded7916913Lennart Poettering nodes = Y.Array(nodes, 0, true);
a940778fb1dd16479f455bab3ac6cbdbc5b06165Lennart Poettering }
a01647e53727107d82382bc5c9d98c894e8f386cLennart Poettering
3de03738fc970496d2d3da668c72767a48ccc41bLennart Poettering for (i = 0, len = nodes.length; i < len; i++) {
3de03738fc970496d2d3da668c72767a48ccc41bLennart Poettering ret.appendChild(nodes[i]);
2b1c3767515672dfd0f5e0a9c9d7ac3a16a6a361Lennart Poettering }
2b1c3767515672dfd0f5e0a9c9d7ac3a16a6a361Lennart Poettering } // else inline with log for minification
37efac5ddb21fd91ed420c070ed07f375e78b3b9Lennart Poettering else { Y.log('unable to convert ' + nodes + ' to fragment', 'warn', 'dom'); }
37efac5ddb21fd91ed420c070ed07f375e78b3b9Lennart Poettering return ret;
7348b3adb324614132cf376f478e883bd7de28f1Lennart Poettering },
7348b3adb324614132cf376f478e883bd7de28f1Lennart Poettering
e107ed185ef08945102834234a05ec51bb438685Lennart Poettering
e107ed185ef08945102834234a05ec51bb438685Lennart Poettering CUSTOM_ATTRIBUTES: (!documentElement.hasAttribute) ? { // IE < 8
81429136905a6204875174b60a179333b7f3c9e4Kay Sievers 'for': 'htmlFor',
81429136905a6204875174b60a179333b7f3c9e4Kay Sievers 'class': 'className'
e107ed185ef08945102834234a05ec51bb438685Lennart Poettering } : { // w3c
f598ac3e28b729dd0b1d0a881df3e16465687a2bLennart Poettering 'htmlFor': 'for',
11fb37f16ed99c1603c9d770b60ce4953b96a58dLennart Poettering 'className': 'class'
01083ad094664e5c685060f4fb35a05ea2f212edLennart Poettering },
01083ad094664e5c685060f4fb35a05ea2f212edLennart Poettering
edb2935c5c5b95c42b8679086f60da5eafad74cbLennart Poettering /**
edb2935c5c5b95c42b8679086f60da5eafad74cbLennart Poettering * Provides a normalized attribute interface.
769918ecd30c0f7ee6e87b9aa6226d956bd2f530Lennart Poettering * @method setAttibute
769918ecd30c0f7ee6e87b9aa6226d956bd2f530Lennart Poettering * @param {String | HTMLElement} el The target element for the attribute.
769918ecd30c0f7ee6e87b9aa6226d956bd2f530Lennart Poettering * @param {String} attr The attribute to set.
769918ecd30c0f7ee6e87b9aa6226d956bd2f530Lennart Poettering * @param {String} val The value of the attribute.
6a3f892a23db71544d0439355f96c44350dafa8fLennart Poettering */
2a781fc9bd33982c81e5ff75974a442a33d4f167Lennart Poettering setAttribute: function(el, attr, val, ieAttr) {
2a781fc9bd33982c81e5ff75974a442a33d4f167Lennart Poettering if (el && el.setAttribute) {
6a3f892a23db71544d0439355f96c44350dafa8fLennart Poettering attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
6a3f892a23db71544d0439355f96c44350dafa8fLennart Poettering el.setAttribute(attr, val, ieAttr);
650264033f2f98f6319513958d94d59078654af8Lennart Poettering }
650264033f2f98f6319513958d94d59078654af8Lennart Poettering },
650264033f2f98f6319513958d94d59078654af8Lennart Poettering
f8901862b2b030921b3d5aba4157044ceab16451Lennart Poettering
eda8f06755bd98c4639293c26b856c225f0d1fe1Lennart Poettering /**
eda8f06755bd98c4639293c26b856c225f0d1fe1Lennart Poettering * Provides a normalized attribute interface.
d4fdc205a4610965cee46408dbd046c922e7620cLennart Poettering * @method getAttibute
d4fdc205a4610965cee46408dbd046c922e7620cLennart Poettering * @param {String | HTMLElement} el The target element for the attribute.
d4fdc205a4610965cee46408dbd046c922e7620cLennart Poettering * @param {String} attr The attribute to get.
af1082b04a3d45a9b1d796b4271f44e87e307026Lennart Poettering * @return {String} The current value of the attribute.
af1082b04a3d45a9b1d796b4271f44e87e307026Lennart Poettering */
af1082b04a3d45a9b1d796b4271f44e87e307026Lennart Poettering getAttribute: function(el, attr, ieAttr) {
af1082b04a3d45a9b1d796b4271f44e87e307026Lennart Poettering ieAttr = (ieAttr !== undefined) ? ieAttr : 2;
488ad3b32a7e2b5b1380abf4a15e5f65fa65f3feLennart Poettering var ret = '';
488ad3b32a7e2b5b1380abf4a15e5f65fa65f3feLennart Poettering if (el && el.getAttribute) {
488ad3b32a7e2b5b1380abf4a15e5f65fa65f3feLennart Poettering attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
488ad3b32a7e2b5b1380abf4a15e5f65fa65f3feLennart Poettering ret = el.getAttribute(attr, ieAttr);
488ad3b32a7e2b5b1380abf4a15e5f65fa65f3feLennart Poettering
488ad3b32a7e2b5b1380abf4a15e5f65fa65f3feLennart Poettering if (ret === null) {
47c94a96df29080f8b3a97e7362df4e9c6ba3265Lennart Poettering ret = ''; // per DOM spec
47c94a96df29080f8b3a97e7362df4e9c6ba3265Lennart Poettering }
09ecd746c9d6581664873674c2188f8c93ed7780Lennart Poettering }
09ecd746c9d6581664873674c2188f8c93ed7780Lennart Poettering return ret;
09ecd746c9d6581664873674c2188f8c93ed7780Lennart Poettering },
09ecd746c9d6581664873674c2188f8c93ed7780Lennart Poettering
09ecd746c9d6581664873674c2188f8c93ed7780Lennart Poettering isWindow: function(obj) {
09ecd746c9d6581664873674c2188f8c93ed7780Lennart Poettering return obj.alert && obj.document;
09ecd746c9d6581664873674c2188f8c93ed7780Lennart Poettering },
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering _fragClones: {},
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering _create: function(html, doc, tag) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering tag = tag || 'div';
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering var frag = Y.DOM._fragClones[tag];
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering if (frag) {
0bee65f0622c4faa8ac8ae771cc0c8a936dfa284Lennart Poettering frag = frag.cloneNode(false);
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering } else {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering frag = Y.DOM._fragClones[tag] = doc.createElement(tag);
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering }
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering frag.innerHTML = html;
ebcf1f97de4f6b1580ae55eb56b1a3939fe6b602Lennart Poettering return frag;
47c94a96df29080f8b3a97e7362df4e9c6ba3265Lennart Poettering },
47c94a96df29080f8b3a97e7362df4e9c6ba3265Lennart Poettering
718db96199eb307751264e4163555662c9a389faLennart Poettering _removeChildNodes: function(node) {
718db96199eb307751264e4163555662c9a389faLennart Poettering while (node.firstChild) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering node.removeChild(node.firstChild);
718db96199eb307751264e4163555662c9a389faLennart Poettering }
718db96199eb307751264e4163555662c9a389faLennart Poettering },
718db96199eb307751264e4163555662c9a389faLennart Poettering
966204e010ed432a1d7a0481d41a326d8ec7b0c8Lennart Poettering /**
966204e010ed432a1d7a0481d41a326d8ec7b0c8Lennart Poettering * Inserts content in a node at the given location
94676f3e9352cbf1f72e0a512ee0d2ed83ff676dLennart Poettering * @method addHTML
6fd4d0209827e5c3e52fa8c7144852f550f8f95cLennart Poettering * @param {HTMLElement} node The node to insert into
416446221d905b6815175dc4d525d27f8ae43d1bLennart Poettering * @param {String} content The content to be inserted
416446221d905b6815175dc4d525d27f8ae43d1bLennart Poettering * @param {String} where Where to insert the content; default is after lastChild
7f79cd7109a60810140a045cc725291fc5515264Lennart Poettering */
0aafd43d235982510d1c40564079f7bcec0c7c19Lennart Poettering addHTML: function(node, content, where) {
19aadacf92ad86967ffb678e37b2ff9e83cb9480Jan Engelhardt if (typeof content === 'string') {
19aadacf92ad86967ffb678e37b2ff9e83cb9480Jan Engelhardt content = Y.Lang.trim(content); // match IE which trims whitespace from innerHTML
df5f6971e6e15b4632884916c71daa076c8bae96Lennart Poettering }
df5f6971e6e15b4632884916c71daa076c8bae96Lennart Poettering
fcba531ed4c6e6f8f21d8ca4e3a56e3162b1c578Lennart Poettering var nodeParent = node.parentNode,
fcba531ed4c6e6f8f21d8ca4e3a56e3162b1c578Lennart Poettering newNode;
6aaa8c2f783cd1b3ac27c5ce40625d032e7e3d71Zbigniew Jędrzejewski-Szmek
c3bb87dbab8b79bb9253407cb5b7f3e6fe8db395Lennart Poettering if (content) {
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt if (content.nodeType) { // domNode
18d4e7c26e7806ac363d19989df7144d5058ce41Lennart Poettering newNode = content;
bdeeb6b543a2a2d0a494f17b85f1498859cdfc2fLennart Poettering } else { // create from string and cache
bdeeb6b543a2a2d0a494f17b85f1498859cdfc2fLennart Poettering newNode = Y.DOM.create(content);
bdeeb6b543a2a2d0a494f17b85f1498859cdfc2fLennart Poettering }
bdeeb6b543a2a2d0a494f17b85f1498859cdfc2fLennart Poettering }
4e09014daf8f98584b3f15e64e93bed232e70a6bLennart Poettering
4e09014daf8f98584b3f15e64e93bed232e70a6bLennart Poettering if (where) {
4e09014daf8f98584b3f15e64e93bed232e70a6bLennart Poettering if (where.nodeType) { // insert regardless of relationship to node
6bb648a16ae4a682ad4784412af706d2e6a3e4daTom Gundersen // TODO: check if node.contains(where)?
fa607802f332e06f4044c3eb38dbea41076c803dLennart Poettering where.parentNode.insertBefore(newNode, where);
d0928791499734e202460d5c027b5d3e0d28e7abLennart Poettering } else {
7212c6083a5577eabc96c35c9db4c19c113cae93Lennart Poettering switch (where) {
1f140dd8b048c5f5599a886b8c4d20f3f1065774David Herrmann case 'replace':
57f2a947270faf65e1876797b930e3f6d60ebd06Lennart Poettering while (node.firstChild) {
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt node.removeChild(node.firstChild);
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering }
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering if (newNode) { // allow empty content to clear node
dc17bcef197a0d5ee798cce59c40e4f5e85c24f6Lennart Poettering node.appendChild(newNode);
80caea6cc72ebd311a311b1527cc6b87201c13bfLennart Poettering }
ab9716c2489f9141ed13ec22dbb216b3e6fbd6b5Lennart Poettering break;
df98a87ba389bdfc0359beedf47557411f3af434Lennart Poettering case 'before':
df98a87ba389bdfc0359beedf47557411f3af434Lennart Poettering nodeParent.insertBefore(newNode, node);
df98a87ba389bdfc0359beedf47557411f3af434Lennart Poettering break;
df98a87ba389bdfc0359beedf47557411f3af434Lennart Poettering case 'after':
2ecfc64e59b5e4e96bed6f68bd36b612ef77a146Lennart Poettering if (node.nextSibling) { // IE errors if refNode is null
6a8b5fa4635ed858788fb10099ec9b62b3359a0aLennart Poettering nodeParent.insertBefore(newNode, node.nextSibling);
69727e6dc69ae5d9b5ae3681723778a3faa354e9Lennart Poettering } else {
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering nodeParent.appendChild(newNode);
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering }
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering break;
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering default:
b568ef14a75dffb7182e0acbdec743b31df2a597Lennart Poettering node.appendChild(newNode);
0ad68f8743f3baaa7cd8ac7a2275459ae0f7b96aLennart Poettering }
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering }
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering } else {
12179984a38fe74581333fbcdc11c822d81f505fLennart Poettering node.appendChild(newNode);
0536ce5d0ceaf87f3e81faaff41d69ffeed2186fZbigniew Jędrzejewski-Szmek }
eb01ba5de14859d7a94835ab9299de40132d549aLennart Poettering
154ff088d371bee5651eaa2bc9bde8a34c185656Lennart Poettering return newNode;
154ff088d371bee5651eaa2bc9bde8a34c185656Lennart Poettering },
154ff088d371bee5651eaa2bc9bde8a34c185656Lennart Poettering
154ff088d371bee5651eaa2bc9bde8a34c185656Lennart Poettering VALUE_SETTERS: {},
69af45035913e7119cffd94c542bd3039600e45dZbigniew Jędrzejewski-Szmek
e8a7a315391a6a07897122725cd707f4e9ce63d7Lennart Poettering VALUE_GETTERS: {},
461bd8e47cafacfcd38389e7558330bfb6e902adLennart Poettering
461bd8e47cafacfcd38389e7558330bfb6e902adLennart Poettering getValue: function(node) {
461bd8e47cafacfcd38389e7558330bfb6e902adLennart Poettering var ret = '', // TODO: return null?
ab8e074ce25b9947314c69e17afe1bd2527ee26dLennart Poettering getter;
ab8e074ce25b9947314c69e17afe1bd2527ee26dLennart Poettering
ab8e074ce25b9947314c69e17afe1bd2527ee26dLennart Poettering if (node && node[TAG_NAME]) {
ab8e074ce25b9947314c69e17afe1bd2527ee26dLennart Poettering getter = Y.DOM.VALUE_GETTERS[node[TAG_NAME].toLowerCase()];
b454b11220e87add6d0f011695c7912b009c853dLennart Poettering
b454b11220e87add6d0f011695c7912b009c853dLennart Poettering if (getter) {
4ff49cb63075aba646b578f2516b37a8dfd5a65bLennart Poettering ret = getter(node);
4ff49cb63075aba646b578f2516b37a8dfd5a65bLennart Poettering } else {
fff87a35d9e26c0d4ea41273a963c0eb20e18da4Zbigniew Jędrzejewski-Szmek ret = node.value;
fff87a35d9e26c0d4ea41273a963c0eb20e18da4Zbigniew Jędrzejewski-Szmek }
fff87a35d9e26c0d4ea41273a963c0eb20e18da4Zbigniew Jędrzejewski-Szmek }
b8b4d3dddc7611dce3bf28004b0375d661120c62Lennart Poettering
b5c03638d48c07aa0eaf13b5f54000c7133e1883Lennart Poettering // workaround for IE8 JSON stringify bug
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt // which converts empty string values to null
b5c03638d48c07aa0eaf13b5f54000c7133e1883Lennart Poettering if (ret === EMPTY_STRING) {
b5c03638d48c07aa0eaf13b5f54000c7133e1883Lennart Poettering ret = EMPTY_STRING; // for real
b5c03638d48c07aa0eaf13b5f54000c7133e1883Lennart Poettering }
eece8c6fb5f4d354dcef6fd369e876c4f3a3f163Lennart Poettering
eece8c6fb5f4d354dcef6fd369e876c4f3a3f163Lennart Poettering return (typeof ret === 'string') ? ret : '';
eece8c6fb5f4d354dcef6fd369e876c4f3a3f163Lennart Poettering },
356ce9915ab1a4a1e6dc26954df34936a69e7c12Lennart Poettering
356ce9915ab1a4a1e6dc26954df34936a69e7c12Lennart Poettering setValue: function(node, val) {
c144692179098c1861f2aeafc67689a74439cf4cLennart Poettering var setter;
c144692179098c1861f2aeafc67689a74439cf4cLennart Poettering
c144692179098c1861f2aeafc67689a74439cf4cLennart Poettering if (node && node[TAG_NAME]) {
c144692179098c1861f2aeafc67689a74439cf4cLennart Poettering setter = Y.DOM.VALUE_SETTERS[node[TAG_NAME].toLowerCase()];
795607b22308f5b92073b012e43be1892fdd97c0Lennart Poettering
0be8342c04bbf129b4a21e5073eacccbbce4e896Lennart Poettering if (setter) {
0be8342c04bbf129b4a21e5073eacccbbce4e896Lennart Poettering setter(node, val);
0be8342c04bbf129b4a21e5073eacccbbce4e896Lennart Poettering } else {
0be8342c04bbf129b4a21e5073eacccbbce4e896Lennart Poettering node.value = val;
0be8342c04bbf129b4a21e5073eacccbbce4e896Lennart Poettering }
e5ec62c56963d997edaffa904af5dc45dac23988Lennart Poettering }
54c31a79f72ff57ac8eba089acacc4ab482b745dLennart Poettering },
826872b61e4857dfffe63ba84e2b005623baecd6Lennart Poettering
826872b61e4857dfffe63ba84e2b005623baecd6Lennart Poettering siblings: function(node, fn) {
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt var nodes = [],
826872b61e4857dfffe63ba84e2b005623baecd6Lennart Poettering sibling = node;
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering while ((sibling = sibling[PREVIOUS_SIBLING])) {
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering if (sibling[TAG_NAME] && (!fn || fn(sibling))) {
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering nodes.unshift(sibling);
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering }
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering }
356ce9915ab1a4a1e6dc26954df34936a69e7c12Lennart Poettering
490b7e47093d491a2bdb1084fe92b796f4e07eefLennart Poettering sibling = node;
81d112a8f0522a09fcfe317f420363a2b728137cLennart Poettering while ((sibling = sibling[NEXT_SIBLING])) {
490b7e47093d491a2bdb1084fe92b796f4e07eefLennart Poettering if (sibling[TAG_NAME] && (!fn || fn(sibling))) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering nodes.push(sibling);
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering }
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering }
466784c8710e5cb0e0b86a16506d992d7ec5b619Kay Sievers
e41814846c19a48f4490169d82e359e005c4db45Lennart Poettering return nodes;
c0fe5db522b52f27e030655ce2c03e05cbbc1558Kay Sievers },
e9fd44b728ff1fc0d1f24fccb87a767f6865df27Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering /**
e9fd44b728ff1fc0d1f24fccb87a767f6865df27Lennart Poettering * Brute force version of contains.
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * Used for browsers without contains support for non-HTMLElement Nodes (textNodes, etc).
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * @method _bruteContains
3040728b6691ea2e9df3a2060e2d49a792bbaedaLennart Poettering * @private
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * @param {HTMLElement} element The containing html element.
8ed206517c2be381324ac5832bf34cc14024270eLennart Poettering * @param {HTMLElement} needle The html element that may be contained.
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * @return {Boolean} Whether or not the element is or contains the needle.
e6c6e7afffa80ad74efdb1ddfa815294624f1608Lennart Poettering */
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering _bruteContains: function(element, needle) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering while (needle) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering if (element === needle) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering return true;
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering }
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering needle = needle.parentNode;
e5ec62c56963d997edaffa904af5dc45dac23988Lennart Poettering }
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering return false;
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering },
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering// TODO: move to Lang?
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering /**
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering * Memoizes dynamic regular expressions to boost runtime performance.
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering * @method _getRegExp
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering * @private
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering * @param {String} str The string to convert to a regular expression.
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering * @param {String} flags optional An optinal string of flags.
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering * @return {RegExp} An instance of RegExp
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering */
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering _getRegExp: function(str, flags) {
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering flags = flags || '';
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering Y.DOM._regexCache = Y.DOM._regexCache || {};
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering if (!Y.DOM._regexCache[str + flags]) {
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering Y.DOM._regexCache[str + flags] = new RegExp(str, flags);
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering }
b568ef14a75dffb7182e0acbdec743b31df2a597Lennart Poettering return Y.DOM._regexCache[str + flags];
e673ad0415d89c322e5b1a121e411f1b1d8075c0Lennart Poettering },
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
e673ad0415d89c322e5b1a121e411f1b1d8075c0Lennart Poettering// TODO: make getDoc/Win true privates?
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering /**
e673ad0415d89c322e5b1a121e411f1b1d8075c0Lennart Poettering * returns the appropriate document.
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * @method _getDoc
57f2a947270faf65e1876797b930e3f6d60ebd06Lennart Poettering * @private
c06bf414042cd1bf94e0af63e9e2a0c291bfc546Kay Sievers * @param {HTMLElement} element optional Target element.
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * @return {Object} The document for the given element or the default document.
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering */
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering _getDoc: function(element) {
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt element = element || {};
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering return (element[NODE_TYPE] === 9) ? element : // element === document
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering element[OWNER_DOCUMENT] || // element === DOM node
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering element.document || // element === window
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering Y.config.doc; // default
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering },
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering /**
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * returns the appropriate window.
f47ec8ebb3858553dec870e1c596e39525f46360Lennart Poettering * @method _getWin
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * @private
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering * @param {HTMLElement} element optional Target element.
038cf33420afa5f913fe5cbf3e7138574c33d97bZbigniew Jędrzejewski-Szmek * @return {Object} The window for the given element or the default window.
038cf33420afa5f913fe5cbf3e7138574c33d97bZbigniew Jędrzejewski-Szmek */
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering _getWin: function(element) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering var doc = Y.DOM._getDoc(element);
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering return doc[DEFAULT_VIEW] || doc[PARENT_WINDOW] || Y.config.win;
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering },
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering _batch: function(nodes, fn, arg1, arg2, arg3, etc) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering fn = (typeof name === 'string') ? Y.DOM[fn] : fn;
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering var result,
601d9d6fb394a780765e80581daab850623e9698Josh Triplett ret = [];
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering if (fn && nodes) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering Y.each(nodes, function(node) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering if ((result = fn.call(Y.DOM, node, arg1, arg2, arg3, etc)) !== undefined) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering ret[ret.length] = result;
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering }
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering });
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering }
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt return ret.length ? ret : nodes;
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering },
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering creators: {},
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering _IESimpleCreate: function(html, doc) {
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering doc = doc || Y.config.doc;
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering return doc.createElement(html);
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering }
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering};
279f036675536d55c901562b49f9df146af1a0e3Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering(function(Y) {
8b8f259170e35b93e6c6d1757cb8b835bbdaa40cZbigniew Jędrzejewski-Szmek var creators = Y.DOM.creators,
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering create = Y.DOM.create,
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering re_tbody = /(?:\/(?:thead|tfoot|tbody|caption|col|colgroup)>)+\s*<tbody/,
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering TABLE_OPEN = '<table>',
eb124a97fb72d076014253b1acde69d428f15ecfLennart Poettering TABLE_CLOSE = '</table>';
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering if (Y.UA.ie) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering Y.mix(creators, {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering // TODO: thead/tfoot with nested tbody
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering // IE adds TBODY when creating TABLE elements (which may share this impl)
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering tbody: function(html, doc) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering var frag = create(TABLE_OPEN + html + TABLE_CLOSE, doc),
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering tb = frag.children.tags('tbody')[0];
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering if (frag.children.length > 1 && tb && !re_tbody.test(html)) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering tb[PARENT_NODE].removeChild(tb); // strip extraneous tbody
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering }
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering return frag;
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering },
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering script: function(html, doc) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering var frag = doc.createElement('div');
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering frag.innerHTML = '-' + html;
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering frag.removeChild(frag[FIRST_CHILD]);
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering return frag;
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering }
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering }, true);
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering Y.mix(Y.DOM.VALUE_GETTERS, {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering button: function(node) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering return (node.attributes && node.attributes.value) ? node.attributes.value.value : '';
8b04b925e587ff56568c62ff5ad3f2ea2b34ca7aLennart Poettering }
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering });
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering Y.mix(Y.DOM.VALUE_SETTERS, {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering // IE: node.value changes the button text, which should be handled via innerHTML
eb124a97fb72d076014253b1acde69d428f15ecfLennart Poettering button: function(node, val) {
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering var attr = node.attributes.value;
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt if (!attr) {
90e071d1d59be05fcba66561439c3ca67c80ee20Lennart Poettering attr = node[OWNER_DOCUMENT].createAttribute('value');
d2e83c23f5f0cdd3b6ec05c5c40209708721e704Kay Sievers node.setAttributeNode(attr);
a19554ed92a7460b4e709cc40c558cde827ab85bLennart Poettering }
a19554ed92a7460b4e709cc40c558cde827ab85bLennart Poettering
1cb88f2c61f590083847d65cd5a518e834da87d3Lennart Poettering attr.value = val;
1cb88f2c61f590083847d65cd5a518e834da87d3Lennart Poettering }
1cb88f2c61f590083847d65cd5a518e834da87d3Lennart Poettering });
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt }
1cb88f2c61f590083847d65cd5a518e834da87d3Lennart Poettering
603cd8fe07cb03e8b11722d1a732e569e5a46347Lennart Poettering if (Y.UA.gecko || Y.UA.ie) {
a7a3f28be404875eff20443a0fa8088bcc4c18dfLennart Poettering Y.mix(creators, {
a7a3f28be404875eff20443a0fa8088bcc4c18dfLennart Poettering option: function(html, doc) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering return create('<select>' + html + '</select>', doc);
08f9588885c5d65694b324846b0ed19211d2c178Lennart Poettering },
9ee58bddeb6eb044753167e0047fe836479ca5dbKay Sievers
9ee58bddeb6eb044753167e0047fe836479ca5dbKay Sievers tr: function(html, doc) {
dcfc4b2e5c1af6375488c00bdc6fb8122f86c4d7Lennart Poettering return create('<tbody>' + html + '</tbody>', doc);
71ef24d09573874c0f7bc323c07c3aec2a458707Lennart Poettering },
71ef24d09573874c0f7bc323c07c3aec2a458707Lennart Poettering
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt td: function(html, doc) {
1b89884ba31cbe98f159ce2c7d6fac5f6a57698fLennart Poettering return create('<tr>' + html + '</tr>', doc);
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering },
9cb74bcb23dde8488459ca233bf9caee642b8402Zbigniew Jędrzejewski-Szmek
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering tbody: function(html, doc) {
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering return create(TABLE_OPEN + html + TABLE_CLOSE, doc);
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering }
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering });
b44be3ecf6326c27aa2c6c6d1fe34e22e22592a0Lennart Poettering
5f1dac6bf605871615b35891a3966fa474db5b20Lennart Poettering Y.mix(creators, {
f801968466fed39d50d410b30ac828c26722cc95Lennart Poettering legend: 'fieldset',
424a19f8a2061c6b058283228734010b2fa24db4Lennart Poettering th: creators.td,
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering thead: creators.tbody,
424a19f8a2061c6b058283228734010b2fa24db4Lennart Poettering tfoot: creators.tbody,
424a19f8a2061c6b058283228734010b2fa24db4Lennart Poettering caption: creators.tbody,
424a19f8a2061c6b058283228734010b2fa24db4Lennart Poettering colgroup: creators.tbody,
a1cccad1fe88ddd6943e18af97cf7f466296970fLennart Poettering col: creators.tbody,
8556879e0d14925ce897875c6c264368e2d048c2Lennart Poettering optgroup: creators.option
4a30847b9d71e0381948d68279c8f775b9de7850Lennart Poettering });
4a30847b9d71e0381948d68279c8f775b9de7850Lennart Poettering }
5e8b28838e493b59628322b69580097ef7dd9384Lennart Poettering
5e8b28838e493b59628322b69580097ef7dd9384Lennart Poettering Y.mix(Y.DOM.VALUE_GETTERS, {
38a60d7112d33ffd596b23e8df53d75a7c09e71bLennart Poettering option: function(node) {
38a60d7112d33ffd596b23e8df53d75a7c09e71bLennart Poettering var attrs = node.attributes;
68f160039eb78fe122cfe0d4c49695ae91f6f0d1Lennart Poettering return (attrs.value && attrs.value.specified) ? node.value : node.text;
0790b9fed42eefc4e22dbbe2337cba9713b7848cLennart Poettering },
68f160039eb78fe122cfe0d4c49695ae91f6f0d1Lennart Poettering
68f160039eb78fe122cfe0d4c49695ae91f6f0d1Lennart Poettering select: function(node) {
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt var val = node.value,
68f160039eb78fe122cfe0d4c49695ae91f6f0d1Lennart Poettering options = node.options;
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt
68f160039eb78fe122cfe0d4c49695ae91f6f0d1Lennart Poettering if (options && val === '') {
0790b9fed42eefc4e22dbbe2337cba9713b7848cLennart Poettering // TODO: implement multipe select
fd4d89b2c0b31da01d134301e30916931ae3c7d9Lennart Poettering if (node.multiple) {
fd4d89b2c0b31da01d134301e30916931ae3c7d9Lennart Poettering Y.log('multiple select normalization not implemented', 'warn', 'DOM');
47ae7201b1df43bd3da83a19e38483b0e5694c99Lennart Poettering } else {
47ae7201b1df43bd3da83a19e38483b0e5694c99Lennart Poettering val = Y.DOM.getValue(options[node.selectedIndex], 'value');
88a6c5894c9d3f85d63b87b040c130366b4006ceKay Sievers }
8351ceaea9480d9c2979aa2ff0f4982cfdfef58dLennart Poettering }
9946996cda11a18b44d82344676e5a0e96339408Lennart Poettering
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt return val;
9946996cda11a18b44d82344676e5a0e96339408Lennart Poettering }
3471bedc005fab03f40b99bf6599645330adcd9eLennart Poettering });
3471bedc005fab03f40b99bf6599645330adcd9eLennart Poettering})(Y);
59cea26a349cfa8db906b520dac72563dd773ff2Lennart Poettering
35eb6b124ebdf82bd77aad6e44962a9a039c4d33Lennart Poettering})(Y);
5b40d33761376354116a8cddb9b9fbdb6c4727d6Lennart Poetteringvar addClass, hasClass, removeClass;
5b40d33761376354116a8cddb9b9fbdb6c4727d6Lennart Poettering
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay SieversY.mix(Y.DOM, {
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers /**
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers * Determines whether a DOM element has the given className.
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers * @method hasClass
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers * @param {HTMLElement} element The DOM element.
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers * @param {String} className the class name to search for
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers * @return {Boolean} Whether or not the element has the given class.
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers */
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers hasClass: function(node, className) {
d3a3f22267a7dac426b07a7ed0baa1632f5daf04Kay Sievers var re = Y.DOM._getRegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart Poettering return re.test(node.className);
e01a15b71e18bf2008aec7e75041ffa42eb80b80Kay Sievers },
a888b352eb53b07daa24fa859ceeb254336b293dLennart Poettering
abd55b16547d0bb0ed1c31e72e16838f0f59f48bKay Sievers /**
abd55b16547d0bb0ed1c31e72e16838f0f59f48bKay Sievers * Adds a class name to a given DOM element.
abd55b16547d0bb0ed1c31e72e16838f0f59f48bKay Sievers * @method addClass
abd55b16547d0bb0ed1c31e72e16838f0f59f48bKay Sievers * @param {HTMLElement} element The DOM element.
e8d842a0d0b39f298e1e7f70d29759e50b2b16d4Tom Gundersen * @param {String} className the class name to add to the class attribute
e7337bae09c2e22a42a2a9c8cdda0cd6cf42428eTom Gundersen */
b8217b7bd5fd171916a095b150fad4c3a37f5a41Kay Sievers addClass: function(node, className) {
169c4f65131fbc7bcb51e7d5487a715cdcd0e0ebLennart Poettering if (!Y.DOM.hasClass(node, className)) { // skip if already present
169c4f65131fbc7bcb51e7d5487a715cdcd0e0ebLennart Poettering node.className = Y.Lang.trim([node.className, className].join(' '));
fb0864e7b9c6d26269ccea6ec5c0fd921c029781Lennart Poettering }
fb0864e7b9c6d26269ccea6ec5c0fd921c029781Lennart Poettering },
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering /**
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering * Removes a class name from a given element.
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering * @method removeClass
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering * @param {HTMLElement} element The DOM element.
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering * @param {String} className the class name to remove from the class attribute
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering */
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering removeClass: function(node, className) {
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering if (className && hasClass(node, className)) {
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering node.className = Y.Lang.trim(node.className.replace(Y.DOM._getRegExp('(?:^|\\s+)' +
70a44afee385c4afadaab9a002b3f9dd44aedf4aJan Engelhardt className + '(?:\\s+|$)'), ' '));
65c0cf7108ae3537a357c74b4586a783baba82f9Lennart Poettering
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers if ( hasClass(node, className) ) { // in case of multiple adjacent
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers removeClass(node, className);
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers }
ad740100d108282d0244d5739d4dcc86fe4c5fdeLennart Poettering }
ad740100d108282d0244d5739d4dcc86fe4c5fdeLennart Poettering },
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering
f38afcd0c7f558ca5bf0854b42f8c6954f8ad7f3Lennart Poettering /**
614cc34f3a2a7c64a21c3f5256f2e2b2c1de1d51Zbigniew Jędrzejewski-Szmek * Replace a class with another class for a given element.
614cc34f3a2a7c64a21c3f5256f2e2b2c1de1d51Zbigniew Jędrzejewski-Szmek * If no oldClassName is present, the newClassName is simply added.
7d441ddb5ca090b5a97f58ac4b4d97b3e84fa81eLennart Poettering * @method replaceClass
d28315e4aff91560ed4c2fc9f876ec8bfc559f2dJan Engelhardt * @param {HTMLElement} element The DOM element
14e639ae7a1dbf156273ce697d30fbc6c6594209Lennart Poettering * @param {String} oldClassName the class name to be replaced
7f8aa67131cfc03ddcbd31c0420754864fc122f0Lennart Poettering * @param {String} newClassName the class name that will be replacing the old class name
ff01d048b4c1455241c894cf7982662c9d28fd34Lennart Poettering */
d3c7d7dd77b2b72315164b672462825cef6c0f9aKay Sievers replaceClass: function(node, oldC, newC) {
72b9ed828bd22f3ddd74b6853c183eebf006d6d8Lennart Poettering //Y.log('replaceClass replacing ' + oldC + ' with ' + newC, 'info', 'Node');
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering addClass(node, newC);
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering removeClass(node, oldC);
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering },
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering /**
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering * If the className exists on the node it is removed, if it doesn't exist it is added.
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering * @method toggleClass
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering * @param {HTMLElement} element The DOM element
a4c279f87451186b8beb1b8cc21c7cad561ecf4bLennart Poettering * @param {String} className the class name to be toggled
a4c279f87451186b8beb1b8cc21c7cad561ecf4bLennart Poettering * @param {Boolean} addClass optional boolean to indicate whether class
55cdcbacf70f05a40a155af24f6d2da6b478cba6Lennart Poettering * should be added or removed regardless of current state
8d0e38a2b966799af884e78a54fd6a2dffa44788Lennart Poettering */
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering toggleClass: function(node, className, force) {
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering var add = (force !== undefined) ? force :
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering !(hasClass(node, className));
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering
88a07670cfa974a605c7c7b520b8a3135fce37f9Lennart Poettering if (add) {
88a07670cfa974a605c7c7b520b8a3135fce37f9Lennart Poettering addClass(node, className);
88a07670cfa974a605c7c7b520b8a3135fce37f9Lennart Poettering } else {
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering removeClass(node, className);
916abb21d0a6653e0187b91591e492026886b0a4Lennart Poettering }
9534ce54858c67363b841cdbdc315140437bfdb4Lennart Poettering }
9534ce54858c67363b841cdbdc315140437bfdb4Lennart Poettering});
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering
796b06c21b62d13c9021e2fbd9c58a5c6edb2764Kay SievershasClass = Y.DOM.hasClass;
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart PoetteringremoveClass = Y.DOM.removeClass;
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart PoetteringaddClass = Y.DOM.addClass;
7a2a0b907b5cc60f5d9a871997d7d6e7f62bf4d8Lennart Poettering
253ee27a0c7a410d27d490bb79ea97caed6a2b68Lennart Poettering
5d0fcd7c8d29340ac9425c309e8ac436a9af699cLennart Poettering
8bbabc447b1d913bd21faf97c7b17d20d315d2b4Lennart Poettering}, '@VERSION@' ,{requires:['oop']});
f530371f1f85a070d7d0fb5112146a43533ae00bLennart PoetteringYUI.add('dom-style', function(Y) {
e707c49485b8f4f2ec040d3da232d39153e650b9Lennart Poettering
a19554ed92a7460b4e709cc40c558cde827ab85bLennart Poettering(function(Y) {
a73d88fa024b5668ed7dde681e99547d41e6a864Lennart Poettering/**
a74a8793b04de9886b4f6987b9cb86fa02c73520Lennart Poettering * Add style management functionality to DOM.
3040728b6691ea2e9df3a2060e2d49a792bbaedaLennart Poettering * @module dom
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering * @submodule dom-style
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering * @for DOM
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering */
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poettering
3679d1126bae52e02f6cd60fca196f616b9e660dLennart Poetteringvar DOCUMENT_ELEMENT = 'documentElement',
73090dc815390f4fca4e3ed8a7e1d3806605daaaLennart Poettering DEFAULT_VIEW = 'defaultView',
44143309dd0b37d61d7d842ca58f01a65646ec71Kay Sievers OWNER_DOCUMENT = 'ownerDocument',
3d57c6ab801f4437f12948e29589e3d00c3ad9dbLennart Poettering STYLE = 'style',
260abb780a135e4cae8c10715c7e85675efc345aLennart Poettering FLOAT = 'float',
2791a8f8dc8764a9247cdba3562bd4c04010f144Lennart Poettering CSS_FLOAT = 'cssFloat',
a8f11321c209830a35edd0357e8def5d4437d854Lennart Poettering STYLE_FLOAT = 'styleFloat',
Error!

 

There was an error!

null

java.lang.NullPointerException