src/cm/media/js/lib/yui/yui_3.0.0b1/build/dom/dom-base.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 0 40c8f766c9b8
permissions -rw-r--r--
add link to "privacy policy" in the header test
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
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
    },
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
     * Inserts the new node as the next sibling of the reference node 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
     * @method insertAfter
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
     * @param {String | HTMLElement} newNode The node to be inserted
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
     * @param {String | HTMLElement} referenceNode The node to insert the new node after 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
     * @return {HTMLElement} The node that was inserted (or null if insert fails) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
    insertAfter: function(newNode, referenceNode) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
        if (!newNode || !referenceNode || !referenceNode[PARENT_NODE]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
            return null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
        }       
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
        if (typeof newNode === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
            newNode = Y.DOM.create(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
        if (referenceNode[NEXT_SIBLING]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
            return referenceNode[PARENT_NODE].insertBefore(newNode, referenceNode[NEXT_SIBLING]); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
            return referenceNode[PARENT_NODE].appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
    },
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
     * Creates a new dom node using the provided markup string. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
     * @method create
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
     * @param {String} html The markup used to create the element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
     * @param {HTMLDocument} doc An optional document context 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
    create: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   442
        html = Y.Lang.trim(html); // match IE which trims whitespace from innerHTML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   443
        if (!doc && Y.DOM._cloneCache[html]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   444
            return Y.DOM._cloneCache[html].cloneNode(true); // NOTE: return
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
        doc = doc || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
        var m = re_tag.exec(html),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
            create = Y.DOM._create,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
            custom = Y.DOM.creators,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
            ret = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
            tag, nodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
        if (m && custom[m[1]]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
            if (typeof custom[m[1]] === 'function') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   456
                create = custom[m[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   457
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   458
                tag = custom[m[1]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   461
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   462
        nodes = create(html, doc, tag).childNodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   463
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   464
        if (nodes.length === 1) { // return single node, breaking parentNode ref from "fragment"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
            ret = nodes[0].parentNode.removeChild(nodes[0]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   466
        } else { // return multiple nodes as a fragment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   467
            ret = doc.createDocumentFragment();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   468
            while (nodes.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   469
                ret.appendChild(nodes[0]); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   470
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
        Y.DOM._cloneCache[html] = ret.cloneNode(true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   477
    CUSTOM_ATTRIBUTES: (!document.documentElement.hasAttribute) ? { // IE < 8
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   478
        'for': 'htmlFor',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   479
        'class': 'className'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   480
    } : { // w3c
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   481
        'htmlFor': 'for',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   482
        'className': 'class'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   483
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   484
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   485
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   486
     * Provides a normalized attribute interface. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
     * @method setAttibute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   488
     * @param {String | HTMLElement} el The target element for the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   489
     * @param {String} attr The attribute to set.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   490
     * @param {String} val The value of the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   491
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   492
    setAttribute: function(el, attr, val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   493
        if (el && el.setAttribute) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   494
            attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   495
            el.setAttribute(attr, val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   496
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   497
    },
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
     * Provides a normalized attribute interface. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   502
     * @method getAttibute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   503
     * @param {String | HTMLElement} el The target element for the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   504
     * @param {String} attr The attribute to get.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   505
     * @return {String} The current value of the attribute. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   507
    getAttribute: function(el, attr) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   508
        var ret = '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   509
        if (el && el.getAttribute) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   510
            attr = Y.DOM.CUSTOM_ATTRIBUTES[attr] || attr;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   511
            ret = el.getAttribute(attr, 2);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   512
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   513
            if (ret === null) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   514
                ret = ''; // per DOM spec
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   515
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   516
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   517
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   518
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   519
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   520
    // @deprecated
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   521
    srcIndex: (document.documentElement.sourceIndex) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   522
        function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   523
            return (node && node.sourceIndex) ? node.sourceIndex : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   524
        } :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   525
        function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   526
            return (node && node[OWNER_DOCUMENT]) ? 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   527
                    [].indexOf.call(node[OWNER_DOCUMENT].
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   528
                            getElementsByTagName('*'), node) : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   529
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   531
    isWindow: function(obj) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   532
        return obj.alert && obj.document;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   533
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   534
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   535
    _fragClones: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   536
        div: document.createElement('div')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   537
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   538
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
    _create: function(html, doc, tag) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
        tag = tag || 'div';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
        var frag = Y.DOM._fragClones[tag];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
        if (frag) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
            frag = frag.cloneNode(false);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
            frag = Y.DOM._fragClones[tag] = doc.createElement(tag);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
        frag.innerHTML = html;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
        return frag;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   551
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   552
    _removeChildNodes: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   553
        while (node.firstChild) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
            node.removeChild(node.firstChild);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
    _cloneCache: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   561
     * Inserts content in a node at the given location 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
     * @method addHTML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
     * @param {HTMLElement} node The node to insert into
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
     * @param {String} content The content to be inserted 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   565
     * @param {String} where Where to insert the content; default is after lastChild 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   567
    addHTML: function(node, content, where) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   568
        if (typeof content === 'string') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   569
            content = Y.Lang.trim(content); // match IE which trims whitespace from innerHTML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   570
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
        var newNode = Y.DOM._cloneCache[content];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
        if (newNode) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
            newNode = newNode.cloneNode(true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
            if (content.nodeType) { // domNode
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
                newNode = content;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   579
            } else { // create from string and cache
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   580
                newNode = Y.DOM.create(content);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
        if (where) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
            if (where.nodeType) { // insert regardless of relationship to node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
                // TODO: check if node.contains(where)?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
                where.parentNode.insertBefore(newNode, where);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
                switch (where) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
                    case 'replace':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
                        while (node.firstChild) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
                            node.removeChild(node.firstChild);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   594
                        node.appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   595
                        break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   596
                    case 'before':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   597
                        node.parentNode.insertBefore(newNode, node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   598
                        break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   599
                    case 'after':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   600
                        if (node.nextSibling) { // IE errors if refNode is null
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   601
                            node.parentNode.insertBefore(newNode, node.nextSibling);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   602
                        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   603
                            node.parentNode.appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   604
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   605
                        break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   606
                    default:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
                        node.appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
            node.appendChild(newNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
        return newNode;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
    VALUE_SETTERS: {},
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_GETTERS: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
    getValue: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
        var ret = '', // TODO: return null?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   623
            getter;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   624
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
        if (node && node[TAG_NAME]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
            getter = Y.DOM.VALUE_GETTERS[node[TAG_NAME].toLowerCase()];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
            if (getter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
                ret = getter(node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   630
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
                ret = node.value;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   632
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   633
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   634
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
        return (typeof ret === 'string') ? ret : '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   637
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   638
    setValue: function(node, val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   639
        var setter;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
        if (node && node[TAG_NAME]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
            setter = Y.DOM.VALUE_SETTERS[node[TAG_NAME].toLowerCase()];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
            if (setter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
                setter(node, val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
                node.value = val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   648
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
        }
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
    _stripScripts: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
        var scripts = node.getElementsByTagName('script'),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   654
            i, script;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   656
        for (i = 0, script; script = scripts[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   657
            script.parentNode.removeChild(script);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   658
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
    _execScripts: function(scripts, startIndex) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
        var newScript,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
            i, script;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
        startIndex = startIndex || 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   667
        for (i = startIndex, script; script = scripts[i++];) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
            newScript = script.ownerDocument.createElement('script');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
            script.parentNode.replaceChild(newScript, script);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   670
            if (script.text) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   671
                newScript.text = script.text;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
            } else if (script.src) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   673
                newScript.src = script.src;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   674
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   675
                 // "pause" while loading to ensure exec order 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   676
                // FF reports typeof onload as "undefined", so try IE first
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   677
                if (typeof newScript.onreadystatechange !== 'undefined') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   678
                    newScript.onreadystatechange = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   679
                        if (/loaded|complete/.test(script.readyState)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   680
                            event.srcElement.onreadystatechange = null; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   681
                            // timer to help ensure exec order
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   682
                            setTimeout(function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   683
                                Y.DOM._execScripts(scripts, i++);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   684
                            }, 0);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   685
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   686
                    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   687
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   688
                    newScript.onload = function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   689
                        e.target.onload = null; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   690
                        Y.DOM._execScripts(scripts, i++);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   691
                    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   692
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   693
                return; // NOTE: early return to chain async loading
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   694
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   695
        }
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
     * Brute force version of contains.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   700
     * Used for browsers without contains support for non-HTMLElement Nodes (textNodes, etc).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   701
     * @method _bruteContains
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   702
     * @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   703
     * @param {HTMLElement} element The containing html element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   704
     * @param {HTMLElement} needle The html element that may be contained.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   705
     * @return {Boolean} Whether or not the element is or contains the needle.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   706
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   707
    _bruteContains: function(element, needle) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   708
        while (needle) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   709
            if (element === needle) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   710
                return true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   711
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   712
            needle = needle.parentNode;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   713
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   714
        return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   715
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   716
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   717
// TODO: move to Lang?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   718
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   719
     * Memoizes dynamic regular expressions to boost runtime performance. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   720
     * @method _getRegExp
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   721
     * @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   722
     * @param {String} str The string to convert to a regular expression.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   723
     * @param {String} flags optional An optinal string of flags.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   724
     * @return {RegExp} An instance of RegExp
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   725
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   726
    _getRegExp: function(str, flags) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   727
        flags = flags || '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   728
        Y.DOM._regexCache = Y.DOM._regexCache || {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   729
        if (!Y.DOM._regexCache[str + flags]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   730
            Y.DOM._regexCache[str + flags] = new RegExp(str, flags);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   731
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   732
        return Y.DOM._regexCache[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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   735
// TODO: make getDoc/Win true privates?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   736
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   737
     * returns the appropriate document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   738
     * @method _getDoc
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   739
     * @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   740
     * @param {HTMLElement} element optional Target element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   741
     * @return {Object} The document for the given element or the default document. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   742
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   743
    _getDoc: function(element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   744
        element = element || {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   745
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   746
        return (element[NODE_TYPE] === 9) ? element : // element === document
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   747
                element[OWNER_DOCUMENT] || // element === DOM node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   748
                element.document || // element === window
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   749
                Y.config.doc; // default
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   750
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   751
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   752
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   753
     * returns the appropriate window.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   754
     * @method _getWin
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   755
     * @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   756
     * @param {HTMLElement} element optional Target element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   757
     * @return {Object} The window for the given element or the default window. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   758
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   759
    _getWin: function(element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   760
        var doc = Y.DOM._getDoc(element);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   761
        return doc[DEFAULT_VIEW] || doc[PARENT_WINDOW] || Y.config.win;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   762
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   763
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   764
    // @deprecated, use Selector 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   765
    _childBy: function(element, tag, fn, rev) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   766
        var ret = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   767
            root, axis;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   768
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   769
        if (element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   770
            if (rev) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   771
                root = element[LAST_CHILD];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   772
                axis = PREVIOUS_SIBLING;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   773
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   774
                root = element[FIRST_CHILD];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   775
                axis = NEXT_SIBLING;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   776
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   777
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   778
            if (Y.DOM._testElement(root, tag, fn)) { // is the matching element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   779
                ret = root;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   780
            } else { // need to scan nextSibling axis of firstChild to find matching element
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   781
                ret = Y.DOM.elementByAxis(root, axis, fn);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   782
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   783
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   784
        return ret;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   785
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   786
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   787
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   788
    _batch: function(nodes, fn, arg1, arg2, arg3, etc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   789
        fn = (typeof name === 'string') ? Y.DOM[fn] : fn;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   790
        var result,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   791
            ret = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   792
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   793
        if (fn && nodes) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   794
            Y.each(nodes, function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   795
                if ((result = fn.call(Y.DOM, node, arg1, arg2, arg3, etc)) !== undefined) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   796
                    ret[ret.length] = result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   797
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   798
            });
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
        return ret.length ? ret : nodes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   802
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   803
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   804
    _testElement: function(element, tag, fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   805
        tag = (tag && tag !== '*') ? tag.toUpperCase() : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   806
        return (element && element[TAG_NAME] &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   807
                (!tag || element[TAG_NAME].toUpperCase() === tag) &&
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   808
                (!fn || fn(element)));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   809
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   810
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   811
    creators: {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   812
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   813
    _IESimpleCreate: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   814
        doc = doc || Y.config.doc;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   815
        return doc.createElement(html);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   816
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   817
};
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
(function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   821
    var creators = Y.DOM.creators,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   822
        create = Y.DOM.create,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   823
        re_tbody = /(?:\/(?:thead|tfoot|tbody|caption|col|colgroup)>)+\s*<tbody/,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   824
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   825
        TABLE_OPEN = '<table>',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   826
        TABLE_CLOSE = '</table>';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   827
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   828
    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
   829
        Y.mix(creators, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   830
            option: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   831
                return create('<select>' + html + '</select>', doc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   832
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   833
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   834
            tr: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   835
                return create('<tbody>' + html + '</tbody>', doc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   836
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   837
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   838
            td: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   839
                return create('<tr>' + html + '</tr>', doc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   840
            }, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   841
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   842
            tbody: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   843
                return create(TABLE_OPEN + html + TABLE_CLOSE, doc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   844
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   845
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   846
            legend: 'fieldset'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   847
        });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   848
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   849
        creators.col = creators.tbody; // IE wraps in colgroup
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   850
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   851
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   852
    if (Y.UA.ie) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   853
        Y.mix(creators, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   854
        // TODO: thead/tfoot with nested tbody
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   855
            // IE adds TBODY when creating TABLE elements (which may share this impl)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   856
            tbody: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   857
                var frag = create(TABLE_OPEN + html + TABLE_CLOSE, doc),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   858
                    tb = frag.children.tags('tbody')[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   859
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   860
                if (frag.children.length > 1 && tb && !re_tbody.test(html)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   861
                    tb[PARENT_NODE].removeChild(tb); // strip extraneous tbody
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   862
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   863
                return frag;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   864
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   865
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   866
            script: function(html, doc) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   867
                var frag = doc.createElement('div');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   868
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   869
                frag.innerHTML = '-' + html;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   870
                frag.removeChild(frag[FIRST_CHILD]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   871
                return frag;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   872
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   873
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   874
        }, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   875
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   876
        Y.mix(Y.DOM.VALUE_GETTERS, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   877
            button: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   878
                return (node.attributes && node.attributes.value) ? node.attributes.value.value : '';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   879
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   880
        });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   881
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   882
        Y.mix(Y.DOM.VALUE_SETTERS, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   883
            // IE: node.value changes the button text, which should be handled via innerHTML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   884
            button: function(node, val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   885
                var attr = node.attributes.value;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   886
                if (!attr) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   887
                    attr = node[OWNER_DOCUMENT].createAttribute('value');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   888
                    node.setAttributeNode(attr);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   889
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   890
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   891
                attr.value = val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   892
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   893
        });
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
    if (Y.UA.gecko || Y.UA.ie) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   897
        Y.mix(creators, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   898
                th: creators.td,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   899
                thead: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   900
                tfoot: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   901
                caption: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   902
                colgroup: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   903
                col: creators.tbody,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   904
                optgroup: creators.option
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   905
        });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   906
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   907
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   908
    Y.mix(Y.DOM.VALUE_GETTERS, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   909
        option: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   910
            var attrs = node.attributes;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   911
            return (attrs.value && attrs.value.specified) ? node.value : node.text;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   912
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   913
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   914
        select: function(node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   915
            var val = node.value,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   916
                options = node.options;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   917
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   918
            if (options && val === '') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   919
                if (node.multiple) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   920
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   921
                    val = Y.DOM.getValue(options[node.selectedIndex], 'value');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   922
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   923
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   924
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   925
            return val;
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
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   929
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   930
})(Y);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   931
Y.mix(Y.DOM, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   932
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   933
     * Determines whether a DOM element has the given className.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   934
     * @method hasClass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   935
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   936
     * @param {String} className the class name to search for
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   937
     * @return {Boolean} Whether or not the element has the given class. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   938
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   939
    hasClass: function(node, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   940
        var re = Y.DOM._getRegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   941
        return re.test(node.className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   942
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   943
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   944
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   945
     * Adds a class name to a given DOM element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   946
     * @method addClass         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   947
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   948
     * @param {String} className the class name to add to the class attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   949
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   950
    addClass: function(node, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   951
        if (!Y.DOM.hasClass(node, className)) { // skip if already present 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   952
            node.className = Y.Lang.trim([node.className, className].join(' '));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   953
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   954
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   955
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   956
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   957
     * Removes a class name from a given element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   958
     * @method removeClass         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   959
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   960
     * @param {String} className the class name to remove from the class attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   961
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   962
    removeClass: function(node, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   963
        if (className && Y.DOM.hasClass(node, className)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   964
            node.className = Y.Lang.trim(node.className.replace(Y.DOM._getRegExp('(?:^|\\s+)' +
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   965
                            className + '(?:\\s+|$)'), ' '));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   966
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   967
            if ( Y.DOM.hasClass(node, className) ) { // in case of multiple adjacent
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   968
                Y.DOM.removeClass(node, className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   969
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   970
        }                 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   971
    },
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
     * Replace a class with another class for a given element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   975
     * If no oldClassName is present, the newClassName is simply added.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   976
     * @method replaceClass  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   977
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   978
     * @param {String} oldClassName the class name to be replaced
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   979
     * @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
   980
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   981
    replaceClass: function(node, oldC, newC) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   982
        Y.DOM.addClass(node, newC);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   983
        Y.DOM.removeClass(node, oldC);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   984
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   985
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   986
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   987
     * 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
   988
     * @method toggleClass  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   989
     * @param {HTMLElement} element The DOM element. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   990
     * @param {String} className the class name to be toggled
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   991
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   992
    toggleClass: function(node, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   993
        if (Y.DOM.hasClass(node, className)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   994
            Y.DOM.removeClass(node, className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   995
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   996
            Y.DOM.addClass(node, className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   997
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   998
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   999
});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1000
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
}, '3.0.0b1' ,{requires:['event'], skinnable:false});