dom.js revision 744aec5933ba55f438dc42a241edb3c95df5abff
6a01f2d5ec2024b68edd1d42056b41a88dc0a935aaronYUI.add('dom', function(Y) {
0dc14774d2c21baf6123fcafdb853af5be1d97edwrowe
3fde4c273ea649d1320ec9c51e7d096cd9340a94jerenkrantz/**
3fde4c273ea649d1320ec9c51e7d096cd9340a94jerenkrantz * The DOM utility provides a cross-browser abtraction layer
3fde4c273ea649d1320ec9c51e7d096cd9340a94jerenkrantz * normalizing DOM tasks, and adds extra helper functionality
75eee56d2eaac9c27d32fc46b90bb6b1eac85359trawick * for other common tasks.
75eee56d2eaac9c27d32fc46b90bb6b1eac85359trawick * @module dom
0dc14774d2c21baf6123fcafdb853af5be1d97edwrowe * @submodule dom-base
0dc14774d2c21baf6123fcafdb853af5be1d97edwrowe *
741a54303329728b27fe347447a362e1c576135etrawick */
0dc14774d2c21baf6123fcafdb853af5be1d97edwrowe
9f62694a8b4e2b88994a14555d144b3836b311cfstoddard/**
9f62694a8b4e2b88994a14555d144b3836b311cfstoddard * Provides DOM helper methods.
9f62694a8b4e2b88994a14555d144b3836b311cfstoddard * @class DOM
9f62694a8b4e2b88994a14555d144b3836b311cfstoddard *
52489511342e4ff3fe399e57f29d38e5c4227bc8trawick */
52489511342e4ff3fe399e57f29d38e5c4227bc8trawickvar NODE_TYPE = 'nodeType',
52489511342e4ff3fe399e57f29d38e5c4227bc8trawick OWNER_DOCUMENT = 'ownerDocument',
52489511342e4ff3fe399e57f29d38e5c4227bc8trawick DOCUMENT_ELEMENT = 'documentElement',
8864d6f5f4744b5d2b638e2a53e2660bcf8b5ab5dougm DEFAULT_VIEW = 'defaultView',
8864d6f5f4744b5d2b638e2a53e2660bcf8b5ab5dougm PARENT_WINDOW = 'parentWindow',
8864d6f5f4744b5d2b638e2a53e2660bcf8b5ab5dougm TAG_NAME = 'tagName',
ea512a4af20e6b6e6931de4929d54d93f03a0139ianh PARENT_NODE = 'parentNode',
1e83c8de3aa48b316b28057d53995272baf1260cwrowe FIRST_CHILD = 'firstChild',
1dfb5e008f35ed13c343b7f6306675e33c399792gstein LAST_CHILD = 'lastChild',
1dfb5e008f35ed13c343b7f6306675e33c399792gstein PREVIOUS_SIBLING = 'previousSibling',
1dfb5e008f35ed13c343b7f6306675e33c399792gstein NEXT_SIBLING = 'nextSibling',
1dfb5e008f35ed13c343b7f6306675e33c399792gstein CONTAINS = 'contains',
eadb64379834961679105b7fd4178253fbb9f95dtrawick COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',
eadb64379834961679105b7fd4178253fbb9f95dtrawick INNER_TEXT = 'innerText',
eadb64379834961679105b7fd4178253fbb9f95dtrawick TEXT_CONTENT = 'textContent',
eadb64379834961679105b7fd4178253fbb9f95dtrawick LENGTH = 'length',
eadb64379834961679105b7fd4178253fbb9f95dtrawick
c7e917aa56886c47bfe061c5e9f603a5aaef0d87trawick UNDEFINED = undefined;
c7e917aa56886c47bfe061c5e9f603a5aaef0d87trawick
c7e917aa56886c47bfe061c5e9f603a5aaef0d87trawickvar re_tag = /<([a-z]+)/i;
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoar
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoarvar templateCache = {};
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoar
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoarY.DOM = {
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoar /**
6b6083e6518007139257ee449c2af3032d2437d0trawick * Returns the HTMLElement with the given ID (Wrapper for document.getElementById).
6b6083e6518007139257ee449c2af3032d2437d0trawick * @method byId
6b6083e6518007139257ee449c2af3032d2437d0trawick * @param {String} id the id attribute
88dd056b9863502bba82c2889a0c4cde9fc0ba93trawick * @param {Object} doc optional The document to search. Defaults to current document
88dd056b9863502bba82c2889a0c4cde9fc0ba93trawick * @return {HTMLElement | null} The HTMLElement with the id, or null if none found.
88dd056b9863502bba82c2889a0c4cde9fc0ba93trawick */
88dd056b9863502bba82c2889a0c4cde9fc0ba93trawick byId: function(id, doc) {
7ef3a1797818c6d25efe8c5fadb5eec3b965a6fabrianp return Y.DOM._getDoc(doc).getElementById(id);
7ef3a1797818c6d25efe8c5fadb5eec3b965a6fabrianp },
7ef3a1797818c6d25efe8c5fadb5eec3b965a6fabrianp
1e83c8de3aa48b316b28057d53995272baf1260cwrowe /**
1e83c8de3aa48b316b28057d53995272baf1260cwrowe * Returns the text content of the HTMLElement.
1e83c8de3aa48b316b28057d53995272baf1260cwrowe * @method getText
1e83c8de3aa48b316b28057d53995272baf1260cwrowe * @param {HTMLElement} element The html element.
1e83c8de3aa48b316b28057d53995272baf1260cwrowe * @return {String} The text content of the element (includes text of any descending elements).
1e83c8de3aa48b316b28057d53995272baf1260cwrowe */
1e83c8de3aa48b316b28057d53995272baf1260cwrowe getText: function(element) {
1e83c8de3aa48b316b28057d53995272baf1260cwrowe var text = element ? element[TEXT_CONTENT] : '';
1e83c8de3aa48b316b28057d53995272baf1260cwrowe if (text === UNDEFINED && INNER_TEXT in element) {
1e83c8de3aa48b316b28057d53995272baf1260cwrowe text = element[INNER_TEXT];
7f683bb300df767164724ebc664f339ac396b434dougm }
7f683bb300df767164724ebc664f339ac396b434dougm return text || '';
7f683bb300df767164724ebc664f339ac396b434dougm },
7f683bb300df767164724ebc664f339ac396b434dougm
7f683bb300df767164724ebc664f339ac396b434dougm /**
7f683bb300df767164724ebc664f339ac396b434dougm * Finds the firstChild of the given HTMLElement.
7f683bb300df767164724ebc664f339ac396b434dougm * @method firstChild
26dfa083a1662d57ba7cc410eec4e0696b9be469wrowe * @param {HTMLElement} element The html element.
26dfa083a1662d57ba7cc410eec4e0696b9be469wrowe * @param {Function} fn optional An optional boolean test to apply.
26dfa083a1662d57ba7cc410eec4e0696b9be469wrowe * The optional function is passed the current HTMLElement being tested as its only argument.
26dfa083a1662d57ba7cc410eec4e0696b9be469wrowe * If no function is given, the first found is returned.
4760aa1f19600972cf531ad7da73c1ee5a0225cedougm * @return {HTMLElement | null} The first matching child html element.
4760aa1f19600972cf531ad7da73c1ee5a0225cedougm */
87a1c79b7b37702a254920ca5214fb282a4fb085dougm firstChild: function(element, fn) {
994c3fbc3335e8fe883b1ce4515efc0c85061cdfaaron return Y.DOM._childBy(element, null, fn);
d5d164b22a2004abed640cb52fc275f00ed92f69jerenkrantz },
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid firstChildByTag: function(element, tag, fn) {
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid return Y.DOM._childBy(element, tag, fn);
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid },
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid
525508562a53864b78cf8da91ac13be9c072bba7jerenkrantz /**
525508562a53864b78cf8da91ac13be9c072bba7jerenkrantz * Finds the lastChild of the given HTMLElement.
525508562a53864b78cf8da91ac13be9c072bba7jerenkrantz * @method lastChild
f1fe10268cdadb775eef841aa4fa7305291d35fdtrawick * @param {HTMLElement} element The html element.
f1fe10268cdadb775eef841aa4fa7305291d35fdtrawick * @param {String} tag The tag to search for.
f1fe10268cdadb775eef841aa4fa7305291d35fdtrawick * @param {Function} fn optional An optional boolean test to apply.
f1fe10268cdadb775eef841aa4fa7305291d35fdtrawick * The optional function is passed the current HTMLElement being tested as its only argument.
f04ad0ba7fe0eea5ea7a92f852cef75747ab2090trawick * If no function is given, the first found is returned.
f04ad0ba7fe0eea5ea7a92f852cef75747ab2090trawick * @return {HTMLElement | null} The first matching child html element.
f04ad0ba7fe0eea5ea7a92f852cef75747ab2090trawick */
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick lastChild: function(element, fn) {
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick return Y.DOM._childBy(element, null, fn, true);
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick },
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick lastChildByTag: function(element, tag, fn) {
d5d164b22a2004abed640cb52fc275f00ed92f69jerenkrantz return Y.DOM._childBy(element, tag, fn, true);
d5d164b22a2004abed640cb52fc275f00ed92f69jerenkrantz },
d5d164b22a2004abed640cb52fc275f00ed92f69jerenkrantz
360a9d933a8c25f5975e0ddc883607a5d37e408estoddard /**
360a9d933a8c25f5975e0ddc883607a5d37e408estoddard * Finds all HTMLElement childNodes matching the given tag.
360a9d933a8c25f5975e0ddc883607a5d37e408estoddard * @method childrenByTag
360a9d933a8c25f5975e0ddc883607a5d37e408estoddard * @param {HTMLElement} element The html element.
9b8afc47122e9b0eabb860b6ba2cf9c061c6060fstoddard * @param {String} tag The tag to search for.
9b8afc47122e9b0eabb860b6ba2cf9c061c6060fstoddard * @param {Function} fn optional An optional boolean test to apply.
9b8afc47122e9b0eabb860b6ba2cf9c061c6060fstoddard * The optional function is passed the current HTMLElement being tested as its only argument.
9b8afc47122e9b0eabb860b6ba2cf9c061c6060fstoddard * If no function is given, all children with the given tag are collected.
a21148678a1459064627d917a66669e7e8d140e6stoddard * @return {Array} The collection of child elements.
a21148678a1459064627d917a66669e7e8d140e6stoddard */
910df8b3f50a0515b430b999d4750de94c509f2atrawick childrenByTag: function() {
c6a9d49433c9ba5b18b26c3d764f1bbcb9746090wrowe if (document[DOCUMENT_ELEMENT].children) {
c6a9d49433c9ba5b18b26c3d764f1bbcb9746090wrowe return function(element, tag, fn, toArray) { // TODO: keep toArray option?
c6a9d49433c9ba5b18b26c3d764f1bbcb9746090wrowe tag = (tag && tag !== '*') ? tag : null;
51be7fc538641ed7cb22e959eb31629f7183f70fianh var elements = [];
51be7fc538641ed7cb22e959eb31629f7183f70fianh if (element) {
bb6a7fc0427d0d197c50de34b94a0d23e5732696wrowe elements = (tag) ? element.children.tags(tag) : element.children;
bb6a7fc0427d0d197c50de34b94a0d23e5732696wrowe
bb6a7fc0427d0d197c50de34b94a0d23e5732696wrowe if (fn || toArray) {
bb6a7fc0427d0d197c50de34b94a0d23e5732696wrowe elements = Y.DOM.filterElementsBy(elements, fn);
decd0c23bb26f6662f4b963cf86ee569613bffeagregames }
decd0c23bb26f6662f4b963cf86ee569613bffeagregames }
decd0c23bb26f6662f4b963cf86ee569613bffeagregames
e1753aabf5df187b5b04e72a958af4b65b1a125daaron return elements;
e1753aabf5df187b5b04e72a958af4b65b1a125daaron };
e1753aabf5df187b5b04e72a958af4b65b1a125daaron } else {
e1753aabf5df187b5b04e72a958af4b65b1a125daaron return function(element, tag, fn) {
e1753aabf5df187b5b04e72a958af4b65b1a125daaron tag = (tag && tag !== '*') ? tag.toUpperCase() : null;
e1753aabf5df187b5b04e72a958af4b65b1a125daaron var elements = [],
e1753aabf5df187b5b04e72a958af4b65b1a125daaron wrapFn = fn;
e57f991fe2b9a4c080cd50ca913a2a5693b096b5aaron
e57f991fe2b9a4c080cd50ca913a2a5693b096b5aaron if (element) {
e57f991fe2b9a4c080cd50ca913a2a5693b096b5aaron elements = element.childNodes;
924c8dd40352ca7775704a31a7a77ab86dc951b4ianh if (tag) { // wrap fn and add tag test TODO: allow tag in filterElementsBy?
924c8dd40352ca7775704a31a7a77ab86dc951b4ianh wrapFn = function(el) {
910df8b3f50a0515b430b999d4750de94c509f2atrawick return el[TAG_NAME].toUpperCase() === tag && (!fn || fn(el));
910df8b3f50a0515b430b999d4750de94c509f2atrawick };
910df8b3f50a0515b430b999d4750de94c509f2atrawick }
910df8b3f50a0515b430b999d4750de94c509f2atrawick
0d628dd174dd6de13463b10d2599f6cac24e9fe8brianp elements = Y.DOM.filterElementsBy(elements, wrapFn);
0d628dd174dd6de13463b10d2599f6cac24e9fe8brianp }
0d628dd174dd6de13463b10d2599f6cac24e9fe8brianp return elements;
2fee4fe267fa3577fd71d8c314fe9b527e2b90c0brianp };
2fee4fe267fa3577fd71d8c314fe9b527e2b90c0brianp }
2fee4fe267fa3577fd71d8c314fe9b527e2b90c0brianp }(),
2fee4fe267fa3577fd71d8c314fe9b527e2b90c0brianp
7bf77d70b6830636bc36e6b76a228c301be23ff7brianp /**
7bf77d70b6830636bc36e6b76a228c301be23ff7brianp * Finds all HTMLElement childNodes.
7bf77d70b6830636bc36e6b76a228c301be23ff7brianp * @method children
185b73b1f914e5d8f99f31225cc656b882dcbf73ianh * @param {HTMLElement} element The html element.
6ef713e25735887d4a59a879b97a68bd575ecb92trawick * @param {Function} fn optional An optional boolean test to apply.
cef5cb47e2ea4c174c01762d4430613db0f41e5cstoddard * The optional function is passed the current HTMLElement being tested as its only argument.
cef5cb47e2ea4c174c01762d4430613db0f41e5cstoddard * If no function is given, all children are collected.
cef5cb47e2ea4c174c01762d4430613db0f41e5cstoddard * @return {Array} The collection of child elements.
1eb1f02a23de724c105b2c6c9fbd469a611059c6trawick */
8abd60101b9794e224795ccf68b8ba984efbc94astoddard children: function(element, fn) {
8abd60101b9794e224795ccf68b8ba984efbc94astoddard return Y.DOM.childrenByTag(element, null, fn);
ca47a2b6bcea23e8af185c68f256dcbbfd2a0f9dtrawick },
ca47a2b6bcea23e8af185c68f256dcbbfd2a0f9dtrawick
6ef713e25735887d4a59a879b97a68bd575ecb92trawick /**
6ef713e25735887d4a59a879b97a68bd575ecb92trawick * Finds the previous sibling of the element.
ca47a2b6bcea23e8af185c68f256dcbbfd2a0f9dtrawick * @method previous
26d590c0e5338f66ca1aad6f925374843fac5121stoddard * @param {HTMLElement} element The html element.
26d590c0e5338f66ca1aad6f925374843fac5121stoddard * @param {Function} fn optional An optional boolean test to apply.
26d590c0e5338f66ca1aad6f925374843fac5121stoddard * The optional function is passed the current DOM node being tested as its only argument.
26d590c0e5338f66ca1aad6f925374843fac5121stoddard * If no function is given, the first sibling is returned.
26d590c0e5338f66ca1aad6f925374843fac5121stoddard * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
2b31ac2c6342d2afcf67b7b0f08c928a87f98c74wrowe * @return {HTMLElement | null} The matching DOM node or null if none found.
d472f67198d6b15dd1270136f180cca9c9263243trawick */
d472f67198d6b15dd1270136f180cca9c9263243trawick previous: function(element, fn, all) {
d472f67198d6b15dd1270136f180cca9c9263243trawick return Y.DOM.elementByAxis(element, PREVIOUS_SIBLING, fn, all);
d472f67198d6b15dd1270136f180cca9c9263243trawick },
d472f67198d6b15dd1270136f180cca9c9263243trawick
d472f67198d6b15dd1270136f180cca9c9263243trawick /**
d472f67198d6b15dd1270136f180cca9c9263243trawick * Finds the next sibling of the element.
a3bb95a3600153c7f09f62749e32093658943c32brianp * @method next
a3bb95a3600153c7f09f62749e32093658943c32brianp * @param {HTMLElement} element The html element.
a3bb95a3600153c7f09f62749e32093658943c32brianp * @param {Function} fn optional An optional boolean test to apply.
b760518cc17e7124ba546ed63063603f1ab82a40aaron * The optional function is passed the current DOM node being tested as its only argument.
b760518cc17e7124ba546ed63063603f1ab82a40aaron * If no function is given, the first sibling is returned.
b760518cc17e7124ba546ed63063603f1ab82a40aaron * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
b760518cc17e7124ba546ed63063603f1ab82a40aaron * @return {HTMLElement | null} The matching DOM node or null if none found.
b760518cc17e7124ba546ed63063603f1ab82a40aaron */
b760518cc17e7124ba546ed63063603f1ab82a40aaron next: function(element, fn, all) {
b760518cc17e7124ba546ed63063603f1ab82a40aaron return Y.DOM.elementByAxis(element, NEXT_SIBLING, fn, all);
b760518cc17e7124ba546ed63063603f1ab82a40aaron },
23d8f62856c1531526042e1c5edf44557cadd2e5trawick
23d8f62856c1531526042e1c5edf44557cadd2e5trawick /**
23d8f62856c1531526042e1c5edf44557cadd2e5trawick * Finds the ancestor of the element.
705c8ed3ef608706c91ca12483d7b54ff9007cc9jerenkrantz * @method ancestor
705c8ed3ef608706c91ca12483d7b54ff9007cc9jerenkrantz * @param {HTMLElement} element The html element.
705c8ed3ef608706c91ca12483d7b54ff9007cc9jerenkrantz * @param {Function} fn optional An optional boolean test to apply.
ef154948c97c53cdc1ad5329cb83c32ad26cf416aaron * The optional function is passed the current DOM node being tested as its only argument.
ef154948c97c53cdc1ad5329cb83c32ad26cf416aaron * If no function is given, the parentNode is returned.
ef154948c97c53cdc1ad5329cb83c32ad26cf416aaron * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
c6741d11357aace4c9ba39535d3cb2d751f46114trawick * @return {HTMLElement | null} The matching DOM node or null if none found.
c6741d11357aace4c9ba39535d3cb2d751f46114trawick */
c6741d11357aace4c9ba39535d3cb2d751f46114trawick // TODO: optional stopAt node?
c6741d11357aace4c9ba39535d3cb2d751f46114trawick ancestor: function(element, fn, all) {
7230f1eb017a35b7d20e0e9ec0d234766f2a732dtrawick return Y.DOM.elementByAxis(element, PARENT_NODE, fn, all);
7230f1eb017a35b7d20e0e9ec0d234766f2a732dtrawick },
86a5d34400b7f586ad2cca97c8b33b2f55bac61btrawick
86a5d34400b7f586ad2cca97c8b33b2f55bac61btrawick /**
86a5d34400b7f586ad2cca97c8b33b2f55bac61btrawick * Searches the element by the given axis for the first matching element.
86a5d34400b7f586ad2cca97c8b33b2f55bac61btrawick * @method elementByAxis
86a5d34400b7f586ad2cca97c8b33b2f55bac61btrawick * @param {HTMLElement} element The html element.
86a5d34400b7f586ad2cca97c8b33b2f55bac61btrawick * @param {String} axis The axis to search (parentNode, nextSibling, previousSibling).
86a5d34400b7f586ad2cca97c8b33b2f55bac61btrawick * @param {Function} fn optional An optional boolean test to apply.
6b477c0a238733ca8fd156629310513d29dc7e02trawick * @param {Boolean} all optional Whether all node types should be returned, or just element nodes.
6b477c0a238733ca8fd156629310513d29dc7e02trawick * The optional function is passed the current HTMLElement being tested as its only argument.
6b477c0a238733ca8fd156629310513d29dc7e02trawick * If no function is given, the first element is returned.
6b477c0a238733ca8fd156629310513d29dc7e02trawick * @return {HTMLElement | null} The matching element or null if none found.
2b31ac2c6342d2afcf67b7b0f08c928a87f98c74wrowe */
2b31ac2c6342d2afcf67b7b0f08c928a87f98c74wrowe elementByAxis: function(element, axis, fn, all) {
557eb8d48357657fa898250560f089c65539c634gregames while (element && (element = element[axis])) { // NOTE: assignment
557eb8d48357657fa898250560f089c65539c634gregames if ( (all || element[TAG_NAME]) && (!fn || fn(element)) ) {
557eb8d48357657fa898250560f089c65539c634gregames return element;
adb8c5e5291be5943122bbff404bc1018c79d555ianh }
25b715e9687f82ea055fdea2a9761c7e5f1ac6eetrawick }
25b715e9687f82ea055fdea2a9761c7e5f1ac6eetrawick return null;
25b715e9687f82ea055fdea2a9761c7e5f1ac6eetrawick },
25b715e9687f82ea055fdea2a9761c7e5f1ac6eetrawick
51ced3b28ef430a96586284d4320f7dbdaf7225ebrianp /**
51ced3b28ef430a96586284d4320f7dbdaf7225ebrianp * Finds all elements with the given tag.
51ced3b28ef430a96586284d4320f7dbdaf7225ebrianp * @method byTag
a222035458f89e2db231450ba6d5fae8052da5f5aaron * @param {String} tag The tag being search for.
a222035458f89e2db231450ba6d5fae8052da5f5aaron * @param {HTMLElement} root optional An optional root element to start from.
a222035458f89e2db231450ba6d5fae8052da5f5aaron * @param {Function} fn optional An optional boolean test to apply.
a222035458f89e2db231450ba6d5fae8052da5f5aaron * The optional function is passed the current HTMLElement being tested as its only argument.
4a872628ca5bf20847f442a625c255b643120db0wrowe * If no function is given, all elements with the given tag are returned.
4a872628ca5bf20847f442a625c255b643120db0wrowe * @return {Array} The collection of matching elements.
4a872628ca5bf20847f442a625c255b643120db0wrowe */
74528257888620220641cd28366731539a37e1f3ianh byTag: function(tag, root, fn) {
74528257888620220641cd28366731539a37e1f3ianh root = root || Y.config.doc;
74528257888620220641cd28366731539a37e1f3ianh
0632de713e41fa3aa928a1777677b0d79843ae2bdougm var elements = root.getElementsByTagName(tag),
0632de713e41fa3aa928a1777677b0d79843ae2bdougm retNodes = [];
0cc82c261350ab8dc8a9992cad7197c4d22d597eianh
f2afeedf074acc1a698a9527154eacd138e6c5a1trawick for (var i = 0, len = elements[LENGTH]; i < len; ++i) {
855e263a93fde2e30d10a48a9ffc047039bfc9d9brianp if ( !fn || fn(elements[i]) ) {
855e263a93fde2e30d10a48a9ffc047039bfc9d9brianp retNodes[retNodes[LENGTH]] = elements[i];
855e263a93fde2e30d10a48a9ffc047039bfc9d9brianp }
855e263a93fde2e30d10a48a9ffc047039bfc9d9brianp }
54b3b7946d22324cea615d7c8a4ff0c9eadd1f8crbb return retNodes;
54b3b7946d22324cea615d7c8a4ff0c9eadd1f8crbb },
54b3b7946d22324cea615d7c8a4ff0c9eadd1f8crbb
54b3b7946d22324cea615d7c8a4ff0c9eadd1f8crbb /**
54b3b7946d22324cea615d7c8a4ff0c9eadd1f8crbb * Finds the first element with the given tag.
e28c02dc08247d3fcb71e81791cac2311a248dfdrbb * @method firstByTag
e28c02dc08247d3fcb71e81791cac2311a248dfdrbb * @param {String} tag The tag being search for.
e28c02dc08247d3fcb71e81791cac2311a248dfdrbb * @param {HTMLElement} root optional An optional root element to start from.
e28c02dc08247d3fcb71e81791cac2311a248dfdrbb * @param {Function} fn optional An optional boolean test to apply.
e28c02dc08247d3fcb71e81791cac2311a248dfdrbb * The optional function is passed the current HTMLElement being tested as its only argument.
e28c02dc08247d3fcb71e81791cac2311a248dfdrbb * If no function is given, the first match is returned.
e28c02dc08247d3fcb71e81791cac2311a248dfdrbb * @return {HTMLElement} The matching element.
f9f506f0686ad065b4c6fe14dd962cdd478350dbianh */
f9f506f0686ad065b4c6fe14dd962cdd478350dbianh firstByTag: function(tag, root, fn) {
f9f506f0686ad065b4c6fe14dd962cdd478350dbianh root = root || Y.config.doc;
9d0665da83d1e22c0ea0e5f6f940f70f75bf5237ianh
9d0665da83d1e22c0ea0e5f6f940f70f75bf5237ianh var elements = root.getElementsByTagName(tag),
9d0665da83d1e22c0ea0e5f6f940f70f75bf5237ianh ret = null;
9d0665da83d1e22c0ea0e5f6f940f70f75bf5237ianh
9d0665da83d1e22c0ea0e5f6f940f70f75bf5237ianh for (var i = 0, len = elements[LENGTH]; i < len; ++i) {
47c2fb4c1f155ddb6954e46e7f6d125eef78b3bbaaron if ( !fn || fn(elements[i]) ) {
47c2fb4c1f155ddb6954e46e7f6d125eef78b3bbaaron ret = elements[i];
47c2fb4c1f155ddb6954e46e7f6d125eef78b3bbaaron break;
47c2fb4c1f155ddb6954e46e7f6d125eef78b3bbaaron }
9ca934cec0a1cc3c425fde5dc51956bce6cd3183brianp }
9ca934cec0a1cc3c425fde5dc51956bce6cd3183brianp return ret;
9ca934cec0a1cc3c425fde5dc51956bce6cd3183brianp },
0cdca1e056a05a09fe16fe736abcf79969c9767ejerenkrantz
0cdca1e056a05a09fe16fe736abcf79969c9767ejerenkrantz /**
0cdca1e056a05a09fe16fe736abcf79969c9767ejerenkrantz * Filters a collection of HTMLElements by the given attributes.
f2afeedf074acc1a698a9527154eacd138e6c5a1trawick * @method filterElementsBy
f2afeedf074acc1a698a9527154eacd138e6c5a1trawick * @param {Array} elements The collection of HTMLElements to filter.
f2afeedf074acc1a698a9527154eacd138e6c5a1trawick * @param {Function} fn A boolean test to apply.
0a2d57d962bef3a8898723925b3fb02d2e836994dougm * The function is passed the current HTMLElement being tested as its only argument.
0a2d57d962bef3a8898723925b3fb02d2e836994dougm * If no function is given, all HTMLElements are kept.
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames * @return {Array} The filtered collection of HTMLElements.
06461d67f387ea068187e6dfa036875a8205c04cjerenkrantz */
06461d67f387ea068187e6dfa036875a8205c04cjerenkrantz filterElementsBy: function(elements, fn, firstOnly) {
900127764fb985c340ee4979cac97146a330c694trawick var ret = (firstOnly) ? null : [];
900127764fb985c340ee4979cac97146a330c694trawick for (var i = 0, len = elements[LENGTH]; i < len; ++i) {
1a6a0072a95887164091e366ba0e89c2b39a954abrianp if (elements[i][TAG_NAME] && (!fn || fn(elements[i]))) {
1a6a0072a95887164091e366ba0e89c2b39a954abrianp if (firstOnly) {
1a6a0072a95887164091e366ba0e89c2b39a954abrianp ret = elements[i];
6f4c27ba6e152792f3729069e8d8313ebc87cc60jwoolley break;
6f4c27ba6e152792f3729069e8d8313ebc87cc60jwoolley } else {
6f4c27ba6e152792f3729069e8d8313ebc87cc60jwoolley ret[ret[LENGTH]] = elements[i];
23ce412bd50a47accab4dd26019b78810bbf46ebtrawick }
23ce412bd50a47accab4dd26019b78810bbf46ebtrawick }
23ce412bd50a47accab4dd26019b78810bbf46ebtrawick }
6865813dee5d3c1ebf12dd810368171792a0190atrawick
6865813dee5d3c1ebf12dd810368171792a0190atrawick return ret;
6865813dee5d3c1ebf12dd810368171792a0190atrawick },
97719ad970d779ac48af9364ab0ea9fdcc27470ajwoolley
97719ad970d779ac48af9364ab0ea9fdcc27470ajwoolley /**
97719ad970d779ac48af9364ab0ea9fdcc27470ajwoolley * Determines whether or not one HTMLElement is or contains another HTMLElement.
5ad238c42b1e159ee8f164515e0c4ee6c727c2fdtrawick * @method contains
5ad238c42b1e159ee8f164515e0c4ee6c727c2fdtrawick * @param {HTMLElement} element The containing html element.
5ad238c42b1e159ee8f164515e0c4ee6c727c2fdtrawick * @param {HTMLElement} needle The html element that may be contained.
ba00c3b7c20f00ce631b89ae3b1cd3bae8d1b165rbb * @return {Boolean} Whether or not the element is or contains the needle.
ba00c3b7c20f00ce631b89ae3b1cd3bae8d1b165rbb */
ba00c3b7c20f00ce631b89ae3b1cd3bae8d1b165rbb contains: function(element, needle) {
ba00c3b7c20f00ce631b89ae3b1cd3bae8d1b165rbb var ret = false;
ba00c3b7c20f00ce631b89ae3b1cd3bae8d1b165rbb
ba00c3b7c20f00ce631b89ae3b1cd3bae8d1b165rbb if ( !needle || !element || !needle[NODE_TYPE] || !element[NODE_TYPE]) {
6e954603b02f2b7d4ad80af17d9b3cc6f0bacf69rbb ret = false;
6e954603b02f2b7d4ad80af17d9b3cc6f0bacf69rbb } else if (element[CONTAINS]) {
6e954603b02f2b7d4ad80af17d9b3cc6f0bacf69rbb if (Y.UA.opera || needle[NODE_TYPE] === 1) { // IE & SAF contains fail if needle not an ELEMENT_NODE
6e954603b02f2b7d4ad80af17d9b3cc6f0bacf69rbb ret = element[CONTAINS](needle);
6e954603b02f2b7d4ad80af17d9b3cc6f0bacf69rbb } else {
6e954603b02f2b7d4ad80af17d9b3cc6f0bacf69rbb ret = Y.DOM._bruteContains(element, needle);
6e954603b02f2b7d4ad80af17d9b3cc6f0bacf69rbb }
6e954603b02f2b7d4ad80af17d9b3cc6f0bacf69rbb } else if (element[COMPARE_DOCUMENT_POSITION]) { // gecko
fa449f5bc87c5d87c4c60e778c9c882e7254de7ejwoolley if (element === needle || !!(element[COMPARE_DOCUMENT_POSITION](needle) & 16)) {
fa449f5bc87c5d87c4c60e778c9c882e7254de7ejwoolley ret = true;
fa449f5bc87c5d87c4c60e778c9c882e7254de7ejwoolley }
fa449f5bc87c5d87c4c60e778c9c882e7254de7ejwoolley }
fa449f5bc87c5d87c4c60e778c9c882e7254de7ejwoolley
1c0b7c3bdace07946457fa7ba04b7f97b6599792rbb return ret;
227d23a7db41dd89f52391c9356dbb1adcd675e0jwoolley },
227d23a7db41dd89f52391c9356dbb1adcd675e0jwoolley
227d23a7db41dd89f52391c9356dbb1adcd675e0jwoolley /**
227d23a7db41dd89f52391c9356dbb1adcd675e0jwoolley * Determines whether or not the HTMLElement is part of the document.
227d23a7db41dd89f52391c9356dbb1adcd675e0jwoolley * @method inDoc
227d23a7db41dd89f52391c9356dbb1adcd675e0jwoolley * @param {HTMLElement} element The containing html element.
1c0b7c3bdace07946457fa7ba04b7f97b6599792rbb * @param {HTMLElement} doc optional The document to check.
17bc0e8f2e3816e25bc8fd3fadf39357340aebd0jerenkrantz * @return {Boolean} Whether or not the element is attached to the document.
17bc0e8f2e3816e25bc8fd3fadf39357340aebd0jerenkrantz */
17bc0e8f2e3816e25bc8fd3fadf39357340aebd0jerenkrantz inDoc: function(element, doc) {
17bc0e8f2e3816e25bc8fd3fadf39357340aebd0jerenkrantz doc = doc || Y.config.doc;
17bc0e8f2e3816e25bc8fd3fadf39357340aebd0jerenkrantz return Y.DOM.contains(doc.documentElement, element);
e6cc28a5eb3371ba0c38e941855e71ff0054f50erbb },
e6cc28a5eb3371ba0c38e941855e71ff0054f50erbb
e6cc28a5eb3371ba0c38e941855e71ff0054f50erbb// TODO: dont return collection
e6cc28a5eb3371ba0c38e941855e71ff0054f50erbb create: function(html, doc) {
e6cc28a5eb3371ba0c38e941855e71ff0054f50erbb doc = doc || Y.config.doc;
e6cc28a5eb3371ba0c38e941855e71ff0054f50erbb var m = re_tag.exec(html);
e6cc28a5eb3371ba0c38e941855e71ff0054f50erbb var create = Y.DOM._create,
e6cc28a5eb3371ba0c38e941855e71ff0054f50erbb custom = Y.DOM.creators,
cf233fb4b439415a2bf7bab7e622afd994e0bebftrawick tag, ret;
cf233fb4b439415a2bf7bab7e622afd994e0bebftrawick
cf233fb4b439415a2bf7bab7e622afd994e0bebftrawick if (m && custom[m[1]]) {
cf233fb4b439415a2bf7bab7e622afd994e0bebftrawick if (typeof custom[m[1]] === 'function') {
ae64f3e7385f21ca9d4f30cc7f8702a9ac1034b6trawick create = custom[m[1]];
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames } else {
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames tag = custom[m[1]];
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames }
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames }
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames ret = create(html, doc, tag);
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames return (ret.childNodes.length > 1) ? ret.childNodes : ret.childNodes[0]; // collection or item
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames //return ret.firstChild;
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames },
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames CUSTOM_ATTRIBUTES: (!document.documentElement.hasAttribute) ? { // IE < 8
2a20a2f8432a15b530e0a6b0998c32f40aef82a8gregames 'for': 'htmlFor',
8d49090fd56a8ce06c7f7135f19e5ff8e24b5ff3gregames 'class': 'className'
f99bffd6087564cf9c05cc29d1c6b38d94e0ed30gregames } : { // w3c
270609308f247c5e934b400b5f1691c2cca16c61jerenkrantz 'htmlFor': 'for',
270609308f247c5e934b400b5f1691c2cca16c61jerenkrantz 'className': 'class'
270609308f247c5e934b400b5f1691c2cca16c61jerenkrantz },
8458877c9ba0af86acd590eea531476adde3d02dmartin
8458877c9ba0af86acd590eea531476adde3d02dmartin /**
8458877c9ba0af86acd590eea531476adde3d02dmartin * Provides a normalized attribute interface.
8458877c9ba0af86acd590eea531476adde3d02dmartin * @method setAttibute
8458877c9ba0af86acd590eea531476adde3d02dmartin * @param {String | HTMLElement} el The target element for the attribute.
644be6f54749d2d9950d2c4d2ac448f7af016d26martin * @param {String} attr The attribute to set.
644be6f54749d2d9950d2c4d2ac448f7af016d26martin * @param {String} val The value of the attribute.
644be6f54749d2d9950d2c4d2ac448f7af016d26martin */
644be6f54749d2d9950d2c4d2ac448f7af016d26martin setAttribute: function(el, attr, val) {
8458877c9ba0af86acd590eea531476adde3d02dmartin attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
b30b04f639d479b96cc08c43ffa34c92ba275676ianh el.setAttribute(attr, val);
b30b04f639d479b96cc08c43ffa34c92ba275676ianh },
b30b04f639d479b96cc08c43ffa34c92ba275676ianh
c4fbc4018fd2b6716673a38ee27eeb36cba41c5djwoolley
c4fbc4018fd2b6716673a38ee27eeb36cba41c5djwoolley /**
c4fbc4018fd2b6716673a38ee27eeb36cba41c5djwoolley * Provides a normalized attribute interface.
c4fbc4018fd2b6716673a38ee27eeb36cba41c5djwoolley * @method getAttibute
f4e4643c309e5b5da60e13f9a25984d54b307caawrowe * @param {String | HTMLElement} el The target element for the attribute.
f4e4643c309e5b5da60e13f9a25984d54b307caawrowe * @param {String} attr The attribute to get.
f4e4643c309e5b5da60e13f9a25984d54b307caawrowe * @return {String} The current value of the attribute.
2548497d480c4f3e9b3fe14711bd510aa2157434gregames */
2548497d480c4f3e9b3fe14711bd510aa2157434gregames getAttribute: function(el, attr) {
2548497d480c4f3e9b3fe14711bd510aa2157434gregames attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
ccb5c3af2d491a7cd1c246cd23f0fb083da417fagregames var ret = el.getAttribute(attr);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz if (!document.documentElement.hasAttribute) { // IE < 8
da6e93dca0222159650783802e23172e3160605egregames if (el.getAttributeNode) {
da6e93dca0222159650783802e23172e3160605egregames ret = el.getAttributeNode(attr);
da6e93dca0222159650783802e23172e3160605egregames ret = (ret) ? ret.value : null;
c927e13f298c42251296d33cc1fa3eb8232b843daaron } else {
c927e13f298c42251296d33cc1fa3eb8232b843daaron ret = el.getAttribute(attr);
c927e13f298c42251296d33cc1fa3eb8232b843daaron }
c927e13f298c42251296d33cc1fa3eb8232b843daaron
c927e13f298c42251296d33cc1fa3eb8232b843daaron }
9126ed10455a2a98a3a51c68ed1b356e1873e8e6aaron if (ret === null) {
9126ed10455a2a98a3a51c68ed1b356e1873e8e6aaron ret = ''; // per DOM spec
9126ed10455a2a98a3a51c68ed1b356e1873e8e6aaron }
9126ed10455a2a98a3a51c68ed1b356e1873e8e6aaron return ret;
fa3ca21e09bac0dbc2045e9f53963ba46cfed5b1trawick },
fa3ca21e09bac0dbc2045e9f53963ba46cfed5b1trawick
fa3ca21e09bac0dbc2045e9f53963ba46cfed5b1trawick _create: function(html, doc, tag) {
fa3ca21e09bac0dbc2045e9f53963ba46cfed5b1trawick tag = tag || 'div';
18acb2c0df442ead1d075a1a2207cbb197725b14coar var frag = templateCache[tag] || doc.createElement(tag);
18acb2c0df442ead1d075a1a2207cbb197725b14coar frag.innerHTML = Y.Lang.trim(html);
18acb2c0df442ead1d075a1a2207cbb197725b14coar return frag;
18acb2c0df442ead1d075a1a2207cbb197725b14coar },
617f972690d850a52cd4e9ef2f32d356e0fae715aaron
617f972690d850a52cd4e9ef2f32d356e0fae715aaron /**
617f972690d850a52cd4e9ef2f32d356e0fae715aaron * Brute force version of contains.
617f972690d850a52cd4e9ef2f32d356e0fae715aaron * Used for browsers without contains support for non-HTMLElement Nodes (textNodes, etc).
617f972690d850a52cd4e9ef2f32d356e0fae715aaron * @method _bruteContains
9278d5393ef084f4fc6d7ec8641af5959442c157jwoolley * @private
9278d5393ef084f4fc6d7ec8641af5959442c157jwoolley * @param {HTMLElement} element The containing html element.
9278d5393ef084f4fc6d7ec8641af5959442c157jwoolley * @param {HTMLElement} needle The html element that may be contained.
022cff78006f698453640e0a0e97cc5f8c9de59drbb * @return {Boolean} Whether or not the element is or contains the needle.
022cff78006f698453640e0a0e97cc5f8c9de59drbb */
022cff78006f698453640e0a0e97cc5f8c9de59drbb _bruteContains: function(element, needle) {
022cff78006f698453640e0a0e97cc5f8c9de59drbb while (needle) {
526a776292f420ffeea0d081c61971ed381fad20stoddard if (element === needle) {
526a776292f420ffeea0d081c61971ed381fad20stoddard return true;
526a776292f420ffeea0d081c61971ed381fad20stoddard }
526a776292f420ffeea0d081c61971ed381fad20stoddard needle = needle.parentNode;
526a776292f420ffeea0d081c61971ed381fad20stoddard }
526a776292f420ffeea0d081c61971ed381fad20stoddard return false;
526a776292f420ffeea0d081c61971ed381fad20stoddard },
526a776292f420ffeea0d081c61971ed381fad20stoddard
526a776292f420ffeea0d081c61971ed381fad20stoddard// TODO: move to Lang?
526a776292f420ffeea0d081c61971ed381fad20stoddard /**
526a776292f420ffeea0d081c61971ed381fad20stoddard * Memoizes dynamic regular expressions to boost runtime performance.
452d2fd15cebd2da9331d5d765558a60b488c1a9rbb * @method _getRegExp
62ddc9851530478919d169ba9c34b80f60cf7718trawick * @private
62ddc9851530478919d169ba9c34b80f60cf7718trawick * @param {String} str The string to convert to a regular expression.
62ddc9851530478919d169ba9c34b80f60cf7718trawick * @param {String} flags optional An optinal string of flags.
62ddc9851530478919d169ba9c34b80f60cf7718trawick * @return {RegExp} An instance of RegExp
62ddc9851530478919d169ba9c34b80f60cf7718trawick */
904d7bf799c6216beb34519463596b4fce630308wrowe _getRegExp: function(str, flags) {
904d7bf799c6216beb34519463596b4fce630308wrowe flags = flags || '';
904d7bf799c6216beb34519463596b4fce630308wrowe Y.DOM._regexCache = Y.DOM._regexCache || {};
904d7bf799c6216beb34519463596b4fce630308wrowe if (!Y.DOM._regexCache[str + flags]) {
904d7bf799c6216beb34519463596b4fce630308wrowe Y.DOM._regexCache[str + flags] = new RegExp(str, flags);
904d7bf799c6216beb34519463596b4fce630308wrowe }
904d7bf799c6216beb34519463596b4fce630308wrowe return Y.DOM._regexCache[str + flags];
904d7bf799c6216beb34519463596b4fce630308wrowe },
904d7bf799c6216beb34519463596b4fce630308wrowe
17a4c6968b2fa692ff4dde12fe305230ee6b0421aaron// TODO: make getDoc/Win true privates?
17a4c6968b2fa692ff4dde12fe305230ee6b0421aaron /**
17a4c6968b2fa692ff4dde12fe305230ee6b0421aaron * returns the appropriate document.
17a4c6968b2fa692ff4dde12fe305230ee6b0421aaron * @method _getDoc
83b031099aa3dc8a5fd2f708e397818cbd16c9aajerenkrantz * @private
83b031099aa3dc8a5fd2f708e397818cbd16c9aajerenkrantz * @param {HTMLElement} element optional Target element.
83b031099aa3dc8a5fd2f708e397818cbd16c9aajerenkrantz * @return {Object} The document for the given element or the default document.
01e77cadbd9ad4962993380245bcc033dde523e4rbb */
01e77cadbd9ad4962993380245bcc033dde523e4rbb _getDoc: function(element) {
01e77cadbd9ad4962993380245bcc033dde523e4rbb element = element || {};
8ea9794272347cfdd92861f46295406649f01afatrawick
8ea9794272347cfdd92861f46295406649f01afatrawick return (element[NODE_TYPE] === 9) ? element : // element === document
8ea9794272347cfdd92861f46295406649f01afatrawick element[OWNER_DOCUMENT] || // element === DOM node
8ea9794272347cfdd92861f46295406649f01afatrawick element.document || // element === window
b900452c9c36031434d318880f023c0fb9143325rbb Y.config.doc; // default
b900452c9c36031434d318880f023c0fb9143325rbb },
b900452c9c36031434d318880f023c0fb9143325rbb
b900452c9c36031434d318880f023c0fb9143325rbb /**
b900452c9c36031434d318880f023c0fb9143325rbb * returns the appropriate window.
b900452c9c36031434d318880f023c0fb9143325rbb * @method _getWin
b900452c9c36031434d318880f023c0fb9143325rbb * @private
b900452c9c36031434d318880f023c0fb9143325rbb * @param {HTMLElement} element optional Target element.
b900452c9c36031434d318880f023c0fb9143325rbb * @return {Object} The window for the given element or the default window.
43053faf24ffe7657bb32bc06d4058dedf3ef053rbb */
8b666e1fb772b6fe45de3604b224f3e1f2cfd620rbb _getWin: function(element) {
c453a141db60a5b19649eac508f4851a8729c556rbb var doc = Y.DOM._getDoc(element);
c453a141db60a5b19649eac508f4851a8729c556rbb return doc[DEFAULT_VIEW] || doc[PARENT_WINDOW] || Y.config.win;
c453a141db60a5b19649eac508f4851a8729c556rbb },
8b91dcac0e1ef7796c72d16b0962267313cac486jerenkrantz
8b91dcac0e1ef7796c72d16b0962267313cac486jerenkrantz // TODO: document this
8b91dcac0e1ef7796c72d16b0962267313cac486jerenkrantz _childBy: function(element, tag, fn, rev) {
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe var ret = null,
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe root, axis;
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe if (element) {
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe if (rev) {
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe root = element[LAST_CHILD];
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe axis = PREVIOUS_SIBLING;
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe } else {
7dfed2b71c9c4223996cbd7c5c0c85c7c8fef2a4rbb root = element[FIRST_CHILD];
7dfed2b71c9c4223996cbd7c5c0c85c7c8fef2a4rbb axis = NEXT_SIBLING;
6ce942b017db75b559a42bdc2d7b8ea9e869a956wrowe }
7dfed2b71c9c4223996cbd7c5c0c85c7c8fef2a4rbb
574f6ff9ee80ef4f772649c5c8319b764a8abe42jerenkrantz if (Y.DOM._testElement(root, tag, fn)) { // is the matching element
574f6ff9ee80ef4f772649c5c8319b764a8abe42jerenkrantz ret = root;
574f6ff9ee80ef4f772649c5c8319b764a8abe42jerenkrantz } else { // need to scan nextSibling axis of firstChild to find matching element
6d7d70dbda8e461d87f2d41e323755496ae3ebc7trawick ret = Y.DOM.elementByAxis(root, axis, fn);
6d7d70dbda8e461d87f2d41e323755496ae3ebc7trawick }
6d7d70dbda8e461d87f2d41e323755496ae3ebc7trawick }
22a25f3393393b781e214f4abef17950bcb8bbe3jerenkrantz return ret;
22a25f3393393b781e214f4abef17950bcb8bbe3jerenkrantz
22a25f3393393b781e214f4abef17950bcb8bbe3jerenkrantz },
a310497ca9c5112d759871e1b7d9f6a40fb78bcfwrowe
a310497ca9c5112d759871e1b7d9f6a40fb78bcfwrowe _testElement: function(element, tag, fn) {
a310497ca9c5112d759871e1b7d9f6a40fb78bcfwrowe tag = (tag && tag !== '*') ? tag.toUpperCase() : null;
a310497ca9c5112d759871e1b7d9f6a40fb78bcfwrowe return (element && element[TAG_NAME] &&
a310497ca9c5112d759871e1b7d9f6a40fb78bcfwrowe (!tag || element[TAG_NAME].toUpperCase() === tag) &&
a310497ca9c5112d759871e1b7d9f6a40fb78bcfwrowe (!fn || fn(element)));
a310497ca9c5112d759871e1b7d9f6a40fb78bcfwrowe },
8bda0627eb2aca9e678c1303a0423d33069388dfwrowe
de63b1eeff87cd19cf42bb83cca85381026965ddjerenkrantz creators: {},
f00bc25ff5027f3a40e9cd0ade782641bd0bf1d0wrowe
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb _IESimpleCreate: function(html, doc) {
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb doc = doc || Y.config.doc;
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb return doc.createElement(html);
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb }
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb};
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb(function() {
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb var creators = Y.DOM.creators,
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb create = Y.DOM.create,
e36ef0d081aa59867688bcbb3da65952ec16fae3rbb re_tbody = /(?:\/(?:thead|tfoot|tbody|caption|col|colgroup)>)+\s*<tbody/;
52df98b165194a0ad68885f49f81fdaf56ece568wrowe
52df98b165194a0ad68885f49f81fdaf56ece568wrowe var TABLE_OPEN = '<table>',
52df98b165194a0ad68885f49f81fdaf56ece568wrowe TABLE_CLOSE = '</table>';
2c294c31addd5c957bafe6e78c4a30d423ad6e80rbb
2c294c31addd5c957bafe6e78c4a30d423ad6e80rbb if (Y.UA.gecko || Y.UA.ie) { // require custom creation code for certain element types
2c294c31addd5c957bafe6e78c4a30d423ad6e80rbb Y.mix(creators, {
2c294c31addd5c957bafe6e78c4a30d423ad6e80rbb option: function(html, doc) {
7e44dd5082cd865068285e8f915bb5f045e0bb80lars var frag = create('<select>' + html + '</select>');
7e44dd5082cd865068285e8f915bb5f045e0bb80lars return frag;
7e44dd5082cd865068285e8f915bb5f045e0bb80lars },
7e44dd5082cd865068285e8f915bb5f045e0bb80lars
44a4ee1140769173da7bc2b42d1a686e3260ad84wrowe tr: function(html, doc) {
44a4ee1140769173da7bc2b42d1a686e3260ad84wrowe var frag = creators.tbody('<tbody>' + html + '</tbody>', doc);
44a4ee1140769173da7bc2b42d1a686e3260ad84wrowe return frag.firstChild;
44a4ee1140769173da7bc2b42d1a686e3260ad84wrowe },
44a4ee1140769173da7bc2b42d1a686e3260ad84wrowe
e379fc6d7f79163700290d92ce75deb4f3005301jerenkrantz td: function(html, doc) {
e379fc6d7f79163700290d92ce75deb4f3005301jerenkrantz var frag = creators.tr('<tr>' + html + '</tr>', doc);
e379fc6d7f79163700290d92ce75deb4f3005301jerenkrantz return frag.firstChild;
978faa9e29e0f0c42e66c07240e562325a4717b0jerenkrantz },
978faa9e29e0f0c42e66c07240e562325a4717b0jerenkrantz
978faa9e29e0f0c42e66c07240e562325a4717b0jerenkrantz tbody: function(html, doc) {
978faa9e29e0f0c42e66c07240e562325a4717b0jerenkrantz var frag = create(TABLE_OPEN + html + TABLE_CLOSE, doc);
976501adbc040220270f7d1d77c4b8373033be69wrowe return frag;
976501adbc040220270f7d1d77c4b8373033be69wrowe },
976501adbc040220270f7d1d77c4b8373033be69wrowe
976501adbc040220270f7d1d77c4b8373033be69wrowe legend: 'fieldset'
976501adbc040220270f7d1d77c4b8373033be69wrowe });
976501adbc040220270f7d1d77c4b8373033be69wrowe
10a00688adcf1df367b1243810beedaabe6b1abeminfrin creators.col = creators.tbody; // IE wraps in colgroup
10a00688adcf1df367b1243810beedaabe6b1abeminfrin }
10a00688adcf1df367b1243810beedaabe6b1abeminfrin
8a3a703eae0e35f674b189181609545c6fc77a09rbb if (Y.UA.ie) {
8a3a703eae0e35f674b189181609545c6fc77a09rbb // TODO: allow multiples ("<link><link>")
8a3a703eae0e35f674b189181609545c6fc77a09rbb creators.col = creators.script = creators.link = Y.DOM._IESimpleCreate;
8a3a703eae0e35f674b189181609545c6fc77a09rbb
9af1ccb223d0669b3c3a43eed070d815afde9084mjc // TODO: thead/tfoot with nested tbody
9af1ccb223d0669b3c3a43eed070d815afde9084mjc creators.tbody = function(html, doc) {
9af1ccb223d0669b3c3a43eed070d815afde9084mjc var frag = create(TABLE_OPEN + html + TABLE_CLOSE, doc);
9d41fafe32b324c197f25224207fc6ce34f085bfrbb var tb = frag.children.tags('tbody')[0];
9d41fafe32b324c197f25224207fc6ce34f085bfrbb if (frag.children.length > 1 && tb && !re_tbody.test(html)) {
9d41fafe32b324c197f25224207fc6ce34f085bfrbb tb.parentNode.removeChild(tb);
9d41fafe32b324c197f25224207fc6ce34f085bfrbb }
9d41fafe32b324c197f25224207fc6ce34f085bfrbb return frag;
889d9c84f8b1ad850f977a6d8e548696994f8f86jerenkrantz };
889d9c84f8b1ad850f977a6d8e548696994f8f86jerenkrantz
889d9c84f8b1ad850f977a6d8e548696994f8f86jerenkrantz }
8c83461e53ca7d204e1d634f0c78199d60320d7bjerenkrantz
8c83461e53ca7d204e1d634f0c78199d60320d7bjerenkrantz if (Y.UA.gecko || Y.UA.ie) { // require custom creation code for certain element types
8c83461e53ca7d204e1d634f0c78199d60320d7bjerenkrantz Y.mix(creators, {
8e5842bc05146bb5c171e53b00b24063d17c666cjerenkrantz th: creators.td,
8e5842bc05146bb5c171e53b00b24063d17c666cjerenkrantz thead: creators.tbody,
8e5842bc05146bb5c171e53b00b24063d17c666cjerenkrantz tfoot: creators.tbody,
cdb15137887e284797e9510029098dc725b4dacfjerenkrantz caption: creators.tbody,
cdb15137887e284797e9510029098dc725b4dacfjerenkrantz colgroup: creators.tbody,
798c7c11dc2fe3b08e591e9c76fc1a84857f2cd4jerenkrantz col: creators.tbody,
798c7c11dc2fe3b08e591e9c76fc1a84857f2cd4jerenkrantz optgroup: creators.option
798c7c11dc2fe3b08e591e9c76fc1a84857f2cd4jerenkrantz });
798c7c11dc2fe3b08e591e9c76fc1a84857f2cd4jerenkrantz }
abaaa634d7cee882b7c4bf078ded749ebf11997erbb})();
abaaa634d7cee882b7c4bf078ded749ebf11997erbb/**
abaaa634d7cee882b7c4bf078ded749ebf11997erbb * The DOM utility provides a cross-browser abtraction layer
abaaa634d7cee882b7c4bf078ded749ebf11997erbb * normalizing DOM tasks, and adds extra helper functionality
0aa8e8fd5a242948518655f2296b3c76386754e5jerenkrantz * for other common tasks.
0aa8e8fd5a242948518655f2296b3c76386754e5jerenkrantz * @module dom
0aa8e8fd5a242948518655f2296b3c76386754e5jerenkrantz * @submodule dom-base
de3abad1fe263e577bb11e99b358836bd901397crbb * @for DOM
de3abad1fe263e577bb11e99b358836bd901397crbb */
de3abad1fe263e577bb11e99b358836bd901397crbb
de3abad1fe263e577bb11e99b358836bd901397crbbvar CLASS_NAME = 'className';
de3abad1fe263e577bb11e99b358836bd901397crbb
de3abad1fe263e577bb11e99b358836bd901397crbbY.mix(Y.DOM, {
de3abad1fe263e577bb11e99b358836bd901397crbb /**
de3abad1fe263e577bb11e99b358836bd901397crbb * Determines whether a DOM element has the given className.
de3abad1fe263e577bb11e99b358836bd901397crbb * @method hasClass
0a549489abdb309ef25483431e1e5610ed4ba7a8gstein * @param {HTMLElement} element The DOM element.
0a549489abdb309ef25483431e1e5610ed4ba7a8gstein * @param {String} className the class name to search for
0a549489abdb309ef25483431e1e5610ed4ba7a8gstein * @return {Boolean} Whether or not the element has the given class.
0a549489abdb309ef25483431e1e5610ed4ba7a8gstein */
0a549489abdb309ef25483431e1e5610ed4ba7a8gstein hasClass: function(node, className) {
0a549489abdb309ef25483431e1e5610ed4ba7a8gstein var re = Y.DOM._getRegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
14c6f2e13d97a4fafac1fbc247a274a298d5b418wrowe return re.test(node[CLASS_NAME]);
14c6f2e13d97a4fafac1fbc247a274a298d5b418wrowe },
14c6f2e13d97a4fafac1fbc247a274a298d5b418wrowe
14c6f2e13d97a4fafac1fbc247a274a298d5b418wrowe /**
f00d1e76bae896c2f6a520eec69b1d0d802d4108jerenkrantz * Adds a class name to a given DOM element.
f00d1e76bae896c2f6a520eec69b1d0d802d4108jerenkrantz * @method addClass
f00d1e76bae896c2f6a520eec69b1d0d802d4108jerenkrantz * @param {HTMLElement} element The DOM element.
58097d7d8d1a394092374b9f6ddf76b7993724a4rbb * @param {String} className the class name to add to the class attribute
58097d7d8d1a394092374b9f6ddf76b7993724a4rbb */
58097d7d8d1a394092374b9f6ddf76b7993724a4rbb addClass: function(node, className) {
58097d7d8d1a394092374b9f6ddf76b7993724a4rbb if (!Y.DOM.hasClass(node, className)) { // skip if already present
2f6cebd6b8bf0b044f6579d23117a4a3c364a554wrowe node[CLASS_NAME] = Y.Lang.trim([node[CLASS_NAME], className].join(' '));
2f6cebd6b8bf0b044f6579d23117a4a3c364a554wrowe }
2f6cebd6b8bf0b044f6579d23117a4a3c364a554wrowe },
2f6cebd6b8bf0b044f6579d23117a4a3c364a554wrowe
2f6cebd6b8bf0b044f6579d23117a4a3c364a554wrowe /**
070d2f9fd52a3f0e45ca7ae1235c5a5755b80d24rbb * Removes a class name from a given element.
070d2f9fd52a3f0e45ca7ae1235c5a5755b80d24rbb * @method removeClass
070d2f9fd52a3f0e45ca7ae1235c5a5755b80d24rbb * @param {HTMLElement} element The DOM element.
070d2f9fd52a3f0e45ca7ae1235c5a5755b80d24rbb * @param {String} className the class name to remove from the class attribute
070d2f9fd52a3f0e45ca7ae1235c5a5755b80d24rbb */
7c19ce86bbd72bba1d018522250f5f315ffbc0afjerenkrantz removeClass: function(node, className) {
7c19ce86bbd72bba1d018522250f5f315ffbc0afjerenkrantz if (className && Y.DOM.hasClass(node, className)) {
7c19ce86bbd72bba1d018522250f5f315ffbc0afjerenkrantz node[CLASS_NAME] = Y.Lang.trim(node[CLASS_NAME].replace(Y.DOM._getRegExp('(?:^|\\s+)' +
2264fbcbab4c796c4222c30393c0b218c98b6befrbb className + '(?:\\s+|$)'), ' '));
2264fbcbab4c796c4222c30393c0b218c98b6befrbb
2264fbcbab4c796c4222c30393c0b218c98b6befrbb if ( Y.DOM.hasClass(node, className) ) { // in case of multiple adjacent
2264fbcbab4c796c4222c30393c0b218c98b6befrbb Y.DOM.removeClass(node, className);
e099672a13ea4ff4a11f130406f1baecba5949bajerenkrantz }
e099672a13ea4ff4a11f130406f1baecba5949bajerenkrantz }
e099672a13ea4ff4a11f130406f1baecba5949bajerenkrantz },
9b29e0cfeb2c89a047806cc4a2a764afed6bb170wrowe
9b29e0cfeb2c89a047806cc4a2a764afed6bb170wrowe /**
9b29e0cfeb2c89a047806cc4a2a764afed6bb170wrowe * Replace a class with another class for a given element.
9b29e0cfeb2c89a047806cc4a2a764afed6bb170wrowe * If no oldClassName is present, the newClassName is simply added.
441bd066858500e75e4f63ef149120bcf523de58jerenkrantz * @method replaceClass
441bd066858500e75e4f63ef149120bcf523de58jerenkrantz * @param {HTMLElement} element The DOM element.
441bd066858500e75e4f63ef149120bcf523de58jerenkrantz * @param {String} oldClassName the class name to be replaced
d6a93816bfaa5b3de5f2e6cb0d172cbe20dd056ejerenkrantz * @param {String} newClassName the class name that will be replacing the old class name
d6a93816bfaa5b3de5f2e6cb0d172cbe20dd056ejerenkrantz */
d6a93816bfaa5b3de5f2e6cb0d172cbe20dd056ejerenkrantz replaceClass: function(node, oldC, newC) {
c839614b4216fe34f6346668ad646aca2c0f23c6wrowe Y.DOM.addClass(node, newC);
c839614b4216fe34f6346668ad646aca2c0f23c6wrowe Y.DOM.removeClass(node, oldC);
c839614b4216fe34f6346668ad646aca2c0f23c6wrowe },
c839614b4216fe34f6346668ad646aca2c0f23c6wrowe
c839614b4216fe34f6346668ad646aca2c0f23c6wrowe /**
c839614b4216fe34f6346668ad646aca2c0f23c6wrowe * If the className exists on the node it is removed, if it doesn't exist it is added.
117e2968318323d2ad2187fcd4de379d2eca245cwrowe * @method toggleClass
117e2968318323d2ad2187fcd4de379d2eca245cwrowe * @param {HTMLElement} element The DOM element.
117e2968318323d2ad2187fcd4de379d2eca245cwrowe * @param {String} className the class name to be toggled
117e2968318323d2ad2187fcd4de379d2eca245cwrowe */
117e2968318323d2ad2187fcd4de379d2eca245cwrowe toggleClass: function(node, className) {
117e2968318323d2ad2187fcd4de379d2eca245cwrowe if (Y.DOM.hasClass(node, className)) {
117e2968318323d2ad2187fcd4de379d2eca245cwrowe Y.DOM.removeClass(node, className);
117e2968318323d2ad2187fcd4de379d2eca245cwrowe } else {
117e2968318323d2ad2187fcd4de379d2eca245cwrowe Y.DOM.addClass(node, className);
117e2968318323d2ad2187fcd4de379d2eca245cwrowe }
117e2968318323d2ad2187fcd4de379d2eca245cwrowe }
117e2968318323d2ad2187fcd4de379d2eca245cwrowe});
e9fa5a00f39f6aabbc5dcd776c5bc6bd0638f955wrowe
e9fa5a00f39f6aabbc5dcd776c5bc6bd0638f955wrowe/**
e9fa5a00f39f6aabbc5dcd776c5bc6bd0638f955wrowe * Add style management functionality to DOM.
e9fa5a00f39f6aabbc5dcd776c5bc6bd0638f955wrowe * @module dom
e9fa5a00f39f6aabbc5dcd776c5bc6bd0638f955wrowe * @submodule dom-style
e9fa5a00f39f6aabbc5dcd776c5bc6bd0638f955wrowe * @for DOM
e9fa5a00f39f6aabbc5dcd776c5bc6bd0638f955wrowe */
de419544885a5c64589dddf1b8517672ee17c1feminfrin
de419544885a5c64589dddf1b8517672ee17c1feminfrinvar DOCUMENT_ELEMENT = 'documentElement',
de419544885a5c64589dddf1b8517672ee17c1feminfrin DEFAULT_VIEW = 'defaultView',
df14f0d3a5191cdd7c4bb5b03acd135d43a6f51brbb OWNER_DOCUMENT = 'ownerDocument',
67869a9db2967cb50405e51b1d6d1ebab1219e03trawick STYLE = 'style',
9c4321d9cc4eecbb0c5d568aea53d5e6812c7b96martin FLOAT = 'float',
9c4321d9cc4eecbb0c5d568aea53d5e6812c7b96martin CSS_FLOAT = 'cssFloat',
9c4321d9cc4eecbb0c5d568aea53d5e6812c7b96martin STYLE_FLOAT = 'styleFloat',
9c4321d9cc4eecbb0c5d568aea53d5e6812c7b96martin TRANSPARENT = 'transparent',
9c4321d9cc4eecbb0c5d568aea53d5e6812c7b96martin VISIBLE = 'visible',
956c6100798467199833e7159a00506ee879d772minfrin WIDTH = 'width',
956c6100798467199833e7159a00506ee879d772minfrin HEIGHT = 'height',
956c6100798467199833e7159a00506ee879d772minfrin BORDER_TOP_WIDTH = 'borderTopWidth',
956c6100798467199833e7159a00506ee879d772minfrin BORDER_RIGHT_WIDTH = 'borderRightWidth',
956c6100798467199833e7159a00506ee879d772minfrin BORDER_BOTTOM_WIDTH = 'borderBottomWidth',
956c6100798467199833e7159a00506ee879d772minfrin BORDER_LEFT_WIDTH = 'borderLeftWidth',
47697533fd7ced2259f9150677ea5efa583b6c13rbb GET_COMPUTED_STYLE = 'getComputedStyle',
47697533fd7ced2259f9150677ea5efa583b6c13rbb
47697533fd7ced2259f9150677ea5efa583b6c13rbb DOCUMENT = Y.config.doc,
47697533fd7ced2259f9150677ea5efa583b6c13rbb UNDEFINED = undefined,
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe re_color = /color$/i;
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwroweY.mix(Y.DOM, {
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe CUSTOM_STYLES: {},
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe /**
7ba1a2c8babfd7c7c46bb03567a868d51e1023dbwrowe * Sets a style property for a given element.
b2c2c8a4bc977c0a6bb937af995efc56dc3879a3wrowe * @method setStyle
b2c2c8a4bc977c0a6bb937af995efc56dc3879a3wrowe * @param {HTMLElement} An HTMLElement to apply the style to.
b2c2c8a4bc977c0a6bb937af995efc56dc3879a3wrowe * @param {String} att The style property to set.
b2c2c8a4bc977c0a6bb937af995efc56dc3879a3wrowe * @param {String|Number} val The value.
b2c2c8a4bc977c0a6bb937af995efc56dc3879a3wrowe */
67869a9db2967cb50405e51b1d6d1ebab1219e03trawick setStyle: function(node, att, val, style) {
67869a9db2967cb50405e51b1d6d1ebab1219e03trawick style = node[STYLE],
67869a9db2967cb50405e51b1d6d1ebab1219e03trawick CUSTOM_STYLES = Y.DOM.CUSTOM_STYLES;
4d003677925ceb0abefb9c95355b4c9e9e502899rederpj
4d003677925ceb0abefb9c95355b4c9e9e502899rederpj if (style) {
4d003677925ceb0abefb9c95355b4c9e9e502899rederpj if (att in CUSTOM_STYLES) {
67869a9db2967cb50405e51b1d6d1ebab1219e03trawick if (CUSTOM_STYLES[att].set) {
4d003677925ceb0abefb9c95355b4c9e9e502899rederpj CUSTOM_STYLES[att].set(node, val, style);
e00ae6859667e293a4c40108f524408ae1289f2frbb return; // NOTE: return
0db1b9810f06c0e3c537e0e0dfbc30160c308526trawick } else if (typeof CUSTOM_STYLES[att] === 'string') {
0db1b9810f06c0e3c537e0e0dfbc30160c308526trawick att = CUSTOM_STYLES[att];
0db1b9810f06c0e3c537e0e0dfbc30160c308526trawick }
13bac43a0f21d8c6401debc1baa76be984474074rbb }
13bac43a0f21d8c6401debc1baa76be984474074rbb style[att] = val;
13bac43a0f21d8c6401debc1baa76be984474074rbb }
053497224246c4dbef9af594cacf5c00ed271e6cwrowe },
053497224246c4dbef9af594cacf5c00ed271e6cwrowe
053497224246c4dbef9af594cacf5c00ed271e6cwrowe /**
053497224246c4dbef9af594cacf5c00ed271e6cwrowe * Returns the current style value for the given property.
053497224246c4dbef9af594cacf5c00ed271e6cwrowe * @method getStyle
ac06e54654494445fd3d39e90bd23b436b4f84ccwrowe * @param {HTMLElement} An HTMLElement to get the style from.
ac06e54654494445fd3d39e90bd23b436b4f84ccwrowe * @param {String} att The style property to get.
ac06e54654494445fd3d39e90bd23b436b4f84ccwrowe */
ac06e54654494445fd3d39e90bd23b436b4f84ccwrowe getStyle: function(node, att) {
ac06e54654494445fd3d39e90bd23b436b4f84ccwrowe var style = node[STYLE],
ac06e54654494445fd3d39e90bd23b436b4f84ccwrowe CUSTOM_STYLES = Y.DOM.CUSTOM_STYLES,
ac06e54654494445fd3d39e90bd23b436b4f84ccwrowe val = '';
314b1f3fac7a0b556146ef055f37df00020604d0jwoolley
78e8198247420a3efeb21e38b42c423e5863cbb0jwoolley if (style) {
78e8198247420a3efeb21e38b42c423e5863cbb0jwoolley if (att in CUSTOM_STYLES) {
78e8198247420a3efeb21e38b42c423e5863cbb0jwoolley if (CUSTOM_STYLES[att].get) {
78e8198247420a3efeb21e38b42c423e5863cbb0jwoolley return CUSTOM_STYLES[att].get(node, att, style); // NOTE: return
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe } else if (typeof CUSTOM_STYLES[att] === 'string') {
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe att = CUSTOM_STYLES[att];
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe }
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe }
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe val = style[att];
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe if (val === '') { // TODO: is empty string sufficient?
a906160166014e14adc01c87a956d89de0d79918rbb val = Y.DOM[GET_COMPUTED_STYLE](node, att);
a906160166014e14adc01c87a956d89de0d79918rbb }
a906160166014e14adc01c87a956d89de0d79918rbb }
a906160166014e14adc01c87a956d89de0d79918rbb
a906160166014e14adc01c87a956d89de0d79918rbb return val;
a906160166014e14adc01c87a956d89de0d79918rbb },
a906160166014e14adc01c87a956d89de0d79918rbb
7f66c5be12d3b48b1ebfa79033c099e4f91ff302dougm /**
7f66c5be12d3b48b1ebfa79033c099e4f91ff302dougm * Sets multiple style properties.
7f66c5be12d3b48b1ebfa79033c099e4f91ff302dougm * @method setStyles
7f66c5be12d3b48b1ebfa79033c099e4f91ff302dougm * @param {HTMLElement} node An HTMLElement to apply the styles to.
7f66c5be12d3b48b1ebfa79033c099e4f91ff302dougm * @param {Object} hash An object literal of property:value pairs.
e00ae6859667e293a4c40108f524408ae1289f2frbb */
e00ae6859667e293a4c40108f524408ae1289f2frbb setStyles: function(node, hash) {
e00ae6859667e293a4c40108f524408ae1289f2frbb Y.each(hash, function(v, n) {
e00ae6859667e293a4c40108f524408ae1289f2frbb Y.DOM.setStyle(node, n, v);
e00ae6859667e293a4c40108f524408ae1289f2frbb }, Y.DOM);
e00ae6859667e293a4c40108f524408ae1289f2frbb },
d94fd18ee21dc9b8c1f422144a881e941687d41fdougm
d94fd18ee21dc9b8c1f422144a881e941687d41fdougm /**
53b8cdb3621b11b897438d8990d20e0b78f0d4b7rederpj * Returns the computed style for the given node.
53b8cdb3621b11b897438d8990d20e0b78f0d4b7rederpj * @method getComputedStyle
53b8cdb3621b11b897438d8990d20e0b78f0d4b7rederpj * @param {HTMLElement} An HTMLElement to get the style from.
53b8cdb3621b11b897438d8990d20e0b78f0d4b7rederpj * @param {String} att The style property to get.
53b8cdb3621b11b897438d8990d20e0b78f0d4b7rederpj * @return {String} The computed value of the style property.
53b8cdb3621b11b897438d8990d20e0b78f0d4b7rederpj */
53b8cdb3621b11b897438d8990d20e0b78f0d4b7rederpj getComputedStyle: function(node, att) {
a1373889aeb316ed9d1b0f24a715e919d02a4d99dougm var val = '',
a1373889aeb316ed9d1b0f24a715e919d02a4d99dougm doc = node[OWNER_DOCUMENT];
a1373889aeb316ed9d1b0f24a715e919d02a4d99dougm
6b025bd5a034790b2bb31236092265e154d6a565dougm if (node[STYLE]) {
6b025bd5a034790b2bb31236092265e154d6a565dougm val = doc[DEFAULT_VIEW][GET_COMPUTED_STYLE](node, '')[att];
330e5149d05dc4f5121b30964753167e43690afdrbb }
d0af34e0d69afb8195eee403c60357d59ac046e1trawick return val;
d0af34e0d69afb8195eee403c60357d59ac046e1trawick }
d0af34e0d69afb8195eee403c60357d59ac046e1trawick});
d0af34e0d69afb8195eee403c60357d59ac046e1trawick
91cbefdfe308c93892b52045a5f0253506432cd0trawick// normalize reserved word float alternatives ("cssFloat" or "styleFloat")
91cbefdfe308c93892b52045a5f0253506432cd0trawickif (DOCUMENT[DOCUMENT_ELEMENT][STYLE][CSS_FLOAT] !== UNDEFINED) {
598ce99543701a45a31bb01bf73c83d894592491rederpj Y.DOM.CUSTOM_STYLES[FLOAT] = CSS_FLOAT;
598ce99543701a45a31bb01bf73c83d894592491rederpj} else if (DOCUMENT[DOCUMENT_ELEMENT][STYLE][STYLE_FLOAT] !== UNDEFINED) {
598ce99543701a45a31bb01bf73c83d894592491rederpj Y.DOM.CUSTOM_STYLES[FLOAT] = STYLE_FLOAT;
598ce99543701a45a31bb01bf73c83d894592491rederpj}
fa687651463b68c7cc0dda80341712d1ef9543efwrowe
fa687651463b68c7cc0dda80341712d1ef9543efwrowe// fix opera computedStyle default color unit (convert to rgb)
fa687651463b68c7cc0dda80341712d1ef9543efwroweif (Y.UA.opera) {
fa687651463b68c7cc0dda80341712d1ef9543efwrowe Y.DOM[GET_COMPUTED_STYLE] = function(node, att) {
7680ff9dd09d8feb9db31d23f33458d0464e92f1wrowe var view = node[OWNER_DOCUMENT][DEFAULT_VIEW],
7680ff9dd09d8feb9db31d23f33458d0464e92f1wrowe val = view[GET_COMPUTED_STYLE](node, '')[att];
7680ff9dd09d8feb9db31d23f33458d0464e92f1wrowe
7680ff9dd09d8feb9db31d23f33458d0464e92f1wrowe if (re_color.test(att)) {
c760d13cffeef40df3f8c5a798e40a064dc80067bjh val = Y.Color.toRGB(val);
c760d13cffeef40df3f8c5a798e40a064dc80067bjh }
78980330fa2be5f42eb3a9c9b73a71a5168944e6minfrin
78980330fa2be5f42eb3a9c9b73a71a5168944e6minfrin return val;
78980330fa2be5f42eb3a9c9b73a71a5168944e6minfrin };
78980330fa2be5f42eb3a9c9b73a71a5168944e6minfrin
1fff95696a94273a1629649652cbc5d2e9e8ce39minfrin}
1fff95696a94273a1629649652cbc5d2e9e8ce39minfrin
1fff95696a94273a1629649652cbc5d2e9e8ce39minfrin// safari converts transparent to rgba(), others use "transparent"
90ad571a3ddd07e9b96f06b6b425295e1ec93da0minfrinif (Y.UA.webkit) {
90ad571a3ddd07e9b96f06b6b425295e1ec93da0minfrin Y.DOM[GET_COMPUTED_STYLE] = function(node, att) {
90ad571a3ddd07e9b96f06b6b425295e1ec93da0minfrin var view = node[OWNER_DOCUMENT][DEFAULT_VIEW],
90ad571a3ddd07e9b96f06b6b425295e1ec93da0minfrin val = view[GET_COMPUTED_STYLE](node, '')[att];
90ad571a3ddd07e9b96f06b6b425295e1ec93da0minfrin
10dd882bd22449ec6c1b8fb0c5227727e2232ba8minfrin if (val === 'rgba(0, 0, 0, 0)') {
10dd882bd22449ec6c1b8fb0c5227727e2232ba8minfrin val = TRANSPARENT;
10dd882bd22449ec6c1b8fb0c5227727e2232ba8minfrin }
89342f4a895e67868f8fe37a0ac77f1dd9f91868minfrin
89342f4a895e67868f8fe37a0ac77f1dd9f91868minfrin return val;
89342f4a895e67868f8fe37a0ac77f1dd9f91868minfrin };
89342f4a895e67868f8fe37a0ac77f1dd9f91868minfrin
7a027a168069a89ca0946e04294f5130d9cbe3b8rederpj}
7a027a168069a89ca0946e04294f5130d9cbe3b8rederpj
7a027a168069a89ca0946e04294f5130d9cbe3b8rederpj
10dd882bd22449ec6c1b8fb0c5227727e2232ba8minfrin/**
7a027a168069a89ca0946e04294f5130d9cbe3b8rederpj * Adds position and region management functionality to DOM.
29caf394750ea44e25d289a9aa7b92b9823faa8aminfrin * @module dom
29caf394750ea44e25d289a9aa7b92b9823faa8aminfrin * @submodule dom-screen
29caf394750ea44e25d289a9aa7b92b9823faa8aminfrin * @for DOM
29caf394750ea44e25d289a9aa7b92b9823faa8aminfrin */
29caf394750ea44e25d289a9aa7b92b9823faa8aminfrin
29caf394750ea44e25d289a9aa7b92b9823faa8aminfrinvar OFFSET_TOP = 'offsetTop',
330e5149d05dc4f5121b30964753167e43690afdrbb
330e5149d05dc4f5121b30964753167e43690afdrbb DOCUMENT_ELEMENT = 'documentElement',
330e5149d05dc4f5121b30964753167e43690afdrbb COMPAT_MODE = 'compatMode',
330e5149d05dc4f5121b30964753167e43690afdrbb OFFSET_LEFT = 'offsetLeft',
9222dcffcfe8d92f94c85d4e857af7b63264c9dcrbb OFFSET_PARENT = 'offsetParent',
5ba9b0e6d4e69e3daaad80eba67774408a2355f2wrowe POSITION = 'position',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick FIXED = 'fixed',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick RELATIVE = 'relative',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick LEFT = 'left',
bfad8636cb9e52b309679a90dadc91b635ecfe2atrawick TOP = 'top',
bfad8636cb9e52b309679a90dadc91b635ecfe2atrawick SCROLL_LEFT = 'scrollLeft',
bfad8636cb9e52b309679a90dadc91b635ecfe2atrawick SCROLL_TOP = 'scrollTop',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick _BACK_COMPAT = 'BackCompat',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick MEDIUM = 'medium',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick HEIGHT = 'height',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick WIDTH = 'width',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick BORDER_LEFT_WIDTH = 'borderLeftWidth',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick BORDER_TOP_WIDTH = 'borderTopWidth',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick GET_BOUNDING_CLIENT_RECT = 'getBoundingClientRect',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick GET_COMPUTED_STYLE = 'getComputedStyle',
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick // TODO: how about thead/tbody/tfoot/tr?
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick // TODO: does caption matter?
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick RE_TABLE = /^t(?:able|d|h)$/i;
bb5c04f1ab6c2913d49b263e26302c748a1aa70btrawick
50e228f0b8429c27e411611f4863fafaba403b47wroweY.mix(Y.DOM, {
50e228f0b8429c27e411611f4863fafaba403b47wrowe /**
50e228f0b8429c27e411611f4863fafaba403b47wrowe * Returns the inner height of the viewport (exludes scrollbar).
50e228f0b8429c27e411611f4863fafaba403b47wrowe * @method winHeight
50e228f0b8429c27e411611f4863fafaba403b47wrowe
50e228f0b8429c27e411611f4863fafaba403b47wrowe */
7ba58e7e63da9a8b84f6160c476a0c9d639c81e9trawick winHeight: function(node) {
7ba58e7e63da9a8b84f6160c476a0c9d639c81e9trawick var h = Y.DOM._getWinSize(node)[HEIGHT];
7ba58e7e63da9a8b84f6160c476a0c9d639c81e9trawick return h;
7ba58e7e63da9a8b84f6160c476a0c9d639c81e9trawick },
7ba58e7e63da9a8b84f6160c476a0c9d639c81e9trawick
7ba58e7e63da9a8b84f6160c476a0c9d639c81e9trawick /**
7ba58e7e63da9a8b84f6160c476a0c9d639c81e9trawick * Returns the inner width of the viewport (exludes scrollbar).
0315d8e436a65aa1fd145ce0a84f6c0f21e304c0wrowe * @method winWidth
0315d8e436a65aa1fd145ce0a84f6c0f21e304c0wrowe
0315d8e436a65aa1fd145ce0a84f6c0f21e304c0wrowe */
6270ac7f45156afd9d798dc28f1c6e1d09e040c1rbb winWidth: function(node) {
6270ac7f45156afd9d798dc28f1c6e1d09e040c1rbb var w = Y.DOM._getWinSize(node)[WIDTH];
6270ac7f45156afd9d798dc28f1c6e1d09e040c1rbb return w;
496dc24432cc5c9f95a627865879d4b83dca1055coar },
496dc24432cc5c9f95a627865879d4b83dca1055coar
496dc24432cc5c9f95a627865879d4b83dca1055coar /**
496dc24432cc5c9f95a627865879d4b83dca1055coar * Document height
5b5d90c6d3ffb9e28a62c6bc8e2cb60e4740f7f7coar * @method docHeight
5b5d90c6d3ffb9e28a62c6bc8e2cb60e4740f7f7coar
496dc24432cc5c9f95a627865879d4b83dca1055coar */
622f0f22cd52de0e9904b218defdeb3181e113f3trawick docHeight: function(node) {
622f0f22cd52de0e9904b218defdeb3181e113f3trawick var h = Y.DOM._getDocSize(node)[HEIGHT];
622f0f22cd52de0e9904b218defdeb3181e113f3trawick return Math.max(h, Y.DOM._getWinSize(node)[HEIGHT]);
622f0f22cd52de0e9904b218defdeb3181e113f3trawick },
622f0f22cd52de0e9904b218defdeb3181e113f3trawick
e83476358ef015a1959284421fdc25ab18a7aa02rbb /**
e83476358ef015a1959284421fdc25ab18a7aa02rbb * Document width
7b4c4bb891261e613de39a021d7554fd08132fc5rbb * @method docWidth
7b4c4bb891261e613de39a021d7554fd08132fc5rbb */
7b4c4bb891261e613de39a021d7554fd08132fc5rbb docWidth: function(node) {
7b4c4bb891261e613de39a021d7554fd08132fc5rbb var w = Y.DOM._getDocSize(node)[WIDTH];
7b4c4bb891261e613de39a021d7554fd08132fc5rbb return Math.max(w, Y.DOM._getWinSize(node)[WIDTH]);
22d41dd622ae45958da09d4afd1163fd1923f7ddjwoolley },
4c6731b2f737f8d7fcacd44b97d9e6bab745f1a5rbb
4c6731b2f737f8d7fcacd44b97d9e6bab745f1a5rbb /**
4c6731b2f737f8d7fcacd44b97d9e6bab745f1a5rbb * Amount page has been scroll vertically
0917cf91e713579b7ee0b03e499a08d7c3ec2d88rbb * @method docScrollX
0917cf91e713579b7ee0b03e499a08d7c3ec2d88rbb */
0917cf91e713579b7ee0b03e499a08d7c3ec2d88rbb docScrollX: function(node) {
0917cf91e713579b7ee0b03e499a08d7c3ec2d88rbb var doc = Y.DOM._getDoc(node);
0917cf91e713579b7ee0b03e499a08d7c3ec2d88rbb return Math.max(doc[DOCUMENT_ELEMENT][SCROLL_LEFT], doc.body[SCROLL_LEFT]);
251b60354534e12b004603ecf2a83f32756dc885rbb },
251b60354534e12b004603ecf2a83f32756dc885rbb
251b60354534e12b004603ecf2a83f32756dc885rbb /**
251b60354534e12b004603ecf2a83f32756dc885rbb * Amount page has been scroll horizontally
251b60354534e12b004603ecf2a83f32756dc885rbb * @method docScrollY
251b60354534e12b004603ecf2a83f32756dc885rbb */
251b60354534e12b004603ecf2a83f32756dc885rbb docScrollY: function(node) {
251b60354534e12b004603ecf2a83f32756dc885rbb var doc = Y.DOM._getDoc(node);
251b60354534e12b004603ecf2a83f32756dc885rbb return Math.max(doc[DOCUMENT_ELEMENT][SCROLL_TOP], doc.body[SCROLL_TOP]);
12348d5b520522b6581d907ef9c1ceda029fbc05rbb },
22d41dd622ae45958da09d4afd1163fd1923f7ddjwoolley
12348d5b520522b6581d907ef9c1ceda029fbc05rbb /**
12348d5b520522b6581d907ef9c1ceda029fbc05rbb * Gets the current position of an element based on page coordinates.
12348d5b520522b6581d907ef9c1ceda029fbc05rbb * Element must be part of the DOM tree to have page coordinates
a3b2a05c4c0f6a29e75c9349b85640192f6a8bfejwoolley * (display:none or elements not appended return false).
f8b7801ea5717ef22cc0d02bffacfd5f9e48f898gregames * @method getXY
d65b067e7797b56d6678b0ddcd0aa9258cd55e64trawick * @param element The target element
d65b067e7797b56d6678b0ddcd0aa9258cd55e64trawick * @return {Array} The XY position of the element
416713f4130a31ae7317885c4638b3753c40a5e9jwoolley
416713f4130a31ae7317885c4638b3753c40a5e9jwoolley TODO: test inDocument/display
416713f4130a31ae7317885c4638b3753c40a5e9jwoolley */
f947ecf8a772cbfcce0315feb68ad88e84299ad0trawick getXY: function() {
f947ecf8a772cbfcce0315feb68ad88e84299ad0trawick if (document[DOCUMENT_ELEMENT][GET_BOUNDING_CLIENT_RECT]) {
f947ecf8a772cbfcce0315feb68ad88e84299ad0trawick return function(node) {
f947ecf8a772cbfcce0315feb68ad88e84299ad0trawick if (!node) {
82efd02118af953c3840478fa5e979a4194a579fwrowe return false;
82efd02118af953c3840478fa5e979a4194a579fwrowe }
82efd02118af953c3840478fa5e979a4194a579fwrowe var scrollLeft = Y.DOM.docScrollX(node),
82efd02118af953c3840478fa5e979a4194a579fwrowe scrollTop = Y.DOM.docScrollY(node),
82efd02118af953c3840478fa5e979a4194a579fwrowe box = node[GET_BOUNDING_CLIENT_RECT](),
82efd02118af953c3840478fa5e979a4194a579fwrowe doc = Y.DOM._getDoc(node),
82efd02118af953c3840478fa5e979a4194a579fwrowe //Round the numbers so we get sane data back
82efd02118af953c3840478fa5e979a4194a579fwrowe xy = [Math.floor(box[LEFT]), Math.floor(box[TOP])];
82efd02118af953c3840478fa5e979a4194a579fwrowe
82efd02118af953c3840478fa5e979a4194a579fwrowe if (Y.UA.ie) {
82efd02118af953c3840478fa5e979a4194a579fwrowe var off1 = 2, off2 = 2,
82efd02118af953c3840478fa5e979a4194a579fwrowe mode = doc[COMPAT_MODE],
82efd02118af953c3840478fa5e979a4194a579fwrowe bLeft = Y.DOM[GET_COMPUTED_STYLE](doc[DOCUMENT_ELEMENT], BORDER_LEFT_WIDTH),
82efd02118af953c3840478fa5e979a4194a579fwrowe bTop = Y.DOM[GET_COMPUTED_STYLE](doc[DOCUMENT_ELEMENT], BORDER_TOP_WIDTH);
ff2fef0d709ee06646b3462cd3ef39648a54c7f7jwoolley
ff2fef0d709ee06646b3462cd3ef39648a54c7f7jwoolley if (Y.UA.ie === 6) {
ff2fef0d709ee06646b3462cd3ef39648a54c7f7jwoolley if (mode !== _BACK_COMPAT) {
ff2fef0d709ee06646b3462cd3ef39648a54c7f7jwoolley off1 = 0;
416713f4130a31ae7317885c4638b3753c40a5e9jwoolley off2 = 0;
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe }
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe }
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe if ((mode == _BACK_COMPAT)) {
416713f4130a31ae7317885c4638b3753c40a5e9jwoolley if (bLeft !== MEDIUM) {
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe off1 = parseInt(bLeft, 10);
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe }
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe if (bTop !== MEDIUM) {
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe off2 = parseInt(bTop, 10);
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe }
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe }
416713f4130a31ae7317885c4638b3753c40a5e9jwoolley
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe xy[0] -= off1;
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe xy[1] -= off2;
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe
416713f4130a31ae7317885c4638b3753c40a5e9jwoolley }
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe if ((scrollTop || scrollLeft)) {
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe xy[0] += scrollLeft;
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe xy[1] += scrollTop;
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe }
77e04697cbdb146d93cd22ad9f1c5e74ef8f9cbcwrowe
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe // gecko may return sub-pixel (non-int) values
731c41a39b8273a6c4b8b87b6fd0ba5c7f3f9e2bwrowe xy[0] = Math.floor(xy[0]);
731c41a39b8273a6c4b8b87b6fd0ba5c7f3f9e2bwrowe xy[1] = Math.floor(xy[1]);
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe return xy;
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe };
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe } else {
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe return function(node) { // manually calculate by crawling up offsetParents
731c41a39b8273a6c4b8b87b6fd0ba5c7f3f9e2bwrowe //Calculate the Top and Left border sizes (assumes pixels)
cd32ea298a494089c6886c8de0e8ad13ddc7ee6cwrowe var xy = [node[OFFSET_LEFT], node[OFFSET_TOP]],
cd32ea298a494089c6886c8de0e8ad13ddc7ee6cwrowe parentNode = node,
cd32ea298a494089c6886c8de0e8ad13ddc7ee6cwrowe // TODO: refactor with !! or just falsey
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe bCheck = ((Y.UA.gecko || Y.UA.webkit > 519) ? true : false);
dc96a5e6f9af3c514df4c61ab9468fcf97f9846fwrowe
cd32ea298a494089c6886c8de0e8ad13ddc7ee6cwrowe // TODO: worth refactoring for TOP/LEFT only?
af2bf35f47aaa3f1a3b1fe8336b9d20efad5b7e9gregames while ((parentNode = parentNode[OFFSET_PARENT])) {
af2bf35f47aaa3f1a3b1fe8336b9d20efad5b7e9gregames xy[0] += parentNode[OFFSET_LEFT];
af2bf35f47aaa3f1a3b1fe8336b9d20efad5b7e9gregames xy[1] += parentNode[OFFSET_TOP];
af2bf35f47aaa3f1a3b1fe8336b9d20efad5b7e9gregames if (bCheck) {
e49758465fbf67f29f9aeda996d09f7cc6fa9fe5rbb xy = Y.DOM._calcBorders(parentNode, xy);
e49758465fbf67f29f9aeda996d09f7cc6fa9fe5rbb }
e49758465fbf67f29f9aeda996d09f7cc6fa9fe5rbb }
e49758465fbf67f29f9aeda996d09f7cc6fa9fe5rbb
e49758465fbf67f29f9aeda996d09f7cc6fa9fe5rbb // account for any scrolled ancestors
81e5d74ef38fbf76853e1fbdd95c117e130e473frbb if (Y.DOM.getStyle(node, POSITION) != FIXED) {
81e5d74ef38fbf76853e1fbdd95c117e130e473frbb parentNode = node;
81e5d74ef38fbf76853e1fbdd95c117e130e473frbb var scrollTop, scrollLeft;
81e5d74ef38fbf76853e1fbdd95c117e130e473frbb
81e5d74ef38fbf76853e1fbdd95c117e130e473frbb while ((parentNode = parentNode.parentNode)) {
81e5d74ef38fbf76853e1fbdd95c117e130e473frbb scrollTop = parentNode[SCROLL_TOP];
62db15de4c1f335a64d45821796ae197cff94ef8rbb scrollLeft = parentNode[SCROLL_LEFT];
62db15de4c1f335a64d45821796ae197cff94ef8rbb
62db15de4c1f335a64d45821796ae197cff94ef8rbb //Firefox does something funky with borders when overflow is not visible.
62db15de4c1f335a64d45821796ae197cff94ef8rbb if (Y.UA.gecko && (Y.DOM.getStyle(parentNode, 'overflow') !== 'visible')) {
62db15de4c1f335a64d45821796ae197cff94ef8rbb xy = Y.DOM._calcBorders(parentNode, xy);
62db15de4c1f335a64d45821796ae197cff94ef8rbb }
62db15de4c1f335a64d45821796ae197cff94ef8rbb
f2e16ea0697f128c32da623a0b2b9d0f81c5ebcawrowe
f2e16ea0697f128c32da623a0b2b9d0f81c5ebcawrowe if (scrollTop || scrollLeft) {
f2e16ea0697f128c32da623a0b2b9d0f81c5ebcawrowe xy[0] -= scrollLeft;
3463e3fe80229b9cded9130e8bd13e961ad2ad2cwrowe xy[1] -= scrollTop;
3463e3fe80229b9cded9130e8bd13e961ad2ad2cwrowe }
3463e3fe80229b9cded9130e8bd13e961ad2ad2cwrowe }
3463e3fe80229b9cded9130e8bd13e961ad2ad2cwrowe xy[0] += Y.DOM.docScrollX(node);
7ff254655b6cb0516fa27409470a98554bbec706wrowe xy[1] += Y.DOM.docScrollY(node);
f8b7801ea5717ef22cc0d02bffacfd5f9e48f898gregames
f8b7801ea5717ef22cc0d02bffacfd5f9e48f898gregames } else {
f8b7801ea5717ef22cc0d02bffacfd5f9e48f898gregames //Fix FIXED position -- add scrollbars
f8b7801ea5717ef22cc0d02bffacfd5f9e48f898gregames if (Y.UA.opera) {
f8b7801ea5717ef22cc0d02bffacfd5f9e48f898gregames xy[0] -= Y.DOM.docScrollX(node);
286129112dc6bfee53f0db4f945d3352d4d5bed7stoddard xy[1] -= Y.DOM.docScrollY(node);
eccae8f28bd9fcf6a2d1f29548f7c3b8e297c712wrowe } else if (Y.UA.webkit || Y.UA.gecko) {
b1627fe7e2cb3809dcdfdf1fcbbb6dbccaf788c6rbb xy[0] += Y.DOM.docScrollX(node);
b1627fe7e2cb3809dcdfdf1fcbbb6dbccaf788c6rbb xy[1] += Y.DOM.docScrollY(node);
b1627fe7e2cb3809dcdfdf1fcbbb6dbccaf788c6rbb }
b1627fe7e2cb3809dcdfdf1fcbbb6dbccaf788c6rbb }
b1627fe7e2cb3809dcdfdf1fcbbb6dbccaf788c6rbb //Round the numbers so we get sane data back
eccae8f28bd9fcf6a2d1f29548f7c3b8e297c712wrowe xy[0] = Math.floor(xy[0]);
eccae8f28bd9fcf6a2d1f29548f7c3b8e297c712wrowe xy[1] = Math.floor(xy[1]);
eccae8f28bd9fcf6a2d1f29548f7c3b8e297c712wrowe
eccae8f28bd9fcf6a2d1f29548f7c3b8e297c712wrowe return xy;
4e136881902ae5dfba3c59a23db7aa09345cea3awrowe };
06c2a9f9fcea4b8a21d6b7ffdd50c7a40edf10ffgregames }
06c2a9f9fcea4b8a21d6b7ffdd50c7a40edf10ffgregames }(),// NOTE: Executing for loadtime branching
06c2a9f9fcea4b8a21d6b7ffdd50c7a40edf10ffgregames
06c2a9f9fcea4b8a21d6b7ffdd50c7a40edf10ffgregames /**
263dbbd9c2a6952e756973b3dde9beeaf8eff6b7gregames * Gets the current X position of an element based on page coordinates.
6529086e53a38486d6cf0eac256b96548b6ef299wrowe * Element must be part of the DOM tree to have page coordinates
6529086e53a38486d6cf0eac256b96548b6ef299wrowe * (display:none or elements not appended return false).
6529086e53a38486d6cf0eac256b96548b6ef299wrowe * @method getX
6529086e53a38486d6cf0eac256b96548b6ef299wrowe * @param element The target element
6529086e53a38486d6cf0eac256b96548b6ef299wrowe * @return {Int} The X position of the element
6529086e53a38486d6cf0eac256b96548b6ef299wrowe */
6529086e53a38486d6cf0eac256b96548b6ef299wrowe
6529086e53a38486d6cf0eac256b96548b6ef299wrowe getX: function(node) {
6529086e53a38486d6cf0eac256b96548b6ef299wrowe return Y.DOM.getXY(node)[0];
6529086e53a38486d6cf0eac256b96548b6ef299wrowe },
9876642ec8126175f143702d7b949643f8128fdftrawick
9876642ec8126175f143702d7b949643f8128fdftrawick /**
9876642ec8126175f143702d7b949643f8128fdftrawick * Gets the current Y position of an element based on page coordinates.
263dbbd9c2a6952e756973b3dde9beeaf8eff6b7gregames * Element must be part of the DOM tree to have page coordinates
263dbbd9c2a6952e756973b3dde9beeaf8eff6b7gregames * (display:none or elements not appended return false).
263dbbd9c2a6952e756973b3dde9beeaf8eff6b7gregames * @method getY
263dbbd9c2a6952e756973b3dde9beeaf8eff6b7gregames * @param element The target element
0f2ac39337f7543f197db8b040f596123167eb2dstoddard * @return {Int} The Y position of the element
0f2ac39337f7543f197db8b040f596123167eb2dstoddard */
0f2ac39337f7543f197db8b040f596123167eb2dstoddard
0f2ac39337f7543f197db8b040f596123167eb2dstoddard getY: function(node) {
0f2ac39337f7543f197db8b040f596123167eb2dstoddard return Y.DOM.getXY(node)[1];
0f2ac39337f7543f197db8b040f596123167eb2dstoddard },
5183e10e45a86e2dd1112a4d71c24db3facbbc9agregames
5183e10e45a86e2dd1112a4d71c24db3facbbc9agregames /**
5183e10e45a86e2dd1112a4d71c24db3facbbc9agregames * Set the position of an html element in page coordinates.
0f2ac39337f7543f197db8b040f596123167eb2dstoddard * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
4ff47e3535a6da266acc3f0cf743046dbf16a856rbb * @method setXY
afab3e893c3fecabf2e3cac4e37ada58db984cearbb * @param element The target element
afab3e893c3fecabf2e3cac4e37ada58db984cearbb * @param {Array} xy Contains X & Y values for new position (coordinates are page-based)
afab3e893c3fecabf2e3cac4e37ada58db984cearbb * @param {Boolean} noRetry By default we try and set the position a second time if the first fails
afab3e893c3fecabf2e3cac4e37ada58db984cearbb */
612ea048caf897cb6e69dc296d2b143a08ba83a0rbb setXY: function(node, xy, noRetry) {
612ea048caf897cb6e69dc296d2b143a08ba83a0rbb var pos = Y.DOM.getStyle(node, POSITION),
612ea048caf897cb6e69dc296d2b143a08ba83a0rbb setStyle = Y.DOM.setStyle,
612ea048caf897cb6e69dc296d2b143a08ba83a0rbb
612ea048caf897cb6e69dc296d2b143a08ba83a0rbb delta = [ // assuming pixels; if not we will have to retry
612ea048caf897cb6e69dc296d2b143a08ba83a0rbb parseInt( Y.DOM[GET_COMPUTED_STYLE](node, LEFT), 10 ),
67e81f5f6ddfe2e3d1f1208a04b8ccd368c658farbb parseInt( Y.DOM[GET_COMPUTED_STYLE](node, TOP), 10 )
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard ];
6529086e53a38486d6cf0eac256b96548b6ef299wrowe
6529086e53a38486d6cf0eac256b96548b6ef299wrowe if (pos == 'static') { // default to relative
6529086e53a38486d6cf0eac256b96548b6ef299wrowe pos = RELATIVE;
6529086e53a38486d6cf0eac256b96548b6ef299wrowe setStyle(node, POSITION, pos);
30309f86bfd564437654aa822a19cd0cb29ca6f8wrowe }
30309f86bfd564437654aa822a19cd0cb29ca6f8wrowe
30309f86bfd564437654aa822a19cd0cb29ca6f8wrowe var currentXY = Y.DOM.getXY(node);
30309f86bfd564437654aa822a19cd0cb29ca6f8wrowe
30309f86bfd564437654aa822a19cd0cb29ca6f8wrowe if (currentXY === false) { // has to be part of doc to have xy
65db4f712167a3498de73cee5c08032a8aa6a010rbb return false;
65db4f712167a3498de73cee5c08032a8aa6a010rbb }
65db4f712167a3498de73cee5c08032a8aa6a010rbb
65db4f712167a3498de73cee5c08032a8aa6a010rbb if ( isNaN(delta[0]) ) {// in case of 'auto'
65db4f712167a3498de73cee5c08032a8aa6a010rbb delta[0] = (pos == RELATIVE) ? 0 : node[OFFSET_LEFT];
ed4f9ec869d7fc5bd220c8d70ee58eed9b32d60arederpj }
ed4f9ec869d7fc5bd220c8d70ee58eed9b32d60arederpj if ( isNaN(delta[1]) ) { // in case of 'auto'
ed4f9ec869d7fc5bd220c8d70ee58eed9b32d60arederpj delta[1] = (pos == RELATIVE) ? 0 : node[OFFSET_TOP];
ed4f9ec869d7fc5bd220c8d70ee58eed9b32d60arederpj }
ed4f9ec869d7fc5bd220c8d70ee58eed9b32d60arederpj
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard if (xy[0] !== null) {
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard setStyle(node, LEFT, xy[0] - currentXY[0] + delta[0] + 'px');
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard }
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard if (xy[1] !== null) {
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard setStyle(node, TOP, xy[1] - currentXY[1] + delta[1] + 'px');
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard }
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard
c8af62b87a118cbbc25414eb9459219f338b1b0fstoddard if (!noRetry) {
c981632de03d61667b7a6dda3e1f0a80fd5973b1gregames var newXY = Y.DOM.getXY(node);
c981632de03d61667b7a6dda3e1f0a80fd5973b1gregames
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick // if retry is true, try one more time if we miss
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick if ( (xy[0] !== null && newXY[0] != xy[0]) ||
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick (xy[1] !== null && newXY[1] != xy[1]) ) {
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick Y.DOM.setXY(node, xy, true);
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick }
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick }
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick },
8f43c3299e44dc11a4cd68acc93b578a0318daaftrawick
688f7d0bc138bb02f92288017920468e7e314f23stoddard /**
688f7d0bc138bb02f92288017920468e7e314f23stoddard * Set the X position of an html element in page coordinates, regardless of how the element is positioned.
688f7d0bc138bb02f92288017920468e7e314f23stoddard * The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
688f7d0bc138bb02f92288017920468e7e314f23stoddard * @method setX
688f7d0bc138bb02f92288017920468e7e314f23stoddard * @param element The target element
688f7d0bc138bb02f92288017920468e7e314f23stoddard * @param {Int} x The X values for new position (coordinates are page-based)
448a83963e3ec557bc9f9020ab44f9681595d1eerbb */
3b8937baf1826c625c1ca90d220453a5e4b499edrbb setX: function(node, x) {
3b8937baf1826c625c1ca90d220453a5e4b499edrbb return Y.DOM.setXY(node, [x, null]);
3b8937baf1826c625c1ca90d220453a5e4b499edrbb },
3b8937baf1826c625c1ca90d220453a5e4b499edrbb
3b8937baf1826c625c1ca90d220453a5e4b499edrbb /**
9180a5933673ffb1af633c255ceee029340f3b1erbb * Set the Y position of an html element in page coordinates, regardless of how the element is positioned.
448a83963e3ec557bc9f9020ab44f9681595d1eerbb * The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
e654452796751e21828a4078767e075eccf3b232stoddard * @method setY
e654452796751e21828a4078767e075eccf3b232stoddard * @param element The target element
e654452796751e21828a4078767e075eccf3b232stoddard * @param {Int} y The Y values for new position (coordinates are page-based)
e654452796751e21828a4078767e075eccf3b232stoddard */
e654452796751e21828a4078767e075eccf3b232stoddard setY: function(node, y) {
e654452796751e21828a4078767e075eccf3b232stoddard return Y.DOM.setXY(node, [null, y]);
4670899d8a45ac6add3105181adf1976a1fae109stoddard },
4670899d8a45ac6add3105181adf1976a1fae109stoddard
85986096003221e8eb135ad1fda59a57c3d0528brbb _calcBorders: function(node, xy2) {
cf293fe6e2515d89788ec515ce6266ad6f13a724stoddard var t = parseInt(Y.DOM[GET_COMPUTED_STYLE](node, BORDER_TOP_WIDTH), 10) || 0,
f91cd1fc44d2588d82a56570b1005e7310dfc970jwoolley l = parseInt(Y.DOM[GET_COMPUTED_STYLE](node, BORDER_LEFT_WIDTH), 10) || 0;
f91cd1fc44d2588d82a56570b1005e7310dfc970jwoolley if (Y.UA.gecko) {
f91cd1fc44d2588d82a56570b1005e7310dfc970jwoolley if (RE_TABLE.test(node.tagName)) {
f91cd1fc44d2588d82a56570b1005e7310dfc970jwoolley t = 0;
cbed27f4c149736a6319a790c81aa8acc491fa18jwoolley l = 0;
f91cd1fc44d2588d82a56570b1005e7310dfc970jwoolley }
f91cd1fc44d2588d82a56570b1005e7310dfc970jwoolley }
8ff9257331986cb3646442ab61703fcc02158046trawick xy2[0] += l;
7537a55be7520037878a521d4ec8c8eb2d44a288rbb xy2[1] += t;
7537a55be7520037878a521d4ec8c8eb2d44a288rbb return xy2;
7537a55be7520037878a521d4ec8c8eb2d44a288rbb },
7537a55be7520037878a521d4ec8c8eb2d44a288rbb
7537a55be7520037878a521d4ec8c8eb2d44a288rbb _getWinSize: function(node) {
7537a55be7520037878a521d4ec8c8eb2d44a288rbb var doc = Y.DOM._getDoc(),
7537a55be7520037878a521d4ec8c8eb2d44a288rbb win = doc.defaultView || doc.parentWindow,
7537a55be7520037878a521d4ec8c8eb2d44a288rbb mode = doc[COMPAT_MODE],
7537a55be7520037878a521d4ec8c8eb2d44a288rbb h = win.innerHeight,
7537a55be7520037878a521d4ec8c8eb2d44a288rbb w = win.innerWidth,
7537a55be7520037878a521d4ec8c8eb2d44a288rbb root = doc[DOCUMENT_ELEMENT];
7537a55be7520037878a521d4ec8c8eb2d44a288rbb
de0fbde2191d651a2dd0296e0fd4c449fa9f1d39wrowe if ( mode && !Y.UA.opera ) { // IE, Gecko
de0fbde2191d651a2dd0296e0fd4c449fa9f1d39wrowe if (mode != 'CSS1Compat') { // Quirks
de0fbde2191d651a2dd0296e0fd4c449fa9f1d39wrowe root = doc.body;
de0fbde2191d651a2dd0296e0fd4c449fa9f1d39wrowe }
de0fbde2191d651a2dd0296e0fd4c449fa9f1d39wrowe h = root.clientHeight;
01f404bacecbd1354af8f04c23a28acef5044e73jwoolley w = root.clientWidth;
01f404bacecbd1354af8f04c23a28acef5044e73jwoolley }
01f404bacecbd1354af8f04c23a28acef5044e73jwoolley return { height: h, width: w };
54f7f1c85247dad29d8fa275866cea31d465b392stoddard },
54f7f1c85247dad29d8fa275866cea31d465b392stoddard
54f7f1c85247dad29d8fa275866cea31d465b392stoddard _getDocSize: function(node) {
54f7f1c85247dad29d8fa275866cea31d465b392stoddard var doc = Y.DOM._getDoc(),
01f404bacecbd1354af8f04c23a28acef5044e73jwoolley root = doc[DOCUMENT_ELEMENT];
54f7f1c85247dad29d8fa275866cea31d465b392stoddard
3af8fbdd62c9495c8f879eef1eb952a638a18a7adougm if (doc[COMPAT_MODE] != 'CSS1Compat') {
3af8fbdd62c9495c8f879eef1eb952a638a18a7adougm root = doc.body;
e14ec68ef48bbf6c3dc567900f9e087eaf0bc931trawick }
e14ec68ef48bbf6c3dc567900f9e087eaf0bc931trawick
e14ec68ef48bbf6c3dc567900f9e087eaf0bc931trawick return { height: root.scrollHeight, width: root.scrollWidth };
e14ec68ef48bbf6c3dc567900f9e087eaf0bc931trawick }
227e0bfd39e7c757d3618c8ada78d80cd1143d32wrowe});
227e0bfd39e7c757d3618c8ada78d80cd1143d32wrowe/**
227e0bfd39e7c757d3618c8ada78d80cd1143d32wrowe * Adds position and region management functionality to DOM.
227e0bfd39e7c757d3618c8ada78d80cd1143d32wrowe * @module dom
8ff9257331986cb3646442ab61703fcc02158046trawick * @submodule dom-screen
8ff9257331986cb3646442ab61703fcc02158046trawick * @for DOM
8ff9257331986cb3646442ab61703fcc02158046trawick */
8ff9257331986cb3646442ab61703fcc02158046trawick
8ff9257331986cb3646442ab61703fcc02158046trawickvar OFFSET_WIDTH = 'offsetWidth',
d9b416f8cfaaadcbc739cd8c7c356e76efdd3a2agregames OFFSET_HEIGHT = 'offsetHeight',
d9b416f8cfaaadcbc739cd8c7c356e76efdd3a2agregames TOP = 'top',
d9b416f8cfaaadcbc739cd8c7c356e76efdd3a2agregames RIGHT = 'right',
d9b416f8cfaaadcbc739cd8c7c356e76efdd3a2agregames BOTTOM = 'bottom',
d9b416f8cfaaadcbc739cd8c7c356e76efdd3a2agregames LEFT = 'left',
4192c91889a84b18aec0b046a94a2b2863be204cstoddard TAG_NAME = 'tagName';
4192c91889a84b18aec0b046a94a2b2863be204cstoddard
4192c91889a84b18aec0b046a94a2b2863be204cstoddardvar getOffsets = function(r1, r2) {
4192c91889a84b18aec0b046a94a2b2863be204cstoddard var t = Math.max(r1[TOP], r2[TOP]),
4192c91889a84b18aec0b046a94a2b2863be204cstoddard r = Math.min(r1[RIGHT], r2[RIGHT]),
4192c91889a84b18aec0b046a94a2b2863be204cstoddard b = Math.min(r1[BOTTOM], r2[BOTTOM]),
4192c91889a84b18aec0b046a94a2b2863be204cstoddard l = Math.max(r1[LEFT], r2[LEFT]),
7af2fcad9e14a79d7020a33766fbd3a4dfd088dcorlikowski ret = {};
7af2fcad9e14a79d7020a33766fbd3a4dfd088dcorlikowski
7af2fcad9e14a79d7020a33766fbd3a4dfd088dcorlikowski ret[TOP] = t;
b9d82dd4bc49204d9c2c5523e36b3109da298c04wrowe ret[RIGHT] = r;
7cc9511b8f1fff69439041327dc55e3423ccf439stoddard ret[BOTTOM] = b;
7cc9511b8f1fff69439041327dc55e3423ccf439stoddard ret[LEFT] = l;
7cc9511b8f1fff69439041327dc55e3423ccf439stoddard return ret;
b9d82dd4bc49204d9c2c5523e36b3109da298c04wrowe};
b9d82dd4bc49204d9c2c5523e36b3109da298c04wrowe
1ccb67ea7d1f2a3747d285835fd0ce0d123b66b2orlikowskivar DOM = DOM || Y.DOM;
141c0f61e9a56fbf31abeb85d541949717128bf7orlikowskiY.mix(DOM, {
1ccb67ea7d1f2a3747d285835fd0ce0d123b66b2orlikowski /**
3f4d7fdb598d64d80ab8656852276246f2f3b502rbb * Returns an Object literal containing the following about this element: (top, right, bottom, left)
a7318397b355119d990d1f311b951dea2aafc53arbb * @method region
a7318397b355119d990d1f311b951dea2aafc53arbb * @param {HTMLElement} element The DOM element.
a7318397b355119d990d1f311b951dea2aafc53arbb @return {Object} Object literal containing the following about this element: (top, right, bottom, left)
a7318397b355119d990d1f311b951dea2aafc53arbb */
a7318397b355119d990d1f311b951dea2aafc53arbb region: function(node) {
a7318397b355119d990d1f311b951dea2aafc53arbb var x = DOM.getXY(node),
3f4d7fdb598d64d80ab8656852276246f2f3b502rbb ret = false;
3f4d7fdb598d64d80ab8656852276246f2f3b502rbb
3f4d7fdb598d64d80ab8656852276246f2f3b502rbb if (x) {
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard ret = {
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard '0': x[0],
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard '1': x[1],
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard top: x[1],
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard right: x[0] + node[OFFSET_WIDTH],
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard bottom: x[1] + node[OFFSET_HEIGHT],
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard left: x[0],
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard height: node[OFFSET_HEIGHT],
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard width: node[OFFSET_WIDTH]
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard };
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard }
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard return ret;
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard },
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard /**
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard * Find the intersect information for the passes nodes.
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard * @method intersect
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard * @param {HTMLElement} element The first element
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard * @param {HTMLElement | Object} element2 The element or region to check the interect with
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard * @param {Object} altRegion An object literal containing the region for the first element if we already have the data (for performance i.e. DragDrop)
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard @return {Object} Object literal containing the following intersection data: (top, right, bottom, left, area, yoff, xoff, inRegion)
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard */
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard intersect: function(node, node2, altRegion) {
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard var r = altRegion || DOM.region(node), region = {};
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard var n = node2;
fd709745f1226d683c57ad9bbcdd05971d214d0cstoddard if (n[TAG_NAME]) {
0530cd68803616cfba0456038f2e679d41ebecb1minfrin region = DOM.region(n);
55069cedbbaf2768c1f317c80129c6f869890fb9rbb } else if (Y.Lang.isObject(node2)) {
55069cedbbaf2768c1f317c80129c6f869890fb9rbb region = node2;
55069cedbbaf2768c1f317c80129c6f869890fb9rbb } else {
55069cedbbaf2768c1f317c80129c6f869890fb9rbb return false;
6206099ac06c8fcc8c342e993e5d47d3dfb95d8dminfrin }
6206099ac06c8fcc8c342e993e5d47d3dfb95d8dminfrin
0530cd68803616cfba0456038f2e679d41ebecb1minfrin var off = getOffsets(region, r);
0530cd68803616cfba0456038f2e679d41ebecb1minfrin return {
0530cd68803616cfba0456038f2e679d41ebecb1minfrin top: off[TOP],
0530cd68803616cfba0456038f2e679d41ebecb1minfrin right: off[RIGHT],
b9d75184a83c325dc6cdf5488b0b1a4adec27506stoddard bottom: off[BOTTOM],
b9d75184a83c325dc6cdf5488b0b1a4adec27506stoddard left: off[LEFT],
b9d75184a83c325dc6cdf5488b0b1a4adec27506stoddard area: ((off[BOTTOM] - off[TOP]) * (off[RIGHT] - off[LEFT])),
b9d75184a83c325dc6cdf5488b0b1a4adec27506stoddard yoff: ((off[BOTTOM] - off[TOP])),
ba4c566c200c2436dae841b7c811807c80cd712afielding xoff: (off[RIGHT] - off[LEFT]),
2a7df37e1fa5276b519eb1f04827b96204ba8873trawick inRegion: DOM.inRegion(node, node2, false, altRegion)
2a7df37e1fa5276b519eb1f04827b96204ba8873trawick };
2a7df37e1fa5276b519eb1f04827b96204ba8873trawick
2a7df37e1fa5276b519eb1f04827b96204ba8873trawick },
864c5615d55b8ebbde24e72043f6325741335a74fielding /**
864c5615d55b8ebbde24e72043f6325741335a74fielding * Check if any part of this node is in the passed region
864c5615d55b8ebbde24e72043f6325741335a74fielding * @method inRegion
ff33056d9ea71f35e6fb3c17d53a18931be70a99minfrin * @param {Object} node2 The node to get the region from or an Object literal of the region
ff33056d9ea71f35e6fb3c17d53a18931be70a99minfrin * $param {Boolean} all Should all of the node be inside the region
ff33056d9ea71f35e6fb3c17d53a18931be70a99minfrin * @param {Object} altRegion An object literal containing the region for this node if we already have the data (for performance i.e. DragDrop)
ff33056d9ea71f35e6fb3c17d53a18931be70a99minfrin * @return {Boolean} True if in region, false if not.
ea92d0ffcb30b186010a2c8ca2c80d2ac09e34dastoddard */
ba4c566c200c2436dae841b7c811807c80cd712afielding inRegion: function(node, node2, all, altRegion) {
ba4c566c200c2436dae841b7c811807c80cd712afielding var region = {},
ba4c566c200c2436dae841b7c811807c80cd712afielding r = altRegion || DOM.region(node);
ba4c566c200c2436dae841b7c811807c80cd712afielding
82c7b60981923b89fb4ab4483d2aebcf206e9ee8trawick var n = node2;
342e2ae0f9ab3e3a56c2f37be6ec6c9c44f9ef48trawick if (n[TAG_NAME]) {
342e2ae0f9ab3e3a56c2f37be6ec6c9c44f9ef48trawick region = DOM.region(n);
342e2ae0f9ab3e3a56c2f37be6ec6c9c44f9ef48trawick } else if (Y.Lang.isObject(node2)) {
cb5d3f2f217d457dada4883addb1dc9f3f17bb85fielding region = node2;
cb5d3f2f217d457dada4883addb1dc9f3f17bb85fielding } else {
cb5d3f2f217d457dada4883addb1dc9f3f17bb85fielding return false;
82c7b60981923b89fb4ab4483d2aebcf206e9ee8trawick }
82c7b60981923b89fb4ab4483d2aebcf206e9ee8trawick
82c7b60981923b89fb4ab4483d2aebcf206e9ee8trawick if (all) {
82c7b60981923b89fb4ab4483d2aebcf206e9ee8trawick return (
82c7b60981923b89fb4ab4483d2aebcf206e9ee8trawick r[LEFT] >= region[LEFT] &&
7c60e4e710c92b3c4a0eb831bc6dd65368c599bcstoddard r[RIGHT] <= region[RIGHT] &&
7c60e4e710c92b3c4a0eb831bc6dd65368c599bcstoddard r[TOP] >= region[TOP] &&
7c60e4e710c92b3c4a0eb831bc6dd65368c599bcstoddard r[BOTTOM] <= region[BOTTOM] );
7c60e4e710c92b3c4a0eb831bc6dd65368c599bcstoddard } else {
7c60e4e710c92b3c4a0eb831bc6dd65368c599bcstoddard var off = getOffsets(region, r);
0c7d8ecf301c2a3f99deff385bdda0c21ac60af5stoddard if (off[BOTTOM] >= off[TOP] && off[RIGHT] >= off[LEFT]) {
0c7d8ecf301c2a3f99deff385bdda0c21ac60af5stoddard return true;
0c7d8ecf301c2a3f99deff385bdda0c21ac60af5stoddard } else {
0c7d8ecf301c2a3f99deff385bdda0c21ac60af5stoddard return false;
0c7d8ecf301c2a3f99deff385bdda0c21ac60af5stoddard }
0c7d8ecf301c2a3f99deff385bdda0c21ac60af5stoddard
0e161c3b556697af1dd88b719c05d3af239682d5dougm }
0e161c3b556697af1dd88b719c05d3af239682d5dougm },
01f61931c658183042469eb02fd3f61e4e643a6atrawick
aa616c3b5a4aa59867472cddf7d8e63693808f0erederpj /**
aa616c3b5a4aa59867472cddf7d8e63693808f0erederpj * Check if any part of this element is in the viewport
aa616c3b5a4aa59867472cddf7d8e63693808f0erederpj * @method inViewportRegion
aa616c3b5a4aa59867472cddf7d8e63693808f0erederpj * @param {HTMLElement} element The DOM element.
80e9324586de2fa55e2da4df409e6a85885ea659fielding * @param {Boolean} all Should all of the node be inside the region
80e9324586de2fa55e2da4df409e6a85885ea659fielding * @param {Object} altRegion An object literal containing the region for this node if we already have the data (for performance i.e. DragDrop)
80e9324586de2fa55e2da4df409e6a85885ea659fielding * @return {Boolean} True if in region, false if not.
bacd210652b4559c2597f62e1d41ccbde92acdfafielding */
80e9324586de2fa55e2da4df409e6a85885ea659fielding inViewportRegion: function(node, all, altRegion) {
4682cf97ee2eca42a7222e0113ebacf5ef70c4efrbb return DOM.inRegion(node, DOM.viewportRegion(node), all, altRegion);
4682cf97ee2eca42a7222e0113ebacf5ef70c4efrbb
4682cf97ee2eca42a7222e0113ebacf5ef70c4efrbb },
9f7fc4627b7d98f6f6955ad6cf0cec5a3e1c4debfielding
9f7fc4627b7d98f6f6955ad6cf0cec5a3e1c4debfielding /**
9f7fc4627b7d98f6f6955ad6cf0cec5a3e1c4debfielding * Returns an Object literal containing the following about the visible region of viewport: (top, right, bottom, left)
1702068419e130e99f021228659597c1ec658edcchuck * @method viewportRegion
1702068419e130e99f021228659597c1ec658edcchuck @return {Object} Object literal containing the following about the visible region of the viewport: (top, right, bottom, left)
1702068419e130e99f021228659597c1ec658edcchuck */
1702068419e130e99f021228659597c1ec658edcchuck viewportRegion: function(node) {
01f61931c658183042469eb02fd3f61e4e643a6atrawick node = node || Y.config.doc.documentElement;
01f61931c658183042469eb02fd3f61e4e643a6atrawick var r = {};
01f61931c658183042469eb02fd3f61e4e643a6atrawick r[TOP] = DOM.docScrollY(node);
01f61931c658183042469eb02fd3f61e4e643a6atrawick r[RIGHT] = DOM.winWidth(node) + DOM.docScrollX(node);
7ae8bc63caa2292341a22235223ff1ed17ac02aestoddard r[BOTTOM] = (DOM.docScrollY(node) + DOM.winHeight(node));
7ae8bc63caa2292341a22235223ff1ed17ac02aestoddard r[LEFT] = DOM.docScrollX(node);
7ae8bc63caa2292341a22235223ff1ed17ac02aestoddard
7ae8bc63caa2292341a22235223ff1ed17ac02aestoddard return r;
7ae8bc63caa2292341a22235223ff1ed17ac02aestoddard }
7ae8bc63caa2292341a22235223ff1ed17ac02aestoddard});
a70c3ad07126101795f5a988e86c88a699b297cerederpj/**
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbb * Add style management functionality to DOM.
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbb * @module dom
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbb * @submodule dom-style
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbb * @for DOM
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbb */
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbb
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbbvar CLIENT_TOP = 'clientTop',
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbb CLIENT_LEFT = 'clientLeft',
23851fdc3ee2eac45ebb85f400a5d719656dfa22rbb PARENT_NODE = 'parentNode',
105475009f541187ba7a14a367547d9404c578befielding RIGHT = 'right',
105475009f541187ba7a14a367547d9404c578befielding HAS_LAYOUT = 'hasLayout',
105475009f541187ba7a14a367547d9404c578befielding PX = 'px',
105475009f541187ba7a14a367547d9404c578befielding FILTER = 'filter',
105475009f541187ba7a14a367547d9404c578befielding FILTERS = 'filters',
105475009f541187ba7a14a367547d9404c578befielding OPACITY = 'opacity',
105475009f541187ba7a14a367547d9404c578befielding AUTO = 'auto',
b90c64e517df3fe1c97806830f84a30362187f0afielding CURRENT_STYLE = 'currentStyle';
b90c64e517df3fe1c97806830f84a30362187f0afielding
b90c64e517df3fe1c97806830f84a30362187f0afielding// use alpha filter for IE opacity
b90c64e517df3fe1c97806830f84a30362187f0afieldingif (document[DOCUMENT_ELEMENT][STYLE][OPACITY] === UNDEFINED &&
105475009f541187ba7a14a367547d9404c578befielding document[DOCUMENT_ELEMENT][FILTERS]) {
6ff63662058d5891fc110f8b357a3604d7f7deb3trawick Y.DOM.CUSTOM_STYLES[OPACITY] = {
6ff63662058d5891fc110f8b357a3604d7f7deb3trawick get: function(node) {
6ff63662058d5891fc110f8b357a3604d7f7deb3trawick var val = 100;
c4be1ca9db22140f3788166f0195304e2fe4743bgregames try { // will error if no DXImageTransform
c4be1ca9db22140f3788166f0195304e2fe4743bgregames val = node[FILTERS]['DXImageTransform.Microsoft.Alpha'][OPACITY];
c4be1ca9db22140f3788166f0195304e2fe4743bgregames
8019a211b7453e80e6e22db6d41fe68dd7f8c4b8fielding } catch(e) {
8019a211b7453e80e6e22db6d41fe68dd7f8c4b8fielding try { // make sure its in the document
8019a211b7453e80e6e22db6d41fe68dd7f8c4b8fielding val = node[FILTERS]('alpha')[OPACITY];
8019a211b7453e80e6e22db6d41fe68dd7f8c4b8fielding } catch(err) {
a70c3ad07126101795f5a988e86c88a699b297cerederpj }
a70c3ad07126101795f5a988e86c88a699b297cerederpj }
a70c3ad07126101795f5a988e86c88a699b297cerederpj return val / 100;
a70c3ad07126101795f5a988e86c88a699b297cerederpj },
a70c3ad07126101795f5a988e86c88a699b297cerederpj
357b3c68d77f4187bf6be49c248b90ba50b98f4agregames set: function(node, val, style) {
a3a9ceac1bc30598c594c89e1382609496b7752brbb if (typeof style[FILTER] == 'string') { // in case not appended
a3a9ceac1bc30598c594c89e1382609496b7752brbb style[FILTER] = 'alpha(' + OPACITY + '=' + val * 100 + ')';
a3a9ceac1bc30598c594c89e1382609496b7752brbb
a3a9ceac1bc30598c594c89e1382609496b7752brbb if (!node[CURRENT_STYLE] || !node[CURRENT_STYLE][HAS_LAYOUT]) {
a3a9ceac1bc30598c594c89e1382609496b7752brbb style.zoom = 1; // needs layout
25e17566bc9005778707317c8919c610513a4418stoddard }
25e17566bc9005778707317c8919c610513a4418stoddard }
25e17566bc9005778707317c8919c610513a4418stoddard }
25e17566bc9005778707317c8919c610513a4418stoddard };
25e17566bc9005778707317c8919c610513a4418stoddard}
25e17566bc9005778707317c8919c610513a4418stoddard
25e17566bc9005778707317c8919c610513a4418stoddard// IE getComputedStyle
25e17566bc9005778707317c8919c610513a4418stoddard// TODO: unit-less lineHeight (e.g. 1.22)
73579c435f9f6c2670c4391114368a2eedaf8ebfrbbvar re_size = /^width|height$/,
44ea927aaaa7c419de1c824beb01b26216f387c3dougm re_unit = /^(\d[.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz|%){1}?/i;
44ea927aaaa7c419de1c824beb01b26216f387c3dougm
44ea927aaaa7c419de1c824beb01b26216f387c3dougmvar ComputedStyle = {
a601a32cec653022741d22b5d692b6afd6c4dc55trawick CUSTOM_STYLES: {},
a601a32cec653022741d22b5d692b6afd6c4dc55trawick
a601a32cec653022741d22b5d692b6afd6c4dc55trawick get: function(el, property) {
a601a32cec653022741d22b5d692b6afd6c4dc55trawick var value = '',
a601a32cec653022741d22b5d692b6afd6c4dc55trawick current = el[CURRENT_STYLE][property];
73579c435f9f6c2670c4391114368a2eedaf8ebfrbb
73579c435f9f6c2670c4391114368a2eedaf8ebfrbb if (property === OPACITY) {
73579c435f9f6c2670c4391114368a2eedaf8ebfrbb value = Y.DOM.CUSTOM_STYLES[OPACITY].get(el);
73579c435f9f6c2670c4391114368a2eedaf8ebfrbb } else if (!current || (current.indexOf && current.indexOf(PX) > -1)) { // no need to convert
73579c435f9f6c2670c4391114368a2eedaf8ebfrbb value = current;
73579c435f9f6c2670c4391114368a2eedaf8ebfrbb } else if (Y.DOM.IE.COMPUTED[property]) { // use compute function
73579c435f9f6c2670c4391114368a2eedaf8ebfrbb value = Y.DOM.IE.COMPUTED[property](el, property);
decf1efd1558ed0d2562e2f4f2dd741dcc0c392crbb } else if (re_unit.test(current)) { // convert to pixel
6202bc12656548c624a235bf43d6c866719b2b06rbb value = Y.DOM.IE.ComputedStyle.getPixel(el, property);
6202bc12656548c624a235bf43d6c866719b2b06rbb } else {
6202bc12656548c624a235bf43d6c866719b2b06rbb value = current;
6202bc12656548c624a235bf43d6c866719b2b06rbb }
6202bc12656548c624a235bf43d6c866719b2b06rbb
6202bc12656548c624a235bf43d6c866719b2b06rbb return value;
6202bc12656548c624a235bf43d6c866719b2b06rbb },
bf6fc76bb2af745a68396e793d5d51a135a35f54rederpj
bf6fc76bb2af745a68396e793d5d51a135a35f54rederpj getOffset: function(el, prop) {
bf6fc76bb2af745a68396e793d5d51a135a35f54rederpj var current = el[CURRENT_STYLE][prop], // value of "width", "top", etc.
bf6fc76bb2af745a68396e793d5d51a135a35f54rederpj capped = prop.charAt(0).toUpperCase() + prop.substr(1), // "Width", "Top", etc.
bf6fc76bb2af745a68396e793d5d51a135a35f54rederpj offset = 'offset' + capped, // "offsetWidth", "offsetTop", etc.
bf6fc76bb2af745a68396e793d5d51a135a35f54rederpj pixel = 'pixel' + capped, // "pixelWidth", "pixelTop", etc.
4f110a6b1eb8b6a88a2a0c804cf699062f67f708rbb value = '';
4f110a6b1eb8b6a88a2a0c804cf699062f67f708rbb
4f110a6b1eb8b6a88a2a0c804cf699062f67f708rbb if (current == AUTO) {
4f110a6b1eb8b6a88a2a0c804cf699062f67f708rbb var actual = el[offset]; // offsetHeight/Top etc.
4f110a6b1eb8b6a88a2a0c804cf699062f67f708rbb if (actual === UNDEFINED) { // likely "right" or "bottom"
7aae0c3ef8e7f18f57e2712815c7b48358e5ff68rbb value = 0;
7aae0c3ef8e7f18f57e2712815c7b48358e5ff68rbb }
7aae0c3ef8e7f18f57e2712815c7b48358e5ff68rbb
d353d275978f11f5221110e8f954d09d03ec5e3arbb value = actual;
d353d275978f11f5221110e8f954d09d03ec5e3arbb if (re_size.test(prop)) { // account for box model diff
d353d275978f11f5221110e8f954d09d03ec5e3arbb el[STYLE][prop] = actual;
d353d275978f11f5221110e8f954d09d03ec5e3arbb if (el[offset] > actual) {
20fb0ba160cf0ca91b3f0f0d552cbe60d92b0449fielding // the difference is padding + border (works in Standards & Quirks modes)
20fb0ba160cf0ca91b3f0f0d552cbe60d92b0449fielding value = actual - (el[offset] - actual);
20fb0ba160cf0ca91b3f0f0d552cbe60d92b0449fielding }
66f62d70d05d9011c6ac59d5cd10a24e452fa1b3rbb el[STYLE][prop] = AUTO; // revert to auto
66f62d70d05d9011c6ac59d5cd10a24e452fa1b3rbb }
66f62d70d05d9011c6ac59d5cd10a24e452fa1b3rbb } else { // convert units to px
66f62d70d05d9011c6ac59d5cd10a24e452fa1b3rbb if (!el[STYLE][pixel] && !el[STYLE][prop]) { // need to map style.width to currentStyle (no currentStyle.pixelWidth)
9832ee60b23ca2a3faa403bbe88720815969a9fefielding el[STYLE][prop] = current; // no style.pixelWidth if no style.width
9832ee60b23ca2a3faa403bbe88720815969a9fefielding }
9832ee60b23ca2a3faa403bbe88720815969a9fefielding value = el[STYLE][pixel];
dd6d55810261b3c26c4a2ec2e089c031beb1d44dgregames }
dd6d55810261b3c26c4a2ec2e089c031beb1d44dgregames return value + PX;
dd6d55810261b3c26c4a2ec2e089c031beb1d44dgregames },
dd6d55810261b3c26c4a2ec2e089c031beb1d44dgregames
ee25ccdf4aa79a7a7f2dfc13fc118f0a343422fcwrowe getBorderWidth: function(el, property) {
ee25ccdf4aa79a7a7f2dfc13fc118f0a343422fcwrowe // clientHeight/Width = paddingBox (e.g. offsetWidth - borderWidth)
ee25ccdf4aa79a7a7f2dfc13fc118f0a343422fcwrowe // clientTop/Left = borderWidth
90a8cab05f4d949dd1317df7e19a2f787c46a5f6rbb var value = null;
90a8cab05f4d949dd1317df7e19a2f787c46a5f6rbb if (!el[CURRENT_STYLE][HAS_LAYOUT]) { // TODO: unset layout?
90a8cab05f4d949dd1317df7e19a2f787c46a5f6rbb el[STYLE].zoom = 1; // need layout to measure client
6c3ee5153fd311a5fc6dd718dcc704487ac7d2a3rbb }
6c3ee5153fd311a5fc6dd718dcc704487ac7d2a3rbb
6c3ee5153fd311a5fc6dd718dcc704487ac7d2a3rbb switch(property) {
6c3ee5153fd311a5fc6dd718dcc704487ac7d2a3rbb case BORDER_TOP_WIDTH:
6c3ee5153fd311a5fc6dd718dcc704487ac7d2a3rbb value = el[CLIENT_TOP];
6c3ee5153fd311a5fc6dd718dcc704487ac7d2a3rbb break;
6c3ee5153fd311a5fc6dd718dcc704487ac7d2a3rbb case BORDER_BOTTOM_WIDTH:
da3e32612f06d3082e41ba709919c996c89b8c06rederpj value = el.offsetHeight - el.clientHeight - el[CLIENT_TOP];
da3e32612f06d3082e41ba709919c996c89b8c06rederpj break;
da3e32612f06d3082e41ba709919c996c89b8c06rederpj case BORDER_LEFT_WIDTH:
da3e32612f06d3082e41ba709919c996c89b8c06rederpj value = el[CLIENT_LEFT];
da3e32612f06d3082e41ba709919c996c89b8c06rederpj break;
da3e32612f06d3082e41ba709919c996c89b8c06rederpj case BORDER_RIGHT_WIDTH:
da3e32612f06d3082e41ba709919c996c89b8c06rederpj value = el.offsetWidth - el.clientWidth - el[CLIENT_LEFT];
da3e32612f06d3082e41ba709919c996c89b8c06rederpj break;
734ab810a1c5028776ed5d6c54b2ef974b75d397rbb }
0d9c389e9c63d02edb068917d49af2fa8012af91marc return value + PX;
0d9c389e9c63d02edb068917d49af2fa8012af91marc },
0d9c389e9c63d02edb068917d49af2fa8012af91marc
0d9c389e9c63d02edb068917d49af2fa8012af91marc getPixel: function(node, att) {
ae416a3cdff7a12665838a2184183299dcee6ec9bjh // use pixelRight to convert to px
ae416a3cdff7a12665838a2184183299dcee6ec9bjh var val = null,
ae416a3cdff7a12665838a2184183299dcee6ec9bjh styleRight = node[CURRENT_STYLE][RIGHT],
b0bb6f215e43a79342c422bc9b0c258add88ca51stoddard current = node[CURRENT_STYLE][att];
b0bb6f215e43a79342c422bc9b0c258add88ca51stoddard
6d8d0dd6604f823aadbe3a18c3cff4eca584bda8trawick node[STYLE][RIGHT] = current;
99cec2acb38d6a2fb2d4a9d437db7b50ef5b208awrowe val = node[STYLE].pixelRight;
99cec2acb38d6a2fb2d4a9d437db7b50ef5b208awrowe node[STYLE][RIGHT] = styleRight; // revert
99cec2acb38d6a2fb2d4a9d437db7b50ef5b208awrowe
4d83a32b74579903e90aa1cb8574b5b97404d0c4trawick return val + PX;
4d83a32b74579903e90aa1cb8574b5b97404d0c4trawick },
4d83a32b74579903e90aa1cb8574b5b97404d0c4trawick
4d83a32b74579903e90aa1cb8574b5b97404d0c4trawick getMargin: function(node, att) {
7c2d1ecc95b2213a3fd449b2549999ed6f19f6berbb var val;
7c2d1ecc95b2213a3fd449b2549999ed6f19f6berbb if (node[CURRENT_STYLE][att] == AUTO) {
7c2d1ecc95b2213a3fd449b2549999ed6f19f6berbb val = 0 + PX;
7c2d1ecc95b2213a3fd449b2549999ed6f19f6berbb } else {
7c2d1ecc95b2213a3fd449b2549999ed6f19f6berbb val = Y.DOM.IE.ComputedStyle.getPixel(node, att);
51469a0d2057aa24107b6f5a04e145824e10da1fdirkx }
51469a0d2057aa24107b6f5a04e145824e10da1fdirkx return val;
51469a0d2057aa24107b6f5a04e145824e10da1fdirkx },
51469a0d2057aa24107b6f5a04e145824e10da1fdirkx
51469a0d2057aa24107b6f5a04e145824e10da1fdirkx getVisibility: function(node, att) {
51469a0d2057aa24107b6f5a04e145824e10da1fdirkx var current;
51469a0d2057aa24107b6f5a04e145824e10da1fdirkx while ( (current = node[CURRENT_STYLE]) && current[att] == 'inherit') { // NOTE: assignment in test
51469a0d2057aa24107b6f5a04e145824e10da1fdirkx node = node[PARENT_NODE];
6d8d0dd6604f823aadbe3a18c3cff4eca584bda8trawick }
6d8d0dd6604f823aadbe3a18c3cff4eca584bda8trawick return (current) ? current[att] : VISIBLE;
6d8d0dd6604f823aadbe3a18c3cff4eca584bda8trawick },
6d8d0dd6604f823aadbe3a18c3cff4eca584bda8trawick
73cd9876e07c696a3e3563277a1d4e3173861af6stoddard getColor: function(node, att) {
73cd9876e07c696a3e3563277a1d4e3173861af6stoddard var current = node[CURRENT_STYLE][att];
73cd9876e07c696a3e3563277a1d4e3173861af6stoddard
73cd9876e07c696a3e3563277a1d4e3173861af6stoddard if (!current || current === TRANSPARENT) {
73cd9876e07c696a3e3563277a1d4e3173861af6stoddard Y.DOM.elementByAxis(node, PARENT_NODE, null, function(parent) {
15ecbdb46249bbd3ac51fdacaff3b3ac4d179ffarbb current = parent[CURRENT_STYLE][att];
f0484231f96a9d95f5044c1c8cb33b322d6f9bcbdougm if (current && current !== TRANSPARENT) {
f0484231f96a9d95f5044c1c8cb33b322d6f9bcbdougm node = parent;
2281907b9a2a509aa0eabdc0b1d21424018dbbdfrbb return true;
2281907b9a2a509aa0eabdc0b1d21424018dbbdfrbb }
2281907b9a2a509aa0eabdc0b1d21424018dbbdfrbb });
2281907b9a2a509aa0eabdc0b1d21424018dbbdfrbb }
2281907b9a2a509aa0eabdc0b1d21424018dbbdfrbb
2281907b9a2a509aa0eabdc0b1d21424018dbbdfrbb return Y.Color.toRGB(current);
2281907b9a2a509aa0eabdc0b1d21424018dbbdfrbb },
2ca377182c951f9895cd5e7a350b442a39c8eb23rbb
2ca377182c951f9895cd5e7a350b442a39c8eb23rbb getBorderColor: function(node, att) {
2ca377182c951f9895cd5e7a350b442a39c8eb23rbb var current = node[CURRENT_STYLE];
1217c8c05f7e3ac0cac8c8dc0c6e7979326c977arbb var val = current[att] || current.color;
1217c8c05f7e3ac0cac8c8dc0c6e7979326c977arbb return Y.Color.toRGB(Y.Color.toHex(val));
1217c8c05f7e3ac0cac8c8dc0c6e7979326c977arbb }
1217c8c05f7e3ac0cac8c8dc0c6e7979326c977arbb
b6873e2c00ff7b0af18d837ef4c3cd58cf6b54c5rbb};
893328ef6ff86d0ca27774778d84410353789fb0fielding
893328ef6ff86d0ca27774778d84410353789fb0fielding//fontSize: getPixelFont,
893328ef6ff86d0ca27774778d84410353789fb0fieldingvar IEComputed = {};
893328ef6ff86d0ca27774778d84410353789fb0fielding
893328ef6ff86d0ca27774778d84410353789fb0fielding// TODO: top, right, bottom, left
274de94b0b59f4ee126dca1726624980828d0cd0stoddardIEComputed[WIDTH] = IEComputed[HEIGHT] = ComputedStyle.getOffset;
274de94b0b59f4ee126dca1726624980828d0cd0stoddard
274de94b0b59f4ee126dca1726624980828d0cd0stoddardIEComputed.color = IEComputed.backgroundColor = ComputedStyle.getColor;
274de94b0b59f4ee126dca1726624980828d0cd0stoddard
85d733e70c94a57c9ff893ed05d8b9cfcd0f083fstoddardIEComputed[BORDER_TOP_WIDTH] = IEComputed[BORDER_RIGHT_WIDTH] =
85d733e70c94a57c9ff893ed05d8b9cfcd0f083fstoddard IEComputed[BORDER_BOTTOM_WIDTH] = IEComputed[BORDER_LEFT_WIDTH] =
85d733e70c94a57c9ff893ed05d8b9cfcd0f083fstoddard ComputedStyle.getBorderWidth;
962f339c5f0f61adde79936f610fb05ce0854d6echuck
3f0dd56fa6b79fe389f20738369b290e2f3e9201trawickIEComputed.marginTop = IEComputed.marginRight = IEComputed.marginBottom =
3f0dd56fa6b79fe389f20738369b290e2f3e9201trawick IEComputed.marginLeft = ComputedStyle.getMargin;
3f0dd56fa6b79fe389f20738369b290e2f3e9201trawick
3f0dd56fa6b79fe389f20738369b290e2f3e9201trawickIEComputed.visibility = ComputedStyle.getVisibility;
3f0dd56fa6b79fe389f20738369b290e2f3e9201trawickIEComputed.borderColor = IEComputed.borderTopColor =
70b83609159f247f5920421a890dc27a0718d63adreid IEComputed.borderRightColor = IEComputed.borderBottomColor =
70b83609159f247f5920421a890dc27a0718d63adreid IEComputed.borderLeftColor = ComputedStyle.getBorderColor;
70b83609159f247f5920421a890dc27a0718d63adreid
70b83609159f247f5920421a890dc27a0718d63adreidif (!Y.config.win[GET_COMPUTED_STYLE]) {
70b83609159f247f5920421a890dc27a0718d63adreid Y.DOM[GET_COMPUTED_STYLE] = ComputedStyle.get;
70b83609159f247f5920421a890dc27a0718d63adreid}
a1033a770bfee276def7d4cb9759856f69293e48trawick
a1033a770bfee276def7d4cb9759856f69293e48trawickY.namespace('DOM.IE');
a1033a770bfee276def7d4cb9759856f69293e48trawickY.DOM.IE.COMPUTED = IEComputed;
a1033a770bfee276def7d4cb9759856f69293e48trawickY.DOM.IE.ComputedStyle = ComputedStyle;
bd2d582e0f0708b6e8e258a9a5f9a15445752087trawick
bd2d582e0f0708b6e8e258a9a5f9a15445752087trawick/**
bd2d582e0f0708b6e8e258a9a5f9a15445752087trawick * Provides helper methods for collecting and filtering DOM elements.
adb8ad10ffc20ed06ec6cfab6cd7933ab429ea7dtrawick * @module dom
adb8ad10ffc20ed06ec6cfab6cd7933ab429ea7dtrawick * @submodule selector
adb8ad10ffc20ed06ec6cfab6cd7933ab429ea7dtrawick */
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb/**
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb * Provides helper methods for collecting and filtering DOM elements.
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb * @class Selector
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb * @static
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb */
b45c1c292ff1fa635004ae81fa691f8cb3cdda85rbb
86f191e8221867df8c9cd22271e7d54204f39186rbbvar TAG = 'tag',
86f191e8221867df8c9cd22271e7d54204f39186rbb PARENT_NODE = 'parentNode',
86f191e8221867df8c9cd22271e7d54204f39186rbb PREVIOUS_SIBLING = 'previousSibling',
86f191e8221867df8c9cd22271e7d54204f39186rbb LENGTH = 'length',
86f191e8221867df8c9cd22271e7d54204f39186rbb NODE_TYPE = 'nodeType',
962f339c5f0f61adde79936f610fb05ce0854d6echuck TAG_NAME = 'tagName',
962f339c5f0f61adde79936f610fb05ce0854d6echuck ATTRIBUTES = 'attributes',
962f339c5f0f61adde79936f610fb05ce0854d6echuck PSEUDOS = 'pseudos',
157e6980a24a44e4719173b1c555133caecbc172stoddard COMBINATOR = 'combinator';
157e6980a24a44e4719173b1c555133caecbc172stoddard
157e6980a24a44e4719173b1c555133caecbc172stoddardvar reNth = /^(?:([\-]?\d*)(n){1}|(odd|even)$)*([\-+]?\d*)$/;
157e6980a24a44e4719173b1c555133caecbc172stoddard
faa6e5d8b210456ae4dad0398dfa40a19fd89d59coarvar patterns = {
171f8c636ff1374e3a3dfff333211becda355b98trawick tag: /^((?:-?[_a-z]+[\w\-]*)|\*)/i,
171f8c636ff1374e3a3dfff333211becda355b98trawick attributes: /^\[([a-z]+\w*)+([~\|\^\$\*!=]=?)?['"]?([^\]]*?)['"]?\]/i,
171f8c636ff1374e3a3dfff333211becda355b98trawick pseudos: /^:([\-\w]+)(?:\(['"]?(.+)['"]?\))*/i,
171f8c636ff1374e3a3dfff333211becda355b98trawick combinator: /^\s*([>+~]|\s)\s*/
171f8c636ff1374e3a3dfff333211becda355b98trawick};
171f8c636ff1374e3a3dfff333211becda355b98trawick
faa6e5d8b210456ae4dad0398dfa40a19fd89d59coarvar Selector = {
faa6e5d8b210456ae4dad0398dfa40a19fd89d59coar /**
faa6e5d8b210456ae4dad0398dfa40a19fd89d59coar * Default document for use queries
faa6e5d8b210456ae4dad0398dfa40a19fd89d59coar * @property document
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard * @type object
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard * @default window.document
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard */
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard document: Y.config.doc,
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard /**
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard * Mapping of attributes to aliases, normally to work around HTMLAttributes
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard * that conflict with JS reserved words.
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard * @property attrAliases
ed105ee460bbaf479f0aa0f59d3951da85066e27stoddard * @type object
21b8c3cb46cea2b31a585a95ce9f93f4f6abc35brbb */
bae64a3e5bf7b96d8379e24f13273f26b3b29e16coar attrAliases: {},
bae64a3e5bf7b96d8379e24f13273f26b3b29e16coar
bae64a3e5bf7b96d8379e24f13273f26b3b29e16coar /**
c7fe488773cf6f50a1b2d9211c2f30a2ace8b67ccoar * Mapping of shorthand tokens to corresponding attribute selector
c7fe488773cf6f50a1b2d9211c2f30a2ace8b67ccoar * @property shorthand
c7fe488773cf6f50a1b2d9211c2f30a2ace8b67ccoar * @type object
c7fe488773cf6f50a1b2d9211c2f30a2ace8b67ccoar */
27338fc39af80f2f0e4a8dbdc90c8a8179a5b2e4rbb shorthand: {
27338fc39af80f2f0e4a8dbdc90c8a8179a5b2e4rbb '\\#(-?[_a-z]+[-\\w]*)': '[id=$1]',
27338fc39af80f2f0e4a8dbdc90c8a8179a5b2e4rbb '\\.(-?[_a-z]+[-\\w]*)': '[class~=$1]'
27338fc39af80f2f0e4a8dbdc90c8a8179a5b2e4rbb },
27338fc39af80f2f0e4a8dbdc90c8a8179a5b2e4rbb
27338fc39af80f2f0e4a8dbdc90c8a8179a5b2e4rbb /**
853a0c44563b056e40e9cffe911190f554e63ec3chuck * List of operators and corresponding boolean functions.
853a0c44563b056e40e9cffe911190f554e63ec3chuck * These functions are passed the attribute and the current node's value of the attribute.
853a0c44563b056e40e9cffe911190f554e63ec3chuck * @property operators
853a0c44563b056e40e9cffe911190f554e63ec3chuck * @type object
330c042543440d0987244c94c65d14eeb7af0868rbb */
330c042543440d0987244c94c65d14eeb7af0868rbb operators: {
f1fa5e69040a3a72054d185f6087a7d1592b83e8rbb '=': function(attr, val) { return attr === val; }, // Equality
f1fa5e69040a3a72054d185f6087a7d1592b83e8rbb '!=': function(attr, val) { return attr !== val; }, // Inequality
f1fa5e69040a3a72054d185f6087a7d1592b83e8rbb '~=': function(attr, val) { // Match one of space seperated words
f1fa5e69040a3a72054d185f6087a7d1592b83e8rbb var s = ' ';
30e3e9b782c701f885583b7d13d8e46c37d7e1ddtrawick return (s + attr + s).indexOf((s + val + s)) > -1;
30e3e9b782c701f885583b7d13d8e46c37d7e1ddtrawick },
30e3e9b782c701f885583b7d13d8e46c37d7e1ddtrawick '|=': function(attr, val) { return Y.DOM._getRegExp('^' + val + '[-]?').test(attr); }, // Match start with value followed by optional hyphen
30e3e9b782c701f885583b7d13d8e46c37d7e1ddtrawick '^=': function(attr, val) { return attr.indexOf(val) === 0; }, // Match starts with value
30e3e9b782c701f885583b7d13d8e46c37d7e1ddtrawick '$=': function(attr, val) { return attr.lastIndexOf(val) === attr[LENGTH] - val[LENGTH]; }, // Match ends with value
27faa3af8a50c1dc2dc6cb3049722378f85e5517rbb '*=': function(attr, val) { return attr.indexOf(val) > -1; }, // Match contains value as substring
27faa3af8a50c1dc2dc6cb3049722378f85e5517rbb '': function(attr, val) { return attr; } // Just test for existence of attribute
27faa3af8a50c1dc2dc6cb3049722378f85e5517rbb },
141b1a93f508248cbc0e9a124cc38041eb3e2562rbb
141b1a93f508248cbc0e9a124cc38041eb3e2562rbb /**
141b1a93f508248cbc0e9a124cc38041eb3e2562rbb * List of pseudo-classes and corresponding boolean functions.
141b1a93f508248cbc0e9a124cc38041eb3e2562rbb * These functions are called with the current node, and any value that was parsed with the pseudo regex.
141b1a93f508248cbc0e9a124cc38041eb3e2562rbb * @property pseudos
141b1a93f508248cbc0e9a124cc38041eb3e2562rbb * @type object
141b1a93f508248cbc0e9a124cc38041eb3e2562rbb */
865980dc9aeb61741e586502440f0c0fea4835c6trawick pseudos: {
865980dc9aeb61741e586502440f0c0fea4835c6trawick 'root': function(node) {
865980dc9aeb61741e586502440f0c0fea4835c6trawick return node === node.ownerDocument.documentElement;
865980dc9aeb61741e586502440f0c0fea4835c6trawick },
865980dc9aeb61741e586502440f0c0fea4835c6trawick
865980dc9aeb61741e586502440f0c0fea4835c6trawick 'nth-child': function(node, val) {
865980dc9aeb61741e586502440f0c0fea4835c6trawick return Selector.getNth(node, val);
865980dc9aeb61741e586502440f0c0fea4835c6trawick },
9a0d076511763b559a755133f6a182e6c24ef643rbb
9a0d076511763b559a755133f6a182e6c24ef643rbb 'nth-last-child': function(node, val) {
9a0d076511763b559a755133f6a182e6c24ef643rbb return Selector.getNth(node, val, null, true);
9a0d076511763b559a755133f6a182e6c24ef643rbb },
9a0d076511763b559a755133f6a182e6c24ef643rbb
b42a7e46e4f80282bd27e96d43c9510b14ccb9aarbb 'nth-of-type': function(node, val) {
b42a7e46e4f80282bd27e96d43c9510b14ccb9aarbb return Selector.getNth(node, val, node[TAG_NAME]);
b42a7e46e4f80282bd27e96d43c9510b14ccb9aarbb },
b42a7e46e4f80282bd27e96d43c9510b14ccb9aarbb
b42a7e46e4f80282bd27e96d43c9510b14ccb9aarbb 'nth-last-of-type': function(node, val) {
6501b757f710f75d47c950300d8110aca67dc0b0rbb return Selector.getNth(node, val, node[TAG_NAME], true);
6501b757f710f75d47c950300d8110aca67dc0b0rbb },
6501b757f710f75d47c950300d8110aca67dc0b0rbb
6501b757f710f75d47c950300d8110aca67dc0b0rbb 'first-child': function(node) {
dfd4950edac888e671b96f62ff5382b7cb350d48rbb return Y.DOM.firstChild(node[PARENT_NODE]) === node;
dfd4950edac888e671b96f62ff5382b7cb350d48rbb },
dfd4950edac888e671b96f62ff5382b7cb350d48rbb
dfd4950edac888e671b96f62ff5382b7cb350d48rbb 'last-child': function(node) {
a6d4b3f8d54aaf14d8ee5dda3a09bf8b6370dfa4wrowe return Y.DOM.lastChild(node[PARENT_NODE]) === node;
a6d4b3f8d54aaf14d8ee5dda3a09bf8b6370dfa4wrowe },
c9a95767fbf0f5fb0976a06b97a256033925e433rbb
c9a95767fbf0f5fb0976a06b97a256033925e433rbb 'first-of-type': function(node, val) {
c9a95767fbf0f5fb0976a06b97a256033925e433rbb return Y.DOM.firstChildByTag(node[PARENT_NODE], node[TAG_NAME]) === node;
c9a95767fbf0f5fb0976a06b97a256033925e433rbb },
21b8c3cb46cea2b31a585a95ce9f93f4f6abc35brbb
d8d839738b1e80b0f9c54e83677b3f2c46c22705rbb 'last-of-type': function(node, val) {
d8d839738b1e80b0f9c54e83677b3f2c46c22705rbb return Y.DOM.lastChildByTag(node[PARENT_NODE], node[TAG_NAME]) === node;
d8d839738b1e80b0f9c54e83677b3f2c46c22705rbb },
d8d839738b1e80b0f9c54e83677b3f2c46c22705rbb
adaea88da2d103e4302e361c932b98cee86fb1c5rbb 'only-child': function(node) {
9635d7ffbd8ca441f85051f9a3adba17142d0b20rbb var children = Y.DOM.children(node[PARENT_NODE]);
9635d7ffbd8ca441f85051f9a3adba17142d0b20rbb return children[LENGTH] === 1 && children[0] === node;
9635d7ffbd8ca441f85051f9a3adba17142d0b20rbb },
9635d7ffbd8ca441f85051f9a3adba17142d0b20rbb
d8d839738b1e80b0f9c54e83677b3f2c46c22705rbb 'only-of-type': function(node) {
d8d839738b1e80b0f9c54e83677b3f2c46c22705rbb return Y.DOM.childrenByTag(node[PARENT_NODE], node[TAG_NAME])[LENGTH] === 1;
0415e5e1b9b6eba6899a2e5ef18f8facb8db0cfbstoddard },
0415e5e1b9b6eba6899a2e5ef18f8facb8db0cfbstoddard
0415e5e1b9b6eba6899a2e5ef18f8facb8db0cfbstoddard 'empty': function(node) {
0415e5e1b9b6eba6899a2e5ef18f8facb8db0cfbstoddard return node.childNodes[LENGTH] === 0;
1374444b4fab1475091e12a81663f379b73005efrbb },
1374444b4fab1475091e12a81663f379b73005efrbb
1374444b4fab1475091e12a81663f379b73005efrbb 'not': function(node, simple) {
3233d057ad276d823bded5c24c3fd6729ed1a736rbb return !Selector.test(node, simple);
3233d057ad276d823bded5c24c3fd6729ed1a736rbb },
3233d057ad276d823bded5c24c3fd6729ed1a736rbb
9927a2a72d50103f32323b53f5fc4577c1801327rbb 'contains': function(node, str) {
9927a2a72d50103f32323b53f5fc4577c1801327rbb var text = node.innerText || node.textContent || '';
9927a2a72d50103f32323b53f5fc4577c1801327rbb return text.indexOf(str) > -1;
9927a2a72d50103f32323b53f5fc4577c1801327rbb },
9927a2a72d50103f32323b53f5fc4577c1801327rbb 'checked': function(node) {
82d2eed8f2152aff3f7554951c133a9d404ebbc5rbb return node.checked === true;
82d2eed8f2152aff3f7554951c133a9d404ebbc5rbb }
82d2eed8f2152aff3f7554951c133a9d404ebbc5rbb },
2e970b7ec485dde18f8fb3f494f98a3f68749859fanf
2e970b7ec485dde18f8fb3f494f98a3f68749859fanf /**
2e970b7ec485dde18f8fb3f494f98a3f68749859fanf * Test if the supplied node matches the supplied selector.
a5a7ecb732cfe89bb1f8e3c61b316c2075cefe52rbb * @method test
a5a7ecb732cfe89bb1f8e3c61b316c2075cefe52rbb *
a5a7ecb732cfe89bb1f8e3c61b316c2075cefe52rbb * @param {HTMLElement | String} node An id or node reference to the HTMLElement being tested.
364701a102725758f2e3a511924381e2faa93e27rbb * @param {string} selector The CSS Selector to test the node against.
364701a102725758f2e3a511924381e2faa93e27rbb * @return{boolean} Whether or not the node matches the selector.
364701a102725758f2e3a511924381e2faa93e27rbb * @static
364701a102725758f2e3a511924381e2faa93e27rbb
364701a102725758f2e3a511924381e2faa93e27rbb */
364701a102725758f2e3a511924381e2faa93e27rbb test: function(node, selector) {
0811e8a41d152f0016a385ce1dfa44f475425b70rbb if (!node) {
0811e8a41d152f0016a385ce1dfa44f475425b70rbb return false;
0811e8a41d152f0016a385ce1dfa44f475425b70rbb }
0811e8a41d152f0016a385ce1dfa44f475425b70rbb
957b9b3f5e47c6cc7c2d8d9e2224c7364e966c70rbb var groups = selector ? selector.split(',') : [];
957b9b3f5e47c6cc7c2d8d9e2224c7364e966c70rbb if (groups[LENGTH]) {
957b9b3f5e47c6cc7c2d8d9e2224c7364e966c70rbb for (var i = 0, len = groups[LENGTH]; i < len; ++i) {
957b9b3f5e47c6cc7c2d8d9e2224c7364e966c70rbb if ( Selector._testNode(node, groups[i]) ) { // passes if ANY group matches
957b9b3f5e47c6cc7c2d8d9e2224c7364e966c70rbb return true;
957b9b3f5e47c6cc7c2d8d9e2224c7364e966c70rbb }
e91c80d53d8ffa738283d923638fa3efd8aa6bf7rbb }
e91c80d53d8ffa738283d923638fa3efd8aa6bf7rbb return false;
e91c80d53d8ffa738283d923638fa3efd8aa6bf7rbb }
9359bd100badb53fd8a465cb3a0a90b218b30c4cben return Selector._testNode(node, selector);
9359bd100badb53fd8a465cb3a0a90b218b30c4cben },
9359bd100badb53fd8a465cb3a0a90b218b30c4cben
d0211374a981173d4537e3f919c708b5f64040fcgstein /**
d0211374a981173d4537e3f919c708b5f64040fcgstein * Filters a set of nodes based on a given CSS selector.
d0211374a981173d4537e3f919c708b5f64040fcgstein * @method filter
37d15e1062df9dcdd39ebee5bd2fdc75d4a6aa4arbb *
37d15e1062df9dcdd39ebee5bd2fdc75d4a6aa4arbb * @param {array} nodes A set of nodes/ids to filter.
37d15e1062df9dcdd39ebee5bd2fdc75d4a6aa4arbb * @param {string} selector The selector used to test each node.
e3ec3193b69b45923c14915fa3ee3bc1f0215bafrbb * @return{array} An array of nodes from the supplied array that match the given selector.
e3ec3193b69b45923c14915fa3ee3bc1f0215bafrbb * @static
e3ec3193b69b45923c14915fa3ee3bc1f0215bafrbb */
e3ec3193b69b45923c14915fa3ee3bc1f0215bafrbb filter: function(nodes, selector) {
e3ec3193b69b45923c14915fa3ee3bc1f0215bafrbb nodes = nodes || [];
138c8f7cb8254e035c6f45288e3909cd9c21be5cmartin
138c8f7cb8254e035c6f45288e3909cd9c21be5cmartin var result = Selector._filter(nodes, Selector._tokenize(selector)[0]);
138c8f7cb8254e035c6f45288e3909cd9c21be5cmartin return result;
138c8f7cb8254e035c6f45288e3909cd9c21be5cmartin },
138c8f7cb8254e035c6f45288e3909cd9c21be5cmartin
adaea88da2d103e4302e361c932b98cee86fb1c5rbb /**
adaea88da2d103e4302e361c932b98cee86fb1c5rbb * Retrieves a set of nodes based on a given CSS selector.
adaea88da2d103e4302e361c932b98cee86fb1c5rbb * @method query
adaea88da2d103e4302e361c932b98cee86fb1c5rbb *
8a76b3f3c93d39930182afa227d258218f80926brbb * @param {string} selector The CSS Selector to test the node against.
8e7c85d6eb9bf628f081763c5bd778b784d5001crbb * @param {HTMLElement | String} root optional An id or HTMLElement to start the query from. Defaults to Selector.document.
8e7c85d6eb9bf628f081763c5bd778b784d5001crbb * @param {Boolean} firstOnly optional Whether or not to return only the first match.
8e7c85d6eb9bf628f081763c5bd778b784d5001crbb * @return {Array} An array of nodes that match the given selector.
8e7c85d6eb9bf628f081763c5bd778b784d5001crbb * @static
8e7c85d6eb9bf628f081763c5bd778b784d5001crbb */
97ad13ce0413b573e63512b57c874ebbd41065b2rbb query: function(selector, root, firstOnly) {
97ad13ce0413b573e63512b57c874ebbd41065b2rbb var result = Selector._query(selector, root, firstOnly);
2d3a1dd65798c72b7e46593614b4e27716cc5cderbb return result;
2d3a1dd65798c72b7e46593614b4e27716cc5cderbb },
2d3a1dd65798c72b7e46593614b4e27716cc5cderbb
2d3a1dd65798c72b7e46593614b4e27716cc5cderbb _query: function(selector, root, firstOnly, deDupe) {
78f2608a1583b3cb409e12be701392ad1a929653rbb var result = (firstOnly) ? null : [];
78f2608a1583b3cb409e12be701392ad1a929653rbb if (!selector) {
78f2608a1583b3cb409e12be701392ad1a929653rbb return result;
78f2608a1583b3cb409e12be701392ad1a929653rbb }
c5c3b5e33fca6425dc716e1dc51c10733d9b6bc3rbb
c5c3b5e33fca6425dc716e1dc51c10733d9b6bc3rbb root = root || Selector.document;
c5c3b5e33fca6425dc716e1dc51c10733d9b6bc3rbb var groups = selector.split(','); // TODO: handle comma in attribute/pseudo
c5c3b5e33fca6425dc716e1dc51c10733d9b6bc3rbb
be7b08f10dc6b0be088c8b41009d89ea49ad4acarbb if (groups[LENGTH] > 1) {
be7b08f10dc6b0be088c8b41009d89ea49ad4acarbb var found;
be7b08f10dc6b0be088c8b41009d89ea49ad4acarbb for (var i = 0, len = groups[LENGTH]; i < len; ++i) {
be7b08f10dc6b0be088c8b41009d89ea49ad4acarbb found = arguments.callee(groups[i], root, firstOnly, true);
2a0c3663b66c9af764267ac3c4e140e659598474ben result = firstOnly ? found : result.concat(found);
2a0c3663b66c9af764267ac3c4e140e659598474ben }
2a0c3663b66c9af764267ac3c4e140e659598474ben Selector._clearFoundCache();
2a0c3663b66c9af764267ac3c4e140e659598474ben return result;
8a76b3f3c93d39930182afa227d258218f80926brbb }
8a76b3f3c93d39930182afa227d258218f80926brbb
8a76b3f3c93d39930182afa227d258218f80926brbb var tokens = Selector._tokenize(selector);
8a76b3f3c93d39930182afa227d258218f80926brbb var idToken = tokens[Selector._getIdTokenIndex(tokens)],
11d400383ba9f941cc49e1a8da562fd172d3d7c5stoddard nodes = [],
11d400383ba9f941cc49e1a8da562fd172d3d7c5stoddard node,
13ee9baf0119bca0739d3f17591f0bf2c64cdcccrbb id,
528e2a7d7cf6b8879291b59dd5afd8f6c7ae1b6brbb token = tokens.pop() || {};
528e2a7d7cf6b8879291b59dd5afd8f6c7ae1b6brbb
528e2a7d7cf6b8879291b59dd5afd8f6c7ae1b6brbb if (idToken) {
528e2a7d7cf6b8879291b59dd5afd8f6c7ae1b6brbb id = Selector._getId(idToken[ATTRIBUTES]);
528e2a7d7cf6b8879291b59dd5afd8f6c7ae1b6brbb }
1a3161b56ebbbd036730d5372d4800cc495db212rbb
1a3161b56ebbbd036730d5372d4800cc495db212rbb // use id shortcut when possible
1a3161b56ebbbd036730d5372d4800cc495db212rbb if (id) {
1a3161b56ebbbd036730d5372d4800cc495db212rbb node = Selector.document.getElementById(id);
1a3161b56ebbbd036730d5372d4800cc495db212rbb
2d87d8f191175a0683f430d790d81a5604b74ec6rbb if (node && (root[NODE_TYPE] === 9 || Y.DOM.contains(root, node))) {
2d87d8f191175a0683f430d790d81a5604b74ec6rbb if ( Selector._testNode(node, null, idToken) ) {
2d87d8f191175a0683f430d790d81a5604b74ec6rbb if (idToken === token) {
2d87d8f191175a0683f430d790d81a5604b74ec6rbb nodes = [node]; // simple selector
6bcee6b60a2fc4c96328af30e79bad4927ff30f3rbb } else {
6bcee6b60a2fc4c96328af30e79bad4927ff30f3rbb root = node; // start from here
6bcee6b60a2fc4c96328af30e79bad4927ff30f3rbb }
6bcee6b60a2fc4c96328af30e79bad4927ff30f3rbb }
6bcee6b60a2fc4c96328af30e79bad4927ff30f3rbb } else {
1e8d4cfede0bad3a1a33e3b2eef0ba6754746f72rbb return result;
1e8d4cfede0bad3a1a33e3b2eef0ba6754746f72rbb }
1e8d4cfede0bad3a1a33e3b2eef0ba6754746f72rbb }
1e8d4cfede0bad3a1a33e3b2eef0ba6754746f72rbb
5600cf225f3be88ed9b5385a0737ccde7d0775bbrbb if (root && !nodes[LENGTH]) {
5600cf225f3be88ed9b5385a0737ccde7d0775bbrbb nodes = root.getElementsByTagName(token[TAG]);
5600cf225f3be88ed9b5385a0737ccde7d0775bbrbb }
5600cf225f3be88ed9b5385a0737ccde7d0775bbrbb
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb if (nodes[LENGTH]) {
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb result = Selector._filter(nodes, token, firstOnly, deDupe);
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb }
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb return result;
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb },
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb _filter: function(nodes, token, firstOnly, deDupe) {
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb var result = firstOnly ? null : [];
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb result = Y.DOM.filterElementsBy(nodes, function(node) {
84b76faff9e8fa4b16b587b95d3930e36fe3c405rbb if (! Selector._testNode(node, '', token, deDupe)) {
bcef91d7068817e2e56854f5c5b22b6eb4663a85rbb return false;
bcef91d7068817e2e56854f5c5b22b6eb4663a85rbb }
bcef91d7068817e2e56854f5c5b22b6eb4663a85rbb
445997e06464e7625c7f0e22917f8f2d9876cfffrbb if (deDupe) {
445997e06464e7625c7f0e22917f8f2d9876cfffrbb if (node._found) {
445997e06464e7625c7f0e22917f8f2d9876cfffrbb return false;
445997e06464e7625c7f0e22917f8f2d9876cfffrbb }
445997e06464e7625c7f0e22917f8f2d9876cfffrbb node._found = true;
a2c240fe8836beba2330b03d55569d9e31bb3358trawick Selector._foundCache[Selector._foundCache[LENGTH]] = node;
a2c240fe8836beba2330b03d55569d9e31bb3358trawick }
a2c240fe8836beba2330b03d55569d9e31bb3358trawick return true;
a2c240fe8836beba2330b03d55569d9e31bb3358trawick }, firstOnly);
13ee9baf0119bca0739d3f17591f0bf2c64cdcccrbb
13ee9baf0119bca0739d3f17591f0bf2c64cdcccrbb return result;
13ee9baf0119bca0739d3f17591f0bf2c64cdcccrbb },
13ee9baf0119bca0739d3f17591f0bf2c64cdcccrbb
5a58a10705b7b154b53294e0c0283d64eabdcb7fstoddard _testNode: function(node, selector, token, deDupe) {
5a58a10705b7b154b53294e0c0283d64eabdcb7fstoddard token = token || Selector._tokenize(selector).pop() || {};
5a58a10705b7b154b53294e0c0283d64eabdcb7fstoddard var ops = Selector.operators,
10a2de5cee9ae5abe675ea200fbe635a54556c8ffanf pseudos = Selector.pseudos,
3568de757bac0b47256647504c186d17ca272f85rbb prev = token.previous,
3568de757bac0b47256647504c186d17ca272f85rbb i, len;
3568de757bac0b47256647504c186d17ca272f85rbb
98f3c8c547839251cb43e9f917114cc8b16ced9efanf if (!node[TAG_NAME] ||
98f3c8c547839251cb43e9f917114cc8b16ced9efanf (token[TAG] !== '*' && node[TAG_NAME].toUpperCase() !== token[TAG]) ||
98f3c8c547839251cb43e9f917114cc8b16ced9efanf (deDupe && node._found) ) {
1a411968bb62cc88c3cbf14a53caf6587c224259fanf return false;
1a411968bb62cc88c3cbf14a53caf6587c224259fanf }
10a2de5cee9ae5abe675ea200fbe635a54556c8ffanf
10a2de5cee9ae5abe675ea200fbe635a54556c8ffanf if (token[ATTRIBUTES][LENGTH]) {
10a2de5cee9ae5abe675ea200fbe635a54556c8ffanf var attribute;
10a2de5cee9ae5abe675ea200fbe635a54556c8ffanf for (i = 0, len = token[ATTRIBUTES][LENGTH]; i < len; ++i) {
60777c94cb33363389d4848524c0809c235ba5e5rbb attribute = node.getAttribute(token[ATTRIBUTES][i][0], 2);
6f06d481dafc90f1b553f1d2828bcea50a039854fielding if (attribute === undefined) {
b5140df3124b186e4a977812fd9828d1e295c080wrowe return false;
b5140df3124b186e4a977812fd9828d1e295c080wrowe }
b5140df3124b186e4a977812fd9828d1e295c080wrowe if ( ops[token[ATTRIBUTES][i][1]] &&
b5140df3124b186e4a977812fd9828d1e295c080wrowe !ops[token[ATTRIBUTES][i][1]](attribute, token[ATTRIBUTES][i][2])) {
b5140df3124b186e4a977812fd9828d1e295c080wrowe return false;
c9dafaafc2650994e47f88f5239f643c97ec4cb3wrowe }
c9dafaafc2650994e47f88f5239f643c97ec4cb3wrowe }
c9dafaafc2650994e47f88f5239f643c97ec4cb3wrowe }
c9dafaafc2650994e47f88f5239f643c97ec4cb3wrowe
c9dafaafc2650994e47f88f5239f643c97ec4cb3wrowe if (token[PSEUDOS][LENGTH]) {
41aef8943f349ee0b5b510dd436301b4c33c628cwrowe for (i = 0, len = token[PSEUDOS][LENGTH]; i < len; ++i) {
41aef8943f349ee0b5b510dd436301b4c33c628cwrowe if (pseudos[token[PSEUDOS][i][0]] &&
bb360f1d9bdce4f55f290de07a711db006b25957wrowe !pseudos[token[PSEUDOS][i][0]](node, token[PSEUDOS][i][1])) {
5727f68f33838686d447f55a100309e54efb20f8fielding return false;
5727f68f33838686d447f55a100309e54efb20f8fielding }
5727f68f33838686d447f55a100309e54efb20f8fielding }
5727f68f33838686d447f55a100309e54efb20f8fielding }
5727f68f33838686d447f55a100309e54efb20f8fielding return (prev && prev[COMBINATOR] !== ',') ?
d28c69d8e5f2e88e653d61436bb6fa6302a212b4rbb Selector.combinators[prev[COMBINATOR]](node, token) :
d28c69d8e5f2e88e653d61436bb6fa6302a212b4rbb true;
d28c69d8e5f2e88e653d61436bb6fa6302a212b4rbb },
d28c69d8e5f2e88e653d61436bb6fa6302a212b4rbb
d28c69d8e5f2e88e653d61436bb6fa6302a212b4rbb
b974a8fc59a9d6193305dcd8690992a411d88232rbb _foundCache: [],
b974a8fc59a9d6193305dcd8690992a411d88232rbb _regexCache: {},
b974a8fc59a9d6193305dcd8690992a411d88232rbb
b974a8fc59a9d6193305dcd8690992a411d88232rbb _clearFoundCache: function() {
b974a8fc59a9d6193305dcd8690992a411d88232rbb for (var i = 0, len = Selector._foundCache[LENGTH]; i < len; ++i) {
fa996ff928f6170678c8789c8073c368f56d770arbb try { // IE no like delete
fa996ff928f6170678c8789c8073c368f56d770arbb delete Selector._foundCache[i]._found;
fa996ff928f6170678c8789c8073c368f56d770arbb } catch(e) {
fa996ff928f6170678c8789c8073c368f56d770arbb Selector._foundCache[i].removeAttribute('_found');
fa996ff928f6170678c8789c8073c368f56d770arbb }
fa996ff928f6170678c8789c8073c368f56d770arbb }
a1bbc66131c63e718e3f73fc11a348f7552d7947rbb Selector._foundCache = [];
a1bbc66131c63e718e3f73fc11a348f7552d7947rbb },
a1bbc66131c63e718e3f73fc11a348f7552d7947rbb
b31025f6f2c0392dc76eecca7f27faad0b902be0wrowe combinators: {
b31025f6f2c0392dc76eecca7f27faad0b902be0wrowe ' ': function(node, token) {
b31025f6f2c0392dc76eecca7f27faad0b902be0wrowe while ((node = node[PARENT_NODE])) {
b31025f6f2c0392dc76eecca7f27faad0b902be0wrowe if (Selector._testNode(node, '', token.previous)) {
b31025f6f2c0392dc76eecca7f27faad0b902be0wrowe return true;
b31025f6f2c0392dc76eecca7f27faad0b902be0wrowe }
4783bc116b4dc37deadcc0b68ce3d3eeb6a7464aben }
4783bc116b4dc37deadcc0b68ce3d3eeb6a7464aben return false;
4783bc116b4dc37deadcc0b68ce3d3eeb6a7464aben },
4783bc116b4dc37deadcc0b68ce3d3eeb6a7464aben
4783bc116b4dc37deadcc0b68ce3d3eeb6a7464aben '>': function(node, token) {
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb return Selector._testNode(node[PARENT_NODE], null, token.previous);
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb },
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb '+': function(node, token) {
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb var sib = node[PREVIOUS_SIBLING];
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb while (sib && sib[NODE_TYPE] !== 1) {
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb sib = sib[PREVIOUS_SIBLING];
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb }
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb if (sib && Selector._testNode(sib, null, token.previous)) {
cab10c98980b42562a7850410cecd37798e170ecrbb return true;
cab10c98980b42562a7850410cecd37798e170ecrbb }
cab10c98980b42562a7850410cecd37798e170ecrbb return false;
cab10c98980b42562a7850410cecd37798e170ecrbb },
cab10c98980b42562a7850410cecd37798e170ecrbb
71715c646d5231de578431f8961e711764b899d3fanf '~': function(node, token) {
71715c646d5231de578431f8961e711764b899d3fanf var sib = node[PREVIOUS_SIBLING];
71715c646d5231de578431f8961e711764b899d3fanf while (sib) {
2714d6002fcdf12f5b26cc948c9f2f03ca5e7ee9rbb if (sib[NODE_TYPE] === 1 && Selector._testNode(sib, null, token.previous)) {
2714d6002fcdf12f5b26cc948c9f2f03ca5e7ee9rbb return true;
2714d6002fcdf12f5b26cc948c9f2f03ca5e7ee9rbb }
2714d6002fcdf12f5b26cc948c9f2f03ca5e7ee9rbb sib = sib[PREVIOUS_SIBLING];
2714d6002fcdf12f5b26cc948c9f2f03ca5e7ee9rbb }
8695c28e4d0bb9357f606045b37238d4f49ce8b6rbb
8695c28e4d0bb9357f606045b37238d4f49ce8b6rbb return false;
8695c28e4d0bb9357f606045b37238d4f49ce8b6rbb }
8695c28e4d0bb9357f606045b37238d4f49ce8b6rbb },
8695c28e4d0bb9357f606045b37238d4f49ce8b6rbb
8695c28e4d0bb9357f606045b37238d4f49ce8b6rbb
5f69f46ccdf50afd8f0a23f134746e6066185e89rbb /*
5f69f46ccdf50afd8f0a23f134746e6066185e89rbb an+b = get every _a_th node starting at the _b_th
5f69f46ccdf50afd8f0a23f134746e6066185e89rbb 0n+b = no repeat ("0" and "n" may both be omitted (together) , e.g. "0n+1" or "1", not "0+1"), return only the _b_th element
5f69f46ccdf50afd8f0a23f134746e6066185e89rbb 1n+b = get every element starting from b ("1" may may be omitted, e.g. "1n+0" or "n+0" or "n")
5f69f46ccdf50afd8f0a23f134746e6066185e89rbb an+0 = get every _a_th element, "0" may be omitted
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe */
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe getNth: function(node, expr, tag, reverse) {
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe reNth.test(expr);
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe var a = parseInt(RegExp.$1, 10), // include every _a_ elements (zero means no repeat, just first _a_)
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe n = RegExp.$2, // "n"
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe oddeven = RegExp.$3, // "odd" or "even"
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe b = parseInt(RegExp.$4, 10) || 0, // start scan from element _b_
e76797ee89ad6fb15ad97b0f3903ae324ac44949wrowe op, i, len, siblings;
a1e0709c89175c34a3f72eb4a83d7ee1621a0884rbb
a1e0709c89175c34a3f72eb4a83d7ee1621a0884rbb if (tag) {
a1e0709c89175c34a3f72eb4a83d7ee1621a0884rbb siblings = Y.DOM.childrenByTag(node[PARENT_NODE], tag);
a1e0709c89175c34a3f72eb4a83d7ee1621a0884rbb } else {
4b13b6bcdcfae61d3c58cc2569757651f28f2bbfrbb siblings = Y.DOM.children(node[PARENT_NODE]);
4b13b6bcdcfae61d3c58cc2569757651f28f2bbfrbb }
4b13b6bcdcfae61d3c58cc2569757651f28f2bbfrbb
34ea1d36f4e1c8d66338e691793017d105cc9c32rbb if (oddeven) {
34ea1d36f4e1c8d66338e691793017d105cc9c32rbb a = 2; // always every other
34ea1d36f4e1c8d66338e691793017d105cc9c32rbb op = '+';
34ea1d36f4e1c8d66338e691793017d105cc9c32rbb n = 'n';
2c8f06bf370a44a3d0544ed5319355463c417132gregames b = (oddeven === 'odd') ? 1 : 0;
2c8f06bf370a44a3d0544ed5319355463c417132gregames } else if ( isNaN(a) ) {
2c8f06bf370a44a3d0544ed5319355463c417132gregames a = (n) ? 1 : 0; // start from the first or no repeat
db06e09891b001667974483058923b88c3258324rbb }
db06e09891b001667974483058923b88c3258324rbb
db06e09891b001667974483058923b88c3258324rbb if (a === 0) { // just the first
db06e09891b001667974483058923b88c3258324rbb if (reverse) {
db06e09891b001667974483058923b88c3258324rbb b = siblings[LENGTH] - b + 1;
8ba9d5e9aaaa79dba0de13f5c1b6e725d98f1dc2fanf }
8ba9d5e9aaaa79dba0de13f5c1b6e725d98f1dc2fanf
8ba9d5e9aaaa79dba0de13f5c1b6e725d98f1dc2fanf if (siblings[b - 1] === node) {
8ba9d5e9aaaa79dba0de13f5c1b6e725d98f1dc2fanf return true;
26cf4d32b4ff8807a64b0cfa6865a7d6d171c68efanf } else {
26cf4d32b4ff8807a64b0cfa6865a7d6d171c68efanf return false;
26cf4d32b4ff8807a64b0cfa6865a7d6d171c68efanf }
06c107289de0a0888386e0bc08ef9fc60aacd8bctrawick
06c107289de0a0888386e0bc08ef9fc60aacd8bctrawick } else if (a < 0) {
06c107289de0a0888386e0bc08ef9fc60aacd8bctrawick reverse = !!reverse;
06c107289de0a0888386e0bc08ef9fc60aacd8bctrawick a = Math.abs(a);
f4ab6acec7b02518869ca649ce2d3ceeb92d282etrawick }
f4ab6acec7b02518869ca649ce2d3ceeb92d282etrawick
f4ab6acec7b02518869ca649ce2d3ceeb92d282etrawick if (!reverse) {
b0bd38b2226e5cfb86cce6ed1991723f4c9e4f68trawick for (i = b - 1, len = siblings[LENGTH]; i < len; i += a) {
bf9902ea6090f94c9ee0aaddd80b419a184ffe55jim if ( i >= 0 && siblings[i] === node ) {
bf9902ea6090f94c9ee0aaddd80b419a184ffe55jim return true;
bf9902ea6090f94c9ee0aaddd80b419a184ffe55jim }
bf9902ea6090f94c9ee0aaddd80b419a184ffe55jim }
bf9902ea6090f94c9ee0aaddd80b419a184ffe55jim } else {
bf9902ea6090f94c9ee0aaddd80b419a184ffe55jim for (i = siblings[LENGTH] - b, len = siblings[LENGTH]; i >= 0; i -= a) {
bf9902ea6090f94c9ee0aaddd80b419a184ffe55jim if ( i < len && siblings[i] === node ) {
0b34df54ff22d0ca05eb8e9d7c9610138a878c83rbb return true;
0b34df54ff22d0ca05eb8e9d7c9610138a878c83rbb }
0b34df54ff22d0ca05eb8e9d7c9610138a878c83rbb }
83047afdc49c183cdca6373dba6a0c6afa638f12gstein }
0b34df54ff22d0ca05eb8e9d7c9610138a878c83rbb return false;
c8cc46d12794845f39fa154224075a3bbe57a4c8ben },
c8cc46d12794845f39fa154224075a3bbe57a4c8ben
5dea9095cbfab622c65e5f2f806007aaa7d7761arbb _getId: function(attr) {
5dea9095cbfab622c65e5f2f806007aaa7d7761arbb for (var i = 0, len = attr[LENGTH]; i < len; ++i) {
5dea9095cbfab622c65e5f2f806007aaa7d7761arbb if (attr[i][0] == 'id' && attr[i][1] === '=') {
5dea9095cbfab622c65e5f2f806007aaa7d7761arbb return attr[i][2];
5dea9095cbfab622c65e5f2f806007aaa7d7761arbb }
365c33fd9c0fc3ac27c0bd1d360a5a94980c576atrawick }
365c33fd9c0fc3ac27c0bd1d360a5a94980c576atrawick },
365c33fd9c0fc3ac27c0bd1d360a5a94980c576atrawick
0ea568e49752d337d2b513cce07f2a6f4699d6eatrawick _getIdTokenIndex: function(tokens) {
0ea568e49752d337d2b513cce07f2a6f4699d6eatrawick for (var i = 0, len = tokens[LENGTH]; i < len; ++i) {
0ea568e49752d337d2b513cce07f2a6f4699d6eatrawick if (Selector._getId(tokens[i][ATTRIBUTES])) {
b7a0ad483b54711addc5f43f679189619a23c749ben return i;
b7a0ad483b54711addc5f43f679189619a23c749ben }
328d02603f471fad56cc5588fc9e93f589593ad0rbb }
328d02603f471fad56cc5588fc9e93f589593ad0rbb return -1;
1c850e9f96375578e43e5f69ba7499a543b2a7bdtrawick },
1c850e9f96375578e43e5f69ba7499a543b2a7bdtrawick
1c850e9f96375578e43e5f69ba7499a543b2a7bdtrawick /**
48a2f5e2c189669b025d462f44fda5d4b45e8d78trawick Break selector into token units per simple selector.
48a2f5e2c189669b025d462f44fda5d4b45e8d78trawick Combinator is attached to left-hand selector.
48a2f5e2c189669b025d462f44fda5d4b45e8d78trawick */
48a2f5e2c189669b025d462f44fda5d4b45e8d78trawick _tokenize: function(selector) {
48a2f5e2c189669b025d462f44fda5d4b45e8d78trawick var token = {}, // one token per simple selector (left selector holds combinator)
48a2f5e2c189669b025d462f44fda5d4b45e8d78trawick tokens = [], // array of tokens
48a2f5e2c189669b025d462f44fda5d4b45e8d78trawick found = false, // whether or not any matches were found this pass
b22fb75c37b70fbe176afdb8081c3ce2dba86db4rbb match; // the regex match
b22fb75c37b70fbe176afdb8081c3ce2dba86db4rbb
b22fb75c37b70fbe176afdb8081c3ce2dba86db4rbb selector = Selector._replaceShorthand(selector); // convert ID and CLASS shortcuts to attributes
b22fb75c37b70fbe176afdb8081c3ce2dba86db4rbb
b22fb75c37b70fbe176afdb8081c3ce2dba86db4rbb /*
8fccb89ed59d5c80c76a818f7ca02bb0d068d4d3rbb Search for selector patterns, store, and strip them from the selector string
8fccb89ed59d5c80c76a818f7ca02bb0d068d4d3rbb until no patterns match (invalid selector) or we run out of chars.
8fccb89ed59d5c80c76a818f7ca02bb0d068d4d3rbb
8fccb89ed59d5c80c76a818f7ca02bb0d068d4d3rbb Multiple attributes and pseudos are allowed, in any order.
8fccb89ed59d5c80c76a818f7ca02bb0d068d4d3rbb for example:
da07a882b90b44243c9cd88ac09a789999dccc4drbb 'form:first-child[type=button]:not(button)[lang|=en]'
da07a882b90b44243c9cd88ac09a789999dccc4drbb */
da07a882b90b44243c9cd88ac09a789999dccc4drbb do {
da07a882b90b44243c9cd88ac09a789999dccc4drbb found = false; // reset after full pass
da07a882b90b44243c9cd88ac09a789999dccc4drbb for (var re in patterns) {
4a5c8a77f48f0cf10bfe70479d0a2e8e7d6cd917rbb if (patterns.hasOwnProperty(re)) {
4a5c8a77f48f0cf10bfe70479d0a2e8e7d6cd917rbb if (re != TAG && re != COMBINATOR) { // only one allowed
4a5c8a77f48f0cf10bfe70479d0a2e8e7d6cd917rbb token[re] = token[re] || [];
4a5c8a77f48f0cf10bfe70479d0a2e8e7d6cd917rbb }
4a5c8a77f48f0cf10bfe70479d0a2e8e7d6cd917rbb if ((match = patterns[re].exec(selector))) { // note assignment
4a5c8a77f48f0cf10bfe70479d0a2e8e7d6cd917rbb found = true;
5bf029f8452b6aa105cf3d9d9b19221920725428rbb if (re != TAG && re != COMBINATOR) { // only one allowed
5bf029f8452b6aa105cf3d9d9b19221920725428rbb //token[re] = token[re] || [];
5bf029f8452b6aa105cf3d9d9b19221920725428rbb
60ed053fe71b1e3cfab8c4ed37afde30a6db4841rbb // capture ID for fast path to element
60ed053fe71b1e3cfab8c4ed37afde30a6db4841rbb if (re === ATTRIBUTES && match[1] === 'id') {
60ed053fe71b1e3cfab8c4ed37afde30a6db4841rbb token.id = match[3];
e03878add0099ba9741efc46d545955a60ea8bdcrbb }
e03878add0099ba9741efc46d545955a60ea8bdcrbb
e03878add0099ba9741efc46d545955a60ea8bdcrbb token[re].push(match.slice(1));
e03878add0099ba9741efc46d545955a60ea8bdcrbb } else { // single selector (tag, combinator)
1860b2b5f1de31f8cf9d95f1b394fe98c8dbfab7rbb token[re] = match[1];
1860b2b5f1de31f8cf9d95f1b394fe98c8dbfab7rbb }
1860b2b5f1de31f8cf9d95f1b394fe98c8dbfab7rbb selector = selector.replace(match[0], ''); // strip current match from selector
9ec65cbae2f760e485a1c54df5b19853688d5c91wrowe if (re === COMBINATOR || !selector[LENGTH]) { // next token or done
9ec65cbae2f760e485a1c54df5b19853688d5c91wrowe token[ATTRIBUTES] = Selector._fixAttributes(token[ATTRIBUTES]);
9ec65cbae2f760e485a1c54df5b19853688d5c91wrowe token[PSEUDOS] = token[PSEUDOS] || [];
9ec65cbae2f760e485a1c54df5b19853688d5c91wrowe token[TAG] = token[TAG] ? token[TAG].toUpperCase() : '*';
9ec65cbae2f760e485a1c54df5b19853688d5c91wrowe tokens.push(token);
9ec65cbae2f760e485a1c54df5b19853688d5c91wrowe
9ec65cbae2f760e485a1c54df5b19853688d5c91wrowe token = { // prep next token
9ec65cbae2f760e485a1c54df5b19853688d5c91wrowe previous: token
a8c0c0b8d7dada680bd3f3d70f78ce0656ba5aa6trawick };
a8c0c0b8d7dada680bd3f3d70f78ce0656ba5aa6trawick }
a8c0c0b8d7dada680bd3f3d70f78ce0656ba5aa6trawick }
a8c0c0b8d7dada680bd3f3d70f78ce0656ba5aa6trawick }
a8c0c0b8d7dada680bd3f3d70f78ce0656ba5aa6trawick }
a8c0c0b8d7dada680bd3f3d70f78ce0656ba5aa6trawick } while (found);
77c656dabf05adcdee0d30b15b4628be738a1913rbb
77c656dabf05adcdee0d30b15b4628be738a1913rbb return tokens;
77c656dabf05adcdee0d30b15b4628be738a1913rbb },
77c656dabf05adcdee0d30b15b4628be738a1913rbb
77c656dabf05adcdee0d30b15b4628be738a1913rbb _fixAttributes: function(attr) {
7e73041858979fd162c849cc2e7447beb51eedf8rbb var aliases = Selector.attrAliases;
7e73041858979fd162c849cc2e7447beb51eedf8rbb attr = attr || [];
886cd69ebf69e990dbc365be87ff8ea7cd681904rbb for (var i = 0, len = attr[LENGTH]; i < len; ++i) {
886cd69ebf69e990dbc365be87ff8ea7cd681904rbb if (aliases[attr[i][0]]) { // convert reserved words, etc
886cd69ebf69e990dbc365be87ff8ea7cd681904rbb attr[i][0] = aliases[attr[i][0]];
a8c0c0b8d7dada680bd3f3d70f78ce0656ba5aa6trawick }
886cd69ebf69e990dbc365be87ff8ea7cd681904rbb if (!attr[i][1]) { // use exists operator
886cd69ebf69e990dbc365be87ff8ea7cd681904rbb attr[i][1] = '';
886cd69ebf69e990dbc365be87ff8ea7cd681904rbb }
db9ac238bf63d7df2bebbaff4de1628a32151028trawick }
ce121a776564df6bb75498209094142d92404b8atrawick return attr;
ce121a776564df6bb75498209094142d92404b8atrawick },
ce121a776564df6bb75498209094142d92404b8atrawick
e1ade9256c87684358786fcf7eef251bd4c1db10rbb _replaceShorthand: function(selector) {
e1ade9256c87684358786fcf7eef251bd4c1db10rbb var shorthand = Selector.shorthand;
e1ade9256c87684358786fcf7eef251bd4c1db10rbb var attrs = selector.match(patterns[ATTRIBUTES]); // pull attributes to avoid false pos on "." and "#"
e1ade9256c87684358786fcf7eef251bd4c1db10rbb if (attrs) {
e1ade9256c87684358786fcf7eef251bd4c1db10rbb selector = selector.replace(patterns[ATTRIBUTES], 'REPLACED_ATTRIBUTE');
e1ade9256c87684358786fcf7eef251bd4c1db10rbb }
db9ac238bf63d7df2bebbaff4de1628a32151028trawick for (var re in shorthand) {
db9ac238bf63d7df2bebbaff4de1628a32151028trawick if (shorthand.hasOwnProperty(re)) {
db9ac238bf63d7df2bebbaff4de1628a32151028trawick selector = selector.replace(Y.DOM._getRegExp(re, 'gi'), shorthand[re]);
eae32ab3fb398ca408bc2d45b22adf1b67a75471rbb }
eae32ab3fb398ca408bc2d45b22adf1b67a75471rbb }
d1d25826dbd7d2ba97db90b77122ae2b0f363e89rbb
d1d25826dbd7d2ba97db90b77122ae2b0f363e89rbb if (attrs) {
d1d25826dbd7d2ba97db90b77122ae2b0f363e89rbb for (var i = 0, len = attrs[LENGTH]; i < len; ++i) {
42ec91fadb5532438ab4c02993b15c18a517967frbb selector = selector.replace('REPLACED_ATTRIBUTE', attrs[i]);
42ec91fadb5532438ab4c02993b15c18a517967frbb }
42ec91fadb5532438ab4c02993b15c18a517967frbb }
42ec91fadb5532438ab4c02993b15c18a517967frbb return selector;
42ec91fadb5532438ab4c02993b15c18a517967frbb }
96fc773162e93e5b85686ab152f11baf4498d868rbb
2975523a2901fc601ae9510082a7d4fb11bb9aecake};
2975523a2901fc601ae9510082a7d4fb11bb9aecake
2975523a2901fc601ae9510082a7d4fb11bb9aecakeif (Y.UA.ie && Y.UA.ie < 8) { // rewrite class for IE (others use getAttribute('class')
5827adc4c40ff4b10db9b09cea43f4307c8fc319trawick Selector.attrAliases['class'] = 'className';
5827adc4c40ff4b10db9b09cea43f4307c8fc319trawick Selector.attrAliases['for'] = 'htmlFor';
5827adc4c40ff4b10db9b09cea43f4307c8fc319trawick}
5827adc4c40ff4b10db9b09cea43f4307c8fc319trawick
5827adc4c40ff4b10db9b09cea43f4307c8fc319trawickY.Selector = Selector;
5827adc4c40ff4b10db9b09cea43f4307c8fc319trawickY.Selector.patterns = patterns;
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
e7270e4daeb3e62414b361ca2bf0e707d0ae3310wrowe/**
e7270e4daeb3e62414b361ca2bf0e707d0ae3310wrowe * Add style management functionality to DOM.
e7270e4daeb3e62414b361ca2bf0e707d0ae3310wrowe * @module dom
e7270e4daeb3e62414b361ca2bf0e707d0ae3310wrowe * @submodule dom-style
e7270e4daeb3e62414b361ca2bf0e707d0ae3310wrowe * @for DOM
e7270e4daeb3e62414b361ca2bf0e707d0ae3310wrowe */
f6e9f5600e77b78fb013bb543d364135961639d1rbb
f6e9f5600e77b78fb013bb543d364135961639d1rbbvar TO_STRING = 'toString',
f6e9f5600e77b78fb013bb543d364135961639d1rbb PARSE_INT = parseInt,
f6e9f5600e77b78fb013bb543d364135961639d1rbb RE = RegExp;
f6e9f5600e77b78fb013bb543d364135961639d1rbb
f6e9f5600e77b78fb013bb543d364135961639d1rbbY.Color = {
f6e9f5600e77b78fb013bb543d364135961639d1rbb KEYWORDS: {
f6e9f5600e77b78fb013bb543d364135961639d1rbb black: '000',
f6e9f5600e77b78fb013bb543d364135961639d1rbb silver: 'c0c0c0',
f6e9f5600e77b78fb013bb543d364135961639d1rbb gray: '808080',
cfa64348224b66dd1c9979b809406c4d15b1c137fielding white: 'fff',
b580e99ec29c68e3c56b5b1ad8a4ec1e2de865c0trawick maroon: '800000',
b580e99ec29c68e3c56b5b1ad8a4ec1e2de865c0trawick red: 'f00',
b580e99ec29c68e3c56b5b1ad8a4ec1e2de865c0trawick purple: '800080',
b580e99ec29c68e3c56b5b1ad8a4ec1e2de865c0trawick fuchsia: 'f0f',
b580e99ec29c68e3c56b5b1ad8a4ec1e2de865c0trawick green: '008000',
cfa64348224b66dd1c9979b809406c4d15b1c137fielding lime: '0f0',
cfa64348224b66dd1c9979b809406c4d15b1c137fielding olive: '808000',
cfa64348224b66dd1c9979b809406c4d15b1c137fielding yellow: 'ff0',
cfa64348224b66dd1c9979b809406c4d15b1c137fielding navy: '000080',
cfa64348224b66dd1c9979b809406c4d15b1c137fielding blue: '00f',
cfa64348224b66dd1c9979b809406c4d15b1c137fielding teal: '008080',
cfa64348224b66dd1c9979b809406c4d15b1c137fielding aqua: '0ff'
cfa64348224b66dd1c9979b809406c4d15b1c137fielding },
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding re_RGB: /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
cfa64348224b66dd1c9979b809406c4d15b1c137fielding re_hex: /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
cfa64348224b66dd1c9979b809406c4d15b1c137fielding re_hex3: /([0-9A-F])/gi,
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding toRGB: function(val) {
cfa64348224b66dd1c9979b809406c4d15b1c137fielding if (!Y.Color.re_RGB.test(val)) {
cfa64348224b66dd1c9979b809406c4d15b1c137fielding val = Y.Color.toHex(val);
cfa64348224b66dd1c9979b809406c4d15b1c137fielding }
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding if(Y.Color.re_hex.exec(val)) {
cfa64348224b66dd1c9979b809406c4d15b1c137fielding val = 'rgb(' + [
cfa64348224b66dd1c9979b809406c4d15b1c137fielding PARSE_INT(RE.$1, 16),
cfa64348224b66dd1c9979b809406c4d15b1c137fielding PARSE_INT(RE.$2, 16),
cfa64348224b66dd1c9979b809406c4d15b1c137fielding PARSE_INT(RE.$3, 16)
cfa64348224b66dd1c9979b809406c4d15b1c137fielding ].join(', ') + ')';
cfa64348224b66dd1c9979b809406c4d15b1c137fielding }
cfa64348224b66dd1c9979b809406c4d15b1c137fielding return val;
cfa64348224b66dd1c9979b809406c4d15b1c137fielding },
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding toHex: function(val) {
cfa64348224b66dd1c9979b809406c4d15b1c137fielding val = Y.Color.KEYWORDS[val] || val;
cfa64348224b66dd1c9979b809406c4d15b1c137fielding if (Y.Color.re_RGB.exec(val)) {
cfa64348224b66dd1c9979b809406c4d15b1c137fielding var r = (RE.$1.length === 1) ? '0' + RE.$1 : Number(RE.$1),
cfa64348224b66dd1c9979b809406c4d15b1c137fielding g = (RE.$2.length === 1) ? '0' + RE.$2 : Number(RE.$2),
cfa64348224b66dd1c9979b809406c4d15b1c137fielding b = (RE.$3.length === 1) ? '0' + RE.$3 : Number(RE.$3);
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding val = [
cfa64348224b66dd1c9979b809406c4d15b1c137fielding r[TO_STRING](16),
cfa64348224b66dd1c9979b809406c4d15b1c137fielding g[TO_STRING](16),
cfa64348224b66dd1c9979b809406c4d15b1c137fielding b[TO_STRING](16)
cfa64348224b66dd1c9979b809406c4d15b1c137fielding ].join('');
cfa64348224b66dd1c9979b809406c4d15b1c137fielding }
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding if (val.length < 6) {
cfa64348224b66dd1c9979b809406c4d15b1c137fielding val = val.replace(Y.Color.re_hex3, '$1$1');
cfa64348224b66dd1c9979b809406c4d15b1c137fielding }
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding if (val !== 'transparent' && val.indexOf('#') < 0) {
cfa64348224b66dd1c9979b809406c4d15b1c137fielding val = '#' + val;
cfa64348224b66dd1c9979b809406c4d15b1c137fielding }
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding return val.toLowerCase();
cfa64348224b66dd1c9979b809406c4d15b1c137fielding }
cfa64348224b66dd1c9979b809406c4d15b1c137fielding};
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding
cfa64348224b66dd1c9979b809406c4d15b1c137fielding}, '@VERSION@' );
cfa64348224b66dd1c9979b809406c4d15b1c137fielding