dom-debug.js revision 30c47c5a199c16d0970a8eeda11d4fb56df668d9
0b75a2dd3bd81a69e2d68fe446cacb46be04c1f1Mark AndrewsYUI.add('dom-base', function(Y) {
0b75a2dd3bd81a69e2d68fe446cacb46be04c1f1Mark Andrews
0b75a2dd3bd81a69e2d68fe446cacb46be04c1f1Mark Andrews(function(Y) {
c54c1eaf26d5a7fc123c4af3712353156a766df1Mark Andrews/**
c54c1eaf26d5a7fc123c4af3712353156a766df1Mark Andrews * The DOM utility provides a cross-browser abtraction layer
0d993c02babc1e00516272783b310e83bb292d5cMark Andrews * normalizing DOM tasks, and adds extra helper functionality
0d993c02babc1e00516272783b310e83bb292d5cMark Andrews * for other common tasks.
0d993c02babc1e00516272783b310e83bb292d5cMark Andrews * @module dom
4d9f3f00d93fcb8743b1105e8cf82e862be220d1Mark Andrews * @submodule dom-base
4d9f3f00d93fcb8743b1105e8cf82e862be220d1Mark Andrews *
4d9f3f00d93fcb8743b1105e8cf82e862be220d1Mark Andrews */
4d9f3f00d93fcb8743b1105e8cf82e862be220d1Mark Andrews
4d9f3f00d93fcb8743b1105e8cf82e862be220d1Mark Andrews/**
86f6b92e35c7bdb5fc1fd1021af75b981863313eMark Andrews * Provides DOM helper methods.
86f6b92e35c7bdb5fc1fd1021af75b981863313eMark Andrews * @class DOM
86f6b92e35c7bdb5fc1fd1021af75b981863313eMark Andrews *
25276bd1ecb372b82c9235648e5defab0655dcd5Mark Andrews */
25276bd1ecb372b82c9235648e5defab0655dcd5Mark Andrewsvar NODE_TYPE = 'nodeType',
25276bd1ecb372b82c9235648e5defab0655dcd5Mark Andrews OWNER_DOCUMENT = 'ownerDocument',
25276bd1ecb372b82c9235648e5defab0655dcd5Mark Andrews DEFAULT_VIEW = 'defaultView',
320d6ee24ea59c0dbcb2c08038586ef03c6a191dMark Andrews PARENT_WINDOW = 'parentWindow',
320d6ee24ea59c0dbcb2c08038586ef03c6a191dMark Andrews TAG_NAME = 'tagName',
320d6ee24ea59c0dbcb2c08038586ef03c6a191dMark Andrews PARENT_NODE = 'parentNode',
475fe52dc33d8d8344e8b1e48fa7bb6643f7ca66Mark Andrews FIRST_CHILD = 'firstChild',
475fe52dc33d8d8344e8b1e48fa7bb6643f7ca66Mark Andrews PREVIOUS_SIBLING = 'previousSibling',
475fe52dc33d8d8344e8b1e48fa7bb6643f7ca66Mark Andrews NEXT_SIBLING = 'nextSibling',
69ee6250c9ce0feb7afc7d6a0508984b79d28b5bMark Andrews CONTAINS = 'contains',
5af560664daaa984f98cec6925518a3e06c4ab4fMark Andrews COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',
69ee6250c9ce0feb7afc7d6a0508984b79d28b5bMark Andrews EMPTY_STRING = '',
0f8f42a09eb102fa88e4d2caacdafbeda931f94cMark Andrews
8d77066ba0feb1353a7c85f929c365c5103f3976Mark Andrews documentElement = document.documentElement,
8d77066ba0feb1353a7c85f929c365c5103f3976Mark Andrews
8d77066ba0feb1353a7c85f929c365c5103f3976Mark Andrews re_tag = /<([a-z]+)/i;
8d77066ba0feb1353a7c85f929c365c5103f3976Mark Andrews
8d77066ba0feb1353a7c85f929c365c5103f3976Mark AndrewsY.DOM = {
3e7b37e01ba3efc873486140734fd24788092a30Mark Andrews /**
3e7b37e01ba3efc873486140734fd24788092a30Mark Andrews * Returns the HTMLElement with the given ID (Wrapper for document.getElementById).
3e7b37e01ba3efc873486140734fd24788092a30Mark Andrews * @method byId
54532c54130de8f374465bb23d5576fc3257ea96Mark Andrews * @param {String} id the id attribute
54532c54130de8f374465bb23d5576fc3257ea96Mark Andrews * @param {Object} doc optional The document to search. Defaults to current document
020f7361a49c5b1cda91927cf8206c1283fc7496Mark Andrews * @return {HTMLElement | null} The HTMLElement with the id, or null if none found.
020f7361a49c5b1cda91927cf8206c1283fc7496Mark Andrews */
1c0927d8a091effcf9b2dc5baa533927c113bd5cMark Andrews byId: function(id, doc) {
1c0927d8a091effcf9b2dc5baa533927c113bd5cMark Andrews doc = doc || Y.config.doc;
1c0927d8a091effcf9b2dc5baa533927c113bd5cMark Andrews // TODO: IE Name
446ff1959cc3e963778c8770204b72c9e7c7df5aMark Andrews return doc.getElementById(id);
446ff1959cc3e963778c8770204b72c9e7c7df5aMark Andrews },
446ff1959cc3e963778c8770204b72c9e7c7df5aMark Andrews
70f8c70cdd3ca68edcf9d448eb508abf3697719aMark Andrews // @deprecated
70f8c70cdd3ca68edcf9d448eb508abf3697719aMark Andrews children: function(node, tag) {
33c538015323f4576679e427088372eea614feebMark Andrews var ret = [];
33c538015323f4576679e427088372eea614feebMark Andrews if (node) {
ac65e45126dda424b5cc9d2865b353dc0ec23e1eMark Andrews tag = tag || '*';
ac65e45126dda424b5cc9d2865b353dc0ec23e1eMark Andrews ret = Y.Selector.query('> ' + tag, node);
ac65e45126dda424b5cc9d2865b353dc0ec23e1eMark Andrews }
0423090da198f31ac615cd3a8f7d83aada32d5b3Mark Andrews return ret;
0423090da198f31ac615cd3a8f7d83aada32d5b3Mark Andrews },
d9e0458a890c49f977fdcf9d995681f546f7c427Mark Andrews
d9e0458a890c49f977fdcf9d995681f546f7c427Mark Andrews // @deprecated
de4976142190ae84ed3e4099f3e0fc07781748a3Mark Andrews firstByTag: function(tag, root) {
de4976142190ae84ed3e4099f3e0fc07781748a3Mark Andrews var ret;
de4976142190ae84ed3e4099f3e0fc07781748a3Mark Andrews root = root || Y.config.doc;
5758e9adfb009286b2b719ff83eb284f1019c589Mark Andrews
5758e9adfb009286b2b719ff83eb284f1019c589Mark Andrews if (tag && root.getElementsByTagName) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ret = root.getElementsByTagName(tag)[0];
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews }
6a3c86ff436452d062912bd91ecd289541869d42Mark Andrews
6a3c86ff436452d062912bd91ecd289541869d42Mark Andrews return ret || null;
e0fa16fe191d619d2cd05a039067414409329878Mark Andrews },
e0fa16fe191d619d2cd05a039067414409329878Mark Andrews
e0fa16fe191d619d2cd05a039067414409329878Mark Andrews /**
93da96c1cfd5f3c47169855867dd18db00c8a386Mark Andrews * Returns the text content of the HTMLElement.
93da96c1cfd5f3c47169855867dd18db00c8a386Mark Andrews * @method getText
93da96c1cfd5f3c47169855867dd18db00c8a386Mark Andrews * @param {HTMLElement} element The html element.
7d389c324cc032475f9d219a12ab84bacbd7fbaaMark Andrews * @return {String} The text content of the element (includes text of any descending elements).
7d389c324cc032475f9d219a12ab84bacbd7fbaaMark Andrews */
cd9bfe5b256a3e84ba090e8fcb5de0d6c50974aeMark Andrews getText: (documentElement.textContent !== undefined) ?
cd9bfe5b256a3e84ba090e8fcb5de0d6c50974aeMark Andrews function(element) {
935afdff81843012abeabf8b06e7d3887e7c5e21Mark Andrews var ret = '';
dcd371be7d481b242d277d735e4c2d974297c164Mark Andrews if (element) {
dcd371be7d481b242d277d735e4c2d974297c164Mark Andrews ret = element.textContent;
935afdff81843012abeabf8b06e7d3887e7c5e21Mark Andrews }
cc4928ec7116a064223f60639ca1a80f25ba350fMark Andrews return ret || '';
935afdff81843012abeabf8b06e7d3887e7c5e21Mark Andrews } : function(element) {
e2cf63c5df79eb7c8b86b6278289883fa760cda5Mark Andrews var ret = '';
935afdff81843012abeabf8b06e7d3887e7c5e21Mark Andrews if (element) {
c3184b4e2a1f238f4615d36fee79df82b1711344Mark Andrews ret = element.innerText;
c3184b4e2a1f238f4615d36fee79df82b1711344Mark Andrews }
c3184b4e2a1f238f4615d36fee79df82b1711344Mark Andrews return ret || '';
935afdff81843012abeabf8b06e7d3887e7c5e21Mark Andrews },
9b7c023fe6dc88ba1e69ace1f7c3ade40c6475f9Mark Andrews
9b7c023fe6dc88ba1e69ace1f7c3ade40c6475f9Mark Andrews /**
9b7c023fe6dc88ba1e69ace1f7c3ade40c6475f9Mark Andrews * Sets the text content of the HTMLElement.
935afdff81843012abeabf8b06e7d3887e7c5e21Mark Andrews * @method setText
0a1fa37641b59c56d02f5390917a49e4987f0f75Mark Andrews * @param {HTMLElement} element The html element.
0a1fa37641b59c56d02f5390917a49e4987f0f75Mark Andrews * @param {String} content The content to add.
935afdff81843012abeabf8b06e7d3887e7c5e21Mark Andrews */
c61ec97ae0b859914ee26e213fe792f86a157990Mark Andrews setText: (documentElement.textContent !== undefined) ?
c61ec97ae0b859914ee26e213fe792f86a157990Mark Andrews function(element, content) {
935afdff81843012abeabf8b06e7d3887e7c5e21Mark Andrews if (element) {
49f7d1585e0e4f1ffa1667391dd7ae1c4d3d4e81Mark Andrews element.textContent = content;
49f7d1585e0e4f1ffa1667391dd7ae1c4d3d4e81Mark Andrews }
0b1af13f680a865521105a77ee192024b5af33c4Mark Andrews } : function(element, content) {
0b1af13f680a865521105a77ee192024b5af33c4Mark Andrews if (element) {
0b1af13f680a865521105a77ee192024b5af33c4Mark Andrews element.innerText = content;
0b1af13f680a865521105a77ee192024b5af33c4Mark Andrews }
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews },
945cb085b859dbfc6a883813dda03c83e06995d3Mark Andrews
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews /*
5ed4b0d4452967d9b3aaf7a22a2956a6ee67a614Mark Andrews * Finds the previous sibling of the element.
5ed4b0d4452967d9b3aaf7a22a2956a6ee67a614Mark Andrews * @method previous
5ed4b0d4452967d9b3aaf7a22a2956a6ee67a614Mark Andrews * @deprecated Use elementByAxis
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews * @param {HTMLElement} element The html element.
c549b3a4d5fedba2ae960df667864e824acb1ef9Mark Andrews * @param {Function} fn optional An optional boolean test to apply.
c549b3a4d5fedba2ae960df667864e824acb1ef9Mark Andrews * The optional function is passed the current DOM node being tested as its only argument.
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews * If no function is given, the first sibling is returned.
a483e67c4cdcbfc29ddc62b5a2d0d99b1c542fadMark Andrews * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
a483e67c4cdcbfc29ddc62b5a2d0d99b1c542fadMark Andrews * @return {HTMLElement | null} The matching DOM node or null if none found.
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews */
d73de275987d29627dc11d5bd4a22874a29f7874Mark Andrews previous: function(element, fn, all) {
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews return Y.DOM.elementByAxis(element, PREVIOUS_SIBLING, fn, all);
8f9664521724eefc39728c092d0bc6be527e1496Mark Andrews },
8f9664521724eefc39728c092d0bc6be527e1496Mark Andrews
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews /*
da091cda77fa951e682119c3df84f60a62bed702Mark Andrews * Finds the next sibling of the element.
da091cda77fa951e682119c3df84f60a62bed702Mark Andrews * @method next
da091cda77fa951e682119c3df84f60a62bed702Mark Andrews * @deprecated Use elementByAxis
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews * @param {HTMLElement} element The html element.
d8d489cd8efc45b06a232ac07a636b3d36cc7e8fMark Andrews * @param {Function} fn optional An optional boolean test to apply.
d8d489cd8efc45b06a232ac07a636b3d36cc7e8fMark Andrews * The optional function is passed the current DOM node being tested as its only argument.
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews * If no function is given, the first sibling is returned.
bdb1394788a677d0b6e8499ba1ece17a73f476c7Mark Andrews * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
bdb1394788a677d0b6e8499ba1ece17a73f476c7Mark Andrews * @return {HTMLElement | null} The matching DOM node or null if none found.
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews */
c8aa2c83113229a59069cbd05c735896f51b886bMark Andrews next: function(element, fn, all) {
c8aa2c83113229a59069cbd05c735896f51b886bMark Andrews return Y.DOM.elementByAxis(element, NEXT_SIBLING, fn, all);
3a7c831b697b4604bc90019f2ccc217338117a1cMark Andrews },
a1edcd1b8d430650d85ec0962cd32efde76a71fbMark Andrews
5b1627d469d07c5bfe7f193e3ddd85d0dd6ad4b0Mark Andrews /*
5b1627d469d07c5bfe7f193e3ddd85d0dd6ad4b0Mark Andrews * Finds the ancestor of the element.
7c23b791f4ae8f0c4c2982a91d13c0ecb15ee798Mark Andrews * @method ancestor
7c23b791f4ae8f0c4c2982a91d13c0ecb15ee798Mark Andrews * @deprecated Use elementByAxis
7c23b791f4ae8f0c4c2982a91d13c0ecb15ee798Mark Andrews * @param {HTMLElement} element The html element.
7c23b791f4ae8f0c4c2982a91d13c0ecb15ee798Mark Andrews * @param {Function} fn optional An optional boolean test to apply.
8989de1059c6292fc43ce507df4991224af2d789Mark Andrews * The optional function is passed the current DOM node being tested as its only argument.
8989de1059c6292fc43ce507df4991224af2d789Mark Andrews * If no function is given, the parentNode is returned.
8989de1059c6292fc43ce507df4991224af2d789Mark Andrews * @param {Boolean} testSelf optional Whether or not to include the element in the scan
acc8b7ac3d16538bf223545bbf71899b9accaebbMark Andrews * @return {HTMLElement | null} The matching DOM node or null if none found.
acc8b7ac3d16538bf223545bbf71899b9accaebbMark Andrews */
e7bb307667cc89287e810b95bddd342cb5dcb4e7Mark Andrews ancestor: function(element, fn, testSelf) {
e7bb307667cc89287e810b95bddd342cb5dcb4e7Mark Andrews var ret = null;
b9efcf0a377381b29960137e54ecaf4db85a35c8Mark Andrews if (testSelf) {
b9efcf0a377381b29960137e54ecaf4db85a35c8Mark Andrews ret = (!fn || fn(element)) ? element : null;
b9efcf0a377381b29960137e54ecaf4db85a35c8Mark Andrews
b9efcf0a377381b29960137e54ecaf4db85a35c8Mark Andrews }
8e5893c36cdccc706f9632f51e0c8d390d2a8d06Mark Andrews return ret || Y.DOM.elementByAxis(element, PARENT_NODE, fn, null);
8e5893c36cdccc706f9632f51e0c8d390d2a8d06Mark Andrews },
e396939d492e6afa8e31a8dc11d7317c9e62f15fMark Andrews
e396939d492e6afa8e31a8dc11d7317c9e62f15fMark Andrews /**
9549a96654ead15b264c9159d48eb485e4f9db55Mark Andrews * Searches the element by the given axis for the first matching element.
9549a96654ead15b264c9159d48eb485e4f9db55Mark Andrews * @method elementByAxis
3d822d111c00e70830dc163a5298196a1e7db29fMark Andrews * @param {HTMLElement} element The html element.
3d822d111c00e70830dc163a5298196a1e7db29fMark Andrews * @param {String} axis The axis to search (parentNode, nextSibling, previousSibling).
88aa68f478c1634f5f10034fb6ea4158efa20ff4Mark Andrews * @param {Function} fn optional An optional boolean test to apply.
88aa68f478c1634f5f10034fb6ea4158efa20ff4Mark Andrews * @param {Boolean} all optional Whether all node types should be returned, or just element nodes.
88aa68f478c1634f5f10034fb6ea4158efa20ff4Mark Andrews * The optional function is passed the current HTMLElement being tested as its only argument.
4c83dd7f22b19c75afdd311684f6ba0faa24e8d8Mark Andrews * If no function is given, the first element is returned.
4c83dd7f22b19c75afdd311684f6ba0faa24e8d8Mark Andrews * @return {HTMLElement | null} The matching element or null if none found.
4c83dd7f22b19c75afdd311684f6ba0faa24e8d8Mark Andrews */
5f4098e478ae913cdc1bb8851599b8f2431050d3Mark Andrews elementByAxis: function(element, axis, fn, all) {
5f4098e478ae913cdc1bb8851599b8f2431050d3Mark Andrews while (element && (element = element[axis])) { // NOTE: assignment
5f4098e478ae913cdc1bb8851599b8f2431050d3Mark Andrews if ( (all || element[TAG_NAME]) && (!fn || fn(element)) ) {
57e0f58b3fd4cb49a57200c8af9cb58d984d871aMark Andrews return element;
57e0f58b3fd4cb49a57200c8af9cb58d984d871aMark Andrews }
26cf4737b3e84c3a686a5eacebf22ac39e57d4caMark Andrews }
26cf4737b3e84c3a686a5eacebf22ac39e57d4caMark Andrews return null;
26cf4737b3e84c3a686a5eacebf22ac39e57d4caMark Andrews },
34e5a08809dda3276252269ebddd1616e62081a2Mark Andrews
34e5a08809dda3276252269ebddd1616e62081a2Mark Andrews /**
34e5a08809dda3276252269ebddd1616e62081a2Mark Andrews * Determines whether or not one HTMLElement is or contains another HTMLElement.
0cd36f1d15caf6622ec3128544d4238ad180a300Mark Andrews * @method contains
0cd36f1d15caf6622ec3128544d4238ad180a300Mark Andrews * @param {HTMLElement} element The containing html element.
0cd36f1d15caf6622ec3128544d4238ad180a300Mark Andrews * @param {HTMLElement} needle The html element that may be contained.
0cd36f1d15caf6622ec3128544d4238ad180a300Mark Andrews * @return {Boolean} Whether or not the element is or contains the needle.
93649589d470624e9e1c34403ad076b3a1a4c5c3Mark Andrews */
93649589d470624e9e1c34403ad076b3a1a4c5c3Mark Andrews contains: function(element, needle) {
93649589d470624e9e1c34403ad076b3a1a4c5c3Mark Andrews var ret = false;
5991ce423682075b39523bba3926696aa60dd541Mark Andrews
29f5bb81e2d1d72fc6e44c87404bd4598a34df94Mark Andrews if ( !needle || !element || !needle[NODE_TYPE] || !element[NODE_TYPE]) {
ddc592d128cdde85ada64efbda95981c10c4c03cMark Andrews ret = false;
ddc592d128cdde85ada64efbda95981c10c4c03cMark Andrews } else if (element[CONTAINS]) {
ddc592d128cdde85ada64efbda95981c10c4c03cMark Andrews if (Y.UA.opera || needle[NODE_TYPE] === 1) { // IE & SAF contains fail if needle not an ELEMENT_NODE
88c2b83cc548a217cc92a2bf75ca1ef1d4237d4fMark Andrews ret = element[CONTAINS](needle);
88c2b83cc548a217cc92a2bf75ca1ef1d4237d4fMark Andrews } else {
bd6ad47c3dbc52a54f240432878b6832bd6dd6e2Mark Andrews ret = Y.DOM._bruteContains(element, needle);
bd6ad47c3dbc52a54f240432878b6832bd6dd6e2Mark Andrews }
bd6ad47c3dbc52a54f240432878b6832bd6dd6e2Mark Andrews } else if (element[COMPARE_DOCUMENT_POSITION]) { // gecko
c7c1bf7dc167ff164193bc04f33a22109e4c0829Mark Andrews if (element === needle || !!(element[COMPARE_DOCUMENT_POSITION](needle) & 16)) {
c7c1bf7dc167ff164193bc04f33a22109e4c0829Mark Andrews ret = true;
c7c1bf7dc167ff164193bc04f33a22109e4c0829Mark Andrews }
9e205a3c51e68d19a7ed03244d45b14b3e0d69afMark Andrews }
9e205a3c51e68d19a7ed03244d45b14b3e0d69afMark Andrews
9e205a3c51e68d19a7ed03244d45b14b3e0d69afMark Andrews return ret;
e823642ec0c167af8f7db01c96ba0279165a61f3Mark Andrews },
e823642ec0c167af8f7db01c96ba0279165a61f3Mark Andrews
e823642ec0c167af8f7db01c96ba0279165a61f3Mark Andrews /**
93e6ebcd0a0f044ba2add424c265b5e0bb4c8afdMark Andrews * Determines whether or not the HTMLElement is part of the document.
93e6ebcd0a0f044ba2add424c265b5e0bb4c8afdMark Andrews * @method inDoc
93e6ebcd0a0f044ba2add424c265b5e0bb4c8afdMark Andrews * @param {HTMLElement} element The containing html element.
8ac1acc30d0f405222ffa7b2b93131d9d4e18599Mark Andrews * @param {HTMLElement} doc optional The document to check.
8ac1acc30d0f405222ffa7b2b93131d9d4e18599Mark Andrews * @return {Boolean} Whether or not the element is attached to the document.
c99d9017ba00099bfa89e1ed53e63a5cb07d28d5Mark Andrews */
c99d9017ba00099bfa89e1ed53e63a5cb07d28d5Mark Andrews inDoc: function(element, doc) {
c99d9017ba00099bfa89e1ed53e63a5cb07d28d5Mark Andrews // there may be multiple elements with the same ID
c99d9017ba00099bfa89e1ed53e63a5cb07d28d5Mark Andrews doc = doc || element[OWNER_DOCUMENT];
c99d9017ba00099bfa89e1ed53e63a5cb07d28d5Mark Andrews var nodes = [],
c99d9017ba00099bfa89e1ed53e63a5cb07d28d5Mark Andrews ret = false,
c99d9017ba00099bfa89e1ed53e63a5cb07d28d5Mark Andrews i,
c4a9ce445c48a57eed5aa16582b1964cf8cedf87Mark Andrews node,
c4a9ce445c48a57eed5aa16582b1964cf8cedf87Mark Andrews query;
a04a323f9a1ebd4766fc577e11bf3c22bdaf5516Mark Andrews
a04a323f9a1ebd4766fc577e11bf3c22bdaf5516Mark Andrews element.id = element.id || Y.guid();
a04a323f9a1ebd4766fc577e11bf3c22bdaf5516Mark Andrews
dd0228908543562781a4c0d8773ae87d4c530633Mark Andrews nodes = Y.DOM.allById(element.id, doc);
dd0228908543562781a4c0d8773ae87d4c530633Mark Andrews for (i = 0; node = nodes[i++];) { // check for a match
dd0228908543562781a4c0d8773ae87d4c530633Mark Andrews if (node === element) {
dd0228908543562781a4c0d8773ae87d4c530633Mark Andrews ret = true;
810e8d27763c5d8557239ab321eb125163af9236Mark Andrews break;
810e8d27763c5d8557239ab321eb125163af9236Mark Andrews }
810e8d27763c5d8557239ab321eb125163af9236Mark Andrews }
15f358ed4ea081793041bbfba70849be472236d3Mark Andrews
15f358ed4ea081793041bbfba70849be472236d3Mark Andrews return ret;
15f358ed4ea081793041bbfba70849be472236d3Mark Andrews
984c39beed2fee49dda75c4c8a37b7f32bf434bfMark Andrews },
984c39beed2fee49dda75c4c8a37b7f32bf434bfMark Andrews
984c39beed2fee49dda75c4c8a37b7f32bf434bfMark Andrews allById: function(id, root) {
c08a03a43116c21cf12dea7cbcb5465588f7955cMark Andrews root = root || Y.config.doc;
c08a03a43116c21cf12dea7cbcb5465588f7955cMark Andrews var nodes = [],
c311ed52d45334e182a093efad827fe4cbe7e686Mark Andrews ret = [],
c311ed52d45334e182a093efad827fe4cbe7e686Mark Andrews i,
c311ed52d45334e182a093efad827fe4cbe7e686Mark Andrews node;
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews if (root.querySelectorAll) {
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews ret = root.querySelectorAll('[id="' + id + '"]');
79a6a33184abff1999ba13b10922ccb34a2758a5Mark Andrews } else if (root.all) {
5d26560e2b93e1aa0334931ec6ccb6045c3581fcMark Andrews nodes = root.all(id);
5d26560e2b93e1aa0334931ec6ccb6045c3581fcMark Andrews if (nodes && nodes.nodeType) { // root.all may return one or many
5d26560e2b93e1aa0334931ec6ccb6045c3581fcMark Andrews nodes = [nodes];
2b1c71b134eb92f2e297a56f778838e42f41c880Mark Andrews }
2b1c71b134eb92f2e297a56f778838e42f41c880Mark Andrews
2b1c71b134eb92f2e297a56f778838e42f41c880Mark Andrews if (nodes && nodes.length) {
2b1c71b134eb92f2e297a56f778838e42f41c880Mark Andrews for (i = 0; node = nodes[i++];) { // check for a match
d6fbfd28ea82e425740de903ddc67f7d9e9f82e7Mark Andrews if (node.id === id) { // avoid false positive for node.name
d6fbfd28ea82e425740de903ddc67f7d9e9f82e7Mark Andrews ret.push(node);
d6fbfd28ea82e425740de903ddc67f7d9e9f82e7Mark Andrews }
7791dd06ea69d0fb2494788ad4c24d568f40bcdfMark Andrews }
7791dd06ea69d0fb2494788ad4c24d568f40bcdfMark Andrews }
091b098b49a4f84f459abd46451955a18abd6d40Mark Andrews }
091b098b49a4f84f459abd46451955a18abd6d40Mark Andrews return ret;
091b098b49a4f84f459abd46451955a18abd6d40Mark Andrews },
7d3458a972a902740eb142044655aba6c6ffb9acMark Andrews
7d3458a972a902740eb142044655aba6c6ffb9acMark Andrews /**
7d3458a972a902740eb142044655aba6c6ffb9acMark Andrews * Creates a new dom node using the provided markup string.
7c441b7f4afdedb6e5a99f113a4f926a005fa950Mark Andrews * @method create
7c441b7f4afdedb6e5a99f113a4f926a005fa950Mark Andrews * @param {String} html The markup used to create the element
7c441b7f4afdedb6e5a99f113a4f926a005fa950Mark Andrews * @param {HTMLDocument} doc An optional document context
7c441b7f4afdedb6e5a99f113a4f926a005fa950Mark Andrews */
f0ffc28f61a68b350fef9257f5f50e1ac866e0abMark Andrews create: function(html, doc) {
75e184e4b80c499859574257dd5781d62cfed0b3Mark Andrews if (typeof html === 'string') {
f0ffc28f61a68b350fef9257f5f50e1ac866e0abMark Andrews html = Y.Lang.trim(html); // match IE which trims whitespace from innerHTML
7f20fd8ebb0cabc8f935381d958f8371990c9212Mark Andrews }
7f20fd8ebb0cabc8f935381d958f8371990c9212Mark Andrews
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews doc = doc || Y.config.doc;
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews var m = re_tag.exec(html),
8695d7b357789bedff63e5b19c5ab25cd58fcd4bMark Andrews create = Y.DOM._create,
f76c4ebaf586a693521f018fbc617c292c1555d7Mark Andrews custom = Y.DOM.creators,
f76c4ebaf586a693521f018fbc617c292c1555d7Mark Andrews ret = null,
b597abd9cc44c7b9ecd0ff67df59a21ff45e88d5Mark Andrews tag, nodes;
b597abd9cc44c7b9ecd0ff67df59a21ff45e88d5Mark Andrews
b597abd9cc44c7b9ecd0ff67df59a21ff45e88d5Mark Andrews if (m && custom[m[1]]) {
b597abd9cc44c7b9ecd0ff67df59a21ff45e88d5Mark Andrews if (typeof custom[m[1]] === 'function') {
81e302788a444b81231a7cda721548a020ae5660Brian Wellington create = custom[m[1]];
81e302788a444b81231a7cda721548a020ae5660Brian Wellington } else {
81e302788a444b81231a7cda721548a020ae5660Brian Wellington tag = custom[m[1]];
c00a1eb423623442aff428336bb55590f79013bbMark Andrews }
c00a1eb423623442aff428336bb55590f79013bbMark Andrews }
1e258716acade52396a8f260b5e19cbf6ca0290aMark Andrews
1e258716acade52396a8f260b5e19cbf6ca0290aMark Andrews nodes = create(html, doc, tag).childNodes;
d972fa317829804a692e46a34b6f27a33f861d9dMark Andrews
d972fa317829804a692e46a34b6f27a33f861d9dMark Andrews if (nodes.length === 1) { // return single node, breaking parentNode ref from "fragment"
4b171ebd702d72200a4d7609f11c5f79d6b6f964Brian Wellington ret = nodes[0].parentNode.removeChild(nodes[0]);
4b171ebd702d72200a4d7609f11c5f79d6b6f964Brian Wellington } else { // return multiple nodes as a fragment
4b171ebd702d72200a4d7609f11c5f79d6b6f964Brian Wellington ret = Y.DOM._nl2frag(nodes, doc);
cceca51fec3b4af660d28e2d3df7242823312eb6Brian Wellington }
cceca51fec3b4af660d28e2d3df7242823312eb6Brian Wellington
03fae7ef2173cdf32918853b047d95d9046574ccMark Andrews return ret;
03fae7ef2173cdf32918853b047d95d9046574ccMark Andrews },
03fae7ef2173cdf32918853b047d95d9046574ccMark Andrews
03fae7ef2173cdf32918853b047d95d9046574ccMark Andrews _nl2frag: function(nodes, doc) {
ad611e746d6fdcbb9e67da361a3a039c226a9236Mark Andrews var ret = null,
ad611e746d6fdcbb9e67da361a3a039c226a9236Mark Andrews i, len;
603d1d1e20fbffc986b3aec93379bb4f6ac37afcMark Andrews
603d1d1e20fbffc986b3aec93379bb4f6ac37afcMark Andrews if (nodes && (nodes.push || nodes.item) && nodes[0]) {
603d1d1e20fbffc986b3aec93379bb4f6ac37afcMark Andrews doc = doc || nodes[0].ownerDocument;
2dd99c098ca162f985b7ef3c8142a964ad8281aeMark Andrews ret = doc.createDocumentFragment();
2dd99c098ca162f985b7ef3c8142a964ad8281aeMark Andrews
2dd99c098ca162f985b7ef3c8142a964ad8281aeMark Andrews if (nodes.item) { // convert live list to static array
2dd99c098ca162f985b7ef3c8142a964ad8281aeMark Andrews nodes = Y.Array(nodes, 0, true);
2dd99c098ca162f985b7ef3c8142a964ad8281aeMark Andrews }
2dd99c098ca162f985b7ef3c8142a964ad8281aeMark Andrews
1fb264ed3aa861a67d7bab9aeb5aea5836e03c14Mark Andrews for (i = 0, len = nodes.length; i < len; i++) {
1fb264ed3aa861a67d7bab9aeb5aea5836e03c14Mark Andrews ret.appendChild(nodes[i]);
1fb264ed3aa861a67d7bab9aeb5aea5836e03c14Mark Andrews }
608c703d1231e0b1f291637ca5361b773afcdbf1Mark Andrews } // else inline with log for minification
608c703d1231e0b1f291637ca5361b773afcdbf1Mark Andrews else { Y.log('unable to convert ' + nodes + ' to fragment', 'warn', 'dom'); }
608c703d1231e0b1f291637ca5361b773afcdbf1Mark Andrews return ret;
feb8ae093115b36ac061e23d0227ea06f51950a3Mark Andrews },
feb8ae093115b36ac061e23d0227ea06f51950a3Mark Andrews
27151990b2b48f027f7f01972fe8e0dfa1df52d3Mark Andrews
27151990b2b48f027f7f01972fe8e0dfa1df52d3Mark Andrews CUSTOM_ATTRIBUTES: (!documentElement.hasAttribute) ? { // IE < 8
27151990b2b48f027f7f01972fe8e0dfa1df52d3Mark Andrews 'for': 'htmlFor',
6b610836bc081fdadf7bc7a16ce27f422c6b5638Brian Wellington 'class': 'className'
6b610836bc081fdadf7bc7a16ce27f422c6b5638Brian Wellington } : { // w3c
95b604c5e972a5e9eb713bf45cf0b2d9b98da27eMark Andrews 'htmlFor': 'for',
2211bec6a0626b681fdf5a8e4406555ef76ddf70Mark Andrews 'className': 'class'
2211bec6a0626b681fdf5a8e4406555ef76ddf70Mark Andrews },
2211bec6a0626b681fdf5a8e4406555ef76ddf70Mark Andrews
fcb2ecdb52a594a5c0d07c2e98e67c14708c16dfMark Andrews /**
fcb2ecdb52a594a5c0d07c2e98e67c14708c16dfMark Andrews * Provides a normalized attribute interface.
fcb2ecdb52a594a5c0d07c2e98e67c14708c16dfMark Andrews * @method setAttibute
3561e645d77448b20b1676680b08c76d559e5335Mark Andrews * @param {String | HTMLElement} el The target element for the attribute.
3561e645d77448b20b1676680b08c76d559e5335Mark Andrews * @param {String} attr The attribute to set.
b9c80c8bddbb88384d7baef297a873b5f8715e49Mark Andrews * @param {String} val The value of the attribute.
b9c80c8bddbb88384d7baef297a873b5f8715e49Mark Andrews */
b9c80c8bddbb88384d7baef297a873b5f8715e49Mark Andrews setAttribute: function(el, attr, val, ieAttr) {
b9c80c8bddbb88384d7baef297a873b5f8715e49Mark Andrews if (el && el.setAttribute) {
b9c80c8bddbb88384d7baef297a873b5f8715e49Mark Andrews attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
b9c80c8bddbb88384d7baef297a873b5f8715e49Mark Andrews el.setAttribute(attr, val, ieAttr);
27269e9dd45b619160f90db1a0f6b2b3f6f4bbb8Mark Andrews }
faf23095be9a0b5e2696f2b1f1a260af16e9ebeaMark Andrews },
27269e9dd45b619160f90db1a0f6b2b3f6f4bbb8Mark Andrews
faf23095be9a0b5e2696f2b1f1a260af16e9ebeaMark Andrews
f38c274c217d0a5b791786877422306a0e477e10Mark Andrews /**
f38c274c217d0a5b791786877422306a0e477e10Mark Andrews * Provides a normalized attribute interface.
84ef147b1fa0aed15cade55478ed647d15f7b094Mark Andrews * @method getAttibute
84ef147b1fa0aed15cade55478ed647d15f7b094Mark Andrews * @param {String | HTMLElement} el The target element for the attribute.
84ef147b1fa0aed15cade55478ed647d15f7b094Mark Andrews * @param {String} attr The attribute to get.
e53a5a116fc531f730df0adb091278ff8a941dffMark Andrews * @return {String} The current value of the attribute.
e53a5a116fc531f730df0adb091278ff8a941dffMark Andrews */
e53a5a116fc531f730df0adb091278ff8a941dffMark Andrews getAttribute: function(el, attr, ieAttr) {
fc7fbdf6e66fb496442ec4f99f5a84669ea4c6d3Mark Andrews ieAttr = (ieAttr !== undefined) ? ieAttr : 2;
fc7fbdf6e66fb496442ec4f99f5a84669ea4c6d3Mark Andrews var ret = '';
fc7fbdf6e66fb496442ec4f99f5a84669ea4c6d3Mark Andrews if (el && el.getAttribute) {
fc7fbdf6e66fb496442ec4f99f5a84669ea4c6d3Mark Andrews attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
986be654feec852eb9da0d15599f18d0035e569bMark Andrews ret = el.getAttribute(attr, ieAttr);
986be654feec852eb9da0d15599f18d0035e569bMark Andrews
986be654feec852eb9da0d15599f18d0035e569bMark Andrews if (ret === null) {
3703473c4a2672af58b4f141e92067e969fd978eBrian Wellington ret = ''; // per DOM spec
3703473c4a2672af58b4f141e92067e969fd978eBrian Wellington }
c26c65b7a0d036e78bfc73f3e7e0817adb0365c0Mark Andrews }
43733a83ed92359555c0dcc766e04216ba858309Mark Andrews return ret;
43733a83ed92359555c0dcc766e04216ba858309Mark Andrews },
43733a83ed92359555c0dcc766e04216ba858309Mark Andrews
bda64555f62216c3e785338f372a7ad9b79c197cMark Andrews isWindow: function(obj) {
86e71d7e8626de37559265f0edac8451bef6d001Andreas Gustafsson return obj.alert && obj.document;
bda64555f62216c3e785338f372a7ad9b79c197cMark Andrews },
39c2b741427eedafe5054909773c2e121c078b72Mark Andrews
39c2b741427eedafe5054909773c2e121c078b72Mark Andrews _fragClones: {},
39c2b741427eedafe5054909773c2e121c078b72Mark Andrews
de36c606c52ad51e5abca6e42faf655937e5ed10Mark Andrews _create: function(html, doc, tag) {
de36c606c52ad51e5abca6e42faf655937e5ed10Mark Andrews tag = tag || 'div';
23cb957a81a51a9656917ea98d0ae56b7abdcaccMark Andrews
23cb957a81a51a9656917ea98d0ae56b7abdcaccMark Andrews var frag = Y.DOM._fragClones[tag];
7789eb1345bef03773a2530dce7f2709cc50aa2aAndreas Gustafsson if (frag) {
23cb957a81a51a9656917ea98d0ae56b7abdcaccMark Andrews frag = frag.cloneNode(false);
28d8b4118da7abed531ca09136a6d1402837d721Mark Andrews } else {
28d8b4118da7abed531ca09136a6d1402837d721Mark Andrews frag = Y.DOM._fragClones[tag] = doc.createElement(tag);
28d8b4118da7abed531ca09136a6d1402837d721Mark Andrews }
d6c0627d1e4d841eac9576427f2d4a0cf9a47e2cMark Andrews frag.innerHTML = html;
d6c0627d1e4d841eac9576427f2d4a0cf9a47e2cMark Andrews return frag;
d6c0627d1e4d841eac9576427f2d4a0cf9a47e2cMark Andrews },
5d7b81d2a49d237ff5e73fdc4bd3394a3ee29392Mark Andrews
eeede5be4b3ff940b622799a04951e0dc45ad45fAndreas Gustafsson _removeChildNodes: function(node) {
eeede5be4b3ff940b622799a04951e0dc45ad45fAndreas Gustafsson while (node.firstChild) {
5d7b81d2a49d237ff5e73fdc4bd3394a3ee29392Mark Andrews node.removeChild(node.firstChild);
8f63de30293716a22054e7db47f27e81bab545c5Mark Andrews }
8f63de30293716a22054e7db47f27e81bab545c5Mark Andrews },
8f63de30293716a22054e7db47f27e81bab545c5Mark Andrews
caa8797a00ccb1a02f1690dda5b4aeda9a1db5a7Mark Andrews /**
caa8797a00ccb1a02f1690dda5b4aeda9a1db5a7Mark Andrews * Inserts content in a node at the given location
9ae90732df942a7ffcbaa26ba254b55248ce79a5Mark Andrews * @method addHTML
9ae90732df942a7ffcbaa26ba254b55248ce79a5Mark Andrews * @param {HTMLElement} node The node to insert into
9ae90732df942a7ffcbaa26ba254b55248ce79a5Mark Andrews * @param {String} content The content to be inserted
f3222d48cc3d81706d198faa00dea9720eb0768dMark Andrews * @param {String} where Where to insert the content; default is after lastChild
c1567cb58cbf2eb816320ff49f000afafea02a85Mark Andrews */
f3222d48cc3d81706d198faa00dea9720eb0768dMark Andrews addHTML: function(node, content, where) {
c73c1c33ec9569c8f9ffd205b48f044f9b03795bMark Andrews if (typeof content === 'string') {
c73c1c33ec9569c8f9ffd205b48f044f9b03795bMark Andrews content = Y.Lang.trim(content); // match IE which trims whitespace from innerHTML
c73c1c33ec9569c8f9ffd205b48f044f9b03795bMark Andrews }
e95cc59f90d35f2d482b6f9c19ba96818275335cMark Andrews
0062c1ddfe0b2f0a4e206a5d460d8e7d58e29b80Brian Wellington var nodeParent = node.parentNode,
0062c1ddfe0b2f0a4e206a5d460d8e7d58e29b80Brian Wellington newNode;
9aa1fb4861dc1d45f5a02fb1b9a9b815cc863747Mark Andrews
0062c1ddfe0b2f0a4e206a5d460d8e7d58e29b80Brian Wellington if (content) {
48b0f5ff87f0a5a138129bcd855fd72908491321Andreas Gustafsson if (content.nodeType) { // domNode
48b0f5ff87f0a5a138129bcd855fd72908491321Andreas Gustafsson newNode = content;
48b0f5ff87f0a5a138129bcd855fd72908491321Andreas Gustafsson } else { // create from string and cache
0b809e3e23f9f3d9697def5f447aa57d5aeef56bAndreas Gustafsson newNode = Y.DOM.create(content);
cde7dfea4c1267a2b526114f4ea80fe9db1fc557Brian Wellington }
cde7dfea4c1267a2b526114f4ea80fe9db1fc557Brian Wellington }
fca9cc33ad4299e58e53aa5273d805477267e27aBrian Wellington
fca9cc33ad4299e58e53aa5273d805477267e27aBrian Wellington if (where) {
fca9cc33ad4299e58e53aa5273d805477267e27aBrian Wellington if (where.nodeType) { // insert regardless of relationship to node
fca9cc33ad4299e58e53aa5273d805477267e27aBrian Wellington // TODO: check if node.contains(where)?
2ca2e1a1ceec59a40f977f01ba8e8f4c0424c484Brian Wellington where.parentNode.insertBefore(newNode, where);
2ca2e1a1ceec59a40f977f01ba8e8f4c0424c484Brian Wellington } else {
2ca2e1a1ceec59a40f977f01ba8e8f4c0424c484Brian Wellington switch (where) {
84185d19c7a9ef1ac23cc6236c8773697d4efeb1Brian Wellington case 'replace':
84185d19c7a9ef1ac23cc6236c8773697d4efeb1Brian Wellington while (node.firstChild) {
84185d19c7a9ef1ac23cc6236c8773697d4efeb1Brian Wellington node.removeChild(node.firstChild);
683f10428e292811317df38fa324f242abbf7384Mark Andrews }
683f10428e292811317df38fa324f242abbf7384Mark Andrews if (newNode) { // allow empty content to clear node
683f10428e292811317df38fa324f242abbf7384Mark Andrews node.appendChild(newNode);
5da1e589c2288dbe87002f771005a78d80a2e258Mark Andrews }
5da1e589c2288dbe87002f771005a78d80a2e258Mark Andrews break;
5da1e589c2288dbe87002f771005a78d80a2e258Mark Andrews case 'before':
5da1e589c2288dbe87002f771005a78d80a2e258Mark Andrews nodeParent.insertBefore(newNode, node);
5da1e589c2288dbe87002f771005a78d80a2e258Mark Andrews break;
5da1e589c2288dbe87002f771005a78d80a2e258Mark Andrews case 'after':
852fa3b2e32719d094f3ad6513238841ae1f078bMark Andrews if (node.nextSibling) { // IE errors if refNode is null
852fa3b2e32719d094f3ad6513238841ae1f078bMark Andrews nodeParent.insertBefore(newNode, node.nextSibling);
852fa3b2e32719d094f3ad6513238841ae1f078bMark Andrews } else {
8569ab045a4cf6ecd1b5a3354ddb1c93ef34ea57Brian Wellington nodeParent.appendChild(newNode);
8569ab045a4cf6ecd1b5a3354ddb1c93ef34ea57Brian Wellington }
8569ab045a4cf6ecd1b5a3354ddb1c93ef34ea57Brian Wellington break;
a5c077e40c784cf9e25c95a1ab94db2faab04ae9Brian Wellington default:
a5c077e40c784cf9e25c95a1ab94db2faab04ae9Brian Wellington node.appendChild(newNode);
a5c077e40c784cf9e25c95a1ab94db2faab04ae9Brian Wellington }
a5c077e40c784cf9e25c95a1ab94db2faab04ae9Brian Wellington }
2ca556300b09a94f0937b303386d29b95ef057ddBrian Wellington } else {
2ca556300b09a94f0937b303386d29b95ef057ddBrian Wellington node.appendChild(newNode);
2ca556300b09a94f0937b303386d29b95ef057ddBrian Wellington }
2ca556300b09a94f0937b303386d29b95ef057ddBrian Wellington
97527fc03cdb061759e2c9529c670ac1c190ef84Brian Wellington return newNode;
97527fc03cdb061759e2c9529c670ac1c190ef84Brian Wellington },
e1c2a8b9c120bcfc2f56e866ca3069b8a90c38dbMark Andrews
e1c2a8b9c120bcfc2f56e866ca3069b8a90c38dbMark Andrews VALUE_SETTERS: {},
e1c2a8b9c120bcfc2f56e866ca3069b8a90c38dbMark Andrews
b7064914ca566fdd67cf0fe7e82d586cbb596470Mark Andrews VALUE_GETTERS: {},
b7064914ca566fdd67cf0fe7e82d586cbb596470Mark Andrews
b7064914ca566fdd67cf0fe7e82d586cbb596470Mark Andrews getValue: function(node) {
3e67a87fc6be516ec12afa5aa31c2c04d5a6ae17Brian Wellington var ret = '', // TODO: return null?
3e67a87fc6be516ec12afa5aa31c2c04d5a6ae17Brian Wellington getter;
3e67a87fc6be516ec12afa5aa31c2c04d5a6ae17Brian Wellington
49f62849e5f80add0ee36b0f9b42cdce8de9748aMark Andrews if (node && node[TAG_NAME]) {
e9472e9f18f1c4f1279be2b3147be13a2bb731d0Mark Andrews getter = Y.DOM.VALUE_GETTERS[node[TAG_NAME].toLowerCase()];
e9472e9f18f1c4f1279be2b3147be13a2bb731d0Mark Andrews
e9472e9f18f1c4f1279be2b3147be13a2bb731d0Mark Andrews if (getter) {
e9472e9f18f1c4f1279be2b3147be13a2bb731d0Mark Andrews ret = getter(node);
e9472e9f18f1c4f1279be2b3147be13a2bb731d0Mark Andrews } else {
d073663cb45bef2fff5f9a43b9b6006edfc52483Mark Andrews ret = node.value;
d073663cb45bef2fff5f9a43b9b6006edfc52483Mark Andrews }
d073663cb45bef2fff5f9a43b9b6006edfc52483Mark Andrews }
d83346263dc68358d73de2a8be60846c9c92950eAndreas Gustafsson
cad61731f8e960d9d99034a2a6eaafe1069c405cMark Andrews // workaround for IE8 JSON stringify bug
cad61731f8e960d9d99034a2a6eaafe1069c405cMark Andrews // which converts empty string values to null
54469c2b2262f6a3f09610df69e16e9c75fd1fe5Mark Andrews if (ret === EMPTY_STRING) {
54469c2b2262f6a3f09610df69e16e9c75fd1fe5Mark Andrews ret = EMPTY_STRING; // for real
54469c2b2262f6a3f09610df69e16e9c75fd1fe5Mark Andrews }
90e303b114e56db5809fdd19805243457fa43cd9Olafur Gudmundsson
90e303b114e56db5809fdd19805243457fa43cd9Olafur Gudmundsson return (typeof ret === 'string') ? ret : '';
90e303b114e56db5809fdd19805243457fa43cd9Olafur Gudmundsson },
adbb11147cd5d97d140485fa37e85e66e15cf594Mark Andrews
b938d2af619822a8262c86223cad958511e716a9Andreas Gustafsson setValue: function(node, val) {
adbb11147cd5d97d140485fa37e85e66e15cf594Mark Andrews var setter;
9ab461a6ffed2ae2fe0380c30b69052db7473405Mark Andrews
9ab461a6ffed2ae2fe0380c30b69052db7473405Mark Andrews if (node && node[TAG_NAME]) {
b627356826f7b22e2ef396b80e8394eac76bc109Mark Andrews setter = Y.DOM.VALUE_SETTERS[node[TAG_NAME].toLowerCase()];
77467267d97c781f3f3d050e229a874831e59c3dMark Andrews
13ba983cc86bc7d80d5f66ba09002f7d510a6631Mark Andrews if (setter) {
13ba983cc86bc7d80d5f66ba09002f7d510a6631Mark Andrews setter(node, val);
3036da01090c0d1e11cddc26af16630d6d9c1f39Mark Andrews } else {
84d8c0166ddc63ad5ce64e7d354553de38b9aabdAndreas Gustafsson node.value = val;
da5d1cf1b1aa29ae53a0427be49291b04bd60549Mark Andrews }
66291de2060a1569de3fe9c5f0c1225448868f7aMark Andrews }
66291de2060a1569de3fe9c5f0c1225448868f7aMark Andrews },
6c06bc591a830023e5e7a41cc4b37978b98c0c51Mark Andrews
84d8c0166ddc63ad5ce64e7d354553de38b9aabdAndreas Gustafsson /**
6c06bc591a830023e5e7a41cc4b37978b98c0c51Mark Andrews * Brute force version of contains.
58d943711575376b05b3b3b303922a8a9d7ce9c1Mark Andrews * Used for browsers without contains support for non-HTMLElement Nodes (textNodes, etc).
c36f45e354c0d5b6ab9f821bfe315d0ce9d95a29Mark Andrews * @method _bruteContains
9cec4ca6cac428a46c6d64197c64831dcc02f506Andreas Gustafsson * @private
9cec4ca6cac428a46c6d64197c64831dcc02f506Andreas Gustafsson * @param {HTMLElement} element The containing html element.
9cec4ca6cac428a46c6d64197c64831dcc02f506Andreas Gustafsson * @param {HTMLElement} needle The html element that may be contained.
23fb770906bf1fd98210f16ad660078274242963Mark Andrews * @return {Boolean} Whether or not the element is or contains the needle.
23fb770906bf1fd98210f16ad660078274242963Mark Andrews */
23fb770906bf1fd98210f16ad660078274242963Mark Andrews _bruteContains: function(element, needle) {
0cb27602e5690baa9ab61c7c1430e507536adca7Brian Wellington while (needle) {
0cb27602e5690baa9ab61c7c1430e507536adca7Brian Wellington if (element === needle) {
0cb27602e5690baa9ab61c7c1430e507536adca7Brian Wellington return true;
ff1b064f5e2bf19c8e25f8927d23df5714e666edMark Andrews }
ff1b064f5e2bf19c8e25f8927d23df5714e666edMark Andrews needle = needle.parentNode;
8e40433e347bc487cd70f02487fc7ce947a2422aMark Andrews }
8e40433e347bc487cd70f02487fc7ce947a2422aMark Andrews return false;
8e40433e347bc487cd70f02487fc7ce947a2422aMark Andrews },
880723fb130841459d45695b387651cacd6c9bb8Mark Andrews
880723fb130841459d45695b387651cacd6c9bb8Mark Andrews// TODO: move to Lang?
880723fb130841459d45695b387651cacd6c9bb8Mark Andrews /**
8f44fd4f8d5cefc227ab0fe59cbcbc3979fbc9caAndreas Gustafsson * Memoizes dynamic regular expressions to boost runtime performance.
8f44fd4f8d5cefc227ab0fe59cbcbc3979fbc9caAndreas Gustafsson * @method _getRegExp
8f44fd4f8d5cefc227ab0fe59cbcbc3979fbc9caAndreas Gustafsson * @private
8f44fd4f8d5cefc227ab0fe59cbcbc3979fbc9caAndreas Gustafsson * @param {String} str The string to convert to a regular expression.
fefbb64a751f23c9dcf8bb1e62c6ed40a6a04fb2Mark Andrews * @param {String} flags optional An optinal string of flags.
fefbb64a751f23c9dcf8bb1e62c6ed40a6a04fb2Mark Andrews * @return {RegExp} An instance of RegExp
fefbb64a751f23c9dcf8bb1e62c6ed40a6a04fb2Mark Andrews */
0d6f70f1dbf77cf10e0bae8683c741f5924f6afeMark Andrews _getRegExp: function(str, flags) {
b938d2af619822a8262c86223cad958511e716a9Andreas Gustafsson flags = flags || '';
111e3433d289e8b4ea1260add39baa78c2a46891Mark Andrews Y.DOM._regexCache = Y.DOM._regexCache || {};
cf300e03de3df3ff422db922520bf07c686c86daMark Andrews if (!Y.DOM._regexCache[str + flags]) {
cf300e03de3df3ff422db922520bf07c686c86daMark Andrews Y.DOM._regexCache[str + flags] = new RegExp(str, flags);
cf300e03de3df3ff422db922520bf07c686c86daMark Andrews }
9ac8796f1653d89af589753a3e42c694f35ddd8aMark Andrews return Y.DOM._regexCache[str + flags];
9ac8796f1653d89af589753a3e42c694f35ddd8aMark Andrews },
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson// TODO: make getDoc/Win true privates?
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson /**
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson * returns the appropriate document.
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson * @method _getDoc
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson * @private
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson * @param {HTMLElement} element optional Target element.
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson * @return {Object} The document for the given element or the default document.
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson */
242bba8991b030b7764f0bdca3922d75c34ea51eAndreas Gustafsson _getDoc: function(element) {
f2c49862fb348586bb4b95a5388c86e0c0cbfa2cAndreas Gustafsson element = element || {};
02bdc23f8e3ca0f710e0a40daa15941ab1db6bb2Mark Andrews
45fe575607b91147ed753d175a7255198f14f197Andreas Gustafsson return (element[NODE_TYPE] === 9) ? element : // element === document
ef29912666cc6160f7165558bef017ab3849c5e1Mark Andrews element[OWNER_DOCUMENT] || // element === DOM node
ef29912666cc6160f7165558bef017ab3849c5e1Mark Andrews element.document || // element === window
ef29912666cc6160f7165558bef017ab3849c5e1Mark Andrews Y.config.doc; // default
ef29912666cc6160f7165558bef017ab3849c5e1Mark Andrews },
ef29912666cc6160f7165558bef017ab3849c5e1Mark Andrews
ef29912666cc6160f7165558bef017ab3849c5e1Mark Andrews /**
ef29912666cc6160f7165558bef017ab3849c5e1Mark Andrews * returns the appropriate window.
0cfa2fb26df42f781eca8c4c856d2d0165055bebMark Andrews * @method _getWin
0cfa2fb26df42f781eca8c4c856d2d0165055bebMark Andrews * @private
0cfa2fb26df42f781eca8c4c856d2d0165055bebMark Andrews * @param {HTMLElement} element optional Target element.
0cfa2fb26df42f781eca8c4c856d2d0165055bebMark Andrews * @return {Object} The window for the given element or the default window.
06a949d2ce8d4b4cbfbf4e7a0335316520aafa46Andreas Gustafsson */
06a949d2ce8d4b4cbfbf4e7a0335316520aafa46Andreas Gustafsson _getWin: function(element) {
06a949d2ce8d4b4cbfbf4e7a0335316520aafa46Andreas Gustafsson var doc = Y.DOM._getDoc(element);
0b81e99ddfb01746e667797dedc291fc550d14d3Brian Wellington return doc[DEFAULT_VIEW] || doc[PARENT_WINDOW] || Y.config.win;
0b81e99ddfb01746e667797dedc291fc550d14d3Brian Wellington },
0b81e99ddfb01746e667797dedc291fc550d14d3Brian Wellington
3638017bd3cb8e30874f708a125d1541b680b25eBrian Wellington _batch: function(nodes, fn, arg1, arg2, arg3, etc) {
3638017bd3cb8e30874f708a125d1541b680b25eBrian Wellington fn = (typeof name === 'string') ? Y.DOM[fn] : fn;
3638017bd3cb8e30874f708a125d1541b680b25eBrian Wellington var result,
8771fbe4a2cee7bebd785a486824833d741c7315Brian Wellington ret = [];
8771fbe4a2cee7bebd785a486824833d741c7315Brian Wellington
8771fbe4a2cee7bebd785a486824833d741c7315Brian Wellington if (fn && nodes) {
b541c10d0442d9804d94567a97956cec3bd2912dBrian Wellington Y.each(nodes, function(node) {
8bb79fc9b9952172d10f56f31739730e38d4b013Brian Wellington if ((result = fn.call(Y.DOM, node, arg1, arg2, arg3, etc)) !== undefined) {
f59d47928ed33d1546e8f982370086429f727e85Andreas Gustafsson ret[ret.length] = result;
f59d47928ed33d1546e8f982370086429f727e85Andreas Gustafsson }
b541c10d0442d9804d94567a97956cec3bd2912dBrian Wellington });
c01237c6bc5ec25063b4aae1799fe4de01a7455bAndreas Gustafsson }
c01237c6bc5ec25063b4aae1799fe4de01a7455bAndreas Gustafsson
c01237c6bc5ec25063b4aae1799fe4de01a7455bAndreas Gustafsson return ret.length ? ret : nodes;
60213f2815a7e6584a2285546d05633fa7b6f5b4Mark Andrews },
c52806164c335f89e1980af836470b6daffe4f82Andreas Gustafsson
60213f2815a7e6584a2285546d05633fa7b6f5b4Mark Andrews _testElement: function(element, tag, fn) {
c52806164c335f89e1980af836470b6daffe4f82Andreas Gustafsson tag = (tag && tag !== '*') ? tag.toUpperCase() : null;
c52806164c335f89e1980af836470b6daffe4f82Andreas Gustafsson return (element && element[TAG_NAME] &&
c52806164c335f89e1980af836470b6daffe4f82Andreas Gustafsson (!tag || element[TAG_NAME].toUpperCase() === tag) &&
6c8abf481df85a67c3f32f5f107b554d3ff5a3edMark Andrews (!fn || fn(element)));
c52806164c335f89e1980af836470b6daffe4f82Andreas Gustafsson },
c52806164c335f89e1980af836470b6daffe4f82Andreas Gustafsson
1e4bfff1855795853648f507422b96fc8fecbff1Mark Andrews creators: {},
6b31d9c56874d3bd58b420cbe6cd64be502dbe08Andreas Gustafsson
892476530f3971aff52f25103d488ece9b01f673Andreas Gustafsson _IESimpleCreate: function(html, doc) {
6b31d9c56874d3bd58b420cbe6cd64be502dbe08Andreas Gustafsson doc = doc || Y.config.doc;
6b31d9c56874d3bd58b420cbe6cd64be502dbe08Andreas Gustafsson return doc.createElement(html);
ee80f4506479e189ca1320eb87ac89188c5a7848Mark Andrews }
ee80f4506479e189ca1320eb87ac89188c5a7848Mark Andrews};
ee80f4506479e189ca1320eb87ac89188c5a7848Mark Andrews
d9d6d2f77fe54831dec9cde8ca03ae1f825599f9Andreas Gustafsson
d9d6d2f77fe54831dec9cde8ca03ae1f825599f9Andreas Gustafsson(function(Y) {
d9d6d2f77fe54831dec9cde8ca03ae1f825599f9Andreas Gustafsson var creators = Y.DOM.creators,
9b2c0d29248ad5f86b47319239a06c783e1b5307Andreas Gustafsson create = Y.DOM.create,
9b2c0d29248ad5f86b47319239a06c783e1b5307Andreas Gustafsson re_tbody = /(?:\/(?:thead|tfoot|tbody|caption|col|colgroup)>)+\s*<tbody/,
eb2c518a3871932e86268e7c6ddae2b2a00d72fdMark Andrews
4072dfb9b865c82c24a72e734d54da51a20dfc1eMark Andrews TABLE_OPEN = '<table>',
4072dfb9b865c82c24a72e734d54da51a20dfc1eMark Andrews TABLE_CLOSE = '</table>';
92094d44a2d0cb2b1be58a87299903ba7c436a0cAndreas Gustafsson
92094d44a2d0cb2b1be58a87299903ba7c436a0cAndreas Gustafsson if (Y.UA.ie) {
92094d44a2d0cb2b1be58a87299903ba7c436a0cAndreas Gustafsson Y.mix(creators, {
11fe3dcfe2a5fbefd0cfe445872dc4c595506204Andreas Gustafsson // TODO: thead/tfoot with nested tbody
11fe3dcfe2a5fbefd0cfe445872dc4c595506204Andreas Gustafsson // IE adds TBODY when creating TABLE elements (which may share this impl)
11fe3dcfe2a5fbefd0cfe445872dc4c595506204Andreas Gustafsson tbody: function(html, doc) {
d1abb8bb020aacd1ce0da65c2d5d8f7c96ebd52aMark Andrews var frag = create(TABLE_OPEN + html + TABLE_CLOSE, doc),
b4aeceec736cd16d4c4e98f519c8df79b15fbe45Andreas Gustafsson tb = frag.children.tags('tbody')[0];
b4aeceec736cd16d4c4e98f519c8df79b15fbe45Andreas Gustafsson
b4aeceec736cd16d4c4e98f519c8df79b15fbe45Andreas Gustafsson if (frag.children.length > 1 && tb && !re_tbody.test(html)) {
307ba34fa07db768c3a899844f248a2c1d7dcc7fAndreas Gustafsson tb[PARENT_NODE].removeChild(tb); // strip extraneous tbody
307ba34fa07db768c3a899844f248a2c1d7dcc7fAndreas Gustafsson }
307ba34fa07db768c3a899844f248a2c1d7dcc7fAndreas Gustafsson return frag;
307ba34fa07db768c3a899844f248a2c1d7dcc7fAndreas Gustafsson },
b6b9d8b8434e4eaab74b69cd14fcacf448055ca5Brian Wellington
b6b9d8b8434e4eaab74b69cd14fcacf448055ca5Brian Wellington script: function(html, doc) {
b6b9d8b8434e4eaab74b69cd14fcacf448055ca5Brian Wellington var frag = doc.createElement('div');
31f6e44dcaad33d66d607e3a919d4aa59cdbaec5Andreas Gustafsson
31f6e44dcaad33d66d607e3a919d4aa59cdbaec5Andreas Gustafsson frag.innerHTML = '-' + html;
31f6e44dcaad33d66d607e3a919d4aa59cdbaec5Andreas Gustafsson frag.removeChild(frag[FIRST_CHILD]);
31f6e44dcaad33d66d607e3a919d4aa59cdbaec5Andreas Gustafsson return frag;
af36ecc41ae6bd73553aacd006ae55474e193b07Andreas Gustafsson }
af36ecc41ae6bd73553aacd006ae55474e193b07Andreas Gustafsson
6d6529b5e5ab7223fa2560ebe144bcb82517cef3Mark Andrews }, true);
0b07b9482c00060d1ddd551a5dcb8cecbe2c1f65Mark Andrews
af36ecc41ae6bd73553aacd006ae55474e193b07Andreas Gustafsson Y.mix(Y.DOM.VALUE_GETTERS, {
0b07b9482c00060d1ddd551a5dcb8cecbe2c1f65Mark Andrews button: function(node) {
c0fe9b0d1b01a9a0883977a362ce4128723a56d6Mark Andrews return (node.attributes && node.attributes.value) ? node.attributes.value.value : '';
c0fe9b0d1b01a9a0883977a362ce4128723a56d6Mark Andrews }
2869504d83e84a91dbc822e8a243e837f5c0374dAndreas Gustafsson });
2869504d83e84a91dbc822e8a243e837f5c0374dAndreas Gustafsson
2869504d83e84a91dbc822e8a243e837f5c0374dAndreas Gustafsson Y.mix(Y.DOM.VALUE_SETTERS, {
138cc7f283889367b11840ff77a9ea08e17a9daeAndreas Gustafsson // IE: node.value changes the button text, which should be handled via innerHTML
ce6caa07591b3723968c22f5aa13740f9609135aAndreas Gustafsson button: function(node, val) {
138cc7f283889367b11840ff77a9ea08e17a9daeAndreas Gustafsson var attr = node.attributes.value;
138cc7f283889367b11840ff77a9ea08e17a9daeAndreas Gustafsson if (!attr) {
ac1a59e95cfd035f38222e739affd43eafa9eeefMark Andrews attr = node[OWNER_DOCUMENT].createAttribute('value');
ac1a59e95cfd035f38222e739affd43eafa9eeefMark Andrews node.setAttributeNode(attr);
58930ca9802e772afe9f5ccb30f236d201cf60e0Danny Mayer }
58930ca9802e772afe9f5ccb30f236d201cf60e0Danny Mayer
58930ca9802e772afe9f5ccb30f236d201cf60e0Danny Mayer attr.value = val;
e3e94dd137c5f9d3d5c5179863f674b27aa0cc02Andreas Gustafsson }
e3e94dd137c5f9d3d5c5179863f674b27aa0cc02Andreas Gustafsson });
e3e94dd137c5f9d3d5c5179863f674b27aa0cc02Andreas Gustafsson }
e3e94dd137c5f9d3d5c5179863f674b27aa0cc02Andreas Gustafsson
7c014c5bf41dc38802e8889c0a9110204eb1a552Andreas Gustafsson if (Y.UA.gecko || Y.UA.ie) {
7c014c5bf41dc38802e8889c0a9110204eb1a552Andreas Gustafsson Y.mix(creators, {
7c014c5bf41dc38802e8889c0a9110204eb1a552Andreas Gustafsson option: function(html, doc) {
7c014c5bf41dc38802e8889c0a9110204eb1a552Andreas Gustafsson return create('<select>' + html + '</select>', doc);
7c014c5bf41dc38802e8889c0a9110204eb1a552Andreas Gustafsson },
3e42bdfdc901b6b921b02028bd51ca2af8e84adcMark Andrews
3e42bdfdc901b6b921b02028bd51ca2af8e84adcMark Andrews tr: function(html, doc) {
2053e8c26cd69600132632fbee247601ce8c9e8cAndreas Gustafsson return create('<tbody>' + html + '</tbody>', doc);
3e42bdfdc901b6b921b02028bd51ca2af8e84adcMark Andrews },
b20eef7ab022dd984e2e9c12f6a7edf35661d3b0Mark Andrews
b20eef7ab022dd984e2e9c12f6a7edf35661d3b0Mark Andrews td: function(html, doc) {
b20eef7ab022dd984e2e9c12f6a7edf35661d3b0Mark Andrews return create('<tr>' + html + '</tr>', doc);
b20eef7ab022dd984e2e9c12f6a7edf35661d3b0Mark Andrews },
b20eef7ab022dd984e2e9c12f6a7edf35661d3b0Mark Andrews
b20eef7ab022dd984e2e9c12f6a7edf35661d3b0Mark Andrews tbody: function(html, doc) {
b20eef7ab022dd984e2e9c12f6a7edf35661d3b0Mark Andrews return create(TABLE_OPEN + html + TABLE_CLOSE, doc);
ea01b618d981e58f85071a40550bc7f7565d4509Andreas Gustafsson }
ea01b618d981e58f85071a40550bc7f7565d4509Andreas Gustafsson });
bad3251d3f7ffccdec39ccfe04d94308985fb36eAndreas Gustafsson
bad3251d3f7ffccdec39ccfe04d94308985fb36eAndreas Gustafsson Y.mix(creators, {
80dd46d7aab16c42a8c1acf6156c95406a9f20a4Mark Andrews legend: 'fieldset',
9eec883bf871ee2235009e889440f986c98908b8Andreas Gustafsson th: creators.td,
993572b2495561c57b556621dd9fe493e8c6dd1bDanny Mayer thead: creators.tbody,
78bf1ca89505820ed7b03be4bf0c0b53b557f3cdAndreas Gustafsson tfoot: creators.tbody,
78bf1ca89505820ed7b03be4bf0c0b53b557f3cdAndreas Gustafsson caption: creators.tbody,
78bf1ca89505820ed7b03be4bf0c0b53b557f3cdAndreas Gustafsson colgroup: creators.tbody,
78bf1ca89505820ed7b03be4bf0c0b53b557f3cdAndreas Gustafsson col: creators.tbody,
088eaf3878580eebbbd2b020411532af278aae5aAndreas Gustafsson optgroup: creators.option
6b13908f7030e09fb4573f3c2f8d7a5edc70e0b5Mark Andrews });
afeabf9f707ca71192041c1132d9f07d7bd83132Mark Andrews }
3842a051baf34ffc4e428cd6f2d4a641e548e6f6Mark Andrews
3842a051baf34ffc4e428cd6f2d4a641e548e6f6Mark Andrews Y.mix(Y.DOM.VALUE_GETTERS, {
46ba6046bcb3b534346de13a4ff5c1513e72936bAndreas Gustafsson option: function(node) {
46ba6046bcb3b534346de13a4ff5c1513e72936bAndreas Gustafsson var attrs = node.attributes;
46ba6046bcb3b534346de13a4ff5c1513e72936bAndreas Gustafsson return (attrs.value && attrs.value.specified) ? node.value : node.text;
a89d1aea0cce6a28a3751cd508db67e38d307a5eDanny Mayer },
04f158ce9a12746eb216892b2bf8259749db254eAndreas Gustafsson
04f158ce9a12746eb216892b2bf8259749db254eAndreas Gustafsson select: function(node) {
04f158ce9a12746eb216892b2bf8259749db254eAndreas Gustafsson var val = node.value,
04f158ce9a12746eb216892b2bf8259749db254eAndreas Gustafsson options = node.options;
62c1fe7b450916acdaf4a3fe65a9b691d5d32f3fBrian Wellington
62c1fe7b450916acdaf4a3fe65a9b691d5d32f3fBrian Wellington if (options && val === '') {
62c1fe7b450916acdaf4a3fe65a9b691d5d32f3fBrian Wellington // TODO: implement multipe select
712bf9b0cc4ed34f4bf33b437f8b0e45853b93ceMark Andrews if (node.multiple) {
712bf9b0cc4ed34f4bf33b437f8b0e45853b93ceMark Andrews Y.log('multiple select normalization not implemented', 'warn', 'DOM');
7e2f4ceafaae4eac1deddc87f906b29a922fff9dAndreas Gustafsson } else {
7e2f4ceafaae4eac1deddc87f906b29a922fff9dAndreas Gustafsson val = Y.DOM.getValue(options[node.selectedIndex], 'value');
7e2f4ceafaae4eac1deddc87f906b29a922fff9dAndreas Gustafsson }
2053e8c26cd69600132632fbee247601ce8c9e8cAndreas Gustafsson }
72499be79fbb68140bd31e0e4ded18a70a5b523bMark Andrews
90c5477ca11a94b0e7d8071181d69544e1ab9be9Mark Andrews return val;
90c5477ca11a94b0e7d8071181d69544e1ab9be9Mark Andrews }
90c5477ca11a94b0e7d8071181d69544e1ab9be9Mark Andrews });
552a117791c17878c5c1b94b0fc3ac4e8491543eMark Andrews})(Y);
552a117791c17878c5c1b94b0fc3ac4e8491543eMark Andrews
f3e4c3d6c536973bae92611402ba55277069eba2Mark Andrews})(Y);
f3e4c3d6c536973bae92611402ba55277069eba2Mark Andrewsvar addClass, hasClass, removeClass;
6fb633bc3fddba07fc9460ffd245b7ee2d459285Mark Andrews
6fb633bc3fddba07fc9460ffd245b7ee2d459285Mark AndrewsY.mix(Y.DOM, {
6fb633bc3fddba07fc9460ffd245b7ee2d459285Mark Andrews /**
ca033e166ca9f9dc7bf010065a93af668a09fd44Mark Andrews * Determines whether a DOM element has the given className.
ca033e166ca9f9dc7bf010065a93af668a09fd44Mark Andrews * @method hasClass
ca033e166ca9f9dc7bf010065a93af668a09fd44Mark Andrews * @param {HTMLElement} element The DOM element.
f9321a16fb8dce8999a43a6d4008c54845305401Mark Andrews * @param {String} className the class name to search for
c8bedec446212b07511ded85ba04a9a3d5965ba8Mark Andrews * @return {Boolean} Whether or not the element has the given class.
c8bedec446212b07511ded85ba04a9a3d5965ba8Mark Andrews */
7a104af70fb3071e7949c4e0e585af18ab362db5Mark Andrews hasClass: function(node, className) {
7a104af70fb3071e7949c4e0e585af18ab362db5Mark Andrews var re = Y.DOM._getRegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
7a104af70fb3071e7949c4e0e585af18ab362db5Mark Andrews return re.test(node.className);
7a104af70fb3071e7949c4e0e585af18ab362db5Mark Andrews },
923de3bb9cf4d619de206544975986a22b18196fMark Andrews
923de3bb9cf4d619de206544975986a22b18196fMark Andrews /**
2359261a252b339f3cef046cefa10ee1e1d4564dMark Andrews * Adds a class name to a given DOM element.
2359261a252b339f3cef046cefa10ee1e1d4564dMark Andrews * @method addClass
769cd7d5dd677434c3dfa27cbfdd8cb76296fcdcMark Andrews * @param {HTMLElement} element The DOM element.
769cd7d5dd677434c3dfa27cbfdd8cb76296fcdcMark Andrews * @param {String} className the class name to add to the class attribute
769cd7d5dd677434c3dfa27cbfdd8cb76296fcdcMark Andrews */
6bad645917a026dfa4662dd0a3a78b9efc3f4c36Mark Andrews addClass: function(node, className) {
6bad645917a026dfa4662dd0a3a78b9efc3f4c36Mark Andrews if (!Y.DOM.hasClass(node, className)) { // skip if already present
11931cc68d6c8139f507a724e7ca9814eed8b552Mark Andrews node.className = Y.Lang.trim([node.className, className].join(' '));
11931cc68d6c8139f507a724e7ca9814eed8b552Mark Andrews }
11931cc68d6c8139f507a724e7ca9814eed8b552Mark Andrews },
64e9b7eafb798c75e9a40948cf05d8847da59d9dAndreas Gustafsson
11931cc68d6c8139f507a724e7ca9814eed8b552Mark Andrews /**
11931cc68d6c8139f507a724e7ca9814eed8b552Mark Andrews * Removes a class name from a given element.
d91d025deffd075db2507d44fab04b79920b3e91Mark Andrews * @method removeClass
d91d025deffd075db2507d44fab04b79920b3e91Mark Andrews * @param {HTMLElement} element The DOM element.
d91d025deffd075db2507d44fab04b79920b3e91Mark Andrews * @param {String} className the class name to remove from the class attribute
985b4f1c8653c6dfaa46652c412838850c0ffb1cMark Andrews */
985b4f1c8653c6dfaa46652c412838850c0ffb1cMark Andrews removeClass: function(node, className) {
c8d9ff1fe871a0e9d5834240c5872a26166cc240Andreas Gustafsson if (className && hasClass(node, className)) {
1d556695ef3c7918ba5061d7d846122d60f5f6c5Mark Andrews node.className = Y.Lang.trim(node.className.replace(Y.DOM._getRegExp('(?:^|\\s+)' +
e9ca87459a20f5e6721b9bd0b28c95fc3d6b843cMark Andrews className + '(?:\\s+|$)'), ' '));
e9ca87459a20f5e6721b9bd0b28c95fc3d6b843cMark Andrews
ca690f98020f75758bc26f4b5ef1ccf0472a27c3Mark Andrews if ( hasClass(node, className) ) { // in case of multiple adjacent
ca690f98020f75758bc26f4b5ef1ccf0472a27c3Mark Andrews removeClass(node, className);
ca690f98020f75758bc26f4b5ef1ccf0472a27c3Mark Andrews }
137a1f98e3862577ae9ccbb6b735ef63a51c456eMark Andrews }
137a1f98e3862577ae9ccbb6b735ef63a51c456eMark Andrews },
5cd7e9d4db393c314dd1a761c52d2cb3a4da9b72Andreas Gustafsson
5cd7e9d4db393c314dd1a761c52d2cb3a4da9b72Andreas Gustafsson /**
5f4804c7e47e3cfe7237d27a354d268b0b7ea73bAndreas Gustafsson * Replace a class with another class for a given element.
5cd7e9d4db393c314dd1a761c52d2cb3a4da9b72Andreas Gustafsson * If no oldClassName is present, the newClassName is simply added.
cc8e8b59d6780889739657226a95e23ca1ecadb1Andreas Gustafsson * @method replaceClass
cc8e8b59d6780889739657226a95e23ca1ecadb1Andreas Gustafsson * @param {HTMLElement} element The DOM element
1418d7292da7ebaba1ba389d60192023c0170245Andreas Gustafsson * @param {String} oldClassName the class name to be replaced
cc8e8b59d6780889739657226a95e23ca1ecadb1Andreas Gustafsson * @param {String} newClassName the class name that will be replacing the old class name
65775fe205e8ac935313c42062c75460e0bc1514Andreas Gustafsson */
65775fe205e8ac935313c42062c75460e0bc1514Andreas Gustafsson replaceClass: function(node, oldC, newC) {
65775fe205e8ac935313c42062c75460e0bc1514Andreas Gustafsson //Y.log('replaceClass replacing ' + oldC + ' with ' + newC, 'info', 'Node');
65775fe205e8ac935313c42062c75460e0bc1514Andreas Gustafsson addClass(node, newC);
17b687ef360ba8c07201dc6511a3c975cc1bb2a8Andreas Gustafsson removeClass(node, oldC);
17b687ef360ba8c07201dc6511a3c975cc1bb2a8Andreas Gustafsson },
17b687ef360ba8c07201dc6511a3c975cc1bb2a8Andreas Gustafsson
17b687ef360ba8c07201dc6511a3c975cc1bb2a8Andreas Gustafsson /**
998358fa900393378c70ad598c2b2e67385089d4Mark Andrews * If the className exists on the node it is removed, if it doesn't exist it is added.
998358fa900393378c70ad598c2b2e67385089d4Mark Andrews * @method toggleClass
2053e8c26cd69600132632fbee247601ce8c9e8cAndreas Gustafsson * @param {HTMLElement} element The DOM element
998358fa900393378c70ad598c2b2e67385089d4Mark Andrews * @param {String} className the class name to be toggled
bc508906db43dda7eab0988348dd0ae3f3023a9bMark Andrews * @param {Boolean} addClass optional boolean to indicate whether class
bc508906db43dda7eab0988348dd0ae3f3023a9bMark Andrews * should be added or removed regardless of current state
bc508906db43dda7eab0988348dd0ae3f3023a9bMark Andrews */
b352902413608d0eb310c4bb45412fa45734afbcAndreas Gustafsson toggleClass: function(node, className, force) {
b352902413608d0eb310c4bb45412fa45734afbcAndreas Gustafsson var add = (force !== undefined) ? force :
b352902413608d0eb310c4bb45412fa45734afbcAndreas Gustafsson !(hasClass(node, className));
b352902413608d0eb310c4bb45412fa45734afbcAndreas Gustafsson
b352902413608d0eb310c4bb45412fa45734afbcAndreas Gustafsson if (add) {
b352902413608d0eb310c4bb45412fa45734afbcAndreas Gustafsson addClass(node, className);
72e8c079c4c6dc66d565cf89ebf6feb5fa2dea33Mark Andrews } else {
72e8c079c4c6dc66d565cf89ebf6feb5fa2dea33Mark Andrews removeClass(node, className);
72e8c079c4c6dc66d565cf89ebf6feb5fa2dea33Mark Andrews }
c8ab83c08e5227b5146295a9ef4a96d61b066b67Andreas Gustafsson }
c8ab83c08e5227b5146295a9ef4a96d61b066b67Andreas Gustafsson});
c8ab83c08e5227b5146295a9ef4a96d61b066b67Andreas Gustafsson
4e57d3ff7d92abdef4b0b6aebc23a9dfae2ba040Andreas GustafssonhasClass = Y.DOM.hasClass;
4e57d3ff7d92abdef4b0b6aebc23a9dfae2ba040Andreas GustafssonremoveClass = Y.DOM.removeClass;
4e57d3ff7d92abdef4b0b6aebc23a9dfae2ba040Andreas GustafssonaddClass = Y.DOM.addClass;
1c398fd83c444d61904d23431d3994139919b68eAndreas Gustafsson
be9932698bf35d0f34e65b5ffbb81bedddd76636Mark Andrews
081cff0c33514a5dc63ab794fc199c07377ab756Mark Andrews
d352f188cb9e3820054b7451384a3d910619b4a1Andreas Gustafsson}, '@VERSION@' ,{requires:['oop']});
d352f188cb9e3820054b7451384a3d910619b4a1Andreas GustafssonYUI.add('dom-style', function(Y) {
d352f188cb9e3820054b7451384a3d910619b4a1Andreas Gustafsson
3d38596530c389610494e6a6ba70d9f5dc9717c5Andreas Gustafsson(function(Y) {
081cff0c33514a5dc63ab794fc199c07377ab756Mark Andrews/**
3d38596530c389610494e6a6ba70d9f5dc9717c5Andreas Gustafsson * Add style management functionality to DOM.
a7cb695600c3c14ac12676f0fb1e179690c5883cMark Andrews * @module dom
a7cb695600c3c14ac12676f0fb1e179690c5883cMark Andrews * @submodule dom-style
a7cb695600c3c14ac12676f0fb1e179690c5883cMark Andrews * @for DOM
479c6fc4584e062088ceee037690cdff85fc349bAndreas Gustafsson */
b19619260fbd447b0fe3e709b2cc8ae38f27ec3fMark Andrews
1500a4fe5da9475d5918b27b566a1278ec6b54ebAndreas Gustafssonvar DOCUMENT_ELEMENT = 'documentElement',
1500a4fe5da9475d5918b27b566a1278ec6b54ebAndreas Gustafsson DEFAULT_VIEW = 'defaultView',
1255d388f034dc556d235a002527101781dbeb29Mark Andrews OWNER_DOCUMENT = 'ownerDocument',
1255d388f034dc556d235a002527101781dbeb29Mark Andrews STYLE = 'style',
c615c2ddce6c08e5a26d9ca61742a20fa8dc1938Mark Andrews FLOAT = 'float',
c615c2ddce6c08e5a26d9ca61742a20fa8dc1938Mark Andrews CSS_FLOAT = 'cssFloat',
c615c2ddce6c08e5a26d9ca61742a20fa8dc1938Mark Andrews STYLE_FLOAT = 'styleFloat',
31d3464c0c0a35236c7924f698c5a8a66a9ed534Mark Andrews TRANSPARENT = 'transparent',
31d3464c0c0a35236c7924f698c5a8a66a9ed534Mark Andrews GET_COMPUTED_STYLE = 'getComputedStyle',
31d3464c0c0a35236c7924f698c5a8a66a9ed534Mark Andrews
f04c15adc7e62deb2f53cc53f32d890936007903Andreas Gustafsson DOCUMENT = Y.config.doc,
f04c15adc7e62deb2f53cc53f32d890936007903Andreas Gustafsson UNDEFINED = undefined,
2f6d1483f665d86501049199b9698554da0eacb0Mark Andrews
53c07ca2164f8a083aa97591345bf4339a8573bdAndreas Gustafsson re_color = /color$/i;
d1029cbcf03a0a2a6c05c1e17e692d844eb27094Andreas Gustafsson
ea7b38cd1e5c6c9e099f1b3a702ba531bc4aba0aMark Andrews
32d248107a5bc92b4bf9fc77deaa55b3da969ba2Andreas GustafssonY.mix(Y.DOM, {
32d248107a5bc92b4bf9fc77deaa55b3da969ba2Andreas Gustafsson CUSTOM_STYLES: {
32d248107a5bc92b4bf9fc77deaa55b3da969ba2Andreas Gustafsson },
32d248107a5bc92b4bf9fc77deaa55b3da969ba2Andreas Gustafsson
4574714ad44ba97f53425fe8d21b7ecb00ac83b9Andreas Gustafsson
4574714ad44ba97f53425fe8d21b7ecb00ac83b9Andreas Gustafsson /**
4574714ad44ba97f53425fe8d21b7ecb00ac83b9Andreas Gustafsson * Sets a style property for a given element.
4574714ad44ba97f53425fe8d21b7ecb00ac83b9Andreas Gustafsson * @method setStyle
4574714ad44ba97f53425fe8d21b7ecb00ac83b9Andreas Gustafsson * @param {HTMLElement} An HTMLElement to apply the style to.
8d8c145175370d2fd8dbdf425b5ac2a9dc19da96Mark Andrews * @param {String} att The style property to set.
8d8c145175370d2fd8dbdf425b5ac2a9dc19da96Mark Andrews * @param {String|Number} val The value.
07eaf0b8d0c3c93d8139c413bf9cc8bba7db9432Mark Andrews */
cf70df7d0e24401a358f0b9c1a616ad0e8c783a6Mark Andrews setStyle: function(node, att, val, style) {
cf70df7d0e24401a358f0b9c1a616ad0e8c783a6Mark Andrews style = style || node.style;
cf70df7d0e24401a358f0b9c1a616ad0e8c783a6Mark Andrews var CUSTOM_STYLES = Y.DOM.CUSTOM_STYLES;
9234d92d4e274791eff42cc4ea5766ed7a281b17Mark Andrews
9234d92d4e274791eff42cc4ea5766ed7a281b17Mark Andrews if (style) {
9234d92d4e274791eff42cc4ea5766ed7a281b17Mark Andrews if (val === null) {
0cf9ce19cc05a60f85ec610106a983fe806ebb77Andreas Gustafsson val = ''; // normalize for unsetting
0cf9ce19cc05a60f85ec610106a983fe806ebb77Andreas Gustafsson }
0cf9ce19cc05a60f85ec610106a983fe806ebb77Andreas Gustafsson if (att in CUSTOM_STYLES) {
0cf9ce19cc05a60f85ec610106a983fe806ebb77Andreas Gustafsson if (CUSTOM_STYLES[att].set) {
42f61e5c46d4824918385e7279c1b71d8ada8e8dAndreas Gustafsson CUSTOM_STYLES[att].set(node, val, style);
2ba574f329c14376d26d7c0f22c89d7a978a2625Mark Andrews return; // NOTE: return
2ba574f329c14376d26d7c0f22c89d7a978a2625Mark Andrews } else if (typeof CUSTOM_STYLES[att] === 'string') {
3c3fe072252aecffae43e6349125663c315b092dAndreas Gustafsson att = CUSTOM_STYLES[att];
3c3fe072252aecffae43e6349125663c315b092dAndreas Gustafsson }
3c3fe072252aecffae43e6349125663c315b092dAndreas Gustafsson }
3c3fe072252aecffae43e6349125663c315b092dAndreas Gustafsson style[att] = val;
64ea5fd972c9946a3fe56cbc0bf897266d3f8747Andreas Gustafsson }
64ea5fd972c9946a3fe56cbc0bf897266d3f8747Andreas Gustafsson },
05a4a299b599195ca6ede9395b245956a8c3a790Mark Andrews
3ad07fa335d40330cd1859da42e67f2457443990Andreas Gustafsson /**
3ad07fa335d40330cd1859da42e67f2457443990Andreas Gustafsson * Returns the current style value for the given property.
3ad07fa335d40330cd1859da42e67f2457443990Andreas Gustafsson * @method getStyle
1094dec52a86e57df53f6167d86de94360a7a382Mark Andrews * @param {HTMLElement} An HTMLElement to get the style from.
1094dec52a86e57df53f6167d86de94360a7a382Mark Andrews * @param {String} att The style property to get.
64ea5fd972c9946a3fe56cbc0bf897266d3f8747Andreas Gustafsson */
1094dec52a86e57df53f6167d86de94360a7a382Mark Andrews getStyle: function(node, att) {
fa2fb620c7c0a907b220c257007d8fb6d38bb3a4Andreas Gustafsson var style = node[STYLE],
5419c0c2d0b77682021084c69f2a5c5e2f9a5525Andreas Gustafsson CUSTOM_STYLES = Y.DOM.CUSTOM_STYLES,
fa2fb620c7c0a907b220c257007d8fb6d38bb3a4Andreas Gustafsson val = '';
fa2fb620c7c0a907b220c257007d8fb6d38bb3a4Andreas Gustafsson
fa2fb620c7c0a907b220c257007d8fb6d38bb3a4Andreas Gustafsson if (style) {
62a3dbe63e833f2eaf613393399ea4667d8de28dAndreas Gustafsson if (att in CUSTOM_STYLES) {
62a3dbe63e833f2eaf613393399ea4667d8de28dAndreas Gustafsson if (CUSTOM_STYLES[att].get) {
62a3dbe63e833f2eaf613393399ea4667d8de28dAndreas Gustafsson return CUSTOM_STYLES[att].get(node, att, style); // NOTE: return
62a3dbe63e833f2eaf613393399ea4667d8de28dAndreas Gustafsson } else if (typeof CUSTOM_STYLES[att] === 'string') {
62a3dbe63e833f2eaf613393399ea4667d8de28dAndreas Gustafsson att = CUSTOM_STYLES[att];
248732d66fffb557e84264c2bb2fb43ac766163fAndreas Gustafsson }
9bdb01e6c382e897572791b12190472955994d87Mark Andrews }
9bdb01e6c382e897572791b12190472955994d87Mark Andrews val = style[att];
e69b9ffb0f8b4d1117a682908c9143ebe3efcd6bAndreas Gustafsson if (val === '') { // TODO: is empty string sufficient?
e69b9ffb0f8b4d1117a682908c9143ebe3efcd6bAndreas Gustafsson val = Y.DOM[GET_COMPUTED_STYLE](node, att);
e69b9ffb0f8b4d1117a682908c9143ebe3efcd6bAndreas Gustafsson }
417872b98aec720d587a9ef0197e25e78a2b7ee9Mark Andrews }
417872b98aec720d587a9ef0197e25e78a2b7ee9Mark Andrews
5419c0c2d0b77682021084c69f2a5c5e2f9a5525Andreas Gustafsson return val;
a77ad145d0109081c5da6ac40a2303369db89735Andreas Gustafsson },
8ba4e82f5358815fd94f34fde408ffd047ba3430Andreas Gustafsson
8ba4e82f5358815fd94f34fde408ffd047ba3430Andreas Gustafsson /**
61d5bfc06be978ea962b1c64309894ac80351771Mark Andrews * Sets multiple style properties.
ada9b8ab20b81716c7ff1f4f3365929b2f7c8ff8Mark Andrews * @method setStyles
ada9b8ab20b81716c7ff1f4f3365929b2f7c8ff8Mark Andrews * @param {HTMLElement} node An HTMLElement to apply the styles to.
ada9b8ab20b81716c7ff1f4f3365929b2f7c8ff8Mark Andrews * @param {Object} hash An object literal of property:value pairs.
3c9b2e62502460c34c2e0ceba1a5d138b3a13cc1Andreas Gustafsson */
3c9b2e62502460c34c2e0ceba1a5d138b3a13cc1Andreas Gustafsson setStyles: function(node, hash) {
3c9b2e62502460c34c2e0ceba1a5d138b3a13cc1Andreas Gustafsson var style = node.style;
1beaa9e45738ad18cb7cae55aea95a1b16a14f94Andreas Gustafsson Y.each(hash, function(v, n) {
bb60abb44549428414cd55a022f2b8cc4488f7adAndreas Gustafsson Y.DOM.setStyle(node, n, v, style);
bb60abb44549428414cd55a022f2b8cc4488f7adAndreas Gustafsson }, Y.DOM);
bb60abb44549428414cd55a022f2b8cc4488f7adAndreas Gustafsson },
bb60abb44549428414cd55a022f2b8cc4488f7adAndreas Gustafsson
024face21cdfbfc7a862a3be061e6780533ef755Andreas Gustafsson /**
024face21cdfbfc7a862a3be061e6780533ef755Andreas Gustafsson * Returns the computed style for the given node.
024face21cdfbfc7a862a3be061e6780533ef755Andreas Gustafsson * @method getComputedStyle
1beaa9e45738ad18cb7cae55aea95a1b16a14f94Andreas Gustafsson * @param {HTMLElement} An HTMLElement to get the style from.
1beaa9e45738ad18cb7cae55aea95a1b16a14f94Andreas Gustafsson * @param {String} att The style property to get.
1beaa9e45738ad18cb7cae55aea95a1b16a14f94Andreas Gustafsson * @return {String} The computed value of the style property.
f953788d75c7df2db43907c68da18ed75c235dd3Andreas Gustafsson */
f953788d75c7df2db43907c68da18ed75c235dd3Andreas Gustafsson getComputedStyle: function(node, att) {
f953788d75c7df2db43907c68da18ed75c235dd3Andreas Gustafsson var val = '',
9df7cf8ea31d8d26f9c1be55f2cdafdc68d63c53Andreas Gustafsson doc = node[OWNER_DOCUMENT];
cf638fc378d74dd4afa59fe11d04da7b0cddca88Andreas Gustafsson
fbdde79262a4ba2bdf4bfae61167026b3220488aAndreas Gustafsson if (node[STYLE]) {
4fa5d53e750b4e34e19b9648900d489315b185eaAndreas Gustafsson val = doc[DEFAULT_VIEW][GET_COMPUTED_STYLE](node, null)[att];
4fa5d53e750b4e34e19b9648900d489315b185eaAndreas Gustafsson }
fbdde79262a4ba2bdf4bfae61167026b3220488aAndreas Gustafsson return val;
fbdde79262a4ba2bdf4bfae61167026b3220488aAndreas Gustafsson }
a7e1dcd84ada7e4e4c78f3f281e8a4d99adaf4d1Andreas Gustafsson});
a7e1dcd84ada7e4e4c78f3f281e8a4d99adaf4d1Andreas Gustafsson
a7e1dcd84ada7e4e4c78f3f281e8a4d99adaf4d1Andreas Gustafsson// normalize reserved word float alternatives ("cssFloat" or "styleFloat")
a7e1dcd84ada7e4e4c78f3f281e8a4d99adaf4d1Andreas Gustafssonif (DOCUMENT[DOCUMENT_ELEMENT][STYLE][CSS_FLOAT] !== UNDEFINED) {
3fc4c1434d7ac377c720640e2e925a3af567cccbMark Andrews Y.DOM.CUSTOM_STYLES[FLOAT] = CSS_FLOAT;
2975d0f819762614526c650b9c2077ef22f81328Andreas Gustafsson} else if (DOCUMENT[DOCUMENT_ELEMENT][STYLE][STYLE_FLOAT] !== UNDEFINED) {
2975d0f819762614526c650b9c2077ef22f81328Andreas Gustafsson Y.DOM.CUSTOM_STYLES[FLOAT] = STYLE_FLOAT;
0aba41458d345ea901cf945d47162e5f23647de9Mark Andrews}
0bd2ea544e95601e0f0b056acfa079c99d5f6b57Andreas Gustafsson
0bd2ea544e95601e0f0b056acfa079c99d5f6b57Andreas Gustafsson// fix opera computedStyle default color unit (convert to rgb)
0bd2ea544e95601e0f0b056acfa079c99d5f6b57Andreas Gustafssonif (Y.UA.opera) {
5f7516bee5ace9542701f23fc7723a3e3196802aMark Andrews Y.DOM[GET_COMPUTED_STYLE] = function(node, att) {
79432444e84d2d104119fe6a3d5cbc04b1375bd4Andreas Gustafsson var view = node[OWNER_DOCUMENT][DEFAULT_VIEW],
79432444e84d2d104119fe6a3d5cbc04b1375bd4Andreas Gustafsson val = view[GET_COMPUTED_STYLE](node, '')[att];
2e24e82fc3551e3228bcacaa7c45cb61daa49195Mark Andrews
3c17010ba5a6b8dd8a2bbc550813c7f051f45a08Andreas Gustafsson if (re_color.test(att)) {
3c17010ba5a6b8dd8a2bbc550813c7f051f45a08Andreas Gustafsson val = Y.Color.toRGB(val);
3c17010ba5a6b8dd8a2bbc550813c7f051f45a08Andreas Gustafsson }
d5169236b7260d447e672db8256fdd7c70f5ee1dMark Andrews
df7596a03eea7f1c2df89bd63d3bd4b73f274565Mark Andrews return val;
df7596a03eea7f1c2df89bd63d3bd4b73f274565Mark Andrews };
df7596a03eea7f1c2df89bd63d3bd4b73f274565Mark Andrews
df7596a03eea7f1c2df89bd63d3bd4b73f274565Mark Andrews}
f08782f0923d11227983a352c26301cf703383cfMark Andrews
f08782f0923d11227983a352c26301cf703383cfMark Andrews// safari converts transparent to rgba(), others use "transparent"
b923e278535b4e8d264998a85a6ae1eb4b3aa4c6Andreas Gustafssonif (Y.UA.webkit) {
ed2cefaf0ea367ee408cb7f6a54a413814240fa7Andreas Gustafsson Y.DOM[GET_COMPUTED_STYLE] = function(node, att) {
ed2cefaf0ea367ee408cb7f6a54a413814240fa7Andreas Gustafsson var view = node[OWNER_DOCUMENT][DEFAULT_VIEW],
ed2cefaf0ea367ee408cb7f6a54a413814240fa7Andreas Gustafsson val = view[GET_COMPUTED_STYLE](node, '')[att];
ed2cefaf0ea367ee408cb7f6a54a413814240fa7Andreas Gustafsson
b923e278535b4e8d264998a85a6ae1eb4b3aa4c6Andreas Gustafsson if (val === 'rgba(0, 0, 0, 0)') {
b923e278535b4e8d264998a85a6ae1eb4b3aa4c6Andreas Gustafsson val = TRANSPARENT;
b923e278535b4e8d264998a85a6ae1eb4b3aa4c6Andreas Gustafsson }
b923e278535b4e8d264998a85a6ae1eb4b3aa4c6Andreas Gustafsson
edf97be2b54cbdc4f3f3a46776df3e912892e960Andreas Gustafsson return val;
edf97be2b54cbdc4f3f3a46776df3e912892e960Andreas Gustafsson };
769ef0b7bdc9520dd62d2f440ea36bc020e88934Andreas Gustafsson
9e46f410e716f73abb345be215ccb4c61782b718Andreas Gustafsson}
9e46f410e716f73abb345be215ccb4c61782b718Andreas Gustafsson})(Y);
9e46f410e716f73abb345be215ccb4c61782b718Andreas Gustafsson(function(Y) {
769ef0b7bdc9520dd62d2f440ea36bc020e88934Andreas Gustafssonvar PARSE_INT = parseInt,
769ef0b7bdc9520dd62d2f440ea36bc020e88934Andreas Gustafsson RE = RegExp;
b09f4e054cbe67b93a5ff62d511ee25945038943Mark Andrews
5419c0c2d0b77682021084c69f2a5c5e2f9a5525Andreas GustafssonY.Color = {
b09f4e054cbe67b93a5ff62d511ee25945038943Mark Andrews KEYWORDS: {
3d3445447225ab63f49fc24362963ea49ce94901Andreas Gustafsson black: '000',
3d3445447225ab63f49fc24362963ea49ce94901Andreas Gustafsson silver: 'c0c0c0',
3d3445447225ab63f49fc24362963ea49ce94901Andreas Gustafsson gray: '808080',
40dd9cb8cc240c33d820fe79f176ed51e4c06a1aMark Andrews white: 'fff',
96ea98af241ef00395f4e61de7e2dacfd9941afcMark Andrews maroon: '800000',
96ea98af241ef00395f4e61de7e2dacfd9941afcMark Andrews red: 'f00',
3dff229f5dd223568476acec4df1f513acb00b1dAndreas Gustafsson purple: '800080',
3dff229f5dd223568476acec4df1f513acb00b1dAndreas Gustafsson fuchsia: 'f0f',
54c4aa0f62aebeb01b6861ee068c1044433fe8feMark Andrews green: '008000',
792de65053d8a48d05746b35a21a9fa1792e71acAndreas Gustafsson lime: '0f0',
792de65053d8a48d05746b35a21a9fa1792e71acAndreas Gustafsson olive: '808000',
792de65053d8a48d05746b35a21a9fa1792e71acAndreas Gustafsson yellow: 'ff0',
808b909f27c30d36b27efb5aa5ef2d18f83b6d4bAndreas Gustafsson navy: '000080',
846474d5a6aa21cebb3e94243a11faa5c20200bfAndreas Gustafsson blue: '00f',
3e934267660cb13029bcdbddf318fe1cc27b6718Andreas Gustafsson teal: '008080',
3e934267660cb13029bcdbddf318fe1cc27b6718Andreas Gustafsson aqua: '0ff'
846474d5a6aa21cebb3e94243a11faa5c20200bfAndreas Gustafsson },
7655e78c366cc0d25e24e2a96ba58e04a96042faAndreas Gustafsson
7655e78c366cc0d25e24e2a96ba58e04a96042faAndreas Gustafsson re_RGB: /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
7655e78c366cc0d25e24e2a96ba58e04a96042faAndreas Gustafsson re_hex: /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
6859033d425170380bcfac4809257bc6e9b60383Andreas Gustafsson re_hex3: /([0-9A-F])/gi,
6859033d425170380bcfac4809257bc6e9b60383Andreas Gustafsson
6859033d425170380bcfac4809257bc6e9b60383Andreas Gustafsson toRGB: function(val) {
f558da602e8b74ed181d9189f20bf32dfa6d8723Brian Wellington if (!Y.Color.re_RGB.test(val)) {
5419c0c2d0b77682021084c69f2a5c5e2f9a5525Andreas Gustafsson val = Y.Color.toHex(val);
f558da602e8b74ed181d9189f20bf32dfa6d8723Brian Wellington }
ff4322d44f8404683b6fb6c86a38a2bc14f6c083Andreas Gustafsson
ff4322d44f8404683b6fb6c86a38a2bc14f6c083Andreas Gustafsson if(Y.Color.re_hex.exec(val)) {
ff4322d44f8404683b6fb6c86a38a2bc14f6c083Andreas Gustafsson val = 'rgb(' + [
8d146b6e1156f5b562af9a4a9aba76b09650412cAndreas Gustafsson PARSE_INT(RE.$1, 16),
8d146b6e1156f5b562af9a4a9aba76b09650412cAndreas Gustafsson PARSE_INT(RE.$2, 16),
8d146b6e1156f5b562af9a4a9aba76b09650412cAndreas Gustafsson PARSE_INT(RE.$3, 16)
8d146b6e1156f5b562af9a4a9aba76b09650412cAndreas Gustafsson ].join(', ') + ')';
808b909f27c30d36b27efb5aa5ef2d18f83b6d4bAndreas Gustafsson }
808b909f27c30d36b27efb5aa5ef2d18f83b6d4bAndreas Gustafsson return val;
808b909f27c30d36b27efb5aa5ef2d18f83b6d4bAndreas Gustafsson },
595a14576ea14884c35b3726f054f2065365620bMark Andrews
595a14576ea14884c35b3726f054f2065365620bMark Andrews toHex: function(val) {
595a14576ea14884c35b3726f054f2065365620bMark Andrews val = Y.Color.KEYWORDS[val] || val;
640923da589bc5b8492ac407ef89ea1ee9a1c358Andreas Gustafsson if (Y.Color.re_RGB.exec(val)) {
d9e690eb71bde3c748208733ba40a34e9d0ba29dAndreas Gustafsson val = [
d9e690eb71bde3c748208733ba40a34e9d0ba29dAndreas Gustafsson Number(RE.$1).toString(16),
1299e93989afbe1fee0739811b05fd1641ea14aeAndreas Gustafsson Number(RE.$2).toString(16),
1299e93989afbe1fee0739811b05fd1641ea14aeAndreas Gustafsson Number(RE.$3).toString(16)
640923da589bc5b8492ac407ef89ea1ee9a1c358Andreas Gustafsson ];
640923da589bc5b8492ac407ef89ea1ee9a1c358Andreas Gustafsson
640923da589bc5b8492ac407ef89ea1ee9a1c358Andreas Gustafsson for (var i = 0; i < val.length; i++) {
640923da589bc5b8492ac407ef89ea1ee9a1c358Andreas Gustafsson if (val[i].length < 2) {
1299e93989afbe1fee0739811b05fd1641ea14aeAndreas Gustafsson val[i] = '0' + val[i];
0bd1b2fbfed4aa489e9d5fcbc7f48acb96ba7248Mark Andrews }
aa30ee42c4b6da9bab4fb84d6cbbda6036a4d426Mark Andrews }
aa30ee42c4b6da9bab4fb84d6cbbda6036a4d426Mark Andrews
aa30ee42c4b6da9bab4fb84d6cbbda6036a4d426Mark Andrews val = val.join('');
1de63e34f163b7a4708a6ad1779f93ae7636b92eAndreas Gustafsson }
01446841be2b73f9a2ead74056df2d5342414041Andreas Gustafsson
01446841be2b73f9a2ead74056df2d5342414041Andreas Gustafsson if (val.length < 6) {
01446841be2b73f9a2ead74056df2d5342414041Andreas Gustafsson val = val.replace(Y.Color.re_hex3, '$1$1');
01446841be2b73f9a2ead74056df2d5342414041Andreas Gustafsson }
28cf7340b9c82fc62ca1a1782cb1bd7b0de11aebAndreas Gustafsson
28cf7340b9c82fc62ca1a1782cb1bd7b0de11aebAndreas Gustafsson if (val !== 'transparent' && val.indexOf('#') < 0) {
28cf7340b9c82fc62ca1a1782cb1bd7b0de11aebAndreas Gustafsson val = '#' + val;
1de63e34f163b7a4708a6ad1779f93ae7636b92eAndreas Gustafsson }
1de63e34f163b7a4708a6ad1779f93ae7636b92eAndreas Gustafsson
feb1f6a4ac42988558ecb8dc5dc0c974ec1f0509Brian Wellington return val.toUpperCase();
feb1f6a4ac42988558ecb8dc5dc0c974ec1f0509Brian Wellington }
ea34bcc6376555296a08e4c9e2f9c2cbe58378a9Andreas Gustafsson};
ea34bcc6376555296a08e4c9e2f9c2cbe58378a9Andreas Gustafsson})(Y);
d1a6976967d6cfd93f5a8d80878215691ac8fe74Mark Andrews
5e4c83cfec3f267ea8f22fbb535c61434c94d43cDanny Mayer(function(Y) {
06f12c290c7904f0723094b5cbd11e2a1d49e95eAndreas Gustafssonvar HAS_LAYOUT = 'hasLayout',
06f12c290c7904f0723094b5cbd11e2a1d49e95eAndreas Gustafsson PX = 'px',
5e4c83cfec3f267ea8f22fbb535c61434c94d43cDanny Mayer FILTER = 'filter',
6e1b2ebcd65c6d0cc90d7789f884aea11184eb5dAndreas Gustafsson FILTERS = 'filters',
1299e93989afbe1fee0739811b05fd1641ea14aeAndreas Gustafsson OPACITY = 'opacity',
e6f17474cb43a138bf7fc9ad30c6b3a2847cb7a7Mark Andrews AUTO = 'auto',
5fe21da364d4397c9a413fe689ce82dea36a7b29Mark Andrews
5fe21da364d4397c9a413fe689ce82dea36a7b29Mark Andrews BORDER_WIDTH = 'borderWidth',
5fe21da364d4397c9a413fe689ce82dea36a7b29Mark Andrews BORDER_TOP_WIDTH = 'borderTopWidth',
a5aca6df165c601d755b8c5f5727048078bf0db5Andreas Gustafsson BORDER_RIGHT_WIDTH = 'borderRightWidth',
43efd9fa56b03e3e285fb58859efc9348c7f4a9fMark Andrews BORDER_BOTTOM_WIDTH = 'borderBottomWidth',
43efd9fa56b03e3e285fb58859efc9348c7f4a9fMark Andrews BORDER_LEFT_WIDTH = 'borderLeftWidth',
43efd9fa56b03e3e285fb58859efc9348c7f4a9fMark Andrews WIDTH = 'width',
5c831a1a1b14470037de6d8bc0501aea5dc6cacdAndreas Gustafsson HEIGHT = 'height',
36e37042c6c9252cdf6eb99bd71ccb6e6c43ba6dBrian Wellington TRANSPARENT = 'transparent',
98e231525fda817d393ef0c529b50bfc08cebe47Mark Andrews VISIBLE = 'visible',
98e231525fda817d393ef0c529b50bfc08cebe47Mark Andrews GET_COMPUTED_STYLE = 'getComputedStyle',
98e231525fda817d393ef0c529b50bfc08cebe47Mark Andrews UNDEFINED = undefined,
d4196128b31d511c8513edacc70dea7e8d0c053aMark Andrews documentElement = document.documentElement,
d4196128b31d511c8513edacc70dea7e8d0c053aMark Andrews
d4196128b31d511c8513edacc70dea7e8d0c053aMark Andrews // TODO: unit-less lineHeight (e.g. 1.22)
4a20a92f4f96cf2b2fd77898c6afec6c45e481b3Andreas Gustafsson 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,
4a20a92f4f96cf2b2fd77898c6afec6c45e481b3Andreas Gustafsson
4a20a92f4f96cf2b2fd77898c6afec6c45e481b3Andreas Gustafsson _getStyleObj = function(node) {
4a20a92f4f96cf2b2fd77898c6afec6c45e481b3Andreas Gustafsson return node.currentStyle || node.style;
4a20a92f4f96cf2b2fd77898c6afec6c45e481b3Andreas Gustafsson },
4a20a92f4f96cf2b2fd77898c6afec6c45e481b3Andreas Gustafsson
56d69016f4fae2eda4d39c92fe13595251aaadd3Mark Andrews ComputedStyle = {
e60b3717f0e6f28d6fb2c5124ffb3bd31cc3a746Mark Andrews CUSTOM_STYLES: {},
e60b3717f0e6f28d6fb2c5124ffb3bd31cc3a746Mark Andrews
0262406cea5802a717539247cbaa596ac808efa9Mark Andrews get: function(el, property) {
3d8ab44d14f3de797b8454fc2edb7421a6bfc874Andreas Gustafsson var value = '',
3d8ab44d14f3de797b8454fc2edb7421a6bfc874Andreas Gustafsson current;
3d8ab44d14f3de797b8454fc2edb7421a6bfc874Andreas Gustafsson
3426f7118c92cab8714a7fddc9e721ff09554447Andreas Gustafsson if (el) {
db235e65884c04058cc6e99ca485170d67cf9538Andreas Gustafsson current = _getStyleObj(el)[property];
db235e65884c04058cc6e99ca485170d67cf9538Andreas Gustafsson
3426f7118c92cab8714a7fddc9e721ff09554447Andreas Gustafsson if (property === OPACITY && Y.DOM.CUSTOM_STYLES[OPACITY]) {
3426f7118c92cab8714a7fddc9e721ff09554447Andreas Gustafsson value = Y.DOM.CUSTOM_STYLES[OPACITY].get(el);
64a5004a66accd190bfd5ddf115667726537be50Andreas Gustafsson } else if (!current || (current.indexOf && current.indexOf(PX) > -1)) { // no need to convert
64a5004a66accd190bfd5ddf115667726537be50Andreas Gustafsson value = current;
64a5004a66accd190bfd5ddf115667726537be50Andreas Gustafsson } else if (Y.DOM.IE.COMPUTED[property]) { // use compute function
64a5004a66accd190bfd5ddf115667726537be50Andreas Gustafsson value = Y.DOM.IE.COMPUTED[property](el, property);
64a5004a66accd190bfd5ddf115667726537be50Andreas Gustafsson } else if (re_unit.test(current)) { // convert to pixel
b1ae7a591a4b99a26036e919b87247b65abfcd77Mark Andrews value = ComputedStyle.getPixel(el, property) + PX;
b1ae7a591a4b99a26036e919b87247b65abfcd77Mark Andrews } else {
b1ae7a591a4b99a26036e919b87247b65abfcd77Mark Andrews value = current;
b1ae7a591a4b99a26036e919b87247b65abfcd77Mark Andrews }
6dbc6fae496db1f584c055e63bcd7afd332fe8f6Andreas Gustafsson }
cab0ee644db604d56b45ec39429d505d635da347Andreas Gustafsson
cab0ee644db604d56b45ec39429d505d635da347Andreas Gustafsson return value;
cab0ee644db604d56b45ec39429d505d635da347Andreas Gustafsson },
cab0ee644db604d56b45ec39429d505d635da347Andreas Gustafsson
7780a3e5a4659bb8fc44f8915d20a8d3ffa33e00Andreas Gustafsson sizeOffsets: {
7780a3e5a4659bb8fc44f8915d20a8d3ffa33e00Andreas Gustafsson width: ['Left', 'Right'],
7780a3e5a4659bb8fc44f8915d20a8d3ffa33e00Andreas Gustafsson height: ['Top', 'Bottom'],
6dbc6fae496db1f584c055e63bcd7afd332fe8f6Andreas Gustafsson top: ['Top'],
6dbc6fae496db1f584c055e63bcd7afd332fe8f6Andreas Gustafsson bottom: ['Bottom']
6dbc6fae496db1f584c055e63bcd7afd332fe8f6Andreas Gustafsson },
6dbc6fae496db1f584c055e63bcd7afd332fe8f6Andreas Gustafsson
6dbc6fae496db1f584c055e63bcd7afd332fe8f6Andreas Gustafsson getOffset: function(el, prop) {
a24d253a3f4e6f4036800744b348fba858d4959eMark Andrews var current = _getStyleObj(el)[prop], // value of "width", "top", etc.
a24d253a3f4e6f4036800744b348fba858d4959eMark Andrews capped = prop.charAt(0).toUpperCase() + prop.substr(1), // "Width", "Top", etc.
847169dab2d0496df1d66842b2cce67c66bf9680Andreas Gustafsson offset = 'offset' + capped, // "offsetWidth", "offsetTop", etc.
3f543c371fff724d1fb05eb564f732476e946b5bBrian Wellington pixel = 'pixel' + capped, // "pixelWidth", "pixelTop", etc.
5419c0c2d0b77682021084c69f2a5c5e2f9a5525Andreas Gustafsson sizeOffsets = ComputedStyle.sizeOffsets[prop],
3f543c371fff724d1fb05eb564f732476e946b5bBrian Wellington value = '';
847169dab2d0496df1d66842b2cce67c66bf9680Andreas Gustafsson
847169dab2d0496df1d66842b2cce67c66bf9680Andreas Gustafsson // IE pixelWidth incorrect for percent
847169dab2d0496df1d66842b2cce67c66bf9680Andreas Gustafsson // manually compute by subtracting padding and border from offset size
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews // NOTE: clientWidth/Height (size minus border) is 0 when current === AUTO so offsetHeight is used
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews // reverting to auto from auto causes position stacking issues (old impl)
ed03e26c44347ec20aff6608de6082e3594d95fbMark Andrews if (current === AUTO || current.indexOf('%') > -1) {
ed03e26c44347ec20aff6608de6082e3594d95fbMark Andrews value = el['offset' + capped];
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews
e8d86192fc424f49e43df9cee439ca5c793e6000Mark Andrews if (sizeOffsets[0]) {
e8d86192fc424f49e43df9cee439ca5c793e6000Mark Andrews value -= ComputedStyle.getPixel(el, 'padding' + sizeOffsets[0]);
e8d86192fc424f49e43df9cee439ca5c793e6000Mark Andrews value -= ComputedStyle.getBorderWidth(el, 'border' + sizeOffsets[0] + 'Width', 1);
bae5d9fcb4616005fbc861e327b0a48b7bd4d89aMark Andrews }
bae5d9fcb4616005fbc861e327b0a48b7bd4d89aMark Andrews
e8d86192fc424f49e43df9cee439ca5c793e6000Mark Andrews if (sizeOffsets[1]) {
1299e93989afbe1fee0739811b05fd1641ea14aeAndreas Gustafsson value -= ComputedStyle.getPixel(el, 'padding' + sizeOffsets[1]);
98a5dc52bf668b093cda7901c057f7b54e18a2fcAndreas Gustafsson value -= ComputedStyle.getBorderWidth(el, 'border' + sizeOffsets[1] + 'Width', 1);
98a5dc52bf668b093cda7901c057f7b54e18a2fcAndreas Gustafsson }
98a5dc52bf668b093cda7901c057f7b54e18a2fcAndreas Gustafsson
98a5dc52bf668b093cda7901c057f7b54e18a2fcAndreas Gustafsson } else { // use style.pixelWidth, etc. to convert to pixels
5af0708e7fd78976a33de70f9380785f4086a1f0Andreas Gustafsson // need to map style.width to currentStyle (no currentStyle.pixelWidth)
98a5dc52bf668b093cda7901c057f7b54e18a2fcAndreas Gustafsson if (!el.style[pixel] && !el.style[prop]) {
98a5dc52bf668b093cda7901c057f7b54e18a2fcAndreas Gustafsson el.style[prop] = current;
452b30ddb32dd9370b2e5ee10427dd3758ef98b4Mark Andrews }
452b30ddb32dd9370b2e5ee10427dd3758ef98b4Mark Andrews value = el.style[pixel];
452b30ddb32dd9370b2e5ee10427dd3758ef98b4Mark Andrews
452b30ddb32dd9370b2e5ee10427dd3758ef98b4Mark Andrews }
6668eca26bf3123750afda48b69991bd29d83807Mark Andrews return value + PX;
1299e93989afbe1fee0739811b05fd1641ea14aeAndreas Gustafsson },
6668eca26bf3123750afda48b69991bd29d83807Mark Andrews
773e64ec150c33269e748d96dd95726ed7e0d842Mark Andrews borderMap: {
06a960c681566a163af5b9a655cf36023075ddcbMark Andrews thin: '2px',
cb8fd52bbeaf40c9166a0144541c4ff2bafc2dd6Andreas Gustafsson medium: '4px',
1eaad22e111709254c70953a4dc768b6d4d31646Mark Andrews thick: '6px'
cad3210bb95057a37aaed20bc8a1542e0534422cAndreas Gustafsson },
cad3210bb95057a37aaed20bc8a1542e0534422cAndreas Gustafsson
cad3210bb95057a37aaed20bc8a1542e0534422cAndreas Gustafsson getBorderWidth: function(el, property, omitUnit) {
cad3210bb95057a37aaed20bc8a1542e0534422cAndreas Gustafsson var unit = omitUnit ? '' : PX,
cad3210bb95057a37aaed20bc8a1542e0534422cAndreas Gustafsson current = el.currentStyle[property];
cad3210bb95057a37aaed20bc8a1542e0534422cAndreas Gustafsson
cad3210bb95057a37aaed20bc8a1542e0534422cAndreas Gustafsson if (current.indexOf(PX) < 0) { // look up keywords
afeded2289de8d193b072da2b44a2d580cc235c1Danny Mayer if (ComputedStyle.borderMap[current]) {
afeded2289de8d193b072da2b44a2d580cc235c1Danny Mayer current = ComputedStyle.borderMap[current];
afeded2289de8d193b072da2b44a2d580cc235c1Danny Mayer } else {
afeded2289de8d193b072da2b44a2d580cc235c1Danny Mayer Y.log('borderWidth computing not implemented', 'warn', 'dom-ie-style');
afeded2289de8d193b072da2b44a2d580cc235c1Danny Mayer }
afeded2289de8d193b072da2b44a2d580cc235c1Danny Mayer }
afeded2289de8d193b072da2b44a2d580cc235c1Danny Mayer return (omitUnit) ? parseFloat(current) : current;
afeded2289de8d193b072da2b44a2d580cc235c1Danny Mayer },
f462b9aed23b77bda867301f80ead6990df6f4f8Andreas Gustafsson
89555ff443c8127a533f6c742316c9b1a713cfd5Mark Andrews getPixel: function(node, att) {
aa9a67adeb48069f5c2e5d8936a8ed5aac7d6ad7Andreas Gustafsson // use pixelRight to convert to px
aa9a67adeb48069f5c2e5d8936a8ed5aac7d6ad7Andreas Gustafsson var val = null,
aa9a67adeb48069f5c2e5d8936a8ed5aac7d6ad7Andreas Gustafsson style = _getStyleObj(node),
aa9a67adeb48069f5c2e5d8936a8ed5aac7d6ad7Andreas Gustafsson styleRight = style.right,
aa9a67adeb48069f5c2e5d8936a8ed5aac7d6ad7Andreas Gustafsson current = style[att];
aa9a67adeb48069f5c2e5d8936a8ed5aac7d6ad7Andreas Gustafsson
73ac1894ea64bc50aff7406872d0e9c5df6d9cf6Mark Andrews node.style.right = current;
539cad8f49b38540b7c20c64d1ef456cb2fa7914Andreas Gustafsson val = node.style.pixelRight;
330b421487d7c3a5e699472fe889aa633772057fMark Andrews node.style.right = styleRight; // revert
e22dca2a9ad30d493a869586abed86f7268204f9Mark Andrews
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson return val;
e22dca2a9ad30d493a869586abed86f7268204f9Mark Andrews },
2c0b26955ee32fcee1757ec1be5a8caf8fe695a6Mark Andrews
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson getMargin: function(node, att) {
2c0b26955ee32fcee1757ec1be5a8caf8fe695a6Mark Andrews var val,
2449f41e75d3b3f1c0ec3f05b1603fd8f80d8ae0Mark Andrews style = _getStyleObj(node);
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson
2449f41e75d3b3f1c0ec3f05b1603fd8f80d8ae0Mark Andrews if (style[att] == AUTO) {
ea72586fc5c360539117119ee35e4c3a04b912bcAndreas Gustafsson val = 0;
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson } else {
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews val = ComputedStyle.getPixel(node, att);
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson }
1fdbadc594a49b423052ea342dac74ff1a36089dMark Andrews return val + PX;
a1898260ad19d02e88ab76c1855d33c67add9defMark Andrews },
a1898260ad19d02e88ab76c1855d33c67add9defMark Andrews
a1898260ad19d02e88ab76c1855d33c67add9defMark Andrews getVisibility: function(node, att) {
305b0eda33b16493355db1f1c86313a6f5fbfc3bDanny Mayer var current;
305b0eda33b16493355db1f1c86313a6f5fbfc3bDanny Mayer while ( (current = node.currentStyle) && current[att] == 'inherit') { // NOTE: assignment in test
305b0eda33b16493355db1f1c86313a6f5fbfc3bDanny Mayer node = node.parentNode;
305b0eda33b16493355db1f1c86313a6f5fbfc3bDanny Mayer }
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson return (current) ? current[att] : VISIBLE;
d16b4e8ba885a45933dc6a46f340b76811d60c74Andreas Gustafsson },
d16b4e8ba885a45933dc6a46f340b76811d60c74Andreas Gustafsson
de9833be77ef92c17b35c02d138a0ad8df34dd91Mark Andrews getColor: function(node, att) {
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson var current = _getStyleObj(node)[att];
de9833be77ef92c17b35c02d138a0ad8df34dd91Mark Andrews
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson if (!current || current === TRANSPARENT) {
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson Y.DOM.elementByAxis(node, 'parentNode', null, function(parent) {
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson current = _getStyleObj(parent)[att];
4e400cb7a2edd25af98ebc25fcbb5b36ca08f9a0Mark Andrews if (current && current !== TRANSPARENT) {
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson node = parent;
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson return true;
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson }
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson });
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson }
5419c0c2d0b77682021084c69f2a5c5e2f9a5525Andreas Gustafsson
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson return Y.Color.toRGB(current);
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson },
c0b6c1a5ab50722793cb99b0d8a1e9e910c146a5Andreas Gustafsson
ec5a06ccf7b15f07d20fd872c3dc1ab8f82f2ceaMark Andrews getBorderColor: function(node, att) {
907ec2c618d08d8322b04729779b24bd778d49e7Mark Andrews var current = _getStyleObj(node),
907ec2c618d08d8322b04729779b24bd778d49e7Mark Andrews val = current[att] || current.color;
907ec2c618d08d8322b04729779b24bd778d49e7Mark Andrews return Y.Color.toRGB(Y.Color.toHex(val));
23a020bc1312fc35e7c4ea36df846c550cb13634Andreas Gustafsson }
0a532842050020a1b0577c65f91f38bd022daa78Andreas Gustafsson },
0a532842050020a1b0577c65f91f38bd022daa78Andreas Gustafsson
0a532842050020a1b0577c65f91f38bd022daa78Andreas Gustafsson //fontSize: getPixelFont,
0a532842050020a1b0577c65f91f38bd022daa78Andreas Gustafsson IEComputed = {};
23a020bc1312fc35e7c4ea36df846c550cb13634Andreas Gustafsson
23a020bc1312fc35e7c4ea36df846c550cb13634Andreas Gustafsson// use alpha filter for IE opacity
23a020bc1312fc35e7c4ea36df846c550cb13634Andreas Gustafssontry {
44c141f9471a6bb1fac0cba7880ba768ede2f0c8Brian Wellington if (documentElement.style[OPACITY] === UNDEFINED &&
5419c0c2d0b77682021084c69f2a5c5e2f9a5525Andreas Gustafsson documentElement[FILTERS]) {
ab3eaa20e9a7e56208408563c79b4f8ac01d5e84Andreas Gustafsson Y.DOM.CUSTOM_STYLES[OPACITY] = {
e1a153c3f095e217eea29958950fea36e54862ceAndreas Gustafsson get: function(node) {
e1a153c3f095e217eea29958950fea36e54862ceAndreas Gustafsson var val = 100;
7250c1a2616761395bdb9ae7cd1ba43f20d3edc4Andreas Gustafsson try { // will error if no DXImageTransform
7250c1a2616761395bdb9ae7cd1ba43f20d3edc4Andreas Gustafsson val = node[FILTERS]['DXImageTransform.Microsoft.Alpha'][OPACITY];
7250c1a2616761395bdb9ae7cd1ba43f20d3edc4Andreas Gustafsson
ab3eaa20e9a7e56208408563c79b4f8ac01d5e84Andreas Gustafsson } catch(e) {
c38b92000c0f1a95daaad5468777e165b8047de9Mark Andrews try { // make sure its in the document
4d77dbcfa052c065a87d2d35b116f17b74bae573Andreas Gustafsson val = node[FILTERS]('alpha')[OPACITY];
c38b92000c0f1a95daaad5468777e165b8047de9Mark Andrews } catch(err) {
c38b92000c0f1a95daaad5468777e165b8047de9Mark Andrews Y.log('getStyle: IE opacity filter not found; returning 1', 'warn', 'dom-style');
c38b92000c0f1a95daaad5468777e165b8047de9Mark Andrews }
a5b9c2b208b51b039c8f4006cddf3d37dd781561Brian Wellington }
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson return val / 100;
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson },
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson
22f0b13f28a7df3b348b18848d0ccd745ea88c3cAndreas Gustafsson set: function(node, val, style) {
ee3ab6063dd13b5947d3fbe88b9ce8f38d65df9dBrian Wellington var current,
9261ca5fc8a564968f34e108eb862157471ca50eAndreas Gustafsson styleObj;
ee3ab6063dd13b5947d3fbe88b9ce8f38d65df9dBrian Wellington
d81622b537be1971530cfb459acdbbe7d82d883bBrian Wellington if (val === '') { // normalize inline style behavior
d81622b537be1971530cfb459acdbbe7d82d883bBrian Wellington styleObj = _getStyleObj(node);
a5b9c2b208b51b039c8f4006cddf3d37dd781561Brian Wellington current = (OPACITY in styleObj) ? styleObj[OPACITY] : 1; // revert to original opacity
9261ca5fc8a564968f34e108eb862157471ca50eAndreas Gustafsson val = current;
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson }
a5b9c2b208b51b039c8f4006cddf3d37dd781561Brian Wellington
2da0b7dfbd02fab454b8ba60f1fdb7e2a5cbd2dbMark Andrews if (typeof style[FILTER] == 'string') { // in case not appended
2da0b7dfbd02fab454b8ba60f1fdb7e2a5cbd2dbMark Andrews style[FILTER] = 'alpha(' + OPACITY + '=' + val * 100 + ')';
2da0b7dfbd02fab454b8ba60f1fdb7e2a5cbd2dbMark Andrews
1cb6e8cbe41afade950837319e04da4ccf8649e0Brian Wellington if (!node.currentStyle || !node.currentStyle[HAS_LAYOUT]) {
9261ca5fc8a564968f34e108eb862157471ca50eAndreas Gustafsson style.zoom = 1; // needs layout
1cb6e8cbe41afade950837319e04da4ccf8649e0Brian Wellington }
2033e305852d4b76772885ea73ebfb6776c1f820Mark Andrews }
6443201354efa09f16ada26dab99e9b7f8271521Andreas Gustafsson }
6443201354efa09f16ada26dab99e9b7f8271521Andreas Gustafsson };
6443201354efa09f16ada26dab99e9b7f8271521Andreas Gustafsson }
e980502db40155234b4e8d320b748b34dbaba3a2Brian Wellington} catch(e) {
5419c0c2d0b77682021084c69f2a5c5e2f9a5525Andreas Gustafsson Y.log('document.documentElement.filters error (activeX disabled)', 'warn', 'dom-style');
e980502db40155234b4e8d320b748b34dbaba3a2Brian Wellington}
e980502db40155234b4e8d320b748b34dbaba3a2Brian Wellington
ecd1addb86319bacc6c0bff2c68373619eebbffcMark Andrewstry {
ecd1addb86319bacc6c0bff2c68373619eebbffcMark Andrews document.createElement('div').style.height = '-1px';
0176adc7c58bb8bd60ec71eeae94dbfbbc4018a8Mark Andrews} catch(e) { // IE throws error on invalid style set; trap common cases
0176adc7c58bb8bd60ec71eeae94dbfbbc4018a8Mark Andrews Y.DOM.CUSTOM_STYLES.height = {
ea20115e347264b9bc1c686d6dfc1b5af3a5516bAndreas Gustafsson set: function(node, val, style) {
ea20115e347264b9bc1c686d6dfc1b5af3a5516bAndreas Gustafsson var floatVal = parseFloat(val);
ea20115e347264b9bc1c686d6dfc1b5af3a5516bAndreas Gustafsson if (isNaN(floatVal) || floatVal >= 0) {
bddfe77128b0f16af263ff149db40f0d885f43d0Mark Andrews style.height = val;
bddfe77128b0f16af263ff149db40f0d885f43d0Mark Andrews } else {
aa0dc8d920a1f79626c3564408db9c5c9a5319a7Andreas Gustafsson Y.log('invalid style value for height: ' + val, 'warn', 'dom-style');
aa0dc8d920a1f79626c3564408db9c5c9a5319a7Andreas Gustafsson }
aa0dc8d920a1f79626c3564408db9c5c9a5319a7Andreas Gustafsson }
aa0dc8d920a1f79626c3564408db9c5c9a5319a7Andreas Gustafsson };
47d48791fc352fcdf9019200070221be41a8d77cMark Andrews
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson Y.DOM.CUSTOM_STYLES.width = {
35db8a8eda6a889675138eb125d366c8851f68a5Andreas Gustafsson set: function(node, val, style) {
0d5e7cd0afaee07302f8364aa454f09b4c63ea79Andreas Gustafsson var floatVal = parseFloat(val);
0d5e7cd0afaee07302f8364aa454f09b4c63ea79Andreas Gustafsson if (isNaN(floatVal) || floatVal >= 0) {
5e88852b94830bf71e37dc700d568cb35e2e6f7eAndreas Gustafsson style.width = val;
5e88852b94830bf71e37dc700d568cb35e2e6f7eAndreas Gustafsson } else {
5e88852b94830bf71e37dc700d568cb35e2e6f7eAndreas Gustafsson Y.log('invalid style value for width: ' + val, 'warn', 'dom-style');
5e88852b94830bf71e37dc700d568cb35e2e6f7eAndreas Gustafsson }
22815444822da17fab82d4ab115da6e055ea1754Brian Wellington }
5e88852b94830bf71e37dc700d568cb35e2e6f7eAndreas Gustafsson };
22815444822da17fab82d4ab115da6e055ea1754Brian Wellington}
22815444822da17fab82d4ab115da6e055ea1754Brian Wellington
35db8a8eda6a889675138eb125d366c8851f68a5Andreas Gustafsson// TODO: top, right, bottom, left
35db8a8eda6a889675138eb125d366c8851f68a5Andreas GustafssonIEComputed[WIDTH] = IEComputed[HEIGHT] = ComputedStyle.getOffset;
35db8a8eda6a889675138eb125d366c8851f68a5Andreas Gustafsson
c6de6524d777c90ae8011af8b10f5cac044081e5Mark AndrewsIEComputed.color = IEComputed.backgroundColor = ComputedStyle.getColor;
bd6504aa9aa16a912412fbe010046aaf4bf23621Brian Wellington
bd6504aa9aa16a912412fbe010046aaf4bf23621Brian WellingtonIEComputed[BORDER_WIDTH] = IEComputed[BORDER_TOP_WIDTH] = IEComputed[BORDER_RIGHT_WIDTH] =
5e88852b94830bf71e37dc700d568cb35e2e6f7eAndreas Gustafsson IEComputed[BORDER_BOTTOM_WIDTH] = IEComputed[BORDER_LEFT_WIDTH] =
bd6504aa9aa16a912412fbe010046aaf4bf23621Brian Wellington ComputedStyle.getBorderWidth;
bd6504aa9aa16a912412fbe010046aaf4bf23621Brian Wellington
bd6504aa9aa16a912412fbe010046aaf4bf23621Brian WellingtonIEComputed.marginTop = IEComputed.marginRight = IEComputed.marginBottom =
bd6504aa9aa16a912412fbe010046aaf4bf23621Brian Wellington IEComputed.marginLeft = ComputedStyle.getMargin;
e9596e1fb3dfa560216776acdbfac3cf5ef97157Mark Andrews
e9596e1fb3dfa560216776acdbfac3cf5ef97157Mark AndrewsIEComputed.visibility = ComputedStyle.getVisibility;
1e289d3cca5cdd01dda650fa6e4c1de1aa8b4196Andreas GustafssonIEComputed.borderColor = IEComputed.borderTopColor =
c54210716ee55b55e22d8dad56fd696a641fc98dBob Halley IEComputed.borderRightColor = IEComputed.borderBottomColor =
c54210716ee55b55e22d8dad56fd696a641fc98dBob Halley IEComputed.borderLeftColor = ComputedStyle.getBorderColor;
c54210716ee55b55e22d8dad56fd696a641fc98dBob Halley
c54210716ee55b55e22d8dad56fd696a641fc98dBob Halleyif (!Y.config.win[GET_COMPUTED_STYLE]) {
3fcf6b956f47405750724bd84e1b2290b61c9186Brian Wellington Y.DOM[GET_COMPUTED_STYLE] = ComputedStyle.get;
82c65f4f62819340ef8198932d3eab8a308a4874Andreas Gustafsson}
3fcf6b956f47405750724bd84e1b2290b61c9186Brian Wellington
1e289d3cca5cdd01dda650fa6e4c1de1aa8b4196Andreas GustafssonY.namespace('DOM.IE');
1e289d3cca5cdd01dda650fa6e4c1de1aa8b4196Andreas GustafssonY.DOM.IE.COMPUTED = IEComputed;
0a2d5c990559ce2b9f95df752db6e93024d9a250Brian WellingtonY.DOM.IE.ComputedStyle = ComputedStyle;
96ed62425310854fd6f6f06bfb7651b3e4c17ee7Andreas Gustafsson
96ed62425310854fd6f6f06bfb7651b3e4c17ee7Andreas Gustafsson})(Y);
96ed62425310854fd6f6f06bfb7651b3e4c17ee7Andreas GustafssonY.mix(Y.DOM, {
96ed62425310854fd6f6f06bfb7651b3e4c17ee7Andreas Gustafsson /**
96ed62425310854fd6f6f06bfb7651b3e4c17ee7Andreas Gustafsson * Sets the width of the element to the given size, regardless
96ed62425310854fd6f6f06bfb7651b3e4c17ee7Andreas Gustafsson * of box model, border, padding, etc.
5733d25b06b46067b3751d10436d82aef09cd705Brian Wellington * @method setWidth
82c65f4f62819340ef8198932d3eab8a308a4874Andreas Gustafsson * @param {HTMLElement} element The DOM element.
5733d25b06b46067b3751d10436d82aef09cd705Brian Wellington * @param {String|Int} size The pixel height to size to
5733d25b06b46067b3751d10436d82aef09cd705Brian Wellington */
82c65f4f62819340ef8198932d3eab8a308a4874Andreas Gustafsson
5733d25b06b46067b3751d10436d82aef09cd705Brian Wellington setWidth: function(node, size) {
debff476ad3512687a354499c25d2793e2009acdBrian Wellington Y.DOM._setSize(node, 'width', size);
debff476ad3512687a354499c25d2793e2009acdBrian Wellington },
eb6e3b04169a766d2b968bcc978191605c2ef24cAndreas Gustafsson
eb6e3b04169a766d2b968bcc978191605c2ef24cAndreas Gustafsson /**
eb6e3b04169a766d2b968bcc978191605c2ef24cAndreas Gustafsson * Sets the height of the element to the given size, regardless
eb6e3b04169a766d2b968bcc978191605c2ef24cAndreas Gustafsson * of box model, border, padding, etc.
eb6e3b04169a766d2b968bcc978191605c2ef24cAndreas Gustafsson * @method setHeight
eb6e3b04169a766d2b968bcc978191605c2ef24cAndreas Gustafsson * @param {HTMLElement} element The DOM element.
7d8c3693d0426b56750b14d80c47df5e42fc75e4Andreas Gustafsson * @param {String|Int} size The pixel height to size to
fed846067d265db1037483d81d01f3651c8a3f28Brian Wellington */
82c65f4f62819340ef8198932d3eab8a308a4874Andreas Gustafsson
fed846067d265db1037483d81d01f3651c8a3f28Brian Wellington setHeight: function(node, size) {
a26ad011f382d12058478704cb5e90e6f4366d01Andreas Gustafsson Y.DOM._setSize(node, 'height', size);
a26ad011f382d12058478704cb5e90e6f4366d01Andreas Gustafsson },
a26ad011f382d12058478704cb5e90e6f4366d01Andreas Gustafsson
a26ad011f382d12058478704cb5e90e6f4366d01Andreas Gustafsson _getOffsetProp: function(node, prop) {
57188b5ff2397c0517e55f622879e69ee547918dAndreas Gustafsson return 'offset' + prop.charAt(0).toUpperCase() + prop.substr(1);
7d8c3693d0426b56750b14d80c47df5e42fc75e4Andreas Gustafsson },
7d8c3693d0426b56750b14d80c47df5e42fc75e4Andreas Gustafsson
7d8c3693d0426b56750b14d80c47df5e42fc75e4Andreas Gustafsson _setSize: function(node, prop, val) {
9a72459b6040b30d043c5fd9e283441b847e569aAndreas Gustafsson var offset;
9a72459b6040b30d043c5fd9e283441b847e569aAndreas Gustafsson
07c336a9a85791dff886b1e28514589a25d9b720Andreas Gustafsson Y.DOM.setStyle(node, prop, val + 'px');
07c336a9a85791dff886b1e28514589a25d9b720Andreas Gustafsson offset = node[Y.DOM._getOffsetProp(node, prop)];
07c336a9a85791dff886b1e28514589a25d9b720Andreas Gustafsson val = val - (offset - val);
07c336a9a85791dff886b1e28514589a25d9b720Andreas Gustafsson
07c336a9a85791dff886b1e28514589a25d9b720Andreas Gustafsson // TODO: handle size less than border/padding (add class?)
07c336a9a85791dff886b1e28514589a25d9b720Andreas Gustafsson if (val < 0) {
07c336a9a85791dff886b1e28514589a25d9b720Andreas Gustafsson val = 0; // no negative sizes
712fa28946312882a60b0c6a913914d3e8c69867Mark Andrews }
712fa28946312882a60b0c6a913914d3e8c69867Mark Andrews Y.DOM.setStyle(node, prop, val + 'px');
f2a16ec2e8970615d39f8fe339b215ad0a893b85Mark Andrews }
8bcf7a157900c3a05168aaec708b8c664b96d797Andreas Gustafsson});
63fd201fde27ce408cde1c73a054e401fcfb9e3bDavid Lawrence
f8644da8d948dbc973f6dd4c94a79774e16ec07bDavid Lawrence
f8644da8d948dbc973f6dd4c94a79774e16ec07bDavid Lawrence}, '@VERSION@' ,{requires:['dom-base']});
9bfa90768ab83ea5a8571c98d3774377da4bdcbeDavid LawrenceYUI.add('dom-screen', function(Y) {
9bfa90768ab83ea5a8571c98d3774377da4bdcbeDavid Lawrence
9bfa90768ab83ea5a8571c98d3774377da4bdcbeDavid Lawrence(function(Y) {
9bfa90768ab83ea5a8571c98d3774377da4bdcbeDavid Lawrence
9bfa90768ab83ea5a8571c98d3774377da4bdcbeDavid Lawrence/**
2d67c2474475acf52c8251dc48bfb7565ee5f2ffDavid Lawrence * Adds position and region management functionality to DOM.
2d67c2474475acf52c8251dc48bfb7565ee5f2ffDavid Lawrence * @module dom
2d67c2474475acf52c8251dc48bfb7565ee5f2ffDavid Lawrence * @submodule dom-screen
2d67c2474475acf52c8251dc48bfb7565ee5f2ffDavid Lawrence * @for DOM
6a7a69e9f764812872ec2db775be2ac8bb073102Andreas Gustafsson */
6a7a69e9f764812872ec2db775be2ac8bb073102Andreas Gustafsson
6a7a69e9f764812872ec2db775be2ac8bb073102Andreas Gustafssonvar DOCUMENT_ELEMENT = 'documentElement',
0a9a3d8c6daf9ffcfb62dbe366e26f521cbb9736Brian Wellington COMPAT_MODE = 'compatMode',
8bcf7a157900c3a05168aaec708b8c664b96d797Andreas Gustafsson POSITION = 'position',
0a9a3d8c6daf9ffcfb62dbe366e26f521cbb9736Brian Wellington FIXED = 'fixed',
f5ebf2f0c9e9d2068ace1dbcc2ef2ed3ebdbfde5Andreas Gustafsson RELATIVE = 'relative',
8bcf7a157900c3a05168aaec708b8c664b96d797Andreas Gustafsson LEFT = 'left',
34d5676aac483e00e16056a6834a27b52bed42f0Brian Wellington TOP = 'top',
1d9ab721315555ac75e7d4f57585323909283688Andreas Gustafsson _BACK_COMPAT = 'BackCompat',
1d9ab721315555ac75e7d4f57585323909283688Andreas Gustafsson MEDIUM = 'medium',
1d9ab721315555ac75e7d4f57585323909283688Andreas Gustafsson BORDER_LEFT_WIDTH = 'borderLeftWidth',
63fd201fde27ce408cde1c73a054e401fcfb9e3bDavid Lawrence BORDER_TOP_WIDTH = 'borderTopWidth',
ef8d97818f0d30a4e09db97af695f504b311372cMark Andrews GET_BOUNDING_CLIENT_RECT = 'getBoundingClientRect',
112d9875bf33e2382f9a986d3e58fce08f1935fcOlafur Gudmundsson GET_COMPUTED_STYLE = 'getComputedStyle',
63fd201fde27ce408cde1c73a054e401fcfb9e3bDavid Lawrence
63fd201fde27ce408cde1c73a054e401fcfb9e3bDavid Lawrence // TODO: how about thead/tbody/tfoot/tr?
63fd201fde27ce408cde1c73a054e401fcfb9e3bDavid Lawrence // TODO: does caption matter?
6af5c66df334c4e275e07b03c9b35e40dbaa4f31Andreas Gustafsson RE_TABLE = /^t(?:able|d|h)$/i;
519f8475ff8218e3981ae2b249eb1403da7c52f6Andreas Gustafsson
519f8475ff8218e3981ae2b249eb1403da7c52f6Andreas GustafssonY.mix(Y.DOM, {
edc1c60621b44fbc8131ad1542f657dd129f9a30Andreas Gustafsson /**
edc1c60621b44fbc8131ad1542f657dd129f9a30Andreas Gustafsson * Returns the inner height of the viewport (exludes scrollbar).
edc1c60621b44fbc8131ad1542f657dd129f9a30Andreas Gustafsson * @method winHeight
edc1c60621b44fbc8131ad1542f657dd129f9a30Andreas Gustafsson * @return {Number} The current height of the viewport.
41626c0997c89dcdecf67c931f0031aadd507977Andreas Gustafsson */
41626c0997c89dcdecf67c931f0031aadd507977Andreas Gustafsson winHeight: function(node) {
41626c0997c89dcdecf67c931f0031aadd507977Andreas Gustafsson var h = Y.DOM._getWinSize(node).height;
4f4e44c98f315bfadc6dded1b86b465222a83967David Lawrence Y.log('winHeight returning ' + h, 'info', 'dom-screen');
464c2e4bb960d15bd60d53c3ef3ae7414b129037David Lawrence return h;
464c2e4bb960d15bd60d53c3ef3ae7414b129037David Lawrence },
464c2e4bb960d15bd60d53c3ef3ae7414b129037David Lawrence
6112718b0dbb01ffbfd3fabc61e30c7e4485b0a7David Lawrence /**
6112718b0dbb01ffbfd3fabc61e30c7e4485b0a7David Lawrence * Returns the inner width of the viewport (exludes scrollbar).
6112718b0dbb01ffbfd3fabc61e30c7e4485b0a7David Lawrence * @method winWidth
6112718b0dbb01ffbfd3fabc61e30c7e4485b0a7David Lawrence * @return {Number} The current width of the viewport.
6112718b0dbb01ffbfd3fabc61e30c7e4485b0a7David Lawrence */
6112718b0dbb01ffbfd3fabc61e30c7e4485b0a7David Lawrence winWidth: function(node) {
04260c5c48d234734863f0222e207b6564cd41a8David Lawrence var w = Y.DOM._getWinSize(node).width;
04260c5c48d234734863f0222e207b6564cd41a8David Lawrence Y.log('winWidth returning ' + w, 'info', 'dom-screen');
04260c5c48d234734863f0222e207b6564cd41a8David Lawrence return w;
f479c9ff5576b3d138c7e52cfc2319b185b7ebcfDavid Lawrence },
f479c9ff5576b3d138c7e52cfc2319b185b7ebcfDavid Lawrence
f479c9ff5576b3d138c7e52cfc2319b185b7ebcfDavid Lawrence /**
6c35e4dd17e6562a6b4d106cbf1d824b9f529356David Lawrence * Document height
504f7802d4c9b43db4820f496c4d00e078effa18David Lawrence * @method docHeight
504f7802d4c9b43db4820f496c4d00e078effa18David Lawrence * @return {Number} The current height of the document.
504f7802d4c9b43db4820f496c4d00e078effa18David Lawrence */
504f7802d4c9b43db4820f496c4d00e078effa18David Lawrence docHeight: function(node) {
6af5c66df334c4e275e07b03c9b35e40dbaa4f31Andreas Gustafsson var h = Y.DOM._getDocSize(node).height;
6af5c66df334c4e275e07b03c9b35e40dbaa4f31Andreas Gustafsson Y.log('docHeight returning ' + h, 'info', 'dom-screen');
3b6bcedffe1d326fd9f6aa3bfb1537af0975fab8Brian Wellington return Math.max(h, Y.DOM._getWinSize(node).height);
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson },
3b6bcedffe1d326fd9f6aa3bfb1537af0975fab8Brian Wellington
3b6bcedffe1d326fd9f6aa3bfb1537af0975fab8Brian Wellington /**
841179549b6433e782c164a562eb3422f603533dAndreas Gustafsson * Document width
f808bd34fbd3dd9508e8183e8025635bc330c34aAndreas Gustafsson * @method docWidth
f808bd34fbd3dd9508e8183e8025635bc330c34aAndreas Gustafsson * @return {Number} The current width of the document.
7fe2ead2b3e23f68c1d3c79da51ef5af4f678f7dAndreas Gustafsson */
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson docWidth: function(node) {
f808bd34fbd3dd9508e8183e8025635bc330c34aAndreas Gustafsson var w = Y.DOM._getDocSize(node).width;
841179549b6433e782c164a562eb3422f603533dAndreas Gustafsson Y.log('docWidth returning ' + w, 'info', 'dom-screen');
841179549b6433e782c164a562eb3422f603533dAndreas Gustafsson return Math.max(w, Y.DOM._getWinSize(node).width);
841179549b6433e782c164a562eb3422f603533dAndreas Gustafsson },
841179549b6433e782c164a562eb3422f603533dAndreas Gustafsson
6c6a6c9f5e2b3c6fd72263eac155e4feddb77316Brian Wellington /**
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson * Amount page has been scroll horizontally
6c6a6c9f5e2b3c6fd72263eac155e4feddb77316Brian Wellington * @method docScrollX
2445d14b1a95132a473aa30076d0ce1762027e76Mark Andrews * @return {Number} The current amount the screen is scrolled horizontally.
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson */
2445d14b1a95132a473aa30076d0ce1762027e76Mark Andrews docScrollX: function(node) {
4585aeb2cc84c0e0602da5abf47c31f92ec3b6b2Mark Andrews var doc = Y.DOM._getDoc(node);
4585aeb2cc84c0e0602da5abf47c31f92ec3b6b2Mark Andrews return Math.max(doc[DOCUMENT_ELEMENT].scrollLeft, doc.body.scrollLeft);
ed0e1ae6bc3df39389a24d72cf544b2437bf8340Andreas Gustafsson },
56877490bc70e4004f6b5e4a16067750ca64be85Andreas Gustafsson
56877490bc70e4004f6b5e4a16067750ca64be85Andreas Gustafsson /**
56877490bc70e4004f6b5e4a16067750ca64be85Andreas Gustafsson * Amount page has been scroll vertically
56877490bc70e4004f6b5e4a16067750ca64be85Andreas Gustafsson * @method docScrollY
711c2be7d9d99ee4415bc4e41ebe4f7f31947b3bAndreas Gustafsson * @return {Number} The current amount the screen is scrolled vertically.
56877490bc70e4004f6b5e4a16067750ca64be85Andreas Gustafsson */
56877490bc70e4004f6b5e4a16067750ca64be85Andreas Gustafsson docScrollY: function(node) {
56877490bc70e4004f6b5e4a16067750ca64be85Andreas Gustafsson var doc = Y.DOM._getDoc(node);
af0be81b2f6ea700dd882d3b18468c7815bd5ef2Andreas Gustafsson return Math.max(doc[DOCUMENT_ELEMENT].scrollTop, doc.body.scrollTop);
af0be81b2f6ea700dd882d3b18468c7815bd5ef2Andreas Gustafsson },
af0be81b2f6ea700dd882d3b18468c7815bd5ef2Andreas Gustafsson
ed0e1ae6bc3df39389a24d72cf544b2437bf8340Andreas Gustafsson /**
ed0e1ae6bc3df39389a24d72cf544b2437bf8340Andreas Gustafsson * Gets the current position of an element based on page coordinates.
ed0e1ae6bc3df39389a24d72cf544b2437bf8340Andreas Gustafsson * Element must be part of the DOM tree to have page coordinates
ed0e1ae6bc3df39389a24d72cf544b2437bf8340Andreas Gustafsson * (display:none or elements not appended return false).
ed0e1ae6bc3df39389a24d72cf544b2437bf8340Andreas Gustafsson * @method getXY
ed0e1ae6bc3df39389a24d72cf544b2437bf8340Andreas Gustafsson * @param element The target element
6cefb60af55912df4411389bccfc38a74e992332Mark Andrews * @return {Array} The XY position of the element
6cefb60af55912df4411389bccfc38a74e992332Mark Andrews
6cefb60af55912df4411389bccfc38a74e992332Mark Andrews TODO: test inDocument/display?
02e81689e3eff98a8d70c98a7cc45c150472316aBrian Wellington */
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson getXY: function() {
02e81689e3eff98a8d70c98a7cc45c150472316aBrian Wellington if (document[DOCUMENT_ELEMENT][GET_BOUNDING_CLIENT_RECT]) {
02e81689e3eff98a8d70c98a7cc45c150472316aBrian Wellington return function(node) {
99a8d30559834dc12bd80f4f164fa6375f73cb62Mark Andrews var xy = null,
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence scrollLeft,
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence scrollTop,
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence box,
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence off1, off2,
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence bLeft, bTop,
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence mode,
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence doc;
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence if (node) {
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence if (Y.DOM.inDoc(node)) {
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence scrollLeft = Y.DOM.docScrollX(node);
dccd7f8459d811141fde04d4a307b9b695cf58b1David Lawrence scrollTop = Y.DOM.docScrollY(node);
03f91269f5453bcbd924910ef85a8f8496cf2661Mark Andrews box = node[GET_BOUNDING_CLIENT_RECT]();
03f91269f5453bcbd924910ef85a8f8496cf2661Mark Andrews doc = Y.DOM._getDoc(node);
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson xy = [box.left, box.top];
03f91269f5453bcbd924910ef85a8f8496cf2661Mark Andrews
afb0a628efd8ecf40f66f6b8d0711bca62be2a9aMark Andrews if (Y.UA.ie) {
afb0a628efd8ecf40f66f6b8d0711bca62be2a9aMark Andrews off1 = 2;
17dba29ba5db791976e505114baee53a1dde88aaBrian Wellington off2 = 2;
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson mode = doc[COMPAT_MODE];
aec9f4d0723b0cffcfa9152533fb8f616ec7313bAndreas Gustafsson bLeft = Y.DOM[GET_COMPUTED_STYLE](doc[DOCUMENT_ELEMENT], BORDER_LEFT_WIDTH);
17dba29ba5db791976e505114baee53a1dde88aaBrian Wellington bTop = Y.DOM[GET_COMPUTED_STYLE](doc[DOCUMENT_ELEMENT], BORDER_TOP_WIDTH);
b5a86fe434c7d58d28af3b5c70c1743979f13aaeMark Andrews
b5a86fe434c7d58d28af3b5c70c1743979f13aaeMark Andrews if (Y.UA.ie === 6) {
b5a86fe434c7d58d28af3b5c70c1743979f13aaeMark Andrews if (mode !== _BACK_COMPAT) {
fb13bc029f62193a07d92384a910a0317fc7e0b0Brian Wellington off1 = 0;
3042b3e2711d00b7fd9ffbf51443ad761d30427fMark Andrews off2 = 0;
3042b3e2711d00b7fd9ffbf51443ad761d30427fMark Andrews }
fb13bc029f62193a07d92384a910a0317fc7e0b0Brian Wellington }
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence if ((mode == _BACK_COMPAT)) {
af0be81b2f6ea700dd882d3b18468c7815bd5ef2Andreas Gustafsson if (bLeft !== MEDIUM) {
af0be81b2f6ea700dd882d3b18468c7815bd5ef2Andreas Gustafsson off1 = parseInt(bLeft, 10);
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence }
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence if (bTop !== MEDIUM) {
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence off2 = parseInt(bTop, 10);
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence }
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence }
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence xy[0] -= off1;
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence xy[1] -= off2;
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence }
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence if ((scrollTop || scrollLeft)) {
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence xy[0] += scrollLeft;
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence xy[1] += scrollTop;
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence }
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence } else { // default to current offsets
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence xy = Y.DOM._getOffset(node);
74cc9d733ca94d43310ff3df84d7a4644c0950f9Andreas Gustafsson }
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence }
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence return xy;
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence };
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence } else {
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence return function(node) { // manually calculate by crawling up offsetParents
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence //Calculate the Top and Left border sizes (assumes pixels)
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence var xy = null,
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson parentNode,
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence bCheck,
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence scrollTop,
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence scrollLeft;
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence if (node) {
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence if (Y.DOM.inDoc(node)) {
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence xy = [node.offsetLeft, node.offsetTop];
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence parentNode = node;
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence // TODO: refactor with !! or just falsey
adcd8c93196ad0a3516252d80597c3c52472ffb2David Lawrence bCheck = ((Y.UA.gecko || Y.UA.webkit > 519) ? true : false);
5455f30a7532738d750252c00e649890c694ee30Brian Wellington
5455f30a7532738d750252c00e649890c694ee30Brian Wellington // TODO: worth refactoring for TOP/LEFT only?
e2fd12f3a020ca8c5de168a44fb72e339cdaa3e9Brian Wellington while ((parentNode = parentNode.offsetParent)) {
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson xy[0] += parentNode.offsetLeft;
e2fd12f3a020ca8c5de168a44fb72e339cdaa3e9Brian Wellington xy[1] += parentNode.offsetTop;
cf74d05a50e342e5b3870005c04ae5ed8013ab3eBrian Wellington if (bCheck) {
cf74d05a50e342e5b3870005c04ae5ed8013ab3eBrian Wellington xy = Y.DOM._calcBorders(parentNode, xy);
cf74d05a50e342e5b3870005c04ae5ed8013ab3eBrian Wellington }
cf74d05a50e342e5b3870005c04ae5ed8013ab3eBrian Wellington }
2ae4dd0dbd50b3159476537c60ccdc8b64364356Mark Andrews
89d03d4715120fd0c968775bf0724b5a2a647539Mark Andrews // account for any scrolled ancestors
2ae4dd0dbd50b3159476537c60ccdc8b64364356Mark Andrews if (Y.DOM.getStyle(node, POSITION) != FIXED) {
4fbd6a13a5ba6ec1e9bd080cba86c74b3b92c894Mark Andrews parentNode = node;
761a21dfab558235030ccfc3d61979146e2cf4b5Mark Andrews
f3ac8ee19231ae3018ec21756f19b1bd639ce7e7Andreas Gustafsson while ((parentNode = parentNode.parentNode)) {
f3ac8ee19231ae3018ec21756f19b1bd639ce7e7Andreas Gustafsson scrollTop = parentNode.scrollTop;
af0be81b2f6ea700dd882d3b18468c7815bd5ef2Andreas Gustafsson scrollLeft = parentNode.scrollLeft;
f3ac8ee19231ae3018ec21756f19b1bd639ce7e7Andreas Gustafsson
0b135de5a52acec5bb42f96b4e79484d1629fd93Brian Wellington //Firefox does something funky with borders when overflow is not visible.
82e991b8ed4e0ed3b010d191e0cadfd60226c2d9Andreas Gustafsson if (Y.UA.gecko && (Y.DOM.getStyle(parentNode, 'overflow') !== 'visible')) {
5ce23ccf3f324dc90ab9b4426b1da6284b0e2abfAndreas Gustafsson xy = Y.DOM._calcBorders(parentNode, xy);
5ce23ccf3f324dc90ab9b4426b1da6284b0e2abfAndreas Gustafsson }
5ce23ccf3f324dc90ab9b4426b1da6284b0e2abfAndreas Gustafsson
5ce23ccf3f324dc90ab9b4426b1da6284b0e2abfAndreas Gustafsson
508d17362c2c43ddf95ddc87ae6a8c5f32f35323Andreas Gustafsson if (scrollTop || scrollLeft) {
508d17362c2c43ddf95ddc87ae6a8c5f32f35323Andreas Gustafsson xy[0] -= scrollLeft;
508d17362c2c43ddf95ddc87ae6a8c5f32f35323Andreas Gustafsson xy[1] -= scrollTop;
508d17362c2c43ddf95ddc87ae6a8c5f32f35323Andreas Gustafsson }
508d17362c2c43ddf95ddc87ae6a8c5f32f35323Andreas Gustafsson }
508d17362c2c43ddf95ddc87ae6a8c5f32f35323Andreas Gustafsson xy[0] += Y.DOM.docScrollX(node);
508d17362c2c43ddf95ddc87ae6a8c5f32f35323Andreas Gustafsson xy[1] += Y.DOM.docScrollY(node);
508d17362c2c43ddf95ddc87ae6a8c5f32f35323Andreas Gustafsson
e7a4f58d55042cbc981a70b5071aaea46b9ebf7fAndreas Gustafsson } else {
e7a4f58d55042cbc981a70b5071aaea46b9ebf7fAndreas Gustafsson //Fix FIXED position -- add scrollbars
e7a4f58d55042cbc981a70b5071aaea46b9ebf7fAndreas Gustafsson xy[0] += Y.DOM.docScrollX(node);
e7a4f58d55042cbc981a70b5071aaea46b9ebf7fAndreas Gustafsson xy[1] += Y.DOM.docScrollY(node);
5fdc9aaf401f6816df65d0e9cf701872f345c558Andreas Gustafsson }
5fdc9aaf401f6816df65d0e9cf701872f345c558Andreas Gustafsson } else {
5fdc9aaf401f6816df65d0e9cf701872f345c558Andreas Gustafsson xy = Y.DOM._getOffset(node);
5fdc9aaf401f6816df65d0e9cf701872f345c558Andreas Gustafsson }
6060b0ac76667afae3c9132ab6e3568a7a693f5dAndreas Gustafsson }
6060b0ac76667afae3c9132ab6e3568a7a693f5dAndreas Gustafsson
50097b38c075be55a73bb3737d091c503c70061dBrian Wellington return xy;
50097b38c075be55a73bb3737d091c503c70061dBrian Wellington };
af1a99a13d73126760b755d63ff7ef8c28ca9070Bob Halley }
af1a99a13d73126760b755d63ff7ef8c28ca9070Bob Halley }(),// NOTE: Executing for loadtime branching
af1a99a13d73126760b755d63ff7ef8c28ca9070Bob Halley
af1a99a13d73126760b755d63ff7ef8c28ca9070Bob Halley _getOffset: function(node) {
751aa24c98fea02215cad95a08411af547d70e41Bob Halley var pos,
fd5847ef0954117d5f905dbbfb68f1e67e4f285fAndreas Gustafsson xy = null;
fd5847ef0954117d5f905dbbfb68f1e67e4f285fAndreas Gustafsson
fd5847ef0954117d5f905dbbfb68f1e67e4f285fAndreas Gustafsson if (node) {
82e991b8ed4e0ed3b010d191e0cadfd60226c2d9Andreas Gustafsson pos = Y.DOM.getStyle(node, POSITION);
82e991b8ed4e0ed3b010d191e0cadfd60226c2d9Andreas Gustafsson xy = [
82e991b8ed4e0ed3b010d191e0cadfd60226c2d9Andreas Gustafsson parseInt(Y.DOM[GET_COMPUTED_STYLE](node, LEFT), 10),
82e991b8ed4e0ed3b010d191e0cadfd60226c2d9Andreas Gustafsson parseInt(Y.DOM[GET_COMPUTED_STYLE](node, TOP), 10)
82e991b8ed4e0ed3b010d191e0cadfd60226c2d9Andreas Gustafsson ];
69d44b2f5ac8e35bdb0b80aeb304f5cb62197892Mark Andrews
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson if ( isNaN(xy[0]) ) { // in case of 'auto'
69d44b2f5ac8e35bdb0b80aeb304f5cb62197892Mark Andrews xy[0] = parseInt(Y.DOM.getStyle(node, LEFT), 10); // try inline
f08f3c6caeb8460cb679a8687f61da61fff69fb0Mark Andrews if ( isNaN(xy[0]) ) { // default to offset value
69d44b2f5ac8e35bdb0b80aeb304f5cb62197892Mark Andrews xy[0] = (pos === RELATIVE) ? 0 : node.offsetLeft || 0;
3242899a56da9c245956979d5be9c92b2cf0ee24Andreas Gustafsson }
8fbd23c0aaacdde1348b6457c5db14c433096fd2Andreas Gustafsson }
8fbd23c0aaacdde1348b6457c5db14c433096fd2Andreas Gustafsson
8fbd23c0aaacdde1348b6457c5db14c433096fd2Andreas Gustafsson if ( isNaN(xy[1]) ) { // in case of 'auto'
5f539d5fc68ca056bd1791e3156b0fe6b28cde16Brian Wellington xy[1] = parseInt(Y.DOM.getStyle(node, TOP), 10); // try inline
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson if ( isNaN(xy[1]) ) { // default to offset value
5f539d5fc68ca056bd1791e3156b0fe6b28cde16Brian Wellington xy[1] = (pos === RELATIVE) ? 0 : node.offsetTop || 0;
76477bd0e0a8f150f06f45c347d286b782cfa679Brian Wellington }
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson }
76477bd0e0a8f150f06f45c347d286b782cfa679Brian Wellington }
76477bd0e0a8f150f06f45c347d286b782cfa679Brian Wellington
e491ef29043ae77d3d78fb7a59328f143fcf70feAndreas Gustafsson return xy;
e491ef29043ae77d3d78fb7a59328f143fcf70feAndreas Gustafsson
e491ef29043ae77d3d78fb7a59328f143fcf70feAndreas Gustafsson },
e491ef29043ae77d3d78fb7a59328f143fcf70feAndreas Gustafsson
1a286a6613d385b443030a8c932e40ac9e9c301fBob Halley /**
1a286a6613d385b443030a8c932e40ac9e9c301fBob Halley * Gets the current X position of an element based on page coordinates.
1a286a6613d385b443030a8c932e40ac9e9c301fBob Halley * Element must be part of the DOM tree to have page coordinates
1a286a6613d385b443030a8c932e40ac9e9c301fBob Halley * (display:none or elements not appended return false).
1a286a6613d385b443030a8c932e40ac9e9c301fBob Halley * @method getX
3242899a56da9c245956979d5be9c92b2cf0ee24Andreas Gustafsson * @param element The target element
3242899a56da9c245956979d5be9c92b2cf0ee24Andreas Gustafsson * @return {Int} The X position of the element
3242899a56da9c245956979d5be9c92b2cf0ee24Andreas Gustafsson */
ecaedd50f4e6b8cff110f9981a0a33a34269d421Mark Andrews
9ffcab1e9a398e431c10c9936c28e4166c2e82e0Andreas Gustafsson getX: function(node) {
296253a3b9dec61190cce77e8b551e05ff514fcdAndreas Gustafsson return Y.DOM.getXY(node)[0];
de8717a7218a4f034144ad7b8755ad43e3fd45c9David Lawrence },
de8717a7218a4f034144ad7b8755ad43e3fd45c9David Lawrence
de8717a7218a4f034144ad7b8755ad43e3fd45c9David Lawrence /**
6f115bdb61672871bd822bdcd09cb1a3aad38aa0David Lawrence * Gets the current Y position of an element based on page coordinates.
6f115bdb61672871bd822bdcd09cb1a3aad38aa0David Lawrence * Element must be part of the DOM tree to have page coordinates
6f115bdb61672871bd822bdcd09cb1a3aad38aa0David Lawrence * (display:none or elements not appended return false).
1ac6cf2f7ae95e4c915cba7038e61930d7c4ba2aAndreas Gustafsson * @method getY
6f115bdb61672871bd822bdcd09cb1a3aad38aa0David Lawrence * @param element The target element
5e194abb5b548524e5c0fd2bb4627ec698b75e2bAndreas Gustafsson * @return {Int} The Y position of the element
5e194abb5b548524e5c0fd2bb4627ec698b75e2bAndreas Gustafsson */
5e194abb5b548524e5c0fd2bb4627ec698b75e2bAndreas Gustafsson
5e194abb5b548524e5c0fd2bb4627ec698b75e2bAndreas Gustafsson getY: function(node) {
5e194abb5b548524e5c0fd2bb4627ec698b75e2bAndreas Gustafsson return Y.DOM.getXY(node)[1];
5e194abb5b548524e5c0fd2bb4627ec698b75e2bAndreas Gustafsson },
5e194abb5b548524e5c0fd2bb4627ec698b75e2bAndreas Gustafsson
09ae77ca30eb17ee32d3f7720ca796a72259cde6Andreas Gustafsson /**
09ae77ca30eb17ee32d3f7720ca796a72259cde6Andreas Gustafsson * Set the position of an html element in page coordinates.
09ae77ca30eb17ee32d3f7720ca796a72259cde6Andreas Gustafsson * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
47afc27c28aef95d94e8d1296498ba57a5f00b25Brian Wellington * @method setXY
cedd0ab1e812ec7cf05d57c3e602db41b79f0a2aAndreas Gustafsson * @param element The target element
8c3989000a19f88415d094eb5984f7cf6ba2340cBrian Wellington * @param {Array} xy Contains X & Y values for new position (coordinates are page-based)
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson * @param {Boolean} noRetry By default we try and set the position a second time if the first fails
8c3989000a19f88415d094eb5984f7cf6ba2340cBrian Wellington */
ac6afcd0caf72aaa2a537e0003de30b363b4a68bBrian Wellington setXY: function(node, xy, noRetry) {
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson var setStyle = Y.DOM.setStyle,
ac6afcd0caf72aaa2a537e0003de30b363b4a68bBrian Wellington pos,
c20ffa38dee7efa0dc01822d4bac5e41729b9b61Brian Wellington delta,
c20ffa38dee7efa0dc01822d4bac5e41729b9b61Brian Wellington newXY,
9ffcab1e9a398e431c10c9936c28e4166c2e82e0Andreas Gustafsson currentXY;
9ffcab1e9a398e431c10c9936c28e4166c2e82e0Andreas Gustafsson
9ffcab1e9a398e431c10c9936c28e4166c2e82e0Andreas Gustafsson if (node && xy) {
2b7a77a68e27fc7991a857d403cb34b2ae90fc0bMark Andrews pos = Y.DOM.getStyle(node, POSITION);
4df51a8f53381d57b3dd75dd84615abd4cf9e969Andreas Gustafsson
0c9dd74fecd876563b7f0e4662243ff026b59622Andreas Gustafsson delta = Y.DOM._getOffset(node);
76873278a44e5ac36ac61b070035ca6d1f353f59Andreas Gustafsson
0c9dd74fecd876563b7f0e4662243ff026b59622Andreas Gustafsson if (pos == 'static') { // default to relative
aed6a8ed2e706404ccca0f31faf110fd6efd34e6Andreas Gustafsson pos = RELATIVE;
aed6a8ed2e706404ccca0f31faf110fd6efd34e6Andreas Gustafsson setStyle(node, POSITION, pos);
aed6a8ed2e706404ccca0f31faf110fd6efd34e6Andreas Gustafsson }
aed6a8ed2e706404ccca0f31faf110fd6efd34e6Andreas Gustafsson
f8b3c627949bd4bc2f6aafb3dab2f56e3aa9ba06Brian Wellington currentXY = Y.DOM.getXY(node);
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson
f8b3c627949bd4bc2f6aafb3dab2f56e3aa9ba06Brian Wellington if (xy[0] !== null) {
f8b3c627949bd4bc2f6aafb3dab2f56e3aa9ba06Brian Wellington setStyle(node, LEFT, xy[0] - currentXY[0] + delta[0] + 'px');
55ddb88e53838693370c213930beda1652b8a583Brian Wellington }
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson
55ddb88e53838693370c213930beda1652b8a583Brian Wellington if (xy[1] !== null) {
daad43e5a4e83bd3c055632799ab67e269467db0Brian Wellington setStyle(node, TOP, xy[1] - currentXY[1] + delta[1] + 'px');
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson }
daad43e5a4e83bd3c055632799ab67e269467db0Brian Wellington
3efd6904134ef6c4866a633eabeb55d1c86be7bbBrian Wellington if (!noRetry) {
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson newXY = Y.DOM.getXY(node);
3efd6904134ef6c4866a633eabeb55d1c86be7bbBrian Wellington if (newXY[0] !== xy[0] || newXY[1] !== xy[1]) {
70d08aea0a693c6ca62c2f7bb33bfddf9e427601Brian Wellington Y.DOM.setXY(node, xy, true);
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson }
70d08aea0a693c6ca62c2f7bb33bfddf9e427601Brian Wellington }
907620b5e0d898da324192cbbe5a5b518f55d175Bob Halley
907620b5e0d898da324192cbbe5a5b518f55d175Bob Halley Y.log('setXY setting position to ' + xy, 'info', 'dom-screen');
907620b5e0d898da324192cbbe5a5b518f55d175Bob Halley } else {
2c9db9314993504064c1a71f4a059ff9493a75caBrian Wellington Y.log('setXY failed to set ' + node + ' to ' + xy, 'info', 'dom-screen');
2c9db9314993504064c1a71f4a059ff9493a75caBrian Wellington }
2c9db9314993504064c1a71f4a059ff9493a75caBrian Wellington },
672056d560d973cac1c0d02f087e059eef8f948fBrian Wellington
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson /**
9027e1bcf1b245226e3053a75d16c5351d7e60caDavid Lawrence * Set the X position of an html element in page coordinates, regardless of how the element is positioned.
9027e1bcf1b245226e3053a75d16c5351d7e60caDavid Lawrence * The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
9027e1bcf1b245226e3053a75d16c5351d7e60caDavid Lawrence * @method setX
9027e1bcf1b245226e3053a75d16c5351d7e60caDavid Lawrence * @param element The target element
9027e1bcf1b245226e3053a75d16c5351d7e60caDavid Lawrence * @param {Int} x The X values for new position (coordinates are page-based)
668f8d91db59f4dd89a0b54206f87879354339f5Brian Wellington */
668f8d91db59f4dd89a0b54206f87879354339f5Brian Wellington setX: function(node, x) {
d7ba3622ffa20c653ef6c8cfae42d8cd26465b7fBrian Wellington return Y.DOM.setXY(node, [x, null]);
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson },
d7ba3622ffa20c653ef6c8cfae42d8cd26465b7fBrian Wellington
c0968380c4fb0b8196aafb8de225531bd847bb6dBrian Wellington /**
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson * Set the Y position of an html element in page coordinates, regardless of how the element is positioned.
c0968380c4fb0b8196aafb8de225531bd847bb6dBrian Wellington * The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
c0968380c4fb0b8196aafb8de225531bd847bb6dBrian Wellington * @method setY
c0968380c4fb0b8196aafb8de225531bd847bb6dBrian Wellington * @param element The target element
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington * @param {Int} y The Y values for new position (coordinates are page-based)
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson */
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington setY: function(node, y) {
c1ff0308f3f67bf148f96ca952db081eb5fd8383Brian Wellington return Y.DOM.setXY(node, [null, y]);
b879ed05f4fb8209add6c19a509c984b6c8b3a98Andreas Gustafsson },
b52a5b063050f209b0f47379178a1e7ae7404624Andreas Gustafsson
b52a5b063050f209b0f47379178a1e7ae7404624Andreas Gustafsson _calcBorders: function(node, xy2) {
b52a5b063050f209b0f47379178a1e7ae7404624Andreas Gustafsson var t = parseInt(Y.DOM[GET_COMPUTED_STYLE](node, BORDER_TOP_WIDTH), 10) || 0,
34613b2e39478a83076f6a626a4b855cebb19533Andreas Gustafsson l = parseInt(Y.DOM[GET_COMPUTED_STYLE](node, BORDER_LEFT_WIDTH), 10) || 0;
34613b2e39478a83076f6a626a4b855cebb19533Andreas Gustafsson if (Y.UA.gecko) {
34613b2e39478a83076f6a626a4b855cebb19533Andreas Gustafsson if (RE_TABLE.test(node.tagName)) {
34613b2e39478a83076f6a626a4b855cebb19533Andreas Gustafsson t = 0;
eb059776a206e9be778de0f196a0304b558a779cAndreas Gustafsson l = 0;
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson }
6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1bBrian Wellington }
6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1bBrian Wellington xy2[0] += l;
3d1483d86dce11fffd03c5b6c93be2e689f522abAndreas Gustafsson xy2[1] += t;
3d1483d86dce11fffd03c5b6c93be2e689f522abAndreas Gustafsson return xy2;
3bd8e7cf1c082cd1021e5a6cae1cf21911217858Brian Wellington },
3d1483d86dce11fffd03c5b6c93be2e689f522abAndreas Gustafsson
3d1483d86dce11fffd03c5b6c93be2e689f522abAndreas Gustafsson _getWinSize: function(node) {
b8a85202af814468421a6541b4c935bd14773c53Brian Wellington var doc = Y.DOM._getDoc(),
b879ed05f4fb8209add6c19a509c984b6c8b3a98Andreas Gustafsson win = doc.defaultView || doc.parentWindow,
b879ed05f4fb8209add6c19a509c984b6c8b3a98Andreas Gustafsson mode = doc[COMPAT_MODE],
b879ed05f4fb8209add6c19a509c984b6c8b3a98Andreas Gustafsson h = win.innerHeight,
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington w = win.innerWidth,
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington root = doc[DOCUMENT_ELEMENT];
4c03e69ab845f703c1ffa3b7772938ca98cce44dAndreas Gustafsson
b0390aab30438a13f533cccae9389945214b1421Brian Wellington if ( mode && !Y.UA.opera ) { // IE, Gecko
b0390aab30438a13f533cccae9389945214b1421Brian Wellington if (mode != 'CSS1Compat') { // Quirks
b0390aab30438a13f533cccae9389945214b1421Brian Wellington root = doc.body;
b0390aab30438a13f533cccae9389945214b1421Brian Wellington }
eb059776a206e9be778de0f196a0304b558a779cAndreas Gustafsson h = root.clientHeight;
54d64c7994d01da590462ecc56faf1a87fc4abb9Brian Wellington w = root.clientWidth;
4c03e69ab845f703c1ffa3b7772938ca98cce44dAndreas Gustafsson }
4c03e69ab845f703c1ffa3b7772938ca98cce44dAndreas Gustafsson return { height: h, width: w };
4c03e69ab845f703c1ffa3b7772938ca98cce44dAndreas Gustafsson },
225a66da7ea2671a3e4db3cc4337f97ff67be647Brian Wellington
225a66da7ea2671a3e4db3cc4337f97ff67be647Brian Wellington _getDocSize: function(node) {
91e35ded544576b671606779143d7fbffaf451d2Andreas Gustafsson var doc = Y.DOM._getDoc(),
225a66da7ea2671a3e4db3cc4337f97ff67be647Brian Wellington root = doc[DOCUMENT_ELEMENT];
d9112843333472bb7700c02a10d18e2b253b2708Bob Halley
279de54fe3a0ac10b64762b18a4569c07b15d742Andreas Gustafsson if (doc[COMPAT_MODE] != 'CSS1Compat') {
279de54fe3a0ac10b64762b18a4569c07b15d742Andreas Gustafsson root = doc.body;
279de54fe3a0ac10b64762b18a4569c07b15d742Andreas Gustafsson }
279de54fe3a0ac10b64762b18a4569c07b15d742Andreas Gustafsson
279de54fe3a0ac10b64762b18a4569c07b15d742Andreas Gustafsson return { height: root.scrollHeight, width: root.scrollWidth };
04cb6056a6539539e0fc2ed695298f7fa7b1d632Brian Wellington }
04cb6056a6539539e0fc2ed695298f7fa7b1d632Brian Wellington});
17789c880460c0bca3f3693c759be2214b936e69Brian Wellington})(Y);
55b62439233d930152690b9eba97b06d9dc13d23Mark Andrews(function(Y) {
55b62439233d930152690b9eba97b06d9dc13d23Mark Andrewsvar TOP = 'top',
02e7e0ba65a26a5f8728b0ee256f7253795cf839Brian Wellington RIGHT = 'right',
123a3dddc94534d3a6c6f81c118a5b63dc5994c3Andreas Gustafsson BOTTOM = 'bottom',
590233519e14f3cf49840a93d2648d5560dd957eDavid Lawrence LEFT = 'left',
590233519e14f3cf49840a93d2648d5560dd957eDavid Lawrence
590233519e14f3cf49840a93d2648d5560dd957eDavid Lawrence getOffsets = function(r1, r2) {
590233519e14f3cf49840a93d2648d5560dd957eDavid Lawrence var t = Math.max(r1[TOP], r2[TOP]),
590233519e14f3cf49840a93d2648d5560dd957eDavid Lawrence r = Math.min(r1[RIGHT], r2[RIGHT]),
123a3dddc94534d3a6c6f81c118a5b63dc5994c3Andreas Gustafsson b = Math.min(r1[BOTTOM], r2[BOTTOM]),
123a3dddc94534d3a6c6f81c118a5b63dc5994c3Andreas Gustafsson l = Math.max(r1[LEFT], r2[LEFT]),
123a3dddc94534d3a6c6f81c118a5b63dc5994c3Andreas Gustafsson ret = {};
123a3dddc94534d3a6c6f81c118a5b63dc5994c3Andreas Gustafsson
5ea0d11ca45bfd1ea9db8db07f18fbb02f500661Brian Wellington ret[TOP] = t;
88a790c39176f72a8f98f134b83df92e09a8c56bAndreas Gustafsson ret[RIGHT] = r;
5ea0d11ca45bfd1ea9db8db07f18fbb02f500661Brian Wellington ret[BOTTOM] = b;
d25dd5b0567f67ecf40b7ed1cb20e0dce7b41c49Brian Wellington ret[LEFT] = l;
d25dd5b0567f67ecf40b7ed1cb20e0dce7b41c49Brian Wellington return ret;
d25dd5b0567f67ecf40b7ed1cb20e0dce7b41c49Brian Wellington },
9ac7076ebad044afb15e9e2687e3696868778538Mark Andrews
9ac7076ebad044afb15e9e2687e3696868778538Mark Andrews DOM = Y.DOM;
7c058f1c384ebdba74231111f9358cf08109a5dbBob Halley
7c058f1c384ebdba74231111f9358cf08109a5dbBob HalleyY.mix(DOM, {
7c058f1c384ebdba74231111f9358cf08109a5dbBob Halley /**
7c058f1c384ebdba74231111f9358cf08109a5dbBob Halley * Returns an Object literal containing the following about this element: (top, right, bottom, left)
76b3ec5e0c3ae856bc1000270bf3df13580673ebBrian Wellington * @method region
620de5a4b1f23dc9b4ec30d30c0607ff389be0daBob Halley * @param {HTMLElement} element The DOM element.
4e3f8e480f220ef8a87fd28d02f9001b8fc6f423Bob Halley @return {Object} Object literal containing the following about this element: (top, right, bottom, left)
4e3f8e480f220ef8a87fd28d02f9001b8fc6f423Bob Halley */
f9e1aa0c440b6c6938967ed5356ec025ea40502eBrian Wellington region: function(node) {
f9e1aa0c440b6c6938967ed5356ec025ea40502eBrian Wellington var xy = DOM.getXY(node),
f9e1aa0c440b6c6938967ed5356ec025ea40502eBrian Wellington ret = false;
4e3f8e480f220ef8a87fd28d02f9001b8fc6f423Bob Halley
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson if (node && xy) {
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson ret = DOM._getRegion(
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson xy[1], // top
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson xy[0] + node.offsetWidth, // right
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson xy[1] + node.offsetHeight, // bottom
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson xy[0] // left
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson );
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson }
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson return ret;
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson },
dc2e09d48b49d96a0572a971180718f680140cf0Andreas Gustafsson
90c099e88e9f16bfee9edee3ac1a51fc98843772Brian Wellington /**
620de5a4b1f23dc9b4ec30d30c0607ff389be0daBob Halley * Find the intersect information for the passes nodes.
620de5a4b1f23dc9b4ec30d30c0607ff389be0daBob Halley * @method intersect
620de5a4b1f23dc9b4ec30d30c0607ff389be0daBob Halley * @param {HTMLElement} element The first element
68b952dc98a9e02b269c0712da120cd773679652Brian Wellington * @param {HTMLElement | Object} element2 The element or region to check the interect with
68b952dc98a9e02b269c0712da120cd773679652Brian Wellington * @param {Object} altRegion An object literal containing the region for the first element if we already have the data (for performance i.e. DragDrop)
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson @return {Object} Object literal containing the following intersection data: (top, right, bottom, left, area, yoff, xoff, inRegion)
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson */
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson intersect: function(node, node2, altRegion) {
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson var r = altRegion || DOM.region(node), region = {},
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson n = node2,
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson off;
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson if (n.tagName) {
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson region = DOM.region(n);
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson } else if (Y.Lang.isObject(node2)) {
ed0a4f1a302a5e543a9a2e4f8e61ca8a0673c6a7Mark Andrews region = node2;
ed0a4f1a302a5e543a9a2e4f8e61ca8a0673c6a7Mark Andrews } else {
a93cf7e83be621d3d68f51e37121a47a70a6757bMark Andrews return false;
a93cf7e83be621d3d68f51e37121a47a70a6757bMark Andrews }
a93cf7e83be621d3d68f51e37121a47a70a6757bMark Andrews
a97b72bac75dd2b4294108f59e1273f50495583cAndreas Gustafsson off = getOffsets(region, r);
c05eeed3c915d55a4949f5c2ce8700a0b0f9381bAndreas Gustafsson return {
1c1156b6e71555e593ed4bbca2284055c9f6fa45Andreas Gustafsson top: off[TOP],
1c1156b6e71555e593ed4bbca2284055c9f6fa45Andreas Gustafsson right: off[RIGHT],
c05eeed3c915d55a4949f5c2ce8700a0b0f9381bAndreas Gustafsson bottom: off[BOTTOM],
c05eeed3c915d55a4949f5c2ce8700a0b0f9381bAndreas Gustafsson left: off[LEFT],
3bb043a8b8b15eece3794ec31ad0ccab103a1c21Brian Wellington area: ((off[BOTTOM] - off[TOP]) * (off[RIGHT] - off[LEFT])),
3bb043a8b8b15eece3794ec31ad0ccab103a1c21Brian Wellington yoff: ((off[BOTTOM] - off[TOP])),
3bb043a8b8b15eece3794ec31ad0ccab103a1c21Brian Wellington xoff: (off[RIGHT] - off[LEFT]),
14c615e979f674aa61b0ca65c6a252009e521dd8Brian Wellington inRegion: DOM.inRegion(node, node2, false, altRegion)
3bb043a8b8b15eece3794ec31ad0ccab103a1c21Brian Wellington };
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson
d1cc210d2091916df6f9858fae20a1c760f3b257Andreas Gustafsson },
df0f58959ed82a2a43ca8d816ce9592541df9f2fMark Andrews /**
4d35b6836eb57387a9da6b103331b59cc988b827Mark Andrews * Check if any part of this node is in the passed region
903e9d41ef730f098d38da9588f2824f37b7d73cMark Andrews * @method inRegion
f4b5a0f43481026ea27bd96e3584ca0e92542f0dBob Halley * @param {Object} node2 The node to get the region from or an Object literal of the region
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson * $param {Boolean} all Should all of the node be inside the region
f4b5a0f43481026ea27bd96e3584ca0e92542f0dBob Halley * @param {Object} altRegion An object literal containing the region for this node if we already have the data (for performance i.e. DragDrop)
f4b5a0f43481026ea27bd96e3584ca0e92542f0dBob Halley * @return {Boolean} True if in region, false if not.
f4b5a0f43481026ea27bd96e3584ca0e92542f0dBob Halley */
f4b5a0f43481026ea27bd96e3584ca0e92542f0dBob Halley inRegion: function(node, node2, all, altRegion) {
6211baaa66d7cac28a21b6426681e597ff04ca9eAndreas Gustafsson var region = {},
6211baaa66d7cac28a21b6426681e597ff04ca9eAndreas Gustafsson r = altRegion || DOM.region(node),
4e605108c6533c2ec6311ee7a466582392656dddAndreas Gustafsson n = node2,
6211baaa66d7cac28a21b6426681e597ff04ca9eAndreas Gustafsson off;
ea544b0511a66bc5f3700d56a72dcd808fdf22e8Brian Wellington
ea544b0511a66bc5f3700d56a72dcd808fdf22e8Brian Wellington if (n.tagName) {
762a538eed7f4de4c340090536553f9c73f6432aBrian Wellington region = DOM.region(n);
ea544b0511a66bc5f3700d56a72dcd808fdf22e8Brian Wellington } else if (Y.Lang.isObject(node2)) {
a012d6dbfb100390efa7d0d4be64ada0210b09ddBrian Wellington region = node2;
a012d6dbfb100390efa7d0d4be64ada0210b09ddBrian Wellington } else {
a012d6dbfb100390efa7d0d4be64ada0210b09ddBrian Wellington return false;
c44ab73a0f37fa8c8a52069ca20dd060492dbafdAndreas Gustafsson }
7ae7d499f353549162ddcf6fed957ea21e4fa52bMark Andrews
c8d185ad5827bf2cf9982075e3336f680759a260Andreas Gustafsson if (all) {
1e50dad10da55802152d00d5573f8b7d49d752a6Bob Halley return (
1e50dad10da55802152d00d5573f8b7d49d752a6Bob Halley r[LEFT] >= region[LEFT] &&
1e50dad10da55802152d00d5573f8b7d49d752a6Bob Halley r[RIGHT] <= region[RIGHT] &&
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson r[TOP] >= region[TOP] &&
1e50dad10da55802152d00d5573f8b7d49d752a6Bob Halley r[BOTTOM] <= region[BOTTOM] );
c8d185ad5827bf2cf9982075e3336f680759a260Andreas Gustafsson } else {
c8d185ad5827bf2cf9982075e3336f680759a260Andreas Gustafsson off = getOffsets(region, r);
40c1177517ca5312371da6cc697d813576cfe5a8Andreas Gustafsson if (off[BOTTOM] >= off[TOP] && off[RIGHT] >= off[LEFT]) {
c8d185ad5827bf2cf9982075e3336f680759a260Andreas Gustafsson return true;
22cafd0ece9c8d22a1218f000afdbceda21fe8afBrian Wellington } else {
22cafd0ece9c8d22a1218f000afdbceda21fe8afBrian Wellington return false;
2cb74c5bc52ef415a771fafe0bf504eab609feadBrian Wellington }
2cb74c5bc52ef415a771fafe0bf504eab609feadBrian Wellington
3d60fe9bafbf633e3a7811c11227baebb17878a4Brian Wellington }
3d60fe9bafbf633e3a7811c11227baebb17878a4Brian Wellington },
218c8472e6c8c1a014e412615cc97bb93c0ef9c2Brian Wellington
218c8472e6c8c1a014e412615cc97bb93c0ef9c2Brian Wellington /**
218c8472e6c8c1a014e412615cc97bb93c0ef9c2Brian Wellington * Check if any part of this element is in the viewport
218c8472e6c8c1a014e412615cc97bb93c0ef9c2Brian Wellington * @method inViewportRegion
f24c135e09214c3843a49fd32ebef2f6a436ba8eBrian Wellington * @param {HTMLElement} element The DOM element.
f24c135e09214c3843a49fd32ebef2f6a436ba8eBrian Wellington * @param {Boolean} all Should all of the node be inside the region
d77312050f1fb1d41b450d4fe6908ea155264d08Brian Wellington * @param {Object} altRegion An object literal containing the region for this node if we already have the data (for performance i.e. DragDrop)
f24c135e09214c3843a49fd32ebef2f6a436ba8eBrian Wellington * @return {Boolean} True if in region, false if not.
4b9f0fd0791cb9cb31087789a03fa3a28dd4b583Andreas Gustafsson */
02940eaf0f732c28c0b39ed114a3803074a80138Andreas Gustafsson inViewportRegion: function(node, all, altRegion) {
02940eaf0f732c28c0b39ed114a3803074a80138Andreas Gustafsson return DOM.inRegion(node, DOM.viewportRegion(node), all, altRegion);
02940eaf0f732c28c0b39ed114a3803074a80138Andreas Gustafsson
dc1453b15d6656cd0661d5bec56359efa649268dAndreas Gustafsson },
9a7d163f6f305d48771b4c56d8d18efc6dfc8fc3Mark Andrews
80aba3d49a872ca11d7cf8550c3a993162e7939fMark Andrews _getRegion: function(t, r, b, l) {
31039b15173fb3e375269991920e4843f664457eMark Andrews var region = {};
31039b15173fb3e375269991920e4843f664457eMark Andrews
aa23a35d81a9618a40c4a9b44be48009553e4777Andreas Gustafsson region[TOP] = region[1] = t;
aa23a35d81a9618a40c4a9b44be48009553e4777Andreas Gustafsson region[LEFT] = region[0] = l;
936af16e0dbac26c1ec2337e684ff6ca9b2fe1bbAndreas Gustafsson region[BOTTOM] = b;
aa23a35d81a9618a40c4a9b44be48009553e4777Andreas Gustafsson region[RIGHT] = r;
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson region.width = region[RIGHT] - region[LEFT];
22457624d3e63e7cd255b4083cb435c16caea26dBob Halley region.height = region[BOTTOM] - region[TOP];
019fefd77d7e77f3c841808ab604f8ce31679d2dBrian Wellington
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson return region;
91425b5e7204b05165e2c5b244f3dad502f9627dBrian Wellington },
91425b5e7204b05165e2c5b244f3dad502f9627dBrian Wellington
91425b5e7204b05165e2c5b244f3dad502f9627dBrian Wellington /**
91425b5e7204b05165e2c5b244f3dad502f9627dBrian Wellington * Returns an Object literal containing the following about the visible region of viewport: (top, right, bottom, left)
b18a5b6730dcb062cf7f47c6b3cb909030b58f36Brian Wellington * @method viewportRegion
b18a5b6730dcb062cf7f47c6b3cb909030b58f36Brian Wellington @return {Object} Object literal containing the following about the visible region of the viewport: (top, right, bottom, left)
e880677f633f726b7df11ba3e59d4406e22256aaMark Andrews */
e880677f633f726b7df11ba3e59d4406e22256aaMark Andrews viewportRegion: function(node) {
7e361074bc8a2df7a0891a7040eea02ca3a5e286Andreas Gustafsson node = node || Y.config.doc.documentElement;
328b080b4af258fdd4d3a2ea1558b48706bd8116Andreas Gustafsson var ret = false,
328b080b4af258fdd4d3a2ea1558b48706bd8116Andreas Gustafsson scrollX,
328b080b4af258fdd4d3a2ea1558b48706bd8116Andreas Gustafsson scrollY;
328b080b4af258fdd4d3a2ea1558b48706bd8116Andreas Gustafsson
328b080b4af258fdd4d3a2ea1558b48706bd8116Andreas Gustafsson if (node) {
9e560b59a722d06a62b5aed761e71fec72638a7cBrian Wellington scrollX = DOM.docScrollX(node);
9e560b59a722d06a62b5aed761e71fec72638a7cBrian Wellington scrollY = DOM.docScrollY(node);
f91dc72b422479b5a0caf1fe54c4054d25ae6055Brian Wellington
f91dc72b422479b5a0caf1fe54c4054d25ae6055Brian Wellington ret = DOM._getRegion(scrollY, // top
7e361074bc8a2df7a0891a7040eea02ca3a5e286Andreas Gustafsson DOM.winWidth(node) + scrollX, // right
7e361074bc8a2df7a0891a7040eea02ca3a5e286Andreas Gustafsson scrollY + DOM.winHeight(node), // bottom
7e361074bc8a2df7a0891a7040eea02ca3a5e286Andreas Gustafsson scrollX); // left
d6b3d06db7ce3b9229dc30cc0e3a72ba2603da28Bob Halley }
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson
d6b3d06db7ce3b9229dc30cc0e3a72ba2603da28Bob Halley return ret;
d6b3d06db7ce3b9229dc30cc0e3a72ba2603da28Bob Halley }
8e68489885e744ab48907414b4199c36858c27ddMark Andrews});
8e68489885e744ab48907414b4199c36858c27ddMark Andrews})(Y);
8e68489885e744ab48907414b4199c36858c27ddMark Andrews
c17c59662f0969a5e52e8b7529cbde1a7c746095Andreas Gustafsson
c17c59662f0969a5e52e8b7529cbde1a7c746095Andreas Gustafsson}, '@VERSION@' ,{requires:['dom-base', 'dom-style']});
c17c59662f0969a5e52e8b7529cbde1a7c746095Andreas GustafssonYUI.add('selector-native', function(Y) {
c17c59662f0969a5e52e8b7529cbde1a7c746095Andreas Gustafsson
ec4f7c6d0f0cfc72bcecdb22bf59890d590218d6Mark Andrews(function(Y) {
d8d95c7d2eae28c5adbde097e88efa115bae6f35Andreas Gustafsson/**
651421a5db8a9edf39c76fd8cf859409eb8c373bAndreas Gustafsson * The selector-native module provides support for native querySelector
651421a5db8a9edf39c76fd8cf859409eb8c373bAndreas Gustafsson * @module dom
651421a5db8a9edf39c76fd8cf859409eb8c373bAndreas Gustafsson * @submodule selector-native
651421a5db8a9edf39c76fd8cf859409eb8c373bAndreas Gustafsson * @for Selector
7427490a67b9547242b57c255254f7e146127c48Bob Halley */
7427490a67b9547242b57c255254f7e146127c48Bob Halley
7427490a67b9547242b57c255254f7e146127c48Bob Halley/**
7427490a67b9547242b57c255254f7e146127c48Bob Halley * Provides support for using CSS selectors to query the DOM
aac319b506beb2e9a77ef124ee95b18870194b05Mark Andrews * @class Selector
fbe35d126f2c4df000f50662ed9d90ced13188c3Andreas Gustafsson * @static
dfa0badebe5a8260281228d94dbe28e4314a9df6Andreas Gustafsson * @for Selector
dfa0badebe5a8260281228d94dbe28e4314a9df6Andreas Gustafsson */
dfa0badebe5a8260281228d94dbe28e4314a9df6Andreas Gustafsson
dfa0badebe5a8260281228d94dbe28e4314a9df6Andreas GustafssonY.namespace('Selector'); // allow native module to standalone
2d0627005d48b7657fa11792c123466b4f974b61Mark Andrews
2d0627005d48b7657fa11792c123466b4f974b61Mark Andrewsvar COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',
2d0627005d48b7657fa11792c123466b4f974b61Mark Andrews OWNER_DOCUMENT = 'ownerDocument';
b1b3495eba72ea2b7270c5cd62b0bb824de74e05Mark Andrews
b1b3495eba72ea2b7270c5cd62b0bb824de74e05Mark Andrewsvar Selector = {
80ddc8b22bf2ede60038393be5cad9da99d3f03fAndreas Gustafsson _foundCache: [],
94baac869a70b529a24ff23d8dc899faa5d4fdc4Brian Wellington
94baac869a70b529a24ff23d8dc899faa5d4fdc4Brian Wellington useNative: true,
94baac869a70b529a24ff23d8dc899faa5d4fdc4Brian Wellington
1ac2c28488fb5de80b3ce9aac3500d215cb61728Brian Wellington _compare: ('sourceIndex' in document.documentElement) ?
1ac2c28488fb5de80b3ce9aac3500d215cb61728Brian Wellington function(nodeA, nodeB) {
1ac2c28488fb5de80b3ce9aac3500d215cb61728Brian Wellington var a = nodeA.sourceIndex,
a1cad3b231800ca928751ff8889bdc6d312d1f88Andreas Gustafsson b = nodeB.sourceIndex;
a1cad3b231800ca928751ff8889bdc6d312d1f88Andreas Gustafsson
a12d9cfa59b5981c52e1aaafedf652d5128f3448Brian Wellington if (a === b) {
702a69f04a89422968ef8fc6fc271fac058e03efBrian Wellington return 0;
702a69f04a89422968ef8fc6fc271fac058e03efBrian Wellington } else if (a > b) {
702a69f04a89422968ef8fc6fc271fac058e03efBrian Wellington return 1;
0f537d1c63f643924355ff9ca2cf72c547101aa4Brian Wellington }
e4aeba32725a79e295c2ceed1919cba076530ba3Andreas Gustafsson
0f537d1c63f643924355ff9ca2cf72c547101aa4Brian Wellington return -1;
9ee323b64bc9dcd73f9a0a0e69a31475026721daAndreas Gustafsson
4b236540be165859390f05911eda86a39ee58eedAndreas Gustafsson } : (document.documentElement[COMPARE_DOCUMENT_POSITION] ?
9ee323b64bc9dcd73f9a0a0e69a31475026721daAndreas Gustafsson function(nodeA, nodeB) {
c27148868266dd718b6677c794b3e6dca53c3bdcAndreas Gustafsson if (nodeA[COMPARE_DOCUMENT_POSITION](nodeB) & 4) {
c27148868266dd718b6677c794b3e6dca53c3bdcAndreas Gustafsson return -1;
f6987630ce2d424a34bb9d373b3c08de48010287Andreas Gustafsson } else {
c27148868266dd718b6677c794b3e6dca53c3bdcAndreas Gustafsson return 1;
80ddc8b22bf2ede60038393be5cad9da99d3f03fAndreas Gustafsson }
f8a44ed40032e034883019ac556f3bb732491a32Mark Andrews } :
f8a44ed40032e034883019ac556f3bb732491a32Mark Andrews function(nodeA, nodeB) {
f1007e99b7db3f4e65663d348530f078adb48ccbMark Andrews var rangeA, rangeB, compare;
07d6480b684d3745e645f35a8b95dae9bda982a3Mark Andrews if (nodeA && nodeB) {
07d6480b684d3745e645f35a8b95dae9bda982a3Mark Andrews rangeA = nodeA[OWNER_DOCUMENT].createRange();
363cb30a83e8e57bc8874e621910f0e23dd84909Mark Andrews rangeA.setStart(nodeA, 0);
634784cb66a1c9ddee0c448f71580f024c8fe40bAndreas Gustafsson rangeB = nodeB[OWNER_DOCUMENT].createRange();
ea6709ec8a66e3ffef9c9466613df499567c57f8Brian Wellington rangeB.setStart(nodeB, 0);
ea6709ec8a66e3ffef9c9466613df499567c57f8Brian Wellington compare = rangeA.compareBoundaryPoints(1, rangeB); // 1 === Range.START_TO_END
ea6709ec8a66e3ffef9c9466613df499567c57f8Brian Wellington }
634784cb66a1c9ddee0c448f71580f024c8fe40bAndreas Gustafsson
634784cb66a1c9ddee0c448f71580f024c8fe40bAndreas Gustafsson return compare;
c2c275f5f4ead0943c76b6463cf7a93095559c64Andreas Gustafsson
634784cb66a1c9ddee0c448f71580f024c8fe40bAndreas Gustafsson }),
634784cb66a1c9ddee0c448f71580f024c8fe40bAndreas Gustafsson
634784cb66a1c9ddee0c448f71580f024c8fe40bAndreas Gustafsson _sort: function(nodes) {
634784cb66a1c9ddee0c448f71580f024c8fe40bAndreas Gustafsson if (nodes) {
ce1269825c9d9c4bca42ae9750a7a2fd93a45557Mark Andrews nodes = Y.Array(nodes, 0, true);
49576ae7a481415d5e815ff59b71c76203259619Andreas Gustafsson if (nodes.sort) {
e8af4e152413190e5553c2fb3074a1cc689c6cefAndreas Gustafsson nodes.sort(Selector._compare);
e8af4e152413190e5553c2fb3074a1cc689c6cefAndreas Gustafsson }
4d30acbac52fcb20a4f0ab4f8508f24861386fe7Brian Wellington }
4d30acbac52fcb20a4f0ab4f8508f24861386fe7Brian Wellington
4d30acbac52fcb20a4f0ab4f8508f24861386fe7Brian Wellington return nodes;
131d5feb05fce60143bc17dab73df20753d9301fBrian Wellington },
131d5feb05fce60143bc17dab73df20753d9301fBrian Wellington
131d5feb05fce60143bc17dab73df20753d9301fBrian Wellington _deDupe: function(nodes) {
131d5feb05fce60143bc17dab73df20753d9301fBrian Wellington var ret = [],
76c9d2f6c0a5d6ea8bcc35fc3228d2019507b2bbBrian Wellington i, node;
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson
76c9d2f6c0a5d6ea8bcc35fc3228d2019507b2bbBrian Wellington for (i = 0; (node = nodes[i++]);) {
187a97287e626b2f2e9774479e145dfbf1eba66cBrian Wellington if (!node._found) {
187a97287e626b2f2e9774479e145dfbf1eba66cBrian Wellington ret[ret.length] = node;
187a97287e626b2f2e9774479e145dfbf1eba66cBrian Wellington node._found = true;
49576ae7a481415d5e815ff59b71c76203259619Andreas Gustafsson }
49576ae7a481415d5e815ff59b71c76203259619Andreas Gustafsson }
7ed2d93fa4e12e0ceaa0c7c0da3a89e7a5d78296Andreas Gustafsson
1ec527b71267747cc3ae4d9849aa4f6362c78ea9Brian Wellington for (i = 0; (node = ret[i++]);) {
1ec527b71267747cc3ae4d9849aa4f6362c78ea9Brian Wellington node._found = null;
1ec527b71267747cc3ae4d9849aa4f6362c78ea9Brian Wellington node.removeAttribute('_found');
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington }
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington return ret;
7ed2d93fa4e12e0ceaa0c7c0da3a89e7a5d78296Andreas Gustafsson },
bfd14616fa53e2572e7492a21467fad239deeae7Andreas Gustafsson
7ed2d93fa4e12e0ceaa0c7c0da3a89e7a5d78296Andreas Gustafsson /**
14bb9cccae74676e25ae145dc14a3681cc3022b9Mark Andrews * Retrieves a set of nodes based on a given CSS selector.
14bb9cccae74676e25ae145dc14a3681cc3022b9Mark Andrews * @method query
01b8865b1462ba219c90cf6c00f1bf0fdf780d9bBrian Wellington *
01b8865b1462ba219c90cf6c00f1bf0fdf780d9bBrian Wellington * @param {string} selector The CSS Selector to test the node against.
3b77946b751f39bd4db5a7d1fe48a81e6b1e7a28Bob Halley * @param {HTMLElement} root optional An HTMLElement to start the query from. Defaults to Y.config.doc
3b77946b751f39bd4db5a7d1fe48a81e6b1e7a28Bob Halley * @param {Boolean} firstOnly optional Whether or not to return only the first match.
fcc3c131e03cb7e844eaecf74d4f9b7fd38c8398Andreas Gustafsson * @return {Array} An array of nodes that match the given selector.
fb0663dbdd4811c6062fe602b511227be66aec56Mark Andrews * @static
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson */
6d3e8dffb447b9a961360f7f4fd77b0bdb81de76Andreas Gustafsson query: function(selector, root, firstOnly, skipNative) {
7017ede939a5d3e7f2dc113061887a9e81fe8627Brian Wellington root = root || Y.config.doc;
7017ede939a5d3e7f2dc113061887a9e81fe8627Brian Wellington var ret = [],
7017ede939a5d3e7f2dc113061887a9e81fe8627Brian Wellington useNative = (Y.Selector.useNative && document.querySelector && !skipNative),
6d3e8dffb447b9a961360f7f4fd77b0bdb81de76Andreas Gustafsson queries = [[selector, root]],
fcc3c131e03cb7e844eaecf74d4f9b7fd38c8398Andreas Gustafsson query,
66921d6dd259c4486a07aba19eee2b8349698575Brian Wellington result,
6d3e8dffb447b9a961360f7f4fd77b0bdb81de76Andreas Gustafsson i,
b65fc651b8aaab5d0fb9b8f6ef583d699d14a113Mark Andrews fn = (useNative) ? Y.Selector._nativeQuery : Y.Selector._bruteQuery;
6d3e8dffb447b9a961360f7f4fd77b0bdb81de76Andreas Gustafsson
2728a98ee4104b2fb30f273893a7f354e20002b5Mark Andrews if (selector && fn) {
c50895694ef939f287aaa7505e0fcf634903bd34Mark Andrews // split group into seperate queries
be387fd057ee54ae5d84904e69587d6e29bd3950Mark Andrews if (!skipNative && // already done if skipping
6d3e8dffb447b9a961360f7f4fd77b0bdb81de76Andreas Gustafsson (!useNative || root.tagName)) { // split native when element scoping is needed
d72269740049af28b091ba81d68a067c88f53547Mark Andrews queries = Selector._splitQueries(selector, root);
6d3e8dffb447b9a961360f7f4fd77b0bdb81de76Andreas Gustafsson }
7dbb39a417a28f61ba13e6e066c2f9c711f61471Mark Andrews
7dbb39a417a28f61ba13e6e066c2f9c711f61471Mark Andrews for (i = 0; (query = queries[i++]);) {
a51f77a70bba62f227fb15fe72ecf959893e3f0fMark Andrews result = fn(query[0], query[1], firstOnly);
a51f77a70bba62f227fb15fe72ecf959893e3f0fMark Andrews if (!firstOnly) { // coerce DOM Collection to Array
a51f77a70bba62f227fb15fe72ecf959893e3f0fMark Andrews result = Y.Array(result, 0, true);
5e16689bd396d261779526345a1c5207e3308477Andreas Gustafsson }
f7321615eaaf63461bd682513d2873d97ae31771Mark Andrews if (result) {
ff7f1dc0393cfc8a033be7e94aa56cd57c97d174Andreas Gustafsson ret = ret.concat(result);
7dec36c225ad044a6546a4e232888f3412c030a8Brian Wellington }
7dec36c225ad044a6546a4e232888f3412c030a8Brian Wellington }
7dec36c225ad044a6546a4e232888f3412c030a8Brian Wellington
ff7f1dc0393cfc8a033be7e94aa56cd57c97d174Andreas Gustafsson if (queries.length > 1) { // remove dupes and sort by doc order
ff7f1dc0393cfc8a033be7e94aa56cd57c97d174Andreas Gustafsson ret = Selector._sort(Selector._deDupe(ret));
ff7f1dc0393cfc8a033be7e94aa56cd57c97d174Andreas Gustafsson }
ff7f1dc0393cfc8a033be7e94aa56cd57c97d174Andreas Gustafsson }
725fec8d79ff36402b0f90a7a05aafa7964e387fBrian Wellington
9b0c4bf7003db929fe00a345fc96fb97677d29e0Brian Wellington Y.log('query: ' + selector + ' returning: ' + ret.length, 'info', 'Selector');
9b0c4bf7003db929fe00a345fc96fb97677d29e0Brian Wellington return (firstOnly) ? (ret[0] || null) : ret;
19c7cce8555ccc0c95455a0c35dedd017d420d05Mark Andrews
19c7cce8555ccc0c95455a0c35dedd017d420d05Mark Andrews },
576f85e5fdb8805307f318db79dfc0d19e390d1aAndreas Gustafsson
576f85e5fdb8805307f318db79dfc0d19e390d1aAndreas Gustafsson // allows element scoped queries to begin with combinator
576f85e5fdb8805307f318db79dfc0d19e390d1aAndreas Gustafsson // e.g. query('> p', document.body) === query('body > p')
576f85e5fdb8805307f318db79dfc0d19e390d1aAndreas Gustafsson _splitQueries: function(selector, node) {
576f85e5fdb8805307f318db79dfc0d19e390d1aAndreas Gustafsson var groups = selector.split(','),
0c70ab306505d89983186e9f8bb8647de55b5d04Mark Andrews queries = [],
0c70ab306505d89983186e9f8bb8647de55b5d04Mark Andrews prefix = '',
0c70ab306505d89983186e9f8bb8647de55b5d04Mark Andrews i, len;
32e64787d9bd84a012ddac506f88fbc677b49377Brian Wellington
32e64787d9bd84a012ddac506f88fbc677b49377Brian Wellington if (node) {
32e64787d9bd84a012ddac506f88fbc677b49377Brian Wellington // enforce for element scoping
fa5a42fbad42f4e033376d5d4624e29d018d97b7Brian Wellington if (node.tagName) {
fa5a42fbad42f4e033376d5d4624e29d018d97b7Brian Wellington node.id = node.id || Y.guid();
fa5a42fbad42f4e033376d5d4624e29d018d97b7Brian Wellington prefix = '[id="' + node.id + '"] ';
fa5a42fbad42f4e033376d5d4624e29d018d97b7Brian Wellington }
12acad068846c11ad7bb9adb23f02a6fc37b4e17Andreas Gustafsson
523dd6a979865b8b1b8f1ecc81e5ce47a168c63fBrian Wellington for (i = 0, len = groups.length; i < len; ++i) {
523dd6a979865b8b1b8f1ecc81e5ce47a168c63fBrian Wellington selector = prefix + groups[i];
5bb4ceb2a67fd558962f8a786c93daedc148a599Mark Andrews queries.push([selector, node]);
5bb4ceb2a67fd558962f8a786c93daedc148a599Mark Andrews }
5bb4ceb2a67fd558962f8a786c93daedc148a599Mark Andrews }
d119051ef75d5a88d28c13fb0a7c6d6757a4e9b5Brian Wellington
d119051ef75d5a88d28c13fb0a7c6d6757a4e9b5Brian Wellington return queries;
d119051ef75d5a88d28c13fb0a7c6d6757a4e9b5Brian Wellington },
d119051ef75d5a88d28c13fb0a7c6d6757a4e9b5Brian Wellington
3f8ad70264645ebd6a2a8bc7e923271eb5bf8416Brian Wellington _nativeQuery: function(selector, root, one) {
3f8ad70264645ebd6a2a8bc7e923271eb5bf8416Brian Wellington try {
9b0e404e5fc71a2bd4fba8a66296477f815af7d5Brian Wellington //Y.log('trying native query with: ' + selector, 'info', 'selector-native');
fff07c1022643da7274d4ba1b086c9c218762dc9Brian Wellington return root['querySelector' + (one ? '' : 'All')](selector);
fff07c1022643da7274d4ba1b086c9c218762dc9Brian Wellington } catch(e) { // fallback to brute if available
fff07c1022643da7274d4ba1b086c9c218762dc9Brian Wellington //Y.log('native query error; reverting to brute query with: ' + selector, 'info', 'selector-native');
4817a0628785835abb57d06f2f616b4a6515ac2fAndreas Gustafsson return Y.Selector.query(selector, root, one, true); // redo with skipNative true
c26c349eab7ca0499786c2091f0e407ec90eee6bAndreas Gustafsson }
c26c349eab7ca0499786c2091f0e407ec90eee6bAndreas Gustafsson },
c26c349eab7ca0499786c2091f0e407ec90eee6bAndreas Gustafsson
c26c349eab7ca0499786c2091f0e407ec90eee6bAndreas Gustafsson filter: function(nodes, selector) {
4817a0628785835abb57d06f2f616b4a6515ac2fAndreas Gustafsson var ret = [],
4817a0628785835abb57d06f2f616b4a6515ac2fAndreas Gustafsson i, node;
4817a0628785835abb57d06f2f616b4a6515ac2fAndreas Gustafsson
4817a0628785835abb57d06f2f616b4a6515ac2fAndreas Gustafsson if (nodes && selector) {
4817a0628785835abb57d06f2f616b4a6515ac2fAndreas Gustafsson for (i = 0; (node = nodes[i++]);) {
228c679d7a269423019f7c528db92e855f08240bMark Andrews if (Y.Selector.test(node, selector)) {
a2a7eaf89cd68acdb16177bb05701107ceab52b9Brian Wellington ret[ret.length] = node;
8c6058d00f89792733b5c8d4ceee84ab5025857bAndreas Gustafsson }
8c6058d00f89792733b5c8d4ceee84ab5025857bAndreas Gustafsson }
148af05e15f5d7ae3b076231617369fdaf57d26dAndreas Gustafsson } else {
d31498a54482c8d5d934875d3fdeaa621c962d6fBrian Wellington Y.log('invalid filter input (nodes: ' + nodes +
d31498a54482c8d5d934875d3fdeaa621c962d6fBrian Wellington ', selector: ' + selector + ')', 'warn', 'Selector');
a2a7eaf89cd68acdb16177bb05701107ceab52b9Brian Wellington }
a2a7eaf89cd68acdb16177bb05701107ceab52b9Brian Wellington
a2a7eaf89cd68acdb16177bb05701107ceab52b9Brian Wellington return ret;
a2a7eaf89cd68acdb16177bb05701107ceab52b9Brian Wellington },
54ce9b2e29aafe1cb5f898a0983fb66e450e9559Brian Wellington
175ba246fb074ae8caca0e76ecc8055517ab486cBrian Wellington test: function(node, selector, root) {
54ce9b2e29aafe1cb5f898a0983fb66e450e9559Brian Wellington var ret = false,
54ce9b2e29aafe1cb5f898a0983fb66e450e9559Brian Wellington groups = selector.split(','),
7357590beef5f671cfdd4ec4304e5210adfb0d8aBrian Wellington useFrag = false,
7357590beef5f671cfdd4ec4304e5210adfb0d8aBrian Wellington parent,
7357590beef5f671cfdd4ec4304e5210adfb0d8aBrian Wellington item,
7357590beef5f671cfdd4ec4304e5210adfb0d8aBrian Wellington items,
8dd5237a27e2e824d18f835dc711573aeb23a173Mark Andrews frag,
8dd5237a27e2e824d18f835dc711573aeb23a173Mark Andrews i, j, group;
8dd5237a27e2e824d18f835dc711573aeb23a173Mark Andrews
3b5102fc018a29e52befde5991844843c7b70786Michael Sawyer if (node && node.tagName) { // only test HTMLElements
bbd3d20d0843165a74698166a3180897fd019e18Andreas Gustafsson
3b5102fc018a29e52befde5991844843c7b70786Michael Sawyer // we need a root if off-doc
61470ed14b20c55c0730461165faa582a3775eb8Mark Andrews if (!root && !Y.DOM.inDoc(node)) {
bbd3d20d0843165a74698166a3180897fd019e18Andreas Gustafsson parent = node.parentNode;
3b5102fc018a29e52befde5991844843c7b70786Michael Sawyer if (parent) {
f7e900edbc368275aa7cec7ebec0986e45aeadd7Mark Andrews root = parent;
f7e900edbc368275aa7cec7ebec0986e45aeadd7Mark Andrews } else { // only use frag when no parent to query
ec772e873bd7f24418049b5b1b5d7c44ff781356Brian Wellington frag = node[OWNER_DOCUMENT].createDocumentFragment();
ec772e873bd7f24418049b5b1b5d7c44ff781356Brian Wellington frag.appendChild(node);
ec772e873bd7f24418049b5b1b5d7c44ff781356Brian Wellington root = frag;
abfbf760f3bc2a6744b0249a31ca5153234b49e8Brian Wellington useFrag = true;
abfbf760f3bc2a6744b0249a31ca5153234b49e8Brian Wellington }
abfbf760f3bc2a6744b0249a31ca5153234b49e8Brian Wellington }
75768d5fa2c6c5c441b849ca4efa649a7c2a9e88Bob Halley root = root || node[OWNER_DOCUMENT];
75768d5fa2c6c5c441b849ca4efa649a7c2a9e88Bob Halley
75768d5fa2c6c5c441b849ca4efa649a7c2a9e88Bob Halley if (!node.id) {
75768d5fa2c6c5c441b849ca4efa649a7c2a9e88Bob Halley node.id = Y.guid();
75768d5fa2c6c5c441b849ca4efa649a7c2a9e88Bob Halley }
75768d5fa2c6c5c441b849ca4efa649a7c2a9e88Bob Halley for (i = 0; (group = groups[i++]);) { // TODO: off-dom test
75768d5fa2c6c5c441b849ca4efa649a7c2a9e88Bob Halley group += '[id="' + node.id + '"]';
065958bd3d26dbc25ff313cfcee07bb6a77ee47eBrian Wellington items = Y.Selector.query(group, root);
75768d5fa2c6c5c441b849ca4efa649a7c2a9e88Bob Halley
4e7942dc7612acb71b111a5e8d919960f5a9efc5Mark Andrews for (j = 0; item = items[j++];) {
fa280ff02ad0c29616a0c3a22ef02cbb3f6db7efDavid Lawrence if (item === node) {
22dbaf9ad8065127fd93eff0f239fd9c548d18b6Andreas Gustafsson ret = true;
22dbaf9ad8065127fd93eff0f239fd9c548d18b6Andreas Gustafsson break;
22dbaf9ad8065127fd93eff0f239fd9c548d18b6Andreas Gustafsson }
22dbaf9ad8065127fd93eff0f239fd9c548d18b6Andreas Gustafsson }
22dbaf9ad8065127fd93eff0f239fd9c548d18b6Andreas Gustafsson if (ret) {
184867e88b5a30bbc29f17edbc7b50a6c8a944e7David Lawrence break;
184867e88b5a30bbc29f17edbc7b50a6c8a944e7David Lawrence }
184867e88b5a30bbc29f17edbc7b50a6c8a944e7David Lawrence }
fa280ff02ad0c29616a0c3a22ef02cbb3f6db7efDavid Lawrence
fa280ff02ad0c29616a0c3a22ef02cbb3f6db7efDavid Lawrence if (useFrag) { // cleanup
fa280ff02ad0c29616a0c3a22ef02cbb3f6db7efDavid Lawrence frag.removeChild(node);
046a9aca49bdc25bd57d75fd0dd34c021722f095Mark Andrews }
f4e4111795ceb13066d09c38723afacb04e33ad4Mark Andrews }
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson
f4e4111795ceb13066d09c38723afacb04e33ad4Mark Andrews return ret;
253ab81bf2760d3d7f68512b43710afc02d788daMark Andrews },
253ab81bf2760d3d7f68512b43710afc02d788daMark Andrews
253ab81bf2760d3d7f68512b43710afc02d788daMark Andrews /**
be171be1799e0ba8cdd35d4f67b772ff086d0d81Andreas Gustafsson * A convenience function to emulate Y.Node's aNode.ancestor(selector).
be171be1799e0ba8cdd35d4f67b772ff086d0d81Andreas Gustafsson * @param {HTMLElement} element An HTMLElement to start the query from.
9f28451bca8377ef6c9ea3b0a49bf342c9fa6800Mark Andrews * @param {String} selector The CSS selector to test the node against.
9f28451bca8377ef6c9ea3b0a49bf342c9fa6800Mark Andrews * @return {HTMLElement} The ancestor node matching the selector, or null.
a110543bb4d2e53caa40f83c2b45786a1efe63efAndreas Gustafsson * @param {Boolean} testSelf optional Whether or not to include the element in the scan
af5dc286ff4b750deec50d1c006aae5fc38019c0Mark Andrews * @static
af5dc286ff4b750deec50d1c006aae5fc38019c0Mark Andrews * @method ancestor
ef9f9001fca9445ef315b1e76a66fc84fef6fdc6Andreas Gustafsson */
ee303f481dfefcd4e4994f8b8b17f2de32aa4d69Brian Wellington ancestor: function (element, selector, testSelf) {
ee303f481dfefcd4e4994f8b8b17f2de32aa4d69Brian Wellington return Y.DOM.ancestor(element, function(n) {
ee303f481dfefcd4e4994f8b8b17f2de32aa4d69Brian Wellington return Y.Selector.test(n, selector);
9b2a2a9016980fbed6b2025d365a8ae99897608cDavid Lawrence }, testSelf);
9b2a2a9016980fbed6b2025d365a8ae99897608cDavid Lawrence }
9b2a2a9016980fbed6b2025d365a8ae99897608cDavid Lawrence};
86b8c485762daa54a96d033110f6f41ea96e5213David Lawrence
125a916d1a0c01f139ced5736145703df28d07cfDavid LawrenceY.mix(Y.Selector, Selector, true);
125a916d1a0c01f139ced5736145703df28d07cfDavid Lawrence
125a916d1a0c01f139ced5736145703df28d07cfDavid Lawrence})(Y);
125a916d1a0c01f139ced5736145703df28d07cfDavid Lawrence
125a916d1a0c01f139ced5736145703df28d07cfDavid Lawrence
2115bc7d6433c92499d8e4f67e1c1dfa42ecd6f0David Lawrence}, '@VERSION@' ,{requires:['dom-base']});
2115bc7d6433c92499d8e4f67e1c1dfa42ecd6f0David LawrenceYUI.add('selector-css2', function(Y) {
2115bc7d6433c92499d8e4f67e1c1dfa42ecd6f0David Lawrence
02e38214502c3a946cdfe87e16525747617a1150Brian Wellington/**
02e38214502c3a946cdfe87e16525747617a1150Brian Wellington * The selector module provides helper methods allowing CSS2 Selectors to be used with DOM elements.
02e38214502c3a946cdfe87e16525747617a1150Brian Wellington * @module dom
f8da2d95835c5216570a45e9000f740321503ae3David Lawrence * @submodule selector-css2
f8da2d95835c5216570a45e9000f740321503ae3David Lawrence * @for Selector
f8da2d95835c5216570a45e9000f740321503ae3David Lawrence */
f8da2d95835c5216570a45e9000f740321503ae3David Lawrence
fdb2cda3ed366699d70aaf67ee5ae7fcd2ca7561David Lawrence/**
fdb2cda3ed366699d70aaf67ee5ae7fcd2ca7561David Lawrence * Provides helper methods for collecting and filtering DOM elements.
6094a7774954463e312f7266c8d4d3f26aa07d4aAndreas Gustafsson */
6094a7774954463e312f7266c8d4d3f26aa07d4aAndreas Gustafsson
8dc3d2006f679d0a291f7a20612c37e2a7146096Brian Wellingtonvar PARENT_NODE = 'parentNode',
a110543bb4d2e53caa40f83c2b45786a1efe63efAndreas Gustafsson TAG_NAME = 'tagName',
a110543bb4d2e53caa40f83c2b45786a1efe63efAndreas Gustafsson ATTRIBUTES = 'attributes',
a110543bb4d2e53caa40f83c2b45786a1efe63efAndreas Gustafsson COMBINATOR = 'combinator',
ef9f9001fca9445ef315b1e76a66fc84fef6fdc6Andreas Gustafsson PSEUDOS = 'pseudos',
bd5f2ac1880f5f2e96b291378c3dff296fc011f1Mark Andrews
a06df85974344892431b14bec51c1beeee971eccAndreas Gustafsson Selector = Y.Selector,
24c5978e0b32137305c2bef2c6e116ee7680a610Andreas Gustafsson
f0f61db621eed0c453e31bb85f6803c550e19a6bAndreas Gustafsson SelectorCSS2 = {
63612a0fe1abbeb8ab6d727a4cfe46831c481387Brian Wellington SORT_RESULTS: true,
63612a0fe1abbeb8ab6d727a4cfe46831c481387Brian Wellington _children: function(node, tag) {
63612a0fe1abbeb8ab6d727a4cfe46831c481387Brian Wellington var ret = node.children,
9be0c3d823200bed1286cff6bddf2a8c639f5287Brian Wellington i,
125a916d1a0c01f139ced5736145703df28d07cfDavid Lawrence children = [],
125a916d1a0c01f139ced5736145703df28d07cfDavid Lawrence childNodes,
125a916d1a0c01f139ced5736145703df28d07cfDavid Lawrence child;
125a916d1a0c01f139ced5736145703df28d07cfDavid Lawrence
32bb863ea960caa650105b60dcd45e3db6840a6fAndreas Gustafsson if (node.children && tag && node.children.tags) {
32bb863ea960caa650105b60dcd45e3db6840a6fAndreas Gustafsson children = node.children.tags(tag);
7d33e8996948523e0180bc7e28a93d534d878dccAndreas Gustafsson } else if ((!ret && node[TAG_NAME]) || (ret && tag)) { // only HTMLElements have children
736aab3076e9bec708cec073f5cf8e6c4b588886Brian Wellington childNodes = ret || node.childNodes;
736aab3076e9bec708cec073f5cf8e6c4b588886Brian Wellington ret = [];
736aab3076e9bec708cec073f5cf8e6c4b588886Brian Wellington for (i = 0; (child = childNodes[i++]);) {
732f883c12f171186d7f3331ebdf5d16044b14b0Brian Wellington if (child.tagName) {
bb1cf189bb9fd9059cf13b785d15b0e50c0be8fbAndreas Gustafsson if (!tag || tag === child.tagName) {
7cb10f77890fe36b14079c7beb848ec390a53e44Andreas Gustafsson ret.push(child);
7cb10f77890fe36b14079c7beb848ec390a53e44Andreas Gustafsson }
7cb10f77890fe36b14079c7beb848ec390a53e44Andreas Gustafsson }
bb1cf189bb9fd9059cf13b785d15b0e50c0be8fbAndreas Gustafsson }
bb1cf189bb9fd9059cf13b785d15b0e50c0be8fbAndreas Gustafsson }
bb1cf189bb9fd9059cf13b785d15b0e50c0be8fbAndreas Gustafsson
bb1cf189bb9fd9059cf13b785d15b0e50c0be8fbAndreas Gustafsson return ret || [];
f53848e17123569387b279578f0100dca5407da5Mark Andrews },
f53848e17123569387b279578f0100dca5407da5Mark Andrews
f53848e17123569387b279578f0100dca5407da5Mark Andrews _regexCache: {},
d46bf932ed5e1f58a4c424ce1ce7525963354482Brian Wellington
d46bf932ed5e1f58a4c424ce1ce7525963354482Brian Wellington _re: {
d46bf932ed5e1f58a4c424ce1ce7525963354482Brian Wellington //attr: /(\[.*\])/g,
64a84169d7eed05486b10be90afea58f4af146f9Brian Wellington attr: /(\[[^\]]*\])/g,
1599bd6998f54b2b34804d7332f543744368a586Mark Andrews pseudos: /:([\-\w]+(?:\(?:['"]?(.+)['"]?\)))*/i
09671f9551077f9eae8c41619b61272cb9821100Andreas Gustafsson },
1599bd6998f54b2b34804d7332f543744368a586Mark Andrews
acc63b06d9e4e2137950dabddcccd17d8b336ca0Olafur Gudmundsson /**
c8fc692fa1445ccfc39b68902546cdfc7ee30d3eBrian Wellington * Mapping of shorthand tokens to corresponding attribute selector
c8fc692fa1445ccfc39b68902546cdfc7ee30d3eBrian Wellington * @property shorthand
c8fc692fa1445ccfc39b68902546cdfc7ee30d3eBrian Wellington * @type object
f19771c55d7e7d5bb38160e710185e6e61749d16Andreas Gustafsson */
f19771c55d7e7d5bb38160e710185e6e61749d16Andreas Gustafsson shorthand: {
f19771c55d7e7d5bb38160e710185e6e61749d16Andreas Gustafsson '\\#(-?[_a-z]+[-\\w]*)': '[id=$1]',
f19771c55d7e7d5bb38160e710185e6e61749d16Andreas Gustafsson '\\.(-?[_a-z]+[-\\w]*)': '[className~=$1]'
f19771c55d7e7d5bb38160e710185e6e61749d16Andreas Gustafsson },
f19771c55d7e7d5bb38160e710185e6e61749d16Andreas Gustafsson
f1d427043e94371cdf1f21b3cbd65917adbcff25Andreas Gustafsson /**
f1d427043e94371cdf1f21b3cbd65917adbcff25Andreas Gustafsson * List of operators and corresponding boolean functions.
f1d427043e94371cdf1f21b3cbd65917adbcff25Andreas Gustafsson * These functions are passed the attribute and the current node's value of the attribute.
f1d427043e94371cdf1f21b3cbd65917adbcff25Andreas Gustafsson * @property operators
f1d427043e94371cdf1f21b3cbd65917adbcff25Andreas Gustafsson * @type object
10e22ebcc3629be94d37bf408157e2c5ee5740e0Andreas Gustafsson */
6c29053a20f7614167bafa4388c666644a095349Andreas Gustafsson operators: {
6c29053a20f7614167bafa4388c666644a095349Andreas Gustafsson '': function(node, attr) { return Y.DOM.getAttribute(node, attr) !== ''; }, // Just test for existence of attribute
6c29053a20f7614167bafa4388c666644a095349Andreas Gustafsson //'': '.+',
6c29053a20f7614167bafa4388c666644a095349Andreas Gustafsson //'=': '^{val}$', // equality
6c29053a20f7614167bafa4388c666644a095349Andreas Gustafsson '~=': '(?:^|\\s+){val}(?:\\s+|$)', // space-delimited
3d509f54ac6bbcc19de5aa6d1ce37e001821dc7bDavid Lawrence '|=': '^{val}-?' // optional hyphen-delimited
3d509f54ac6bbcc19de5aa6d1ce37e001821dc7bDavid Lawrence },
3d509f54ac6bbcc19de5aa6d1ce37e001821dc7bDavid Lawrence
3d509f54ac6bbcc19de5aa6d1ce37e001821dc7bDavid Lawrence pseudos: {
a59ed6543bbc13e7c784d6badce7b757c2620e28David Lawrence 'first-child': function(node) {
a59ed6543bbc13e7c784d6badce7b757c2620e28David Lawrence return Y.Selector._children(node[PARENT_NODE])[0] === node;
a59ed6543bbc13e7c784d6badce7b757c2620e28David Lawrence }
a59ed6543bbc13e7c784d6badce7b757c2620e28David Lawrence },
a59ed6543bbc13e7c784d6badce7b757c2620e28David Lawrence
10e6498d6d7b2cfd8d822788d817fc9a3e0b0c3aDavid Lawrence _bruteQuery: function(selector, root, firstOnly) {
10e6498d6d7b2cfd8d822788d817fc9a3e0b0c3aDavid Lawrence var ret = [],
10e6498d6d7b2cfd8d822788d817fc9a3e0b0c3aDavid Lawrence nodes = [],
10e6498d6d7b2cfd8d822788d817fc9a3e0b0c3aDavid Lawrence tokens = Selector._tokenize(selector),
91b191a90cae9b162b8c68a3b4820031e129b37bBrian Wellington token = tokens[tokens.length - 1],
91b191a90cae9b162b8c68a3b4820031e129b37bBrian Wellington rootDoc = Y.DOM._getDoc(root),
bf00f50cf43a43a999b5ab054cab652f7775dce6Brian Wellington id,
bf00f50cf43a43a999b5ab054cab652f7775dce6Brian Wellington className,
bf00f50cf43a43a999b5ab054cab652f7775dce6Brian Wellington tagName;
253f774e358dba38742a484426a4cadf4f248817Brian Wellington
253f774e358dba38742a484426a4cadf4f248817Brian Wellington
253f774e358dba38742a484426a4cadf4f248817Brian Wellington // if we have an initial ID, set to root when in document
2de31518c3da27092120b40fc373cecf600d64e6Brian Wellington /*
2de31518c3da27092120b40fc373cecf600d64e6Brian Wellington if (tokens[0] && rootDoc === root &&
2de31518c3da27092120b40fc373cecf600d64e6Brian Wellington (id = tokens[0].id) &&
4ae3a03bb7dbb050adddc051a5df6f3de057eb27Andreas Gustafsson rootDoc.getElementById(id)) {
4ae3a03bb7dbb050adddc051a5df6f3de057eb27Andreas Gustafsson root = rootDoc.getElementById(id);
4ae3a03bb7dbb050adddc051a5df6f3de057eb27Andreas Gustafsson }
4ae3a03bb7dbb050adddc051a5df6f3de057eb27Andreas Gustafsson */
10e22ebcc3629be94d37bf408157e2c5ee5740e0Andreas Gustafsson
10e22ebcc3629be94d37bf408157e2c5ee5740e0Andreas Gustafsson if (token) {
2732332fe53d00592109ef69c0075fcc2ad09db9Brian Wellington // prefilter nodes
2732332fe53d00592109ef69c0075fcc2ad09db9Brian Wellington id = token.id;
2732332fe53d00592109ef69c0075fcc2ad09db9Brian Wellington className = token.className;
8fa78d9ad5f5ab6c69d1d52b00b1ffcdf1bd5bebMichael Sawyer tagName = token.tagName || '*';
8fa78d9ad5f5ab6c69d1d52b00b1ffcdf1bd5bebMichael Sawyer
8fa78d9ad5f5ab6c69d1d52b00b1ffcdf1bd5bebMichael Sawyer // try ID first
e544b507b8019a62c5d2716281f6832519a8791dDavid Lawrence if (id) {
e544b507b8019a62c5d2716281f6832519a8791dDavid Lawrence nodes = Y.DOM.allById(id, root);
e544b507b8019a62c5d2716281f6832519a8791dDavid Lawrence // try className
09de21079e902c7356d936ef4f2a31060b36e5f3Brian Wellington } else if (className) {
09de21079e902c7356d936ef4f2a31060b36e5f3Brian Wellington nodes = root.getElementsByClassName(className);
09de21079e902c7356d936ef4f2a31060b36e5f3Brian Wellington } else { // default to tagName
ee4429e13e08f30c366cdc5d10585388b8a9f212Michael Sawyer nodes = root.getElementsByTagName(tagName);
ee4429e13e08f30c366cdc5d10585388b8a9f212Michael Sawyer }
b74896ead5671943135727b50d86d1040d7ffbf3David Lawrence
09671f9551077f9eae8c41619b61272cb9821100Andreas Gustafsson if (nodes.length) {
b74896ead5671943135727b50d86d1040d7ffbf3David Lawrence ret = Selector._filterNodes(nodes, tokens, firstOnly);
b74896ead5671943135727b50d86d1040d7ffbf3David Lawrence }
3c7ce471aa8a1a9c5bc0ca9e41f406bdc9f0b2aeAndreas Gustafsson }
8aff41ca8ac8dbd9671f3da824406a8783db49d1Brian Wellington
8aff41ca8ac8dbd9671f3da824406a8783db49d1Brian Wellington return ret;
8aff41ca8ac8dbd9671f3da824406a8783db49d1Brian Wellington },
c9d7e543d0da2996d1cc52d3c5920141df49a4ecBrian Wellington
c9d7e543d0da2996d1cc52d3c5920141df49a4ecBrian Wellington _filterNodes: function(nodes, tokens, firstOnly) {
6dbf9cbe6a39a00de910ef843b9f864abf68bc40Brian Wellington var i = 0,
6dbf9cbe6a39a00de910ef843b9f864abf68bc40Brian Wellington j,
6dbf9cbe6a39a00de910ef843b9f864abf68bc40Brian Wellington len = tokens.length,
17aac384e029f5dd3314876058c7501f4d84b90bBrian Wellington n = len - 1,
17aac384e029f5dd3314876058c7501f4d84b90bBrian Wellington result = [],
833535ea78ec7a15376b862fd288ffd00f808666Brian Wellington node = nodes[0],
17aac384e029f5dd3314876058c7501f4d84b90bBrian Wellington tmpNode = node,
23f64ea0dcd7f5b7094ae6ade2a002fb7dde1466Brian Wellington getters = Y.Selector.getters,
23f64ea0dcd7f5b7094ae6ade2a002fb7dde1466Brian Wellington operator,
23f64ea0dcd7f5b7094ae6ade2a002fb7dde1466Brian Wellington combinator,
3c7ce471aa8a1a9c5bc0ca9e41f406bdc9f0b2aeAndreas Gustafsson token,
3c7ce471aa8a1a9c5bc0ca9e41f406bdc9f0b2aeAndreas Gustafsson path,
3c7ce471aa8a1a9c5bc0ca9e41f406bdc9f0b2aeAndreas Gustafsson pass,
3c7ce471aa8a1a9c5bc0ca9e41f406bdc9f0b2aeAndreas Gustafsson //FUNCTION = 'function',
3562c9dc12f06eb964ccefd3291a012f4e6b1743Brian Wellington value,
3562c9dc12f06eb964ccefd3291a012f4e6b1743Brian Wellington tests,
3562c9dc12f06eb964ccefd3291a012f4e6b1743Brian Wellington test;
4d5c668a91c6e5a26653031dd137292bfc03da52Andreas Gustafsson
f437f6ffae28f88334cf47ce8f948cbf40331ffaAndreas Gustafsson //do {
f437f6ffae28f88334cf47ce8f948cbf40331ffaAndreas Gustafsson for (i = 0; (tmpNode = node = nodes[i++]);) {
704d6eeab1d8d6a2aeb99c37fa5a97322d9340fcBrian Wellington n = len - 1;
704d6eeab1d8d6a2aeb99c37fa5a97322d9340fcBrian Wellington path = null;
704d6eeab1d8d6a2aeb99c37fa5a97322d9340fcBrian Wellington
ed8ba54e644957e0ebd51601552193275299ca8dAndreas Gustafsson testLoop:
ed8ba54e644957e0ebd51601552193275299ca8dAndreas Gustafsson while (tmpNode && tmpNode.tagName) {
ed8ba54e644957e0ebd51601552193275299ca8dAndreas Gustafsson token = tokens[n];
4d5c668a91c6e5a26653031dd137292bfc03da52Andreas Gustafsson tests = token.tests;
4d5c668a91c6e5a26653031dd137292bfc03da52Andreas Gustafsson j = tests.length;
4d5c668a91c6e5a26653031dd137292bfc03da52Andreas Gustafsson if (j && !pass) {
7789eb1345bef03773a2530dce7f2709cc50aa2aAndreas Gustafsson while ((test = tests[--j])) {
5a6335a8bffdcc15ab4b3bb01d070080f9bc892eMark Andrews operator = test[1];
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson if (getters[test[0]]) {
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson value = getters[test[0]](tmpNode, test[0]);
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson } else {
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson value = tmpNode[test[0]];
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson // use getAttribute for non-standard attributes
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson if (value === undefined && tmpNode.getAttribute) {
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson value = tmpNode.getAttribute(test[0]);
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson }
4c08b67a5f01eda472a9dfee4c73dbbac49c0065Mark Andrews }
4c08b67a5f01eda472a9dfee4c73dbbac49c0065Mark Andrews
f8abaa0fae7f75d9601c10b6a4af8dd907494d45Mark Andrews if ((operator === '=' && value !== test[2]) || // fast path for equality
f8abaa0fae7f75d9601c10b6a4af8dd907494d45Mark Andrews (operator.test && !operator.test(value)) || // regex test
f8abaa0fae7f75d9601c10b6a4af8dd907494d45Mark Andrews (operator.call && !operator(tmpNode, test[0]))) { // function test
1addbb84718fdb7635459ed05f060be086e88f35Andreas Gustafsson
1addbb84718fdb7635459ed05f060be086e88f35Andreas Gustafsson // skip non element nodes or non-matching tags
1addbb84718fdb7635459ed05f060be086e88f35Andreas Gustafsson if ((tmpNode = tmpNode[path])) {
1addbb84718fdb7635459ed05f060be086e88f35Andreas Gustafsson while (tmpNode &&
1addbb84718fdb7635459ed05f060be086e88f35Andreas Gustafsson (!tmpNode.tagName ||
1addbb84718fdb7635459ed05f060be086e88f35Andreas Gustafsson (token.tagName && token.tagName !== tmpNode.tagName))
d3be9a9c6ef76a5d7671b0962785ca025b153d2bAndreas Gustafsson ) {
d3be9a9c6ef76a5d7671b0962785ca025b153d2bAndreas Gustafsson tmpNode = tmpNode[path];
d3be9a9c6ef76a5d7671b0962785ca025b153d2bAndreas Gustafsson }
e9fce1415f8be4cd38d528950c92c481bd105254Mark Andrews }
e9fce1415f8be4cd38d528950c92c481bd105254Mark Andrews continue testLoop;
e9fce1415f8be4cd38d528950c92c481bd105254Mark Andrews }
483958540f0034d543f0564beb7877326f15a45bMark Andrews }
483958540f0034d543f0564beb7877326f15a45bMark Andrews }
59e1a928bc4253b91ead0f7c46be7d3984cb3016Bob Halley
90cd33e0baf23574a88a4c967afec8b95a1801deAndreas Gustafsson n--; // move to next token
90cd33e0baf23574a88a4c967afec8b95a1801deAndreas Gustafsson // now that we've passed the test, move up the tree by combinator
90cd33e0baf23574a88a4c967afec8b95a1801deAndreas Gustafsson if (!pass && (combinator = token.combinator)) {
90cd33e0baf23574a88a4c967afec8b95a1801deAndreas Gustafsson path = combinator.axis;
517950ae99fa271b034a5cfec1c9fbb62696f975Mark Andrews tmpNode = tmpNode[path];
517950ae99fa271b034a5cfec1c9fbb62696f975Mark Andrews
517950ae99fa271b034a5cfec1c9fbb62696f975Mark Andrews // skip non element nodes
f9870620b346ed267023dc98ee81adcfef2e16b7Andreas Gustafsson while (tmpNode && !tmpNode.tagName) {
f9870620b346ed267023dc98ee81adcfef2e16b7Andreas Gustafsson tmpNode = tmpNode[path];
dfd7798d8b870abf03795d8095297a4b982ab6e9Mark Andrews }
19ff7edc1a6388085193f5487e1599f45aa62648Mark Andrews
19ff7edc1a6388085193f5487e1599f45aa62648Mark Andrews if (combinator.direct) { // one pass only
19ff7edc1a6388085193f5487e1599f45aa62648Mark Andrews path = null;
8a0ff6c15cb20c903f9e16a3d5c2cab603478bc3Mark Andrews }
8a0ff6c15cb20c903f9e16a3d5c2cab603478bc3Mark Andrews
8a0ff6c15cb20c903f9e16a3d5c2cab603478bc3Mark Andrews } else { // success if we made it this far
8a0ff6c15cb20c903f9e16a3d5c2cab603478bc3Mark Andrews result.push(node);
a6dbd6b6604e27ae3c7190de20dbcaaa6e5a1fd8Andreas Gustafsson if (firstOnly) {
42928d936e79dbda7ea00bbcab6e5d8034a95bf8Andreas Gustafsson return result;
0c0619cc1983ff58e855c5159d8892e46dddac5eBrian Wellington }
0c0619cc1983ff58e855c5159d8892e46dddac5eBrian Wellington break;
c472ead4a932f93251eddaa41e120c3bfc4f95a4Andreas Gustafsson }
c472ead4a932f93251eddaa41e120c3bfc4f95a4Andreas Gustafsson }
c472ead4a932f93251eddaa41e120c3bfc4f95a4Andreas Gustafsson }// while (tmpNode = node = nodes[++i]);
d7e77a9b59138e8a94d3dfa4e41e1852ad51ac25Andreas Gustafsson node = tmpNode = null;
c472ead4a932f93251eddaa41e120c3bfc4f95a4Andreas Gustafsson return result;
a6dbd6b6604e27ae3c7190de20dbcaaa6e5a1fd8Andreas Gustafsson },
a6dbd6b6604e27ae3c7190de20dbcaaa6e5a1fd8Andreas Gustafsson
a6dbd6b6604e27ae3c7190de20dbcaaa6e5a1fd8Andreas Gustafsson _getRegExp: function(str, flags) {
383665e42ad838046472e847b16c4e0d3f1aaf76Bob Halley var regexCache = Selector._regexCache;
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson flags = flags || '';
383665e42ad838046472e847b16c4e0d3f1aaf76Bob Halley if (!regexCache[str + flags]) {
383665e42ad838046472e847b16c4e0d3f1aaf76Bob Halley regexCache[str + flags] = new RegExp(str, flags);
383665e42ad838046472e847b16c4e0d3f1aaf76Bob Halley }
383665e42ad838046472e847b16c4e0d3f1aaf76Bob Halley return regexCache[str + flags];
383665e42ad838046472e847b16c4e0d3f1aaf76Bob Halley },
6b5a6fbe1cc0ceb7e2b516aaada596b79360a5b8Bob Halley
6b5a6fbe1cc0ceb7e2b516aaada596b79360a5b8Bob Halley combinators: {
6b5a6fbe1cc0ceb7e2b516aaada596b79360a5b8Bob Halley ' ': {
5bbed85a33186db4e629e98f45ca702ac6b09127Brian Wellington axis: 'parentNode'
ba6fd2580863759baedd9c47153602b19006a324Andreas Gustafsson },
ba6fd2580863759baedd9c47153602b19006a324Andreas Gustafsson
ba6fd2580863759baedd9c47153602b19006a324Andreas Gustafsson '>': {
ba6fd2580863759baedd9c47153602b19006a324Andreas Gustafsson axis: 'parentNode',
ba6fd2580863759baedd9c47153602b19006a324Andreas Gustafsson direct: true
ba6fd2580863759baedd9c47153602b19006a324Andreas Gustafsson },
86a4d80e0624a10b1824d25018246e1ea63f55d2Andreas Gustafsson
86a4d80e0624a10b1824d25018246e1ea63f55d2Andreas Gustafsson
850d70818503ca1b0f98c9c70b16b51e789fd705Andreas Gustafsson '+': {
dd16d9d9e77c2d906ee5ffa3dd9f71cacfbcb081Brian Wellington axis: 'previousSibling',
dd16d9d9e77c2d906ee5ffa3dd9f71cacfbcb081Brian Wellington direct: true
d3a86da2e8f09e2c3f55721aae537b9cacc7e537Andreas Gustafsson }
d3a86da2e8f09e2c3f55721aae537b9cacc7e537Andreas Gustafsson },
d3a86da2e8f09e2c3f55721aae537b9cacc7e537Andreas Gustafsson
d3a86da2e8f09e2c3f55721aae537b9cacc7e537Andreas Gustafsson _parsers: [
850d70818503ca1b0f98c9c70b16b51e789fd705Andreas Gustafsson {
850d70818503ca1b0f98c9c70b16b51e789fd705Andreas Gustafsson name: ATTRIBUTES,
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence re: /^\[(-?[a-z]+[\w\-]*)+([~\|\^\$\*!=]=?)?['"]?([^\]]*?)['"]?\]/i,
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence fn: function(match, token) {
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence var operator = match[2] || '',
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence operators = Y.Selector.operators,
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence test;
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence // add prefiltering for ID and CLASS
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence if ((match[1] === 'id' && operator === '=') ||
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence (match[1] === 'className' &&
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence document.documentElement.getElementsByClassName &&
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence (operator === '~=' || operator === '='))) {
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence token.prefilter = match[1];
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence token[match[1]] = match[3];
3c82f274bd880a33fdaf211af4fe8f6b3d6ca556David Lawrence }
5afc10d6d8278c9ab34b9f6c82ef7bb3bfefd0efAndreas Gustafsson
78d78f05d91205cbde33ca87d24b8d13aa2d8d66Brian Wellington // add tests
78d78f05d91205cbde33ca87d24b8d13aa2d8d66Brian Wellington if (operator in operators) {
78d78f05d91205cbde33ca87d24b8d13aa2d8d66Brian Wellington test = operators[operator];
78d78f05d91205cbde33ca87d24b8d13aa2d8d66Brian Wellington if (typeof test === 'string') {
5afc10d6d8278c9ab34b9f6c82ef7bb3bfefd0efAndreas Gustafsson test = Y.Selector._getRegExp(test.replace('{val}', match[3]));
5afc10d6d8278c9ab34b9f6c82ef7bb3bfefd0efAndreas Gustafsson }
5afc10d6d8278c9ab34b9f6c82ef7bb3bfefd0efAndreas Gustafsson match[2] = test;
5afc10d6d8278c9ab34b9f6c82ef7bb3bfefd0efAndreas Gustafsson }
3f01dde0bd24561fc3a6c2f7e259a58af4457a86Brian Wellington if (!token.last || token.prefilter !== match[1]) {
3f01dde0bd24561fc3a6c2f7e259a58af4457a86Brian Wellington return match.slice(1);
3f01dde0bd24561fc3a6c2f7e259a58af4457a86Brian Wellington }
626b221f7113479a0709f0bb0a8193c0ab0dcf84Andreas Gustafsson }
626b221f7113479a0709f0bb0a8193c0ab0dcf84Andreas Gustafsson
626b221f7113479a0709f0bb0a8193c0ab0dcf84Andreas Gustafsson },
626b221f7113479a0709f0bb0a8193c0ab0dcf84Andreas Gustafsson {
733e928f714c848aa394c2d12b6239bc7780101bMark Andrews name: TAG_NAME,
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson re: /^((?:-?[_a-z]+[\w-]*)|\*)/i,
c379c1bddb2d84c9219ab6c394b33aa866b9f3bfAndreas Gustafsson fn: function(match, token) {
febaa091847ab004f40500cc475a819f2c73fcddAndreas Gustafsson var tag = match[1].toUpperCase();
febaa091847ab004f40500cc475a819f2c73fcddAndreas Gustafsson token.tagName = tag;
ebfcb6cf66283096ebda1503b6cc042ce86b6bedBrian Wellington
ebfcb6cf66283096ebda1503b6cc042ce86b6bedBrian Wellington if (tag !== '*' && (!token.last || token.prefilter)) {
c379c1bddb2d84c9219ab6c394b33aa866b9f3bfAndreas Gustafsson return [TAG_NAME, '=', tag];
c379c1bddb2d84c9219ab6c394b33aa866b9f3bfAndreas Gustafsson }
c379c1bddb2d84c9219ab6c394b33aa866b9f3bfAndreas Gustafsson if (!token.prefilter) {
066faef1195d539f575816ccab87ff3e85b1b13eBrian Wellington token.prefilter = 'tagName';
dffdc24ffd76ef3d8c8141671e89fb39428fef06Brian Wellington }
17442ccc2b2e9c3b3bfc337f0fdfad6186fbb123Mark Andrews }
17442ccc2b2e9c3b3bfc337f0fdfad6186fbb123Mark Andrews },
61b0df9eb522f13aef13cc2704728e799cbc251aMichael Sawyer {
61b0df9eb522f13aef13cc2704728e799cbc251aMichael Sawyer name: COMBINATOR,
61b0df9eb522f13aef13cc2704728e799cbc251aMichael Sawyer re: /^\s*([>+~]|\s)\s*/,
61b0df9eb522f13aef13cc2704728e799cbc251aMichael Sawyer fn: function(match, token) {
369bb68c2c7709c7fd8b0d6c1d1f8abc6422a7e2Michael Sawyer }
369bb68c2c7709c7fd8b0d6c1d1f8abc6422a7e2Michael Sawyer },
369bb68c2c7709c7fd8b0d6c1d1f8abc6422a7e2Michael Sawyer {
369bb68c2c7709c7fd8b0d6c1d1f8abc6422a7e2Michael Sawyer name: PSEUDOS,
3dcb97b199693012d12e978b8f577a339e434361Andreas Gustafsson re: /^:([\-\w]+)(?:\(['"]?(.+)['"]?\))*/i,
3dcb97b199693012d12e978b8f577a339e434361Andreas Gustafsson fn: function(match, token) {
a3e41e3c03a32b00fc243fce538a39ddc7237885Andreas Gustafsson var test = Selector[PSEUDOS][match[1]];
a3e41e3c03a32b00fc243fce538a39ddc7237885Andreas Gustafsson if (test) { // reorder match array
a3e41e3c03a32b00fc243fce538a39ddc7237885Andreas Gustafsson return [match[2], test];
a3e41e3c03a32b00fc243fce538a39ddc7237885Andreas Gustafsson } else { // selector token not supported (possibly missing CSS3 module)
4ec1a96d90784f70380bdec66f8a0bd6718a5b71Mark Andrews return false;
fa3cbea8bfba19d1c11f9a6ad20f40a2c15377f0Brian Wellington }
fa3cbea8bfba19d1c11f9a6ad20f40a2c15377f0Brian Wellington }
0fc89c4ee660e825ac66774f2d4912cfc396386aMark Andrews }
0fc89c4ee660e825ac66774f2d4912cfc396386aMark Andrews ],
e21d199dca95aff5d50f133d6b064309e209af00Brian Wellington
e21d199dca95aff5d50f133d6b064309e209af00Brian Wellington _getToken: function(token) {
c03298d879554fc5dc197c28fd4b686e0d880ee3Mark Andrews return {
c03298d879554fc5dc197c28fd4b686e0d880ee3Mark Andrews tagName: null,
04c22ceaf2d3812eaab69d79958d0e0d62048cd2Mark Andrews id: null,
04c22ceaf2d3812eaab69d79958d0e0d62048cd2Mark Andrews className: null,
04c22ceaf2d3812eaab69d79958d0e0d62048cd2Mark Andrews attributes: {},
04c22ceaf2d3812eaab69d79958d0e0d62048cd2Mark Andrews combinator: null,
04c22ceaf2d3812eaab69d79958d0e0d62048cd2Mark Andrews tests: []
04c22ceaf2d3812eaab69d79958d0e0d62048cd2Mark Andrews };
04c22ceaf2d3812eaab69d79958d0e0d62048cd2Mark Andrews },
6ef15459b8fd3fc8b5672da4ad72c19a755dbe45Mark Andrews
b65f2ab14abb4b6ef906d7d02064fba158f07b1eDavid Lawrence /**
b65f2ab14abb4b6ef906d7d02064fba158f07b1eDavid Lawrence Break selector into token units per simple selector.
b65f2ab14abb4b6ef906d7d02064fba158f07b1eDavid Lawrence Combinator is attached to the previous token.
b65f2ab14abb4b6ef906d7d02064fba158f07b1eDavid Lawrence */
b65f2ab14abb4b6ef906d7d02064fba158f07b1eDavid Lawrence _tokenize: function(selector) {
b65f2ab14abb4b6ef906d7d02064fba158f07b1eDavid Lawrence selector = selector || '';
c03bb27f0675a6e60ceea66b451548e8481bc05cMark Andrews selector = Selector._replaceShorthand(Y.Lang.trim(selector));
c03bb27f0675a6e60ceea66b451548e8481bc05cMark Andrews var token = Selector._getToken(), // one token per simple selector (left selector holds combinator)
c03bb27f0675a6e60ceea66b451548e8481bc05cMark Andrews query = selector, // original query for debug report
7789eb1345bef03773a2530dce7f2709cc50aa2aAndreas Gustafsson tokens = [], // array of tokens
b65f2ab14abb4b6ef906d7d02064fba158f07b1eDavid Lawrence found = false, // whether or not any matches were found this pass
c03bb27f0675a6e60ceea66b451548e8481bc05cMark Andrews match, // the regex match
c03bb27f0675a6e60ceea66b451548e8481bc05cMark Andrews test,
c03bb27f0675a6e60ceea66b451548e8481bc05cMark Andrews i, parser;
389c749a5ee18f1c0d6278ae49f2aae5d5f0d2dcMark Andrews
389c749a5ee18f1c0d6278ae49f2aae5d5f0d2dcMark Andrews /*
72fa265baa3d138b43427bcb5c0838740f807045Mark Andrews Search for selector patterns, store, and strip them from the selector string
09671f9551077f9eae8c41619b61272cb9821100Andreas Gustafsson until no patterns match (invalid selector) or we run out of chars.
72fa265baa3d138b43427bcb5c0838740f807045Mark Andrews
4b6d5b2312d1482cc406fe58fa3269dd7a915b3fMark Andrews Multiple attributes and pseudos are allowed, in any order.
a5aca6df165c601d755b8c5f5727048078bf0db5Andreas Gustafsson for example:
4b6d5b2312d1482cc406fe58fa3269dd7a915b3fMark Andrews 'form:first-child[type=button]:not(button)[lang|=en]'
4b6d5b2312d1482cc406fe58fa3269dd7a915b3fMark Andrews */
29c818c7d40fc8898b062903ec703851328a4deaMark Andrews outer:
29c818c7d40fc8898b062903ec703851328a4deaMark Andrews do {
b1cde6bf3a8e3a77eb77caf97df0d7ec5c8450dfBrian Wellington found = false; // reset after full pass
b1cde6bf3a8e3a77eb77caf97df0d7ec5c8450dfBrian Wellington for (i = 0; (parser = Selector._parsers[i++]);) {
b1cde6bf3a8e3a77eb77caf97df0d7ec5c8450dfBrian Wellington if ( (match = parser.re.exec(selector)) ) { // note assignment
f8abaa0fae7f75d9601c10b6a4af8dd907494d45Mark Andrews if (parser.name !== COMBINATOR ) {
f8abaa0fae7f75d9601c10b6a4af8dd907494d45Mark Andrews token.selector = selector;
f8abaa0fae7f75d9601c10b6a4af8dd907494d45Mark Andrews }
f8abaa0fae7f75d9601c10b6a4af8dd907494d45Mark Andrews selector = selector.replace(match[0], ''); // strip current match from selector
28b7844ee93231da831ba3c090e1677bb1be5f18Andreas Gustafsson if (!selector.length) {
37d1c8ee546ae89720c3e17e57ee3a05e9cdc7b9Brian Wellington token.last = true;
37d1c8ee546ae89720c3e17e57ee3a05e9cdc7b9Brian Wellington }
37d1c8ee546ae89720c3e17e57ee3a05e9cdc7b9Brian Wellington
28b7844ee93231da831ba3c090e1677bb1be5f18Andreas Gustafsson if (Selector._attrFilters[match[1]]) { // convert class to className, etc.
28b7844ee93231da831ba3c090e1677bb1be5f18Andreas Gustafsson match[1] = Selector._attrFilters[match[1]];
28b7844ee93231da831ba3c090e1677bb1be5f18Andreas Gustafsson }
28b7844ee93231da831ba3c090e1677bb1be5f18Andreas Gustafsson
28b7844ee93231da831ba3c090e1677bb1be5f18Andreas Gustafsson test = parser.fn(match, token);
28b7844ee93231da831ba3c090e1677bb1be5f18Andreas Gustafsson if (test === false) { // selector not supported
78db9e8f4b686fde6dfa0ec85a68c06cc9d4bf28Brian Wellington found = false;
78db9e8f4b686fde6dfa0ec85a68c06cc9d4bf28Brian Wellington break outer;
78db9e8f4b686fde6dfa0ec85a68c06cc9d4bf28Brian Wellington } else if (test) {
78db9e8f4b686fde6dfa0ec85a68c06cc9d4bf28Brian Wellington token.tests.push(test);
78db9e8f4b686fde6dfa0ec85a68c06cc9d4bf28Brian Wellington }
b20ee662a7c847c9ef7b96ab9e5e34543efe5c0dMark Andrews
b20ee662a7c847c9ef7b96ab9e5e34543efe5c0dMark Andrews if (!selector.length || parser.name === COMBINATOR) {
b20ee662a7c847c9ef7b96ab9e5e34543efe5c0dMark Andrews tokens.push(token);
450995b90c8cb66d82c2377d4f9bd9812a132c30Andreas Gustafsson token = Selector._getToken(token);
450995b90c8cb66d82c2377d4f9bd9812a132c30Andreas Gustafsson if (parser.name === COMBINATOR) {
450995b90c8cb66d82c2377d4f9bd9812a132c30Andreas Gustafsson token.combinator = Y.Selector.combinators[match[1]];
f90fe7c8b9a3eef8968fac74905e868c8ab583a3Brian Wellington }
190fbe9738bd0c1b9b13732bb8bd56b2b7c71640David Lawrence }
190fbe9738bd0c1b9b13732bb8bd56b2b7c71640David Lawrence found = true;
190fbe9738bd0c1b9b13732bb8bd56b2b7c71640David Lawrence }
190fbe9738bd0c1b9b13732bb8bd56b2b7c71640David Lawrence }
190fbe9738bd0c1b9b13732bb8bd56b2b7c71640David Lawrence } while (found && selector.length);
190fbe9738bd0c1b9b13732bb8bd56b2b7c71640David Lawrence
190fbe9738bd0c1b9b13732bb8bd56b2b7c71640David Lawrence if (!found || selector.length) { // not fully parsed
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley Y.log('query: ' + query + ' contains unsupported token in: ' + selector, 'warn', 'Selector');
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley tokens = [];
7b438bdb9b821f9f1c96443762072e137716048dBrian Wellington }
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley return tokens;
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley },
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley
7b438bdb9b821f9f1c96443762072e137716048dBrian Wellington _replaceShorthand: function(selector) {
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley var shorthand = Selector.shorthand,
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley attrs = selector.match(Selector._re.attr), // pull attributes to avoid false pos on "." and "#"
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley pseudos = selector.match(Selector._re.pseudos), // pull attributes to avoid false pos on "." and "#"
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley re, i, len;
7b438bdb9b821f9f1c96443762072e137716048dBrian Wellington
c40085afa75a5eae732ec1198384dd5cb24400b6Bob Halley if (pseudos) {
86c270cbb24117976d6cd3098c3010e067915c24Andreas Gustafsson selector = selector.replace(Selector._re.pseudos, '!!REPLACED_PSEUDO!!');
86c270cbb24117976d6cd3098c3010e067915c24Andreas Gustafsson }
10258f6b3d1ce54ffb22e6b9a31f8f001f7ee2d5Mark Andrews
b38ebe307cb2411535c79afd441870a99cc50eddMark Andrews if (attrs) {
b38ebe307cb2411535c79afd441870a99cc50eddMark Andrews selector = selector.replace(Selector._re.attr, '!!REPLACED_ATTRIBUTE!!');
b38ebe307cb2411535c79afd441870a99cc50eddMark Andrews }
c2e0aac879097f81bcd31e3d09660a71e70c5fb0Michael Sawyer
8217f91f8d2dd6e94a2bf893284506ea47cd294aAndreas Gustafsson for (re in shorthand) {
c2e0aac879097f81bcd31e3d09660a71e70c5fb0Michael Sawyer if (shorthand.hasOwnProperty(re)) {
21a170a0cee1ec2df7be0ce334da309f9a892ea9Andreas Gustafsson selector = selector.replace(Selector._getRegExp(re, 'gi'), shorthand[re]);
588b63e1a86fb707172830e14897da624ed380edMark Andrews }
588b63e1a86fb707172830e14897da624ed380edMark Andrews }
bb17aa91c14de959b191a200df61afb6a68f110fBrian Wellington
bb17aa91c14de959b191a200df61afb6a68f110fBrian Wellington if (attrs) {
bb17aa91c14de959b191a200df61afb6a68f110fBrian Wellington for (i = 0, len = attrs.length; i < len; ++i) {
452d75b18f9d050086964fa39c326cf388517396Mark Andrews selector = selector.replace('!!REPLACED_ATTRIBUTE!!', attrs[i]);
452d75b18f9d050086964fa39c326cf388517396Mark Andrews }
2b4db0b6d4b5a0307cecbafdd1d34d6f61b7dbadMark Andrews }
2b4db0b6d4b5a0307cecbafdd1d34d6f61b7dbadMark Andrews if (pseudos) {
6850cdd4497424c9d42ade487edfde9fb9a47de9Brian Wellington for (i = 0, len = pseudos.length; i < len; ++i) {
6850cdd4497424c9d42ade487edfde9fb9a47de9Brian Wellington selector = selector.replace('!!REPLACED_PSEUDO!!', pseudos[i]);
6850cdd4497424c9d42ade487edfde9fb9a47de9Brian Wellington }
6850cdd4497424c9d42ade487edfde9fb9a47de9Brian Wellington }
2a37aa188c2297e0c0856c3e5740c43dd426a432Mark Andrews return selector;
2a37aa188c2297e0c0856c3e5740c43dd426a432Mark Andrews },
2a37aa188c2297e0c0856c3e5740c43dd426a432Mark Andrews
6c87cf19970a9eef43c1e38227cd23b3a2f6151aMark Andrews _attrFilters: {
6c87cf19970a9eef43c1e38227cd23b3a2f6151aMark Andrews 'class': 'className',
7869b99dc815e3b863351b8095d1b71b3f583541Brian Wellington 'for': 'htmlFor'
7869b99dc815e3b863351b8095d1b71b3f583541Brian Wellington },
df1e829dde71ab960545453e4ae439ae601d5a9eMark Andrews
df1e829dde71ab960545453e4ae439ae601d5a9eMark Andrews getters: {
df1e829dde71ab960545453e4ae439ae601d5a9eMark Andrews href: function(node, attr) {
df1e829dde71ab960545453e4ae439ae601d5a9eMark Andrews return Y.DOM.getAttribute(node, attr);
df1e829dde71ab960545453e4ae439ae601d5a9eMark Andrews }
df1e829dde71ab960545453e4ae439ae601d5a9eMark Andrews }
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer };
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael SawyerY.mix(Y.Selector, SelectorCSS2, true);
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael SawyerY.Selector.getters.src = Y.Selector.getters.rel = Y.Selector.getters.href;
0e7da7ac26cb234763ff03c3a9bc06e3c22e546fAndreas Gustafsson
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer// IE wants class with native queries
cef18335b7f37bf02bc9e9f2c8750a3a9dcd718aAndreas Gustafssonif (Y.Selector.useNative && document.querySelector) {
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer Y.Selector.shorthand['\\.(-?[_a-z]+[-\\w]*)'] = '[class~=$1]';
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer}
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer}, '@VERSION@' ,{requires:['selector-native']});
fb04db11ee6aad3ac3e023ab89b5f9d8a4d5674dMichael Sawyer
e65fe7af00935a0a81d4b0b0ed51c7f6c89f5c3bAndreas Gustafsson
e65fe7af00935a0a81d4b0b0ed51c7f6c89f5c3bAndreas GustafssonYUI.add('selector', function(Y){}, '@VERSION@' ,{use:['selector-native', 'selector-css2']});
e65fe7af00935a0a81d4b0b0ed51c7f6c89f5c3bAndreas Gustafsson
4bb3a1a63d7943564f30bf9efd312283141439a2Andreas Gustafsson
4bb3a1a63d7943564f30bf9efd312283141439a2Andreas Gustafsson
4bb3a1a63d7943564f30bf9efd312283141439a2Andreas GustafssonYUI.add('dom', function(Y){}, '@VERSION@' ,{use:['dom-base', 'dom-style', 'dom-screen', 'selector']});
4bb3a1a63d7943564f30bf9efd312283141439a2Andreas Gustafsson
cef18335b7f37bf02bc9e9f2c8750a3a9dcd718aAndreas Gustafsson