src/cm/media/js/lib/yui/yui_3.0.0b1/build/dom/dom-debug.js
author raph
Mon, 23 Nov 2009 15:14:29 +0100
changeset 0 40c8f766c9b8
permissions -rw-r--r--
import from internal svn r 4007
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
Code licensed under the BSD License:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
http://developer.yahoo.net/yui/license.txt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
version: 3.0.0b1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
build: 1163
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
YUI.add('dom-base', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
/** 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
 * The DOM utility provides a cross-browser abtraction layer
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
 * normalizing DOM tasks, and adds extra helper functionality
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
 * for other common tasks. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
 * @module dom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
 * @submodule dom-base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
 * Provides DOM helper methods.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
 * @class DOM
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
var NODE_TYPE = 'nodeType',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
    OWNER_DOCUMENT = 'ownerDocument',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
    DOCUMENT_ELEMENT = 'documentElement',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
    DEFAULT_VIEW = 'defaultView',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
    PARENT_WINDOW = 'parentWindow',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
    TAG_NAME = 'tagName',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
    PARENT_NODE = 'parentNode',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
    FIRST_CHILD = 'firstChild',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    LAST_CHILD = 'lastChild',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
    PREVIOUS_SIBLING = 'previousSibling',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
    NEXT_SIBLING = 'nextSibling',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
    CONTAINS = 'contains',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
    COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
    re_tag = /<([a-z]+)/i;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
Y.DOM = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
     * Returns the HTMLElement with the given ID (Wrapper for document.getElementById).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
     * @method byId         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
     * @param {String} id the id attribute 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
     * @param {Object} doc optional The document to search. Defaults to current document 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
     * @return {HTMLElement | null} The HTMLElement with the id, or null if none found. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
    byId: function(id, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
        doc = doc || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
        // TODO: IE Name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
        return doc.getElementById(id);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
     * Returns the text content of the HTMLElement. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
     * @method getText         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
     * @param {HTMLElement} element The html element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
     * @return {String} The text content of the element (includes text of any descending elements).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
    getText: (document.documentElement.textContent !== undefined) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
        function(element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
            var ret = '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
            if (element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
                ret = element.textContent;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
            return ret || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
        } : function(element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
            var ret = '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
            if (element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
                ret = element.innerText;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
            return ret || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
     * Sets the text content of the HTMLElement. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
     * @method setText         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
     * @param {HTMLElement} element The html element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
     * @param {String} content The content to add. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
    setText: (document.documentElement.textContent !== undefined) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
        function(element, content) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
            if (element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
                element.textContent = content;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
        } : function(element, content) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
            if (element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
                element.innerText = content;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
// TODO: pull out sugar (rely on _childBy, byAxis, etc)?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
     * Finds the firstChild of the given HTMLElement. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
     * @method firstChild
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
     * @deprecated Use _childBy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
     * @param {HTMLElement} element The html element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
     * The optional function is passed the current HTMLElement being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
     * If no function is given, the first found is returned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
     * @return {HTMLElement | null} The first matching child html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
    firstChild: function(element, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
        return Y.DOM._childBy(element, null, fn);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
    // @deprecated Use _childBy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
    firstChildByTag: function(element, tag, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
        return Y.DOM._childBy(element, tag, fn);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
     * Finds the lastChild of the given HTMLElement.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
     * @method lastChild
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
     * @deprecated Use _childBy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
     * @param {HTMLElement} element The html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
     * @param {String} tag The tag to search for.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
     * The optional function is passed the current HTMLElement being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
     * If no function is given, the first found is returned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
     * @return {HTMLElement | null} The first matching child html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
    lastChild: function(element, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
        return Y.DOM._childBy(element, null, fn, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
    // @deprecated Use _childBy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
    lastChildByTag: function(element, tag, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
        return Y.DOM._childBy(element, tag, fn, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
     * Finds all HTMLElement childNodes matching the given tag.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
     * @method childrenByTag
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
     * @deprecated Use Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
     * @param {HTMLElement} element The html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
     * @param {String} tag The tag to search for.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
     * The optional function is passed the current HTMLElement being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
     * If no function is given, all children with the given tag are collected.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
     * @return {Array} The collection of child elements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
     * TODO: Webkit children.tags() returns grandchildren
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
    _childrenByTag: function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
        if (document[DOCUMENT_ELEMENT].children) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
            return function(element, tag, fn, toArray) { // TODO: keep toArray option?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
                tag = (tag && tag !== '*') ? tag.toUpperCase() : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
                var elements = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
                    wrapFn = fn;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
                if (element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
                    if (tag && !Y.UA.webkit) { // children.tags() broken in safari
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
                        elements = element.children.tags(tag);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
                    } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
                        elements = element.children;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
                        if (tag) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
                            wrapFn = function(el) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
                                return el[TAG_NAME].toUpperCase() === tag && (!fn || fn(el));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
                            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
                    elements = Y.DOM.filterElementsBy(elements, wrapFn);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
                return elements;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
            return function(element, tag, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
                tag = (tag && tag !== '*') ? tag.toUpperCase() : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
                var elements = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
                    wrapFn = fn;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
                if (element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
                    elements = element.childNodes; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
                    if (tag) { // wrap fn and add tag test TODO: allow tag in filterElementsBy?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
                        wrapFn = function(el) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
                            return el[TAG_NAME].toUpperCase() === tag && (!fn || fn(el));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
                        };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
                    elements = Y.DOM.filterElementsBy(elements, wrapFn);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
                return elements;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
    }(),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
     * Finds all HTMLElement childNodes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
     * @method children
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
     * @deprecated Use Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
     * @param {HTMLElement} element The html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
     * The optional function is passed the current HTMLElement being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
     * If no function is given, all children are collected.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
     * @return {Array} The collection of child elements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
    children: function(element, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
        return Y.DOM._childrenByTag(element, null, fn);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
     * Finds the previous sibling of the element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
     * @method previous
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
     * @deprecated Use elementByAxis
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
     * @param {HTMLElement} element The html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
     * The optional function is passed the current DOM node being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
     * If no function is given, the first sibling is returned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
     * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
     * @return {HTMLElement | null} The matching DOM node or null if none found. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
    previous: function(element, fn, all) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
        return Y.DOM.elementByAxis(element, PREVIOUS_SIBLING, fn, all);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
     * Finds the next sibling of the element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
     * @method next
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
     * @deprecated Use elementByAxis
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
     * @param {HTMLElement} element The html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
     * The optional function is passed the current DOM node being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
     * If no function is given, the first sibling is returned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
     * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
     * @return {HTMLElement | null} The matching DOM node or null if none found. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
    next: function(element, fn, all) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
        return Y.DOM.elementByAxis(element, NEXT_SIBLING, fn, all);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
     * Finds the ancestor of the element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
     * @method ancestor
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
     * @deprecated Use elementByAxis
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
     * @param {HTMLElement} element The html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
     * The optional function is passed the current DOM node being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
     * If no function is given, the parentNode is returned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
     * @param {Boolean} all optional Whether all node types should be scanned, or just element nodes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
     * @return {HTMLElement | null} The matching DOM node or null if none found. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
     // TODO: optional stopAt node?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
    ancestor: function(element, fn, all) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
        return Y.DOM.elementByAxis(element, PARENT_NODE, fn, all);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
     * Searches the element by the given axis for the first matching element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
     * @method elementByAxis
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
     * @param {HTMLElement} element The html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
     * @param {String} axis The axis to search (parentNode, nextSibling, previousSibling).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
     * @param {Boolean} all optional Whether all node types should be returned, or just element nodes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
     * The optional function is passed the current HTMLElement being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
     * If no function is given, the first element is returned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
     * @return {HTMLElement | null} The matching element or null if none found.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
    elementByAxis: function(element, axis, fn, all) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
        while (element && (element = element[axis])) { // NOTE: assignment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
                if ( (all || element[TAG_NAME]) && (!fn || fn(element)) ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
                    return element;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
        return null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
     * Finds all elements with the given tag.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
     * @method byTag
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
     * @deprecated Use Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
     * @param {String} tag The tag being search for. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
     * @param {HTMLElement} root optional An optional root element to start from.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
     * The optional function is passed the current HTMLElement being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
     * If no function is given, all elements with the given tag are returned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
     * @return {Array} The collection of matching elements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
    byTag: function(tag, root, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
        root = root || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
        var elements = root.getElementsByTagName(tag),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
            retNodes = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
            i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
        for (i = 0, len = elements.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
            if ( !fn || fn(elements[i]) ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
                retNodes[retNodes.length] = elements[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
        return retNodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
     * Finds the first element with the given tag.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
     * @method firstByTag
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
     * @deprecated Use Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
     * @param {String} tag The tag being search for. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
     * @param {HTMLElement} root optional An optional root element to start from.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
     * @param {Function} fn optional An optional boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
     * The optional function is passed the current HTMLElement being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
     * If no function is given, the first match is returned. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
     * @return {HTMLElement} The matching element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
    firstByTag: function(tag, root, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
        root = root || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
        var elements = root.getElementsByTagName(tag),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
            ret = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
            i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
        for (i = 0, len = elements.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
            if ( !fn || fn(elements[i]) ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
                ret = elements[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
     * Filters a collection of HTMLElements by the given attributes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
     * @method filterElementsBy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
     * @param {Array} elements The collection of HTMLElements to filter.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
     * @param {Function} fn A boolean test to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
     * The function is passed the current HTMLElement being tested as its only argument.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
     * If no function is given, all HTMLElements are kept.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
     * @return {Array} The filtered collection of HTMLElements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
    filterElementsBy: function(elements, fn, firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
        var ret = (firstOnly) ? null : [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
            i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
        for (i = 0, len = elements.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
            if (elements[i][TAG_NAME] && (!fn || fn(elements[i]))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
                if (firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
                    ret = elements[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
                    ret[ret.length] = elements[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
     * Determines whether or not one HTMLElement is or contains another HTMLElement.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
     * @method contains
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
     * @param {HTMLElement} element The containing html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
     * @param {HTMLElement} needle The html element that may be contained.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
     * @return {Boolean} Whether or not the element is or contains the needle.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
    contains: function(element, needle) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
        var ret = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
        if ( !needle || !element || !needle[NODE_TYPE] || !element[NODE_TYPE]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
            ret = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
        } else if (element[CONTAINS])  {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
            if (Y.UA.opera || needle[NODE_TYPE] === 1) { // IE & SAF contains fail if needle not an ELEMENT_NODE
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
                ret = element[CONTAINS](needle);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
                ret = Y.DOM._bruteContains(element, needle); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
        } else if (element[COMPARE_DOCUMENT_POSITION]) { // gecko
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
            if (element === needle || !!(element[COMPARE_DOCUMENT_POSITION](needle) & 16)) { 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
                ret = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
     * Determines whether or not the HTMLElement is part of the document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
     * @method inDoc
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
     * @param {HTMLElement} element The containing html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
     * @param {HTMLElement} doc optional The document to check.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
     * @return {Boolean} Whether or not the element is attached to the document. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
    inDoc: function(element, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
        doc = doc || element[OWNER_DOCUMENT];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
        var id = element.id;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
        if (!id) { // TODO: remove when done?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
            id = element.id = Y.guid();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
        return !! (doc.getElementById(id));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
     * Inserts the new node as the previous sibling of the reference node 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
     * @method insertBefore
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
     * @param {String | HTMLElement} newNode The node to be inserted
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
     * @param {String | HTMLElement} referenceNode The node to insert the new node before 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
     * @return {HTMLElement} The node that was inserted (or null if insert fails) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
    insertBefore: function(newNode, referenceNode) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
        var ret = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
            parent;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
        if (newNode && referenceNode && (parent = referenceNode.parentNode)) { // NOTE: assignment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
            if (typeof newNode === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
                newNode = Y.DOM.create(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
            ret = parent.insertBefore(newNode, referenceNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
            Y.log('insertBefore failed: missing or invalid arg(s)', 'error', 'dom');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
     * Inserts the new node as the next sibling of the reference node 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
     * @method insertAfter
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
     * @param {String | HTMLElement} newNode The node to be inserted
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
     * @param {String | HTMLElement} referenceNode The node to insert the new node after 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
     * @return {HTMLElement} The node that was inserted (or null if insert fails) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
    insertAfter: function(newNode, referenceNode) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
        if (!newNode || !referenceNode || !referenceNode[PARENT_NODE]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
            Y.log('insertAfter failed: missing or invalid arg(s)', 'error', 'DOM');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
            return null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
        }       
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
        if (typeof newNode === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
            newNode = Y.DOM.create(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
        if (referenceNode[NEXT_SIBLING]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
            return referenceNode[PARENT_NODE].insertBefore(newNode, referenceNode[NEXT_SIBLING]); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
            return referenceNode[PARENT_NODE].appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
     * Creates a new dom node using the provided markup string. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
     * @method create
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
     * @param {String} html The markup used to create the element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
     * @param {HTMLDocument} doc An optional document context 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   442
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   443
    create: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   444
        html = Y.Lang.trim(html); // match IE which trims whitespace from innerHTML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
        if (!doc && Y.DOM._cloneCache[html]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
            return Y.DOM._cloneCache[html].cloneNode(true); // NOTE: return
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
        doc = doc || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
        var m = re_tag.exec(html),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
            create = Y.DOM._create,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
            custom = Y.DOM.creators,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
            ret = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
            tag, nodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   456
        if (m && custom[m[1]]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   457
            if (typeof custom[m[1]] === 'function') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   458
                create = custom[m[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
                tag = custom[m[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   461
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   462
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   463
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   464
        nodes = create(html, doc, tag).childNodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   466
        if (nodes.length === 1) { // return single node, breaking parentNode ref from "fragment"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   467
            ret = nodes[0].parentNode.removeChild(nodes[0]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   468
        } else { // return multiple nodes as a fragment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   469
            ret = doc.createDocumentFragment();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   470
            while (nodes.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
                ret.appendChild(nodes[0]); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
        Y.DOM._cloneCache[html] = ret.cloneNode(true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   477
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   478
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   479
    CUSTOM_ATTRIBUTES: (!document.documentElement.hasAttribute) ? { // IE < 8
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   480
        'for': 'htmlFor',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   481
        'class': 'className'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   482
    } : { // w3c
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   483
        'htmlFor': 'for',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   484
        'className': 'class'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   485
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   486
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   488
     * Provides a normalized attribute interface. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   489
     * @method setAttibute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   490
     * @param {String | HTMLElement} el The target element for the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   491
     * @param {String} attr The attribute to set.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   492
     * @param {String} val The value of the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   493
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   494
    setAttribute: function(el, attr, val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   495
        if (el && el.setAttribute) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   496
            attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   497
            el.setAttribute(attr, val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   498
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   499
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   500
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   501
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   502
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   503
     * Provides a normalized attribute interface. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   504
     * @method getAttibute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   505
     * @param {String | HTMLElement} el The target element for the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
     * @param {String} attr The attribute to get.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   507
     * @return {String} The current value of the attribute. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   508
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   509
    getAttribute: function(el, attr) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   510
        var ret = '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   511
        if (el && el.getAttribute) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   512
            attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   513
            ret = el.getAttribute(attr, 2);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   514
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   515
            if (ret === null) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   516
                ret = ''; // per DOM spec
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   517
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   518
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   519
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   520
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   521
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   522
    // @deprecated
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   523
    srcIndex: (document.documentElement.sourceIndex) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   524
        function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   525
            return (node && node.sourceIndex) ? node.sourceIndex : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   526
        } :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   527
        function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   528
            return (node && node[OWNER_DOCUMENT]) ? 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   529
                    [].indexOf.call(node[OWNER_DOCUMENT].
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
                            getElementsByTagName('*'), node) : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   531
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   532
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   533
    isWindow: function(obj) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   534
        return obj.alert && obj.document;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   535
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   536
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   537
    _fragClones: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   538
        div: document.createElement('div')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
    _create: function(html, doc, tag) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
        tag = tag || 'div';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
        var frag = Y.DOM._fragClones[tag];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
        if (frag) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
            frag = frag.cloneNode(false);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
            frag = Y.DOM._fragClones[tag] = doc.createElement(tag);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
        frag.innerHTML = html;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   551
        return frag;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   552
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   553
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
    _removeChildNodes: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
        while (node.firstChild) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
            node.removeChild(node.firstChild);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
    _cloneCache: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   561
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
     * Inserts content in a node at the given location 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
     * @method addHTML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   565
     * @param {HTMLElement} node The node to insert into
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
     * @param {String} content The content to be inserted 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   567
     * @param {String} where Where to insert the content; default is after lastChild 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   568
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   569
    addHTML: function(node, content, where) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   570
        if (typeof content === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
            content = Y.Lang.trim(content); // match IE which trims whitespace from innerHTML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
        var newNode = Y.DOM._cloneCache[content];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
        if (newNode) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
            newNode = newNode.cloneNode(true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   579
            if (content.nodeType) { // domNode
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   580
                newNode = content;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
            } else { // create from string and cache
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
                newNode = Y.DOM.create(content);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
        if (where) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
            if (where.nodeType) { // insert regardless of relationship to node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
                // TODO: check if node.contains(where)?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
                where.parentNode.insertBefore(newNode, where);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
                switch (where) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
                    case 'replace':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
                        while (node.firstChild) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   594
                            node.removeChild(node.firstChild);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   595
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   596
                        node.appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   597
                        break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   598
                    case 'before':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   599
                        node.parentNode.insertBefore(newNode, node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   600
                        break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   601
                    case 'after':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   602
                        if (node.nextSibling) { // IE errors if refNode is null
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   603
                            node.parentNode.insertBefore(newNode, node.nextSibling);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   604
                        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   605
                            node.parentNode.appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   606
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
                        break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
                    default:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
                        node.appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
            node.appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
        return newNode;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   618
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   619
    VALUE_SETTERS: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
    VALUE_GETTERS: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   623
    getValue: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   624
        var ret = '', // TODO: return null?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
            getter;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
        if (node && node[TAG_NAME]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
            getter = Y.DOM.VALUE_GETTERS[node[TAG_NAME].toLowerCase()];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   630
            if (getter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
                ret = getter(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   632
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   633
                ret = node.value;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   634
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   637
        return (typeof ret === 'string') ? ret : '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   638
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   639
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
    setValue: function(node, val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
        var setter;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
        if (node && node[TAG_NAME]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
            setter = Y.DOM.VALUE_SETTERS[node[TAG_NAME].toLowerCase()];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
            if (setter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
                setter(node, val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   648
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
                node.value = val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   650
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   651
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   652
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   654
    _stripScripts: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
        var scripts = node.getElementsByTagName('script'),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   656
            i, script;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   657
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   658
        for (i = 0, script; script = scripts[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
            script.parentNode.removeChild(script);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
    _execScripts: function(scripts, startIndex) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
        var newScript,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
            i, script;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   667
        startIndex = startIndex || 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
        for (i = startIndex, script; script = scripts[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   670
            newScript = script.ownerDocument.createElement('script');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   671
            script.parentNode.replaceChild(newScript, script);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
            if (script.text) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   673
                newScript.text = script.text;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   674
            } else if (script.src) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   675
                newScript.src = script.src;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   676
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   677
                 // "pause" while loading to ensure exec order 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   678
                // FF reports typeof onload as "undefined", so try IE first
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   679
                if (typeof newScript.onreadystatechange !== 'undefined') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   680
                    newScript.onreadystatechange = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   681
                        if (/loaded|complete/.test(script.readyState)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   682
                            event.srcElement.onreadystatechange = null; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   683
                            // timer to help ensure exec order
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   684
                            setTimeout(function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   685
                                Y.DOM._execScripts(scripts, i++);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   686
                            }, 0);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   687
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   688
                    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   689
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   690
                    newScript.onload = function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   691
                        e.target.onload = null; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   692
                        Y.DOM._execScripts(scripts, i++);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   693
                    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   694
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   695
                return; // NOTE: early return to chain async loading
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   696
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   697
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   698
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   699
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   700
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   701
     * Brute force version of contains.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   702
     * Used for browsers without contains support for non-HTMLElement Nodes (textNodes, etc).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   703
     * @method _bruteContains
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   704
     * @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   705
     * @param {HTMLElement} element The containing html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   706
     * @param {HTMLElement} needle The html element that may be contained.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   707
     * @return {Boolean} Whether or not the element is or contains the needle.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   708
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   709
    _bruteContains: function(element, needle) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   710
        while (needle) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   711
            if (element === needle) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   712
                return true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   713
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   714
            needle = needle.parentNode;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   715
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   716
        return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   717
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   718
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   719
// TODO: move to Lang?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   720
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   721
     * Memoizes dynamic regular expressions to boost runtime performance. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   722
     * @method _getRegExp
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   723
     * @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   724
     * @param {String} str The string to convert to a regular expression.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   725
     * @param {String} flags optional An optinal string of flags.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   726
     * @return {RegExp} An instance of RegExp
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   727
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   728
    _getRegExp: function(str, flags) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   729
        flags = flags || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   730
        Y.DOM._regexCache = Y.DOM._regexCache || {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   731
        if (!Y.DOM._regexCache[str + flags]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   732
            Y.DOM._regexCache[str + flags] = new RegExp(str, flags);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   733
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   734
        return Y.DOM._regexCache[str + flags];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   735
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   736
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   737
// TODO: make getDoc/Win true privates?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   738
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   739
     * returns the appropriate document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   740
     * @method _getDoc
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   741
     * @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   742
     * @param {HTMLElement} element optional Target element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   743
     * @return {Object} The document for the given element or the default document. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   744
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   745
    _getDoc: function(element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   746
        element = element || {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   747
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   748
        return (element[NODE_TYPE] === 9) ? element : // element === document
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   749
                element[OWNER_DOCUMENT] || // element === DOM node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   750
                element.document || // element === window
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   751
                Y.config.doc; // default
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   752
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   753
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   754
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   755
     * returns the appropriate window.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   756
     * @method _getWin
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   757
     * @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   758
     * @param {HTMLElement} element optional Target element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   759
     * @return {Object} The window for the given element or the default window. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   760
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   761
    _getWin: function(element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   762
        var doc = Y.DOM._getDoc(element);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   763
        return doc[DEFAULT_VIEW] || doc[PARENT_WINDOW] || Y.config.win;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   764
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   765
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   766
    // @deprecated, use Selector 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   767
    _childBy: function(element, tag, fn, rev) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   768
        var ret = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   769
            root, axis;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   770
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   771
        if (element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   772
            if (rev) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   773
                root = element[LAST_CHILD];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   774
                axis = PREVIOUS_SIBLING;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   775
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   776
                root = element[FIRST_CHILD];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   777
                axis = NEXT_SIBLING;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   778
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   779
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   780
            if (Y.DOM._testElement(root, tag, fn)) { // is the matching element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   781
                ret = root;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   782
            } else { // need to scan nextSibling axis of firstChild to find matching element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   783
                ret = Y.DOM.elementByAxis(root, axis, fn);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   784
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   785
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   786
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   787
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   788
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   789
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   790
    _batch: function(nodes, fn, arg1, arg2, arg3, etc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   791
        fn = (typeof name === 'string') ? Y.DOM[fn] : fn;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   792
        var result,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   793
            ret = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   794
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   795
        if (fn && nodes) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   796
            Y.each(nodes, function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   797
                if ((result = fn.call(Y.DOM, node, arg1, arg2, arg3, etc)) !== undefined) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   798
                    ret[ret.length] = result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   799
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   800
            });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   801
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   802
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   803
        return ret.length ? ret : nodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   804
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   805
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   806
    _testElement: function(element, tag, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   807
        tag = (tag && tag !== '*') ? tag.toUpperCase() : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   808
        return (element && element[TAG_NAME] &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   809
                (!tag || element[TAG_NAME].toUpperCase() === tag) &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   810
                (!fn || fn(element)));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   811
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   812
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   813
    creators: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   814
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   815
    _IESimpleCreate: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   816
        doc = doc || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   817
        return doc.createElement(html);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   818
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   819
};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   820
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   821
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   822
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   823
    var creators = Y.DOM.creators,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   824
        create = Y.DOM.create,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   825
        re_tbody = /(?:\/(?:thead|tfoot|tbody|caption|col|colgroup)>)+\s*<tbody/,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   826
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   827
        TABLE_OPEN = '<table>',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   828
        TABLE_CLOSE = '</table>';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   829
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   830
    if (Y.UA.gecko || Y.UA.ie) { // require custom creation code for certain element types
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   831
        Y.mix(creators, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   832
            option: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   833
                return create('<select>' + html + '</select>', doc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   834
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   835
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   836
            tr: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   837
                return create('<tbody>' + html + '</tbody>', doc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   838
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   839
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   840
            td: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   841
                return create('<tr>' + html + '</tr>', doc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   842
            }, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   843
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   844
            tbody: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   845
                return create(TABLE_OPEN + html + TABLE_CLOSE, doc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   846
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   847
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   848
            legend: 'fieldset'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   849
        });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   850
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   851
        creators.col = creators.tbody; // IE wraps in colgroup
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   852
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   853
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   854
    if (Y.UA.ie) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   855
        Y.mix(creators, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   856
        // TODO: thead/tfoot with nested tbody
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   857
            // IE adds TBODY when creating TABLE elements (which may share this impl)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   858
            tbody: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   859
                var frag = create(TABLE_OPEN + html + TABLE_CLOSE, doc),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   860
                    tb = frag.children.tags('tbody')[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   861
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   862
                if (frag.children.length > 1 && tb && !re_tbody.test(html)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   863
                    tb[PARENT_NODE].removeChild(tb); // strip extraneous tbody
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   864
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   865
                return frag;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   866
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   867
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   868
            script: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   869
                var frag = doc.createElement('div');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   870
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   871
                frag.innerHTML = '-' + html;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   872
                frag.removeChild(frag[FIRST_CHILD]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   873
                return frag;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   874
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   875
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   876
        }, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   877
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   878
        Y.mix(Y.DOM.VALUE_GETTERS, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   879
            button: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   880
                return (node.attributes && node.attributes.value) ? node.attributes.value.value : '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   881
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   882
        });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   883
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   884
        Y.mix(Y.DOM.VALUE_SETTERS, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   885
            // IE: node.value changes the button text, which should be handled via innerHTML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   886
            button: function(node, val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   887
                var attr = node.attributes.value;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   888
                if (!attr) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   889
                    attr = node[OWNER_DOCUMENT].createAttribute('value');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   890
                    node.setAttributeNode(attr);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   891
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   892
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   893
                attr.value = val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   894
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   895
        });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   896
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   897
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   898
    if (Y.UA.gecko || Y.UA.ie) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   899
        Y.mix(creators, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   900
                th: creators.td,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   901
                thead: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   902
                tfoot: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   903
                caption: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   904
                colgroup: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   905
                col: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   906
                optgroup: creators.option
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   907
        });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   908
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   909
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   910
    Y.mix(Y.DOM.VALUE_GETTERS, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   911
        option: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   912
            var attrs = node.attributes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   913
            return (attrs.value && attrs.value.specified) ? node.value : node.text;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   914
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   915
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   916
        select: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   917
            var val = node.value,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   918
                options = node.options;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   919
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   920
            if (options && val === '') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   921
                if (node.multiple) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   922
                    Y.log('multiple select normalization not implemented', 'warn', 'DOM');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   923
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   924
                    val = Y.DOM.getValue(options[node.selectedIndex], 'value');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   925
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   926
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   927
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   928
            return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   929
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   930
    });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   931
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   932
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   933
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   934
Y.mix(Y.DOM, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   935
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   936
     * Determines whether a DOM element has the given className.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   937
     * @method hasClass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   938
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   939
     * @param {String} className the class name to search for
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   940
     * @return {Boolean} Whether or not the element has the given class. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   941
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   942
    hasClass: function(node, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   943
        var re = Y.DOM._getRegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   944
        return re.test(node.className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   945
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   946
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   947
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   948
     * Adds a class name to a given DOM element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   949
     * @method addClass         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   950
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   951
     * @param {String} className the class name to add to the class attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   952
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   953
    addClass: function(node, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   954
        if (!Y.DOM.hasClass(node, className)) { // skip if already present 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   955
            node.className = Y.Lang.trim([node.className, className].join(' '));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   956
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   957
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   958
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   959
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   960
     * Removes a class name from a given element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   961
     * @method removeClass         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   962
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   963
     * @param {String} className the class name to remove from the class attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   964
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   965
    removeClass: function(node, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   966
        if (className && Y.DOM.hasClass(node, className)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   967
            node.className = Y.Lang.trim(node.className.replace(Y.DOM._getRegExp('(?:^|\\s+)' +
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   968
                            className + '(?:\\s+|$)'), ' '));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   969
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   970
            if ( Y.DOM.hasClass(node, className) ) { // in case of multiple adjacent
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   971
                Y.DOM.removeClass(node, className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   972
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   973
        }                 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   974
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   975
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   976
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   977
     * Replace a class with another class for a given element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   978
     * If no oldClassName is present, the newClassName is simply added.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   979
     * @method replaceClass  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   980
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   981
     * @param {String} oldClassName the class name to be replaced
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   982
     * @param {String} newClassName the class name that will be replacing the old class name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   983
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   984
    replaceClass: function(node, oldC, newC) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   985
        //Y.log('replaceClass replacing ' + oldC + ' with ' + newC, 'info', 'Node');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   986
        Y.DOM.addClass(node, newC);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   987
        Y.DOM.removeClass(node, oldC);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   988
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   989
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   990
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   991
     * If the className exists on the node it is removed, if it doesn't exist it is added.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   992
     * @method toggleClass  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   993
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   994
     * @param {String} className the class name to be toggled
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   995
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   996
    toggleClass: function(node, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   997
        if (Y.DOM.hasClass(node, className)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   998
            Y.DOM.removeClass(node, className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   999
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1000
            Y.DOM.addClass(node, className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1001
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1002
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1003
});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1004
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1005
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1006
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1007
}, '3.0.0b1' ,{requires:['event'], skinnable:false});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1008
YUI.add('dom-style', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1009
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1010
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1011
/** 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1012
 * Add style management functionality to DOM.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1013
 * @module dom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1014
 * @submodule dom-style
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1015
 * @for DOM
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1016
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1017
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1018
var DOCUMENT_ELEMENT = 'documentElement',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1019
    DEFAULT_VIEW = 'defaultView',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1020
    OWNER_DOCUMENT = 'ownerDocument',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1021
    STYLE = 'style',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1022
    FLOAT = 'float',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1023
    CSS_FLOAT = 'cssFloat',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1024
    STYLE_FLOAT = 'styleFloat',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1025
    TRANSPARENT = 'transparent',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1026
    GET_COMPUTED_STYLE = 'getComputedStyle',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1027
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1028
    DOCUMENT = Y.config.doc,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1029
    UNDEFINED = undefined,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1030
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1031
    re_color = /color$/i;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1032
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1033
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1034
Y.mix(Y.DOM, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1035
    CUSTOM_STYLES: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1036
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1037
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1038
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1039
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1040
     * Sets a style property for a given element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1041
     * @method setStyle
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1042
     * @param {HTMLElement} An HTMLElement to apply the style to.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1043
     * @param {String} att The style property to set. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1044
     * @param {String|Number} val The value. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1045
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1046
    setStyle: function(node, att, val, style) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1047
        style = style || node.style;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1048
        var CUSTOM_STYLES = Y.DOM.CUSTOM_STYLES;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1049
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1050
        if (style) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1051
            if (val === null) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1052
                val = ''; // normalize for unsetting
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1053
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1054
            if (att in CUSTOM_STYLES) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1055
                if (CUSTOM_STYLES[att].set) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1056
                    CUSTOM_STYLES[att].set(node, val, style);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1057
                    return; // NOTE: return
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1058
                } else if (typeof CUSTOM_STYLES[att] === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1059
                    att = CUSTOM_STYLES[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1060
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1061
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1062
            style[att] = val; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1063
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1064
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1065
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1066
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1067
     * Returns the current style value for the given property.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1068
     * @method getStyle
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1069
     * @param {HTMLElement} An HTMLElement to get the style from.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1070
     * @param {String} att The style property to get. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1071
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1072
    getStyle: function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1073
        var style = node[STYLE],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1074
            CUSTOM_STYLES = Y.DOM.CUSTOM_STYLES,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1075
            val = '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1076
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1077
        if (style) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1078
            if (att in CUSTOM_STYLES) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1079
                if (CUSTOM_STYLES[att].get) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1080
                    return CUSTOM_STYLES[att].get(node, att, style); // NOTE: return
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1081
                } else if (typeof CUSTOM_STYLES[att] === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1082
                    att = CUSTOM_STYLES[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1083
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1084
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1085
            val = style[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1086
            if (val === '') { // TODO: is empty string sufficient?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1087
                val = Y.DOM[GET_COMPUTED_STYLE](node, att);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1088
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1089
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1090
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1091
        return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1092
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1093
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1094
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1095
     * Sets multiple style properties.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1096
     * @method setStyles
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1097
     * @param {HTMLElement} node An HTMLElement to apply the styles to. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1098
     * @param {Object} hash An object literal of property:value pairs. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1099
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1100
    setStyles: function(node, hash) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1101
        var style = node.style;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1102
        Y.each(hash, function(v, n) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1103
            Y.DOM.setStyle(node, n, v, style);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1104
        }, Y.DOM);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1105
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1106
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1107
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1108
     * Returns the computed style for the given node.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1109
     * @method getComputedStyle
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1110
     * @param {HTMLElement} An HTMLElement to get the style from.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1111
     * @param {String} att The style property to get. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1112
     * @return {String} The computed value of the style property. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1113
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1114
    getComputedStyle: function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1115
        var val = '',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1116
            doc = node[OWNER_DOCUMENT];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1117
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1118
        if (node[STYLE]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1119
            val = doc[DEFAULT_VIEW][GET_COMPUTED_STYLE](node, null)[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1120
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1121
        return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1122
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1123
});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1124
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1125
// normalize reserved word float alternatives ("cssFloat" or "styleFloat")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1126
if (DOCUMENT[DOCUMENT_ELEMENT][STYLE][CSS_FLOAT] !== UNDEFINED) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1127
    Y.DOM.CUSTOM_STYLES[FLOAT] = CSS_FLOAT;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1128
} else if (DOCUMENT[DOCUMENT_ELEMENT][STYLE][STYLE_FLOAT] !== UNDEFINED) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1129
    Y.DOM.CUSTOM_STYLES[FLOAT] = STYLE_FLOAT;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1130
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1131
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1132
// fix opera computedStyle default color unit (convert to rgb)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1133
if (Y.UA.opera) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1134
    Y.DOM[GET_COMPUTED_STYLE] = function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1135
        var view = node[OWNER_DOCUMENT][DEFAULT_VIEW],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1136
            val = view[GET_COMPUTED_STYLE](node, '')[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1137
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1138
        if (re_color.test(att)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1139
            val = Y.Color.toRGB(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1140
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1141
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1142
        return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1143
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1144
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1145
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1146
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1147
// safari converts transparent to rgba(), others use "transparent"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1148
if (Y.UA.webkit) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1149
    Y.DOM[GET_COMPUTED_STYLE] = function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1150
        var view = node[OWNER_DOCUMENT][DEFAULT_VIEW],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1151
            val = view[GET_COMPUTED_STYLE](node, '')[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1152
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1153
        if (val === 'rgba(0, 0, 0, 0)') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1154
            val = TRANSPARENT; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1155
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1156
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1157
        return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1158
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1159
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1160
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1161
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1162
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1163
var TO_STRING = 'toString',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1164
    PARSE_INT = parseInt,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1165
    RE = RegExp;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1166
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1167
Y.Color = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1168
    KEYWORDS: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1169
        black: '000',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1170
        silver: 'c0c0c0',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1171
        gray: '808080',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1172
        white: 'fff',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1173
        maroon: '800000',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1174
        red: 'f00',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1175
        purple: '800080',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1176
        fuchsia: 'f0f',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1177
        green: '008000',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1178
        lime: '0f0',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1179
        olive: '808000',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1180
        yellow: 'ff0',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1181
        navy: '000080',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1182
        blue: '00f',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1183
        teal: '008080',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1184
        aqua: '0ff'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1185
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1186
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1187
    re_RGB: /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1188
    re_hex: /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1189
    re_hex3: /([0-9A-F])/gi,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1190
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1191
    toRGB: function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1192
        if (!Y.Color.re_RGB.test(val)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1193
            val = Y.Color.toHex(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1194
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1195
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1196
        if(Y.Color.re_hex.exec(val)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1197
            val = 'rgb(' + [
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1198
                PARSE_INT(RE.$1, 16),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1199
                PARSE_INT(RE.$2, 16),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1200
                PARSE_INT(RE.$3, 16)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1201
            ].join(', ') + ')';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1202
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1203
        return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1204
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1205
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1206
    toHex: function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1207
        val = Y.Color.KEYWORDS[val] || val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1208
        if (Y.Color.re_RGB.exec(val)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1209
            var r = (RE.$1.length === 1) ? '0' + RE.$1 : Number(RE.$1),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1210
                g = (RE.$2.length === 1) ? '0' + RE.$2 : Number(RE.$2),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1211
                b = (RE.$3.length === 1) ? '0' + RE.$3 : Number(RE.$3);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1212
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1213
            val = [
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1214
                r[TO_STRING](16),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1215
                g[TO_STRING](16),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1216
                b[TO_STRING](16)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1217
            ].join('');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1218
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1219
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1220
        if (val.length < 6) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1221
            val = val.replace(Y.Color.re_hex3, '$1$1');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1222
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1223
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1224
        if (val !== 'transparent' && val.indexOf('#') < 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1225
            val = '#' + val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1226
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1227
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1228
        return val.toLowerCase();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1229
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1230
};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1231
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1232
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1233
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1234
var CLIENT_TOP = 'clientTop',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1235
    CLIENT_LEFT = 'clientLeft',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1236
    HAS_LAYOUT = 'hasLayout',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1237
    PX = 'px',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1238
    FILTER = 'filter',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1239
    FILTERS = 'filters',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1240
    OPACITY = 'opacity',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1241
    AUTO = 'auto',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1242
    BORDER_TOP_WIDTH = 'borderTopWidth',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1243
    BORDER_RIGHT_WIDTH = 'borderRightWidth',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1244
    BORDER_BOTTOM_WIDTH = 'borderBottomWidth',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1245
    BORDER_LEFT_WIDTH = 'borderLeftWidth',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1246
    WIDTH = 'width',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1247
    HEIGHT = 'height',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1248
    TRANSPARENT = 'transparent',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1249
    VISIBLE = 'visible',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1250
    GET_COMPUTED_STYLE = 'getComputedStyle',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1251
    UNDEFINED = undefined,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1252
    documentElement = document.documentElement,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1253
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1254
    // TODO: unit-less lineHeight (e.g. 1.22)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1255
    re_size = /^width|height$/,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1256
    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,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1257
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1258
    _getStyleObj = function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1259
        return node.currentStyle || node.style;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1260
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1261
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1262
    ComputedStyle = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1263
        CUSTOM_STYLES: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1264
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1265
        get: function(el, property) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1266
            var value = '',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1267
                current;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1268
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1269
            if (el) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1270
                    current = _getStyleObj(el)[property];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1271
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1272
                if (property === OPACITY) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1273
                    value = Y.DOM.CUSTOM_STYLES[OPACITY].get(el);        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1274
                } else if (!current || (current.indexOf && current.indexOf(PX) > -1)) { // no need to convert
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1275
                    value = current;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1276
                } else if (Y.DOM.IE.COMPUTED[property]) { // use compute function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1277
                    value = Y.DOM.IE.COMPUTED[property](el, property);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1278
                } else if (re_unit.test(current)) { // convert to pixel
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1279
                    value = ComputedStyle.getPixel(el, property) + PX;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1280
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1281
                    value = current;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1282
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1283
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1284
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1285
            return value;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1286
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1287
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1288
        getOffset: function(el, prop) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1289
            var current = _getStyleObj(el)[prop],                     // value of "width", "top", etc.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1290
                capped = prop.charAt(0).toUpperCase() + prop.substr(1), // "Width", "Top", etc.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1291
                offset = 'offset' + capped,                             // "offsetWidth", "offsetTop", etc.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1292
                pixel = 'pixel' + capped,                               // "pixelWidth", "pixelTop", etc.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1293
                actual,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1294
                value = '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1295
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1296
            if (current === AUTO) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1297
                actual = el[offset]; // offsetHeight/Top etc.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1298
                if (actual === UNDEFINED) { // likely "right" or "bottom"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1299
                    value = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1300
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1301
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1302
                value = actual;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1303
                if (re_size.test(prop)) { // account for box model diff 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1304
                    el.style[prop] = actual;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1305
                    if (el[offset] > actual) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1306
                        // the difference is padding + border (works in Standards & Quirks modes)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1307
                        value = actual - (el[offset] - actual);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1308
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1309
                    el.style[prop] = AUTO; // revert to auto
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1310
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1311
            } else { // convert units to px
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1312
                if (current.indexOf('%') > -1) { // IE pixelWidth incorrect for percent; manually compute 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1313
                    current = el.clientWidth - // offsetWidth - borderWidth
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1314
                            ComputedStyle.getPixel(el, 'paddingRight') -
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1315
                            ComputedStyle.getPixel(el, 'paddingLeft');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1316
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1317
                if (!el.style[pixel] && !el.style[prop]) { // need to map style.width to currentStyle (no currentStyle.pixelWidth)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1318
                    el.style[prop] = current;              // no style.pixelWidth if no style.width
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1319
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1320
                value = el.style[pixel];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1321
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1322
            return value + PX;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1323
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1324
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1325
        getBorderWidth: function(el, property) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1326
            // clientHeight/Width = paddingBox (e.g. offsetWidth - borderWidth)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1327
            // clientTop/Left = borderWidth
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1328
            var value = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1329
            if (!el.currentStyle || !el.currentStyle[HAS_LAYOUT]) { // TODO: unset layout?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1330
                el.style.zoom = 1; // need layout to measure client
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1331
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1332
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1333
            switch(property) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1334
                case BORDER_TOP_WIDTH:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1335
                    value = el[CLIENT_TOP];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1336
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1337
                case BORDER_BOTTOM_WIDTH:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1338
                    value = el.offsetHeight - el.clientHeight - el[CLIENT_TOP];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1339
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1340
                case BORDER_LEFT_WIDTH:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1341
                    value = el[CLIENT_LEFT];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1342
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1343
                case BORDER_RIGHT_WIDTH:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1344
                    value = el.offsetWidth - el.clientWidth - el[CLIENT_LEFT];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1345
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1346
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1347
            return value + PX;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1348
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1349
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1350
        getPixel: function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1351
            // use pixelRight to convert to px
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1352
            var val = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1353
                style = _getStyleObj(node),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1354
                styleRight = style.right,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1355
                current = style[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1356
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1357
            node.style.right = current;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1358
            val = node.style.pixelRight;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1359
            node.style.right = styleRight; // revert
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1360
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1361
            return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1362
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1363
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1364
        getMargin: function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1365
            var val,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1366
                style = _getStyleObj(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1367
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1368
            if (style[att] == AUTO) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1369
                val = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1370
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1371
                val = ComputedStyle.getPixel(node, att);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1372
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1373
            return val + PX;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1374
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1375
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1376
        getVisibility: function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1377
            var current;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1378
            while ( (current = node.currentStyle) && current[att] == 'inherit') { // NOTE: assignment in test
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1379
                node = node.parentNode;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1380
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1381
            return (current) ? current[att] : VISIBLE;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1382
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1383
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1384
        getColor: function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1385
            var current = _getStyleObj(node)[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1386
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1387
            if (!current || current === TRANSPARENT) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1388
                Y.DOM.elementByAxis(node, 'parentNode', null, function(parent) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1389
                    current = _getStyleObj(parent)[att];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1390
                    if (current && current !== TRANSPARENT) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1391
                        node = parent;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1392
                        return true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1393
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1394
                });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1395
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1396
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1397
            return Y.Color.toRGB(current);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1398
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1399
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1400
        getBorderColor: function(node, att) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1401
            var current = _getStyleObj(node),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1402
                val = current[att] || current.color;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1403
            return Y.Color.toRGB(Y.Color.toHex(val));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1404
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1405
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1406
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1407
    //fontSize: getPixelFont,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1408
    IEComputed = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1409
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1410
// use alpha filter for IE opacity
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1411
if (documentElement.style[OPACITY] === UNDEFINED &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1412
        documentElement[FILTERS]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1413
    Y.DOM.CUSTOM_STYLES[OPACITY] = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1414
        get: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1415
            var val = 100;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1416
            try { // will error if no DXImageTransform
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1417
                val = node[FILTERS]['DXImageTransform.Microsoft.Alpha'][OPACITY];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1418
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1419
            } catch(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1420
                try { // make sure its in the document
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1421
                    val = node[FILTERS]('alpha')[OPACITY];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1422
                } catch(err) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1423
                    Y.log('getStyle: IE opacity filter not found; returning 1', 'warn', 'dom-style');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1424
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1425
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1426
            return val / 100;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1427
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1428
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1429
        set: function(node, val, style) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1430
            var current,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1431
                styleObj;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1432
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1433
            if (val === '') { // normalize inline style behavior
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1434
                styleObj = _getStyleObj(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1435
                current = (OPACITY in styleObj) ? styleObj[OPACITY] : 1; // revert to original opacity
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1436
                val = current;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1437
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1438
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1439
            if (typeof style[FILTER] == 'string') { // in case not appended
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1440
                style[FILTER] = 'alpha(' + OPACITY + '=' + val * 100 + ')';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1441
                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1442
                if (!node.currentStyle || !node.currentStyle[HAS_LAYOUT]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1443
                    style.zoom = 1; // needs layout 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1444
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1445
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1446
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1447
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1448
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1449
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1450
try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1451
    document.createElement('div').style.height = '-1px';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1452
} catch(e) { // IE throws error on invalid style set; trap common cases
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1453
    Y.DOM.CUSTOM_STYLES.height = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1454
        set: function(node, val, style) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1455
            if (parseInt(val, 10) >= 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1456
                style.height = val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1457
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1458
                Y.log('invalid style value for height: ' + val, 'warn', 'dom-style');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1459
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1460
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1461
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1462
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1463
    Y.DOM.CUSTOM_STYLES.width = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1464
        set: function(node, val, style) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1465
            if (parseInt(val, 10) >= 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1466
                style.width = val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1467
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1468
                Y.log('invalid style value for width: ' + val, 'warn', 'dom-style');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1469
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1470
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1471
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1472
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1473
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1474
// TODO: top, right, bottom, left
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1475
IEComputed[WIDTH] = IEComputed[HEIGHT] = ComputedStyle.getOffset;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1476
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1477
IEComputed.color = IEComputed.backgroundColor = ComputedStyle.getColor;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1478
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1479
IEComputed[BORDER_TOP_WIDTH] = IEComputed[BORDER_RIGHT_WIDTH] =
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1480
        IEComputed[BORDER_BOTTOM_WIDTH] = IEComputed[BORDER_LEFT_WIDTH] =
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1481
        ComputedStyle.getBorderWidth;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1482
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1483
IEComputed.marginTop = IEComputed.marginRight = IEComputed.marginBottom =
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1484
        IEComputed.marginLeft = ComputedStyle.getMargin;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1485
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1486
IEComputed.visibility = ComputedStyle.getVisibility;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1487
IEComputed.borderColor = IEComputed.borderTopColor =
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1488
        IEComputed.borderRightColor = IEComputed.borderBottomColor =
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1489
        IEComputed.borderLeftColor = ComputedStyle.getBorderColor;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1490
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1491
if (!Y.config.win[GET_COMPUTED_STYLE]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1492
    Y.DOM[GET_COMPUTED_STYLE] = ComputedStyle.get; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1493
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1494
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1495
Y.namespace('DOM.IE');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1496
Y.DOM.IE.COMPUTED = IEComputed;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1497
Y.DOM.IE.ComputedStyle = ComputedStyle;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1498
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1499
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1500
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1501
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1502
}, '3.0.0b1' ,{skinnable:false, requires:['dom-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1503
YUI.add('dom-screen', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1504
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1505
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1506
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1507
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1508
 * Adds position and region management functionality to DOM.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1509
 * @module dom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1510
 * @submodule dom-screen
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1511
 * @for DOM
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1512
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1513
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1514
var DOCUMENT_ELEMENT = 'documentElement',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1515
    COMPAT_MODE = 'compatMode',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1516
    POSITION = 'position',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1517
    FIXED = 'fixed',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1518
    RELATIVE = 'relative',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1519
    LEFT = 'left',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1520
    TOP = 'top',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1521
    _BACK_COMPAT = 'BackCompat',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1522
    MEDIUM = 'medium',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1523
    BORDER_LEFT_WIDTH = 'borderLeftWidth',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1524
    BORDER_TOP_WIDTH = 'borderTopWidth',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1525
    GET_BOUNDING_CLIENT_RECT = 'getBoundingClientRect',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1526
    GET_COMPUTED_STYLE = 'getComputedStyle',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1527
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1528
    // TODO: how about thead/tbody/tfoot/tr?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1529
    // TODO: does caption matter?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1530
    RE_TABLE = /^t(?:able|d|h)$/i;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1531
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1532
Y.mix(Y.DOM, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1533
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1534
     * Returns the inner height of the viewport (exludes scrollbar). 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1535
     * @method winHeight
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1536
     * @return {Number} The current height of the viewport.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1537
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1538
    winHeight: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1539
        var h = Y.DOM._getWinSize(node).height;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1540
        Y.log('winHeight returning ' + h, 'info', 'dom-screen');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1541
        return h;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1542
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1543
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1544
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1545
     * Returns the inner width of the viewport (exludes scrollbar). 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1546
     * @method winWidth
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1547
     * @return {Number} The current width of the viewport.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1548
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1549
    winWidth: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1550
        var w = Y.DOM._getWinSize(node).width;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1551
        Y.log('winWidth returning ' + w, 'info', 'dom-screen');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1552
        return w;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1553
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1554
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1555
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1556
     * Document height 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1557
     * @method docHeight
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1558
     * @return {Number} The current height of the document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1559
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1560
    docHeight:  function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1561
        var h = Y.DOM._getDocSize(node).height;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1562
        Y.log('docHeight returning ' + h, 'info', 'dom-screen');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1563
        return Math.max(h, Y.DOM._getWinSize(node).height);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1564
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1565
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1566
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1567
     * Document width 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1568
     * @method docWidth
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1569
     * @return {Number} The current width of the document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1570
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1571
    docWidth:  function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1572
        var w = Y.DOM._getDocSize(node).width;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1573
        Y.log('docWidth returning ' + w, 'info', 'dom-screen');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1574
        return Math.max(w, Y.DOM._getWinSize(node).width);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1575
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1576
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1577
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1578
     * Amount page has been scroll horizontally 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1579
     * @method docScrollX
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1580
     * @return {Number} The current amount the screen is scrolled horizontally.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1581
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1582
    docScrollX: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1583
        var doc = Y.DOM._getDoc(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1584
        return Math.max(doc[DOCUMENT_ELEMENT].scrollLeft, doc.body.scrollLeft);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1585
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1586
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1587
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1588
     * Amount page has been scroll vertically 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1589
     * @method docScrollY
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1590
     * @return {Number} The current amount the screen is scrolled vertically.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1591
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1592
    docScrollY:  function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1593
        var doc = Y.DOM._getDoc(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1594
        return Math.max(doc[DOCUMENT_ELEMENT].scrollTop, doc.body.scrollTop);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1595
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1596
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1597
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1598
     * Gets the current position of an element based on page coordinates. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1599
     * Element must be part of the DOM tree to have page coordinates
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1600
     * (display:none or elements not appended return false).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1601
     * @method getXY
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1602
     * @param element The target element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1603
     * @return {Array} The XY position of the element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1604
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1605
     TODO: test inDocument/display?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1606
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1607
    getXY: function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1608
        if (document[DOCUMENT_ELEMENT][GET_BOUNDING_CLIENT_RECT]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1609
            return function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1610
                var xy = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1611
                    scrollLeft,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1612
                    scrollTop,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1613
                    box,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1614
                    off1, off2,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1615
                    bLeft, bTop,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1616
                    mode,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1617
                    doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1618
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1619
                if (node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1620
                    if (Y.DOM.inDoc(node)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1621
                        scrollLeft = Y.DOM.docScrollX(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1622
                        scrollTop = Y.DOM.docScrollY(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1623
                        box = node[GET_BOUNDING_CLIENT_RECT]();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1624
                        doc = Y.DOM._getDoc(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1625
                        xy = [box.left, box.top];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1626
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1627
                            if (Y.UA.ie) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1628
                                off1 = 2;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1629
                                off2 = 2;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1630
                                mode = doc[COMPAT_MODE];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1631
                                bLeft = Y.DOM[GET_COMPUTED_STYLE](doc[DOCUMENT_ELEMENT], BORDER_LEFT_WIDTH);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1632
                                bTop = Y.DOM[GET_COMPUTED_STYLE](doc[DOCUMENT_ELEMENT], BORDER_TOP_WIDTH);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1633
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1634
                                if (Y.UA.ie === 6) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1635
                                    if (mode !== _BACK_COMPAT) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1636
                                        off1 = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1637
                                        off2 = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1638
                                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1639
                                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1640
                                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1641
                                if ((mode == _BACK_COMPAT)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1642
                                    if (bLeft !== MEDIUM) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1643
                                        off1 = parseInt(bLeft, 10);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1644
                                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1645
                                    if (bTop !== MEDIUM) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1646
                                        off2 = parseInt(bTop, 10);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1647
                                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1648
                                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1649
                                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1650
                                xy[0] -= off1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1651
                                xy[1] -= off2;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1652
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1653
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1654
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1655
                        if ((scrollTop || scrollLeft)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1656
                            xy[0] += scrollLeft;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1657
                            xy[1] += scrollTop;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1658
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1659
                    } else { // default to current offsets
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1660
                        xy = Y.DOM._getOffset(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1661
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1662
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1663
                return xy;                   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1664
            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1665
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1666
            return function(node) { // manually calculate by crawling up offsetParents
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1667
                //Calculate the Top and Left border sizes (assumes pixels)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1668
                var xy = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1669
                    parentNode,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1670
                    bCheck,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1671
                    scrollTop,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1672
                    scrollLeft;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1673
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1674
                if (node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1675
                    if (Y.DOM.inDoc(node)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1676
                        xy = [node.offsetLeft, node.offsetTop];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1677
                        parentNode = node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1678
                        // TODO: refactor with !! or just falsey
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1679
                        bCheck = ((Y.UA.gecko || Y.UA.webkit > 519) ? true : false);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1680
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1681
                        // TODO: worth refactoring for TOP/LEFT only?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1682
                        while ((parentNode = parentNode.offsetParent)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1683
                            xy[0] += parentNode.offsetLeft;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1684
                            xy[1] += parentNode.offsetTop;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1685
                            if (bCheck) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1686
                                xy = Y.DOM._calcBorders(parentNode, xy);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1687
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1688
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1689
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1690
                        // account for any scrolled ancestors
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1691
                        if (Y.DOM.getStyle(node, POSITION) != FIXED) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1692
                            parentNode = node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1693
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1694
                            while ((parentNode = parentNode.parentNode)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1695
                                scrollTop = parentNode.scrollTop;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1696
                                scrollLeft = parentNode.scrollLeft;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1697
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1698
                                //Firefox does something funky with borders when overflow is not visible.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1699
                                if (Y.UA.gecko && (Y.DOM.getStyle(parentNode, 'overflow') !== 'visible')) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1700
                                        xy = Y.DOM._calcBorders(parentNode, xy);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1701
                                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1702
                                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1703
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1704
                                if (scrollTop || scrollLeft) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1705
                                    xy[0] -= scrollLeft;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1706
                                    xy[1] -= scrollTop;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1707
                                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1708
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1709
                            xy[0] += Y.DOM.docScrollX(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1710
                            xy[1] += Y.DOM.docScrollY(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1711
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1712
                        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1713
                            //Fix FIXED position -- add scrollbars
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1714
                            xy[0] += Y.DOM.docScrollX(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1715
                            xy[1] += Y.DOM.docScrollY(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1716
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1717
                    } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1718
                        xy = Y.DOM._getOffset(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1719
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1720
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1721
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1722
                return xy;                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1723
            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1724
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1725
    }(),// NOTE: Executing for loadtime branching
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1726
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1727
    _getOffset: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1728
        var pos,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1729
            xy = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1730
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1731
        if (node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1732
            pos = Y.DOM.getStyle(node, POSITION);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1733
            xy = [
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1734
                parseInt(Y.DOM[GET_COMPUTED_STYLE](node, LEFT), 10),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1735
                parseInt(Y.DOM[GET_COMPUTED_STYLE](node, TOP), 10)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1736
            ];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1737
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1738
            if ( isNaN(xy[0]) ) { // in case of 'auto'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1739
                xy[0] = parseInt(Y.DOM.getStyle(node, LEFT), 10); // try inline
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1740
                if ( isNaN(xy[0]) ) { // default to offset value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1741
                    xy[0] = (pos === RELATIVE) ? 0 : node.offsetLeft || 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1742
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1743
            } 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1744
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1745
            if ( isNaN(xy[1]) ) { // in case of 'auto'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1746
                xy[1] = parseInt(Y.DOM.getStyle(node, TOP), 10); // try inline
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1747
                if ( isNaN(xy[1]) ) { // default to offset value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1748
                    xy[1] = (pos === RELATIVE) ? 0 : node.offsetTop || 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1749
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1750
            } 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1751
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1752
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1753
        return xy;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1754
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1755
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1756
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1757
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1758
     * Gets the current X position of an element based on page coordinates. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1759
     * Element must be part of the DOM tree to have page coordinates
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1760
     * (display:none or elements not appended return false).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1761
     * @method getX
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1762
     * @param element The target element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1763
     * @return {Int} The X position of the element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1764
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1765
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1766
    getX: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1767
        return Y.DOM.getXY(node)[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1768
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1769
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1770
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1771
     * Gets the current Y position of an element based on page coordinates. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1772
     * Element must be part of the DOM tree to have page coordinates
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1773
     * (display:none or elements not appended return false).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1774
     * @method getY
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1775
     * @param element The target element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1776
     * @return {Int} The Y position of the element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1777
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1778
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1779
    getY: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1780
        return Y.DOM.getXY(node)[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1781
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1782
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1783
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1784
     * Set the position of an html element in page coordinates.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1785
     * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1786
     * @method setXY
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1787
     * @param element The target element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1788
     * @param {Array} xy Contains X & Y values for new position (coordinates are page-based)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1789
     * @param {Boolean} noRetry By default we try and set the position a second time if the first fails
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1790
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1791
    setXY: function(node, xy, noRetry) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1792
        var setStyle = Y.DOM.setStyle,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1793
            pos,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1794
            delta,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1795
            newXY,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1796
            currentXY;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1797
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1798
        if (node && xy) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1799
            pos = Y.DOM.getStyle(node, POSITION);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1800
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1801
            delta = Y.DOM._getOffset(node);       
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1802
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1803
            if (pos == 'static') { // default to relative
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1804
                pos = RELATIVE;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1805
                setStyle(node, POSITION, pos);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1806
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1807
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1808
            currentXY = Y.DOM.getXY(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1809
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1810
            if (xy[0] !== null) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1811
                setStyle(node, LEFT, xy[0] - currentXY[0] + delta[0] + 'px');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1812
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1813
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1814
            if (xy[1] !== null) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1815
                setStyle(node, TOP, xy[1] - currentXY[1] + delta[1] + 'px');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1816
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1817
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1818
            if (!noRetry) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1819
                newXY = Y.DOM.getXY(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1820
                if (newXY[0] !== xy[0] || newXY[1] !== xy[1]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1821
                    Y.DOM.setXY(node, xy, true); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1822
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1823
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1824
          
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1825
            Y.log('setXY setting position to ' + xy, 'info', 'dom-screen');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1826
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1827
            Y.log('setXY failed to set ' + node + ' to ' + xy, 'info', 'dom-screen');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1828
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1829
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1830
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1831
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1832
     * Set the X position of an html element in page coordinates, regardless of how the element is positioned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1833
     * The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1834
     * @method setX
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1835
     * @param element The target element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1836
     * @param {Int} x The X values for new position (coordinates are page-based)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1837
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1838
    setX: function(node, x) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1839
        return Y.DOM.setXY(node, [x, null]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1840
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1841
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1842
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1843
     * Set the Y position of an html element in page coordinates, regardless of how the element is positioned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1844
     * The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1845
     * @method setY
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1846
     * @param element The target element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1847
     * @param {Int} y The Y values for new position (coordinates are page-based)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1848
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1849
    setY: function(node, y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1850
        return Y.DOM.setXY(node, [null, y]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1851
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1852
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1853
    _calcBorders: function(node, xy2) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1854
        var t = parseInt(Y.DOM[GET_COMPUTED_STYLE](node, BORDER_TOP_WIDTH), 10) || 0,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1855
            l = parseInt(Y.DOM[GET_COMPUTED_STYLE](node, BORDER_LEFT_WIDTH), 10) || 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1856
        if (Y.UA.gecko) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1857
            if (RE_TABLE.test(node.tagName)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1858
                t = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1859
                l = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1860
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1861
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1862
        xy2[0] += l;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1863
        xy2[1] += t;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1864
        return xy2;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1865
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1866
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1867
    _getWinSize: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1868
        var doc = Y.DOM._getDoc(),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1869
            win = doc.defaultView || doc.parentWindow,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1870
            mode = doc[COMPAT_MODE],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1871
            h = win.innerHeight,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1872
            w = win.innerWidth,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1873
            root = doc[DOCUMENT_ELEMENT];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1874
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1875
        if ( mode && !Y.UA.opera ) { // IE, Gecko
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1876
            if (mode != 'CSS1Compat') { // Quirks
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1877
                root = doc.body; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1878
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1879
            h = root.clientHeight;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1880
            w = root.clientWidth;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1881
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1882
        return { height: h, width: w }; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1883
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1884
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1885
    _getDocSize: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1886
        var doc = Y.DOM._getDoc(),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1887
            root = doc[DOCUMENT_ELEMENT];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1888
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1889
        if (doc[COMPAT_MODE] != 'CSS1Compat') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1890
            root = doc.body;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1891
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1892
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1893
        return { height: root.scrollHeight, width: root.scrollWidth };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1894
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1895
});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1896
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1897
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1898
var TOP = 'top',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1899
    RIGHT = 'right',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1900
    BOTTOM = 'bottom',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1901
    LEFT = 'left',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1902
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1903
    getOffsets = function(r1, r2) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1904
        var t = Math.max(r1[TOP], r2[TOP]),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1905
            r = Math.min(r1[RIGHT], r2[RIGHT]),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1906
            b = Math.min(r1[BOTTOM], r2[BOTTOM]),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1907
            l = Math.max(r1[LEFT], r2[LEFT]),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1908
            ret = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1909
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1910
        ret[TOP] = t;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1911
        ret[RIGHT] = r;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1912
        ret[BOTTOM] = b;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1913
        ret[LEFT] = l;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1914
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1915
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1916
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1917
    DOM = Y.DOM;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1918
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1919
Y.mix(DOM, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1920
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1921
     * Returns an Object literal containing the following about this element: (top, right, bottom, left)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1922
     * @method region
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1923
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1924
     @return {Object} Object literal containing the following about this element: (top, right, bottom, left)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1925
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1926
    region: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1927
        var xy = DOM.getXY(node),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1928
            ret = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1929
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1930
        if (node && xy) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1931
            ret = DOM._getRegion(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1932
                xy[1], // top
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1933
                xy[0] + node.offsetWidth, // right
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1934
                xy[1] + node.offsetHeight, // bottom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1935
                xy[0] // left
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1936
            );
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1937
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1938
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1939
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1940
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1941
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1942
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1943
     * Find the intersect information for the passes nodes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1944
     * @method intersect
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1945
     * @param {HTMLElement} element The first element 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1946
     * @param {HTMLElement | Object} element2 The element or region to check the interect with
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1947
     * @param {Object} altRegion An object literal containing the region for the first element if we already have the data (for performance i.e. DragDrop)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1948
     @return {Object} Object literal containing the following intersection data: (top, right, bottom, left, area, yoff, xoff, inRegion)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1949
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1950
    intersect: function(node, node2, altRegion) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1951
        var r = altRegion || DOM.region(node), region = {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1952
            n = node2,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1953
            off;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1954
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1955
        if (n.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1956
            region = DOM.region(n);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1957
        } else if (Y.Lang.isObject(node2)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1958
            region = node2;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1959
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1960
            return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1961
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1962
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1963
        off = getOffsets(region, r);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1964
        return {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1965
            top: off[TOP],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1966
            right: off[RIGHT],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1967
            bottom: off[BOTTOM],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1968
            left: off[LEFT],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1969
            area: ((off[BOTTOM] - off[TOP]) * (off[RIGHT] - off[LEFT])),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1970
            yoff: ((off[BOTTOM] - off[TOP])),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1971
            xoff: (off[RIGHT] - off[LEFT]),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1972
            inRegion: DOM.inRegion(node, node2, false, altRegion)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1973
        };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1974
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1975
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1976
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1977
     * Check if any part of this node is in the passed region
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1978
     * @method inRegion
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1979
     * @param {Object} node2 The node to get the region from or an Object literal of the region
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1980
     * $param {Boolean} all Should all of the node be inside the region
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1981
     * @param {Object} altRegion An object literal containing the region for this node if we already have the data (for performance i.e. DragDrop)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1982
     * @return {Boolean} True if in region, false if not.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1983
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1984
    inRegion: function(node, node2, all, altRegion) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1985
        var region = {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1986
            r = altRegion || DOM.region(node),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1987
            n = node2,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1988
            off;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1989
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1990
        if (n.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1991
            region = DOM.region(n);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1992
        } else if (Y.Lang.isObject(node2)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1993
            region = node2;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1994
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1995
            return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1996
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1997
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1998
        if (all) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1999
            return (
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2000
                r[LEFT]   >= region[LEFT]   &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2001
                r[RIGHT]  <= region[RIGHT]  && 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2002
                r[TOP]    >= region[TOP]    && 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2003
                r[BOTTOM] <= region[BOTTOM]  );
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2004
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2005
            off = getOffsets(region, r);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2006
            if (off[BOTTOM] >= off[TOP] && off[RIGHT] >= off[LEFT]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2007
                return true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2008
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2009
                return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2010
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2011
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2012
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2013
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2014
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2015
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2016
     * Check if any part of this element is in the viewport
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2017
     * @method inViewportRegion
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2018
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2019
     * @param {Boolean} all Should all of the node be inside the region
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2020
     * @param {Object} altRegion An object literal containing the region for this node if we already have the data (for performance i.e. DragDrop)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2021
     * @return {Boolean} True if in region, false if not.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2022
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2023
    inViewportRegion: function(node, all, altRegion) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2024
        return DOM.inRegion(node, DOM.viewportRegion(node), all, altRegion);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2025
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2026
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2027
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2028
    _getRegion: function(t, r, b, l) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2029
        var region = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2030
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2031
        region[TOP] = region[1] = t;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2032
        region[LEFT] = region[0] = l;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2033
        region[BOTTOM] = b;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2034
        region[RIGHT] = r;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2035
        region.width = region[RIGHT] - region[LEFT];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2036
        region.height = region[BOTTOM] - region[TOP];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2037
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2038
        return region;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2039
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2040
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2041
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2042
     * Returns an Object literal containing the following about the visible region of viewport: (top, right, bottom, left)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2043
     * @method viewportRegion
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2044
     @return {Object} Object literal containing the following about the visible region of the viewport: (top, right, bottom, left)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2045
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2046
    viewportRegion: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2047
        node = node || Y.config.doc.documentElement;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2048
        var ret = false,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2049
            scrollX,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2050
            scrollY;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2051
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2052
        if (node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2053
            scrollX = DOM.docScrollX(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2054
            scrollY = DOM.docScrollY(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2055
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2056
            ret = DOM._getRegion(scrollY, // top
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2057
                DOM.winWidth(node) + scrollX, // right
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2058
                scrollY + DOM.winHeight(node), // bottom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2059
                scrollX); // left
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2060
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2061
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2062
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2063
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2064
});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2065
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2066
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2067
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2068
}, '3.0.0b1' ,{requires:['dom-base', 'dom-style'], skinnable:false});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2069
YUI.add('selector-native', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2070
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2071
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2072
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2073
 * The selector-native module provides support for native querySelector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2074
 * @module dom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2075
 * @submodule selector-native
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2076
 * @for Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2077
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2078
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2079
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2080
 * Provides support for using CSS selectors to query the DOM 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2081
 * @class Selector 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2082
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2083
 * @for Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2084
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2085
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2086
Y.namespace('Selector'); // allow native module to standalone
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2087
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2088
var NativeSelector = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2089
    _reLead: /^\s*([>+~]|:self)/,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2090
    _reUnSupported: /!./,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2091
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2092
    _foundCache: [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2093
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2094
    _supportsNative: function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2095
        // whitelist and feature detection to manage
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2096
        // future implementations manually
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2097
        return ( (Y.UA.ie >= 8 || Y.UA.webkit > 525) &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2098
            document.querySelectorAll);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2099
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2101
    _toArray: function(nodes) { // TODO: move to Y.Array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2102
        var ret = nodes,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2103
            i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2104
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2105
        if (!nodes.slice) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2106
            try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2107
                ret = Array.prototype.slice.call(nodes);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2108
            } catch(e) { // IE: requires manual copy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2109
                ret = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2110
                for (i = 0, len = nodes.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2111
                    ret[i] = nodes[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2112
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2113
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2114
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2115
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2116
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2117
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2118
    _clearFoundCache: function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2119
        var foundCache = NativeSelector._foundCache,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2120
            i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2121
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2122
        for (i = 0, len = foundCache.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2123
            try { // IE no like delete
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2124
                delete foundCache[i]._found;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2125
            } catch(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2126
                foundCache[i].removeAttribute('_found');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2127
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2128
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2129
        foundCache = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2130
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2131
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2132
    _sort: function(nodes) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2133
        if (nodes) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2134
            nodes = NativeSelector._toArray(nodes);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2135
            if (nodes.sort) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2136
                nodes.sort(function(a, b) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2137
                    return Y.DOM.srcIndex(a) - Y.DOM.srcIndex(b);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2138
                });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2139
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2140
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2141
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2142
        return nodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2143
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2144
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2145
    _deDupe: function(nodes) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2146
        var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2147
            cache = NativeSelector._foundCache,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2148
            i, node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2149
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2150
        for (i = 0, node; node = nodes[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2151
            if (!node._found) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2152
                ret[ret.length] = cache[cache.length] = node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2153
                node._found = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2154
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2155
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2156
        NativeSelector._clearFoundCache();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2157
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2158
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2159
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2160
    // allows element scoped queries to begin with combinator
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2161
    // e.g. query('> p', document.body) === query('body > p')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2162
    _prepQuery: function(root, selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2163
        var groups = selector.split(','),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2164
            queries = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2165
            isDocRoot = (root && root.nodeType === 9),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2166
            i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2167
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2168
        if (root) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2169
            if (!isDocRoot) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2170
                root.id = root.id || Y.guid();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2171
                // break into separate queries for element scoping
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2172
                for (i = 0, len = groups.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2173
                    selector = '#' + root.id + ' ' + groups[i]; // prepend with root ID
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2174
                    queries.push({root: root.ownerDocument, selector: selector});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2175
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2176
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2177
                queries.push({root: root, selector: selector});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2178
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2179
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2180
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2181
        return queries;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2182
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2183
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2184
    _query: function(selector, root, firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2185
        if (NativeSelector._reUnSupported.test(selector)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2186
            return Y.Selector._brute.query(selector, root, firstOnly);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2187
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2188
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2189
        var ret = firstOnly ? null : [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2190
            queryName = firstOnly ? 'querySelector' : 'querySelectorAll',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2191
            result,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2192
            queries,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2193
            i, query;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2194
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2195
        root = root || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2196
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2197
        if (selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2198
            queries = NativeSelector._prepQuery(root, selector);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2199
            ret = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2200
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2201
            for (i = 0, query; query = queries[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2202
                try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2203
                    result = query.root[queryName](query.selector);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2204
                    if (queryName === 'querySelectorAll') { // convert NodeList to Array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2205
                        result = NativeSelector._toArray(result);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2206
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2207
                    ret = ret.concat(result);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2208
                } catch(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2209
                    Y.log('native selector error: ' + e, 'error', 'Selector');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2210
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2211
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2212
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2213
            if (queries.length > 1) { // remove dupes and sort by doc order 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2214
                ret = NativeSelector._sort(NativeSelector._deDupe(ret));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2215
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2216
            ret = (!firstOnly) ? ret : ret[0] || null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2217
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2218
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2219
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2220
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2221
    _filter: function(nodes, selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2222
        var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2223
            i, node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2224
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2225
        if (nodes && selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2226
            for (i = 0, node; (node = nodes[i++]);) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2227
                if (Y.Selector._test(node, selector)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2228
                    ret[ret.length] = node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2229
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2230
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2231
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2232
            Y.log('invalid filter input (nodes: ' + nodes +
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2233
                    ', selector: ' + selector + ')', 'warn', 'Selector');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2234
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2235
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2236
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2237
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2238
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2239
    _test: function(node, selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2240
        var ret = false,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2241
            groups = selector.split(','),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2242
            item,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2243
            i, group;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2244
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2245
        if (node && node.tagName) { // only test HTMLElements
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2246
            node.id = node.id || Y.guid();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2247
            for (i = 0, group; group = groups[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2248
                group += '#' + node.id; // add ID for uniqueness
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2249
                item = Y.Selector.query(group, null, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2250
                ret = (item === node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2251
                if (ret) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2252
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2253
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2254
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2255
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2256
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2257
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2258
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2259
};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2260
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2261
if (Y.UA.ie && Y.UA.ie <= 8) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2262
    NativeSelector._reUnSupported = /:(?:nth|not|root|only|checked|first|last|empty)/;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2263
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2264
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2265
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2266
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2267
Y.mix(Y.Selector, NativeSelector, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2268
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2269
// allow standalone selector-native module
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2270
if (NativeSelector._supportsNative()) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2271
    Y.Selector.query = NativeSelector._query;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2272
    //Y.Selector.filter = NativeSelector._filter;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2273
    //Y.Selector.test = NativeSelector._test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2274
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2275
Y.Selector.test = NativeSelector._test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2276
Y.Selector.filter = NativeSelector._filter;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2277
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2278
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2279
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2280
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2281
}, '3.0.0b1' ,{requires:['dom-base'], skinnable:false});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2282
YUI.add('selector-css2', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2283
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2284
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2285
 * The selector module provides helper methods allowing CSS2 Selectors to be used with DOM elements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2286
 * @module dom
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2287
 * @submodule selector-css2
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2288
 * @for Selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2289
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2290
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2291
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2292
 * Provides helper methods for collecting and filtering DOM elements.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2293
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2294
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2295
var PARENT_NODE = 'parentNode',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2296
    TAG_NAME = 'tagName',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2297
    ATTRIBUTES = 'attributes',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2298
    COMBINATOR = 'combinator',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2299
    PSEUDOS = 'pseudos',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2300
    PREVIOUS = 'previous',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2301
    PREVIOUS_SIBLING = 'previousSibling',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2302
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2303
    _childCache = [], // cache to cleanup expando node.children
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2304
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2305
    Selector = Y.Selector,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2306
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2307
    SelectorCSS2 = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2308
        SORT_RESULTS: true,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2309
        _children: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2310
            var ret = node.children,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2311
                i, n;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2312
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2313
            if (!ret && node[TAG_NAME]) { // only HTMLElements have children
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2314
                ret = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2315
                for (i = 0, n; n = node.childNodes[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2316
                    if (n.tagName) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2317
                        ret[ret.length] = n;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2318
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2319
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2320
                _childCache[_childCache.length] = node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2321
                node.children = ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2322
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2323
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2324
            return ret || [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2325
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2326
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2327
        _regexCache: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2328
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2329
        _re: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2330
            attr: /(\[.*\])/g,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2331
            urls: /^(?:href|src)/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2332
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2333
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2334
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2335
         * Mapping of shorthand tokens to corresponding attribute selector 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2336
         * @property shorthand
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2337
         * @type object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2338
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2339
        shorthand: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2340
            '\\#(-?[_a-z]+[-\\w]*)': '[id=$1]',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2341
            '\\.(-?[_a-z]+[-\\w]*)': '[className~=$1]'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2342
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2343
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2344
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2345
         * List of operators and corresponding boolean functions. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2346
         * These functions are passed the attribute and the current node's value of the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2347
         * @property operators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2348
         * @type object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2349
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2350
        operators: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2351
            '': function(node, m) { return Y.DOM.getAttribute(node, m[0]) !== ''; }, // Just test for existence of attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2352
            //'': '.+',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2353
            '=': '^{val}$', // equality
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2354
            '~=': '(?:^|\\s+){val}(?:\\s+|$)', // space-delimited
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2355
            '|=': '^{val}-?' // optional hyphen-delimited
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2356
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2357
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2358
        pseudos: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2359
           'first-child': function(node) { 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2360
                return Y.Selector._children(node[PARENT_NODE])[0] === node; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2361
            } 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2362
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2363
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2364
        _brute: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2365
            /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2366
             * Retrieves a set of nodes based on a given CSS selector. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2367
             * @method query
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2368
             *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2369
             * @param {string} selector The CSS Selector to test the node against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2370
             * @param {HTMLElement} root optional An HTMLElement to start the query from. Defaults to Y.config.doc
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2371
             * @param {Boolean} firstOnly optional Whether or not to return only the first match.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2372
             * @return {Array} An array of nodes that match the given selector.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2373
             * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2374
             */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2375
            query: function(selector, root, firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2376
                var ret = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2377
                if (selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2378
                    ret = Selector._query(selector, root, firstOnly);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2379
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2380
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2381
                Y.log('query: ' + selector + ' returning: ' + ret.length, 'info', 'Selector');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2382
                Selector._cleanup();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2383
                return (firstOnly) ? (ret[0] || null) : ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2384
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2385
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2386
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2387
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2388
        // TODO: make extensible? events?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2389
        _cleanup: function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2390
            for (var i = 0, node; node = _childCache[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2391
                delete node.children;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2392
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2393
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2394
            _childCache = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2395
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2396
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2397
        _query: function(selector, root, firstOnly, deDupe) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2398
            var ret = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2399
                groups = selector.split(','), // TODO: handle comma in attribute/pseudo
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2400
                nodes = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2401
                tokens,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2402
                token,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2403
                i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2404
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2405
            if (groups.length > 1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2406
                for (i = 0, len = groups.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2407
                    ret = ret.concat(arguments.callee(groups[i],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2408
                            root, firstOnly, true)); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2409
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2410
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2411
                ret = Selector.SORT_RESULTS ? Selector._sort(ret) : ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2412
                Selector._clearFoundCache();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2413
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2414
                root = root || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2415
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2416
                if (root.nodeType !== 9) { // enforce element scope
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2417
                    if (!root.id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2418
                        root.id = Y.guid();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2419
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2420
                    // fast-path ID when possible
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2421
                    if (root.ownerDocument.getElementById(root.id)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2422
                        selector = '#' + root.id + ' ' + selector;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2423
                        root = root.ownerDocument;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2424
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2425
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2426
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2427
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2428
                tokens = Selector._tokenize(selector, root);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2429
                token = tokens.pop();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2430
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2431
                if (token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2432
                    if (deDupe) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2433
                        token.deDupe = true; // TODO: better approach?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2434
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2435
                    if (tokens[0] && tokens[0].id && root.nodeType === 9 && root.getElementById(tokens[0].id)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2436
                        root = root.getElementById(tokens[0].id);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2437
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2438
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2439
                    // TODO: no prefilter for off-dom id
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2440
                    if (root && !nodes.length && token.prefilter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2441
                        nodes = token.prefilter(root, token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2442
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2443
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2444
                    if (nodes.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2445
                        if (firstOnly) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2446
                            Y.Array.some(nodes, Selector._testToken, token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2447
                        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2448
                            Y.Array.each(nodes, Selector._testToken, token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2449
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2450
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2451
                    ret = token.result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2452
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2453
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2454
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2455
            return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2456
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2457
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2458
        _testToken: function(node, index, nodes, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2459
            token = token || this;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2460
            var tag = token.tag,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2461
                previous = token[PREVIOUS],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2462
                result = token.result,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2463
                i = 0,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2464
                nextTest = previous && previous[COMBINATOR] ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2465
                        Selector.combinators[previous[COMBINATOR]] :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2466
                        null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2467
                test,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2468
                attr;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2469
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2470
            if (//node[TAG_NAME] && // tagName limits to HTMLElements
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2471
                    (tag === '*' || tag === node[TAG_NAME]) &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2472
                    !(token.last && node._found) ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2473
                while ((attr = token.tests[i])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2474
                    i++;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2475
                    test = attr.test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2476
                    if (test.test) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2477
                        if (!test.test(Y.DOM.getAttribute(node, attr.name))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2478
                            return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2479
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2480
                    } else if (!test(node, attr.match)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2481
                        return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2482
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2483
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2484
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2485
                if (nextTest && !nextTest(node, token)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2486
                    return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2487
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2488
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2489
                if (token.root && token.root.nodeType !== 9 && !Y.DOM.contains(token.root, node)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2490
                    return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2491
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2492
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2493
                result[result.length] = node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2494
                if (token.deDupe && token.last) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2495
                    node._found = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2496
                    Selector._foundCache.push(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2497
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2498
                return true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2499
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2500
            return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2501
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2502
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2503
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2504
        _getRegExp: function(str, flags) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2505
            var regexCache = Selector._regexCache;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2506
            flags = flags || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2507
            if (!regexCache[str + flags]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2508
                regexCache[str + flags] = new RegExp(str, flags);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2509
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2510
            return regexCache[str + flags];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2511
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2512
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2513
        combinators: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2514
            ' ': function(node, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2515
                var test = Selector._testToken,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2516
                    previous = token[PREVIOUS];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2517
                while ( (node = node[PARENT_NODE]) ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2518
                    if (test(node, null, null, previous)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2519
                        return true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2520
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2521
                }  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2522
                return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2523
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2524
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2525
            '>': function(node, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2526
                return Selector._testToken(node[PARENT_NODE], null, null, token[PREVIOUS]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2527
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2528
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2529
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2530
            '+': function(node, token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2531
                var sib = node[PREVIOUS_SIBLING];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2532
                while (sib && sib.nodeType !== 1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2533
                    sib = sib[PREVIOUS_SIBLING];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2534
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2535
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2536
                if (sib && Y.Selector._testToken(sib, null, null, token[PREVIOUS])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2537
                    return true; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2538
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2539
                return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2540
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2541
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2542
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2543
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2544
        _parsers: [
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2545
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2546
                name: TAG_NAME,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2547
                re: /^((?:-?[_a-z]+[\w-]*)|\*)/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2548
                fn: function(token, match) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2549
                    token.tag = match[1].toUpperCase();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2550
                    token.prefilter = function(root) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2551
                        return root.getElementsByTagName(token.tag);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2552
                    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2553
                    return true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2554
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2555
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2556
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2557
                name: ATTRIBUTES,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2558
                re: /^\[([a-z]+\w*)+([~\|\^\$\*!=]=?)?['"]?([^\]]*?)['"]?\]/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2559
                fn: function(token, match) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2560
                    var val = match[3],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2561
                        operator = !(match[2] && val) ? '' : match[2],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2562
                        test = Selector.operators[operator];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2563
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2564
                    // might be a function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2565
                    if (typeof test === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2566
                        test = Selector._getRegExp(test.replace('{val}', val));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2567
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2568
                    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2569
                    if (match[1] === 'id' && val) { // store ID for fast-path match
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2570
                        token.id = val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2571
                        token.prefilter = function(root) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2572
                            var doc = root.nodeType === 9 ? root : root.ownerDocument,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2573
                                node = doc.getElementById(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2574
                            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2575
                            return node ? [node] : [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2576
                        };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2577
                    } else if (document.documentElement.getElementsByClassName && 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2578
                            match[1].indexOf('class') === 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2579
                        if (!token.prefilter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2580
                            token.prefilter = function(root) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2581
                                return root.getElementsByClassName(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2582
                            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2583
                            test = true; // skip class test 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2584
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2585
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2586
                    return test;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2587
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2588
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2589
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2590
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2591
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2592
                name: COMBINATOR,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2593
                re: /^\s*([>+~]|\s)\s*/,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2594
                fn: function(token, match) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2595
                    token[COMBINATOR] = match[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2596
                    return !! Selector.combinators[token[COMBINATOR]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2597
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2598
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2599
            {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2600
                name: PSEUDOS,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2601
                re: /^:([\-\w]+)(?:\(['"]?(.+)['"]?\))*/i,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2602
                fn: function(token, match) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2603
                    return Selector[PSEUDOS][match[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2604
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2605
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2606
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2607
            ],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2608
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2609
        _getToken: function(token) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2610
            return {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2611
                previous: token,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2612
                combinator: ' ',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2613
                tag: '*',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2614
                prefilter: function(root) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2615
                    return root.getElementsByTagName('*');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2616
                },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2617
                tests: [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2618
                result: []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2619
            };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2620
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2621
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2622
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2623
            Break selector into token units per simple selector.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2624
            Combinator is attached to the previous token.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2625
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2626
        _tokenize: function(selector, root) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2627
            selector = selector || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2628
            selector = Selector._replaceShorthand(Y.Lang.trim(selector)); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2629
            var token = Selector._getToken(),     // one token per simple selector (left selector holds combinator)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2630
                query = selector, // original query for debug report
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2631
                tokens = [],    // array of tokens
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2632
                found = false,  // whether or not any matches were found this pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2633
                test,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2634
                match,         // the regex match
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2635
                i, parser;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2636
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2637
            /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2638
                Search for selector patterns, store, and strip them from the selector string
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2639
                until no patterns match (invalid selector) or we run out of chars.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2640
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2641
                Multiple attributes and pseudos are allowed, in any order.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2642
                for example:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2643
                    'form:first-child[type=button]:not(button)[lang|=en]'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2644
            */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2645
            outer:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2646
            do {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2647
                found = false; // reset after full pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2648
                for (i = 0, parser; parser = Selector._parsers[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2649
                    if ( (match = parser.re.exec(selector)) ) { // note assignment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2650
                        test = parser.fn(token, match);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2651
                        if (test) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2652
                            if (test !== true) { // auto-pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2653
                                token.tests.push({
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2654
                                    name: match[1],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2655
                                    test: test,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2656
                                    match: match.slice(1)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2657
                                });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2658
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2659
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2660
                            found = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2661
                            selector = selector.replace(match[0], ''); // strip current match from selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2662
                            if (!selector.length || parser.name === COMBINATOR) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2663
                                token.root = root;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2664
                                tokens.push(token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2665
                                token = Selector._getToken(token);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2666
                            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2667
                        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2668
                            found = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2669
                            break outer;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2670
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2671
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2672
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2673
            } while (found && selector.length);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2674
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2675
            if (!found || selector.length) { // not fully parsed
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2676
                Y.log('query: ' + query + ' contains unsupported token in: ' + selector, 'warn', 'Selector');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2677
                tokens = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2678
            } else if (tokens.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2679
                tokens[tokens.length - 1].last = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2680
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2681
            return tokens;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2682
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2683
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2684
        _replaceShorthand: function(selector) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2685
            var shorthand = Selector.shorthand,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2686
                attrs = selector.match(Selector._re.attr), // pull attributes to avoid false pos on "." and "#"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2687
                re, i, len;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2688
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2689
            if (attrs) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2690
                selector = selector.replace(Selector._re.attr, 'REPLACED_ATTRIBUTE');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2691
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2692
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2693
            for (re in shorthand) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2694
                if (shorthand.hasOwnProperty(re)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2695
                    selector = selector.replace(Selector._getRegExp(re, 'gi'), shorthand[re]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2696
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2697
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2698
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2699
            if (attrs) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2700
                for (i = 0, len = attrs.length; i < len; ++i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2701
                    selector = selector.replace('REPLACED_ATTRIBUTE', attrs[i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2702
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2703
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2704
            return selector;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2705
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2706
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2707
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2708
Y.mix(Y.Selector, SelectorCSS2, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2709
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2710
// only override native when not supported
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2711
if (!Y.Selector._supportsNative()) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2712
    Y.Selector.query = Selector._brute.query;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2713
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2714
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2715
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2716
}, '3.0.0b1' ,{requires:['dom-base', 'selector-native'], skinnable:false});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2717
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2718
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2719
YUI.add('dom', function(Y){}, '3.0.0b1' ,{skinnable:false, use:['dom-base', 'dom-style', 'dom-screen', 'selector-native', 'selector-css2']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  2720