src/cm/media/js/lib/yui/yui_3.10.3/build/stylesheet/stylesheet.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 525 89ef5ed3c48b
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     1
/*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     2
YUI 3.10.3 (build 2fb5187)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     3
Copyright 2013 Yahoo! Inc. All rights reserved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     4
Licensed under the BSD License.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     5
http://yuilibrary.com/license/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     6
*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     7
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     8
YUI.add('stylesheet', function (Y, NAME) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
 * The StyleSheet component is a module for creating and modifying CSS
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
 * stylesheets.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
 * @module stylesheet
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
 */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
var d      = Y.config.doc,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
    p      = d.createElement('p'), // Have to hold the node (see notes)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
    workerStyle = p.style, // worker style collection
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
    isString = Y.Lang.isString,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
    selectors = {},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
    sheets = {},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
    floatAttr = ('cssFloat' in workerStyle) ? 'cssFloat' : 'styleFloat',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
    _toCssText,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
    _unsetOpacity,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
    _unsetProperty,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
    OPACITY = 'opacity',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
    FLOAT   = 'float',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
    EMPTY   = '';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
// Normalizes the removal of an assigned style for opacity.  IE uses the filter
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
// property.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
_unsetOpacity = (OPACITY in workerStyle) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
    function (style) { style.opacity = EMPTY; } :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
    function (style) { style.filter = EMPTY; };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
// Normalizes the removal of an assigned style for a given property.  Expands
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
// shortcut properties if necessary and handles the various names for the float
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
// property.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
workerStyle.border = "1px solid red";
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
workerStyle.border = EMPTY; // IE doesn't unset child properties
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
_unsetProperty = workerStyle.borderLeft ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
    function (style,prop) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
        var p;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
        if (prop !== floatAttr && prop.toLowerCase().indexOf(FLOAT) != -1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
            prop = floatAttr;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
        if (isString(style[prop])) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
            switch (prop) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
                case OPACITY:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
                case 'filter' : _unsetOpacity(style); break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
                case 'font'   :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
                    style.font       = style.fontStyle = style.fontVariant =
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
                    style.fontWeight = style.fontSize  = style.lineHeight  =
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
                    style.fontFamily = EMPTY;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
                default       :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
                    for (p in style) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
                        if (p.indexOf(prop) === 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
                            style[p] = EMPTY;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
                        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
    } :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
    function (style,prop) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
        if (prop !== floatAttr && prop.toLowerCase().indexOf(FLOAT) != -1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
            prop = floatAttr;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
        if (isString(style[prop])) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
            if (prop === OPACITY) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
                _unsetOpacity(style);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
                style[prop] = EMPTY;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
    };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
 * Create an instance of StyleSheet to encapsulate a css stylesheet.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
 * The constructor can be called using function or constructor syntax.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
 * <pre><code>var sheet = Y.StyleSheet(..);</pre></code>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
 * or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
 * <pre><code>var sheet = new Y.StyleSheet(..);</pre></code>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
 * The first parameter passed can be any of the following things:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
 * <ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
 *   <li>The desired string name to register a new empty sheet</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
 *   <li>The string name of an existing StyleSheet instance</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
 *   <li>The unique guid generated for an existing StyleSheet instance</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
 *   <li>The id of an existing <code>&lt;link&gt;</code> or <code>&lt;style&gt;</code> node</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
 *   <li>The node reference for an existing <code>&lt;link&gt;</code> or <code>&lt;style&gt;</code> node</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
 *   <li>The Y.Node instance wrapping an existing <code>&lt;link&gt;</code> or <code>&lt;style&gt;</code> node</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
 *   <li>A chunk of css text to create a new stylesheet from</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
 * </ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
 * <p>If a string is passed, StyleSheet will first look in its static name
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
 * registry for an existing sheet, then in the DOM for an element with that id.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
 * If neither are found and the string contains the { character, it will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
 * used as a the initial cssText for a new StyleSheet.  Otherwise, a new empty
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
 * StyleSheet is created, assigned the string value as a name, and registered
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
 * statically by that name.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
 * <p>The optional second parameter is a string name to register the sheet as.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
 * This param is largely useful when providing a node id/ref or chunk of css
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
 * text to create a populated instance.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
 * @class StyleSheet
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
 * @constructor
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
 * @param seed {String|HTMLElement|Node} a style or link node, its id, or a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
 *              name or guid of a StyleSheet, or a string of css text
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
 * @param name {String} (optional) name to register instance for future static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
 *              access
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
 */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
function StyleSheet(seed, name) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
    var head,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
        node,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
        sheet,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
        cssRules = {},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
        _rules,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
        _insertRule,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
        _deleteRule,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
        i,r,sel;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
    // Factory or constructor
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
    if (!(Y.instanceOf(this, StyleSheet))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
        return new StyleSheet(seed,name);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
    // Extract the DOM node from Node instances
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
    if (seed) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
        if (Y.Node && seed instanceof Y.Node) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
            node = seed._node;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
        } else if (seed.nodeName) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
            node = seed;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
        // capture the DOM node if the string is an id
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
        } else if (isString(seed)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
            if (seed && sheets[seed]) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
                return sheets[seed];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
            node = d.getElementById(seed.replace(/^#/,EMPTY));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
        // Check for the StyleSheet in the static registry
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
        if (node && sheets[Y.stamp(node)]) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
            return sheets[Y.stamp(node)];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
    // Create a style node if necessary
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
    if (!node || !/^(?:style|link)$/i.test(node.nodeName)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
        node = d.createElement('style');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
        node.type = 'text/css';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
    if (isString(seed)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
        // Create entire sheet from seed cssText
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
        if (seed.indexOf('{') != -1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
            // Not a load-time fork because low run-time impact and IE fails
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
            // test for s.styleSheet at page load time (oddly)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
            if (node.styleSheet) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
                node.styleSheet.cssText = seed;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
                node.appendChild(d.createTextNode(seed));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
        } else if (!name) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
            name = seed;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
    // Make sure the node is attached to the appropriate head element
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
    if (!node.parentNode || node.parentNode.nodeName.toLowerCase() !== 'head') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
        head = (node.ownerDocument || d).getElementsByTagName('head')[0];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
        // styleSheet isn't available on the style node in FF2 until appended
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
        // to the head element.  style nodes appended to body do not affect
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
        // change in Safari.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
        head.appendChild(node);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
    // Begin setting up private aliases to the important moving parts
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
    // 1. The stylesheet object
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
    // IE stores StyleSheet under the "styleSheet" property
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
    // Safari doesn't populate sheet for xdomain link elements
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
    sheet = node.sheet || node.styleSheet;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
    // 2. The style rules collection
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
    // IE stores the rules collection under the "rules" property
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
    _rules = sheet && ('cssRules' in sheet) ? 'cssRules' : 'rules';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
    // 3. The method to remove a rule from the stylesheet
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
    // IE supports removeRule
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
    _deleteRule = ('deleteRule' in sheet) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
        function (i) { sheet.deleteRule(i); } :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
        function (i) { sheet.removeRule(i); };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
    // 4. The method to add a new rule to the stylesheet
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
    // IE supports addRule with different signature
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
    _insertRule = ('insertRule' in sheet) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
        function (sel,css,i) { sheet.insertRule(sel+' {'+css+'}',i); } :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
        function (sel,css,i) { sheet.addRule(sel,css,i); };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
    // 5. Initialize the cssRules map from the node
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
    // xdomain link nodes forbid access to the cssRules collection, so this
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
    // will throw an error.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
    // TODO: research alternate stylesheet, @media
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
    for (i = sheet[_rules].length - 1; i >= 0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
        r   = sheet[_rules][i];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
        sel = r.selectorText;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
        if (cssRules[sel]) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
            cssRules[sel].style.cssText += ';' + r.style.cssText;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
            _deleteRule(i);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
        } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
            cssRules[sel] = r;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
    // Cache the instance by the generated Id
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
    StyleSheet.register(Y.stamp(node),this);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
    // Register the instance by name if provided or defaulted from seed
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
    if (name) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
        StyleSheet.register(name,this);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
    // Public API
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
    Y.mix(this,{
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
         * Get the unique stamp for this StyleSheet instance
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
         * @method getId
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
         * @return {Number} the static id
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
        getId : function () { return Y.stamp(node); },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
         * Enable all the rules in the sheet
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
         * @method enable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
         * @return {StyleSheet}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   241
         * @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   242
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   243
        enable : function () { sheet.disabled = false; return this; },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
         * Disable all the rules in the sheet.  Rules may be changed while the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
         * StyleSheet is disabled.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
         * @method disable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
         * @return {StyleSheet}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
         * @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
        disable : function () { sheet.disabled = true; return this; },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
         * Returns false if the StyleSheet is disabled.  Otherwise true.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
         * @method isEnabled
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
         * @return {Boolean}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
        isEnabled : function () { return !sheet.disabled; },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
         * <p>Set style properties for a provided selector string.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
         * If the selector includes commas, it will be split into individual
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
         * selectors and applied accordingly.  If the selector string does not
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
         * have a corresponding rule in the sheet, it will be added.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
         * <p>The object properties in the second parameter must be the JavaScript
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
         * names of style properties.  E.g. fontSize rather than font-size.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
         * <p>The float style property will be set by any of &quot;float&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
         * &quot;styleFloat&quot;, or &quot;cssFloat&quot;.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   274
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   275
         * @method set
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   276
         * @param sel {String} the selector string to apply the changes to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
         * @param css {Object} Object literal of style properties and new values
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
         * @return {StyleSheet}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
         * @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
        set : function (sel,css) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
            var rule = cssRules[sel],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
                multi = sel.split(/\s*,\s*/),i,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
                idx;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
            // IE's addRule doesn't support multiple comma delimited selectors
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
            if (multi.length > 1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
                for (i = multi.length - 1; i >= 0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
                    this.set(multi[i], css);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
                return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
            // Some selector values can cause IE to hang
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
            if (!StyleSheet.isValidSelector(sel)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
                return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   297
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   298
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   299
            // Opera throws an error if there's a syntax error in assigned
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
            // cssText. Avoid this using a worker style collection, then
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
            // assigning the resulting cssText.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
            if (rule) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
                rule.style.cssText = StyleSheet.toCssText(css,rule.style.cssText);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
                idx = sheet[_rules].length;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
                css = StyleSheet.toCssText(css);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
                // IE throws an error when attempting to addRule(sel,'',n)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
                // which would crop up if no, or only invalid values are used
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
                if (css) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   311
                    _insertRule(sel, css, idx);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   312
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   313
                    // Safari replaces the rules collection, but maintains the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
                    // rule instances in the new collection when rules are
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
                    // added/removed
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
                    cssRules[sel] = sheet[_rules][idx];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
            return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
         * <p>Unset style properties for a provided selector string, removing
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
         * their effect from the style cascade.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
         * <p>If the selector includes commas, it will be split into individual
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
         * selectors and applied accordingly.  If there are no properties
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
         * remaining in the rule after unsetting, the rule is removed.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
         * <p>The style property or properties in the second parameter must be the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
         * JavaScript style property names. E.g. fontSize rather than font-size.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
         * <p>The float style property will be unset by any of &quot;float&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
         * &quot;styleFloat&quot;, or &quot;cssFloat&quot;.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
         * @method unset
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
         * @param sel {String} the selector string to apply the changes to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
         * @param css {String|Array} style property name or Array of names
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
         * @return {StyleSheet}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   340
         * @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   341
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   342
        unset : function (sel,css) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
            var rule = cssRules[sel],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   344
                multi = sel.split(/\s*,\s*/),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   345
                remove = !css,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   346
                rules, i;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
            // IE's addRule doesn't support multiple comma delimited selectors
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
            // so rules are mapped internally by atomic selectors
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
            if (multi.length > 1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
                for (i = multi.length - 1; i >= 0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
                    this.unset(multi[i], css);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
                return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
            if (rule) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
                if (!remove) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
                    css = Y.Array(css);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
                    workerStyle.cssText = rule.style.cssText;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
                    for (i = css.length - 1; i >= 0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
                        _unsetProperty(workerStyle,css[i]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
                    if (workerStyle.cssText) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
                        rule.style.cssText = workerStyle.cssText;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
                    } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
                        remove = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
                if (remove) { // remove the rule altogether
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
                    rules = sheet[_rules];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
                    for (i = rules.length - 1; i >= 0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
                        if (rules[i] === rule) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
                            delete cssRules[sel];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
                            _deleteRule(i);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
                            break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
                        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
            return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   385
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   386
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   387
        /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
         * Get the current cssText for a rule or the entire sheet.  If the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
         * selector param is supplied, only the cssText for that rule will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
         * returned, if found.  If the selector string targets multiple
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
         * selectors separated by commas, the cssText of the first rule only
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
         * will be returned.  If no selector string, the stylesheet's full
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
         * cssText will be returned.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
         * @method getCssText
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
         * @param sel {String} Selector string
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
         * @return {String}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
        getCssText : function (sel) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
            var rule, css, selector;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
            if (isString(sel)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
                // IE's addRule doesn't support multiple comma delimited
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
                // selectors so rules are mapped internally by atomic selectors
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
                rule = cssRules[sel.split(/\s*,\s*/)[0]];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
                return rule ? rule.style.cssText : null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
            } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
                css = [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   410
                for (selector in cssRules) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   411
                    if (cssRules.hasOwnProperty(selector)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   412
                        rule = cssRules[selector];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
                        css.push(rule.selectorText+" {"+rule.style.cssText+"}");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
                return css.join("\n");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
_toCssText = function (css,base) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
    var f    = css.styleFloat || css.cssFloat || css[FLOAT],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
        trim = Y.Lang.trim,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
        prop;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
    // A very difficult to repro/isolate IE 9 beta (and Platform Preview 7) bug
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
    // was reduced to this line throwing the error:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
    // "Invalid this pointer used as target for method call"
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
    // It appears that the style collection is corrupted. The error is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
    // catchable, so in a best effort to work around it, replace the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
    // p and workerStyle and try the assignment again.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
    try {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
        workerStyle.cssText = base || EMPTY;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
    } catch (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
        p = d.createElement('p');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
        workerStyle = p.style;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
        workerStyle.cssText = base || EMPTY;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
    if (f && !css[floatAttr]) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
        css = Y.merge(css);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   444
        delete css.styleFloat; delete css.cssFloat; delete css[FLOAT];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   445
        css[floatAttr] = f;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   446
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   447
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   448
    for (prop in css) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   449
        if (css.hasOwnProperty(prop)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   450
            try {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   451
                // IE throws Invalid Value errors and doesn't like whitespace
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   452
                // in values ala ' red' or 'red '
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   453
                workerStyle[prop] = trim(css[prop]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   454
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   455
            catch (ex) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   456
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   457
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   458
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   459
    return workerStyle.cssText;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   460
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   461
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   462
Y.mix(StyleSheet, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   463
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   464
     * <p>Converts an object literal of style properties and values into a string
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   465
     * of css text.  This can then be assigned to el.style.cssText.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   466
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   467
     * <p>The optional second parameter is a cssText string representing the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   468
     * starting state of the style prior to alterations.  This is most often
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   469
     * extracted from the eventual target's current el.style.cssText.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   470
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   471
     * @method toCssText
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   472
     * @param css {Object} object literal of style properties and values
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   473
     * @param cssText {String} (optional) starting cssText value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   474
     * @return {String} the resulting cssText string
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   475
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   476
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   477
    toCssText : ((OPACITY in workerStyle) ? _toCssText :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   478
        // Wrap IE's toCssText to catch opacity.  The copy/merge is to preserve
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   479
        // the input object's integrity, but if float and opacity are set, the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   480
        // input will be copied twice in IE.  Is there a way to avoid this
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   481
        // without increasing the byte count?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   482
        function (css, cssText) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   483
            if (OPACITY in css) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   484
                css = Y.merge(css,{
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   485
                        filter: 'alpha(opacity='+(css.opacity*100)+')'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   486
                      });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   487
                delete css.opacity;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   488
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   489
            return _toCssText(css,cssText);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   490
        }),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   491
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   492
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   493
     * Registers a StyleSheet instance in the static registry by the given name
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   494
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   495
     * @method register
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   496
     * @param name {String} the name to assign the StyleSheet in the registry
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   497
     * @param sheet {StyleSheet} The StyleSheet instance
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   498
     * @return {Boolean} false if no name or sheet is not a StyleSheet
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   499
     *              instance. true otherwise.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   500
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   501
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   502
    register : function (name,sheet) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   503
        return !!(name && sheet instanceof StyleSheet &&
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   504
                  !sheets[name] && (sheets[name] = sheet));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   505
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   506
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   507
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   508
     * <p>Determines if a selector string is safe to use.  Used internally
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   509
     * in set to prevent IE from locking up when attempting to add a rule for a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   510
     * &quot;bad selector&quot;.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   511
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   512
     * <p>Bad selectors are considered to be any string containing unescaped
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   513
     * `~!@$%^&()+=|{}[];'"?< or space. Also forbidden are . or # followed by
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   514
     * anything other than an alphanumeric.  Additionally -abc or .-abc or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   515
     * #_abc or '# ' all fail.  There are likely more failure cases, so
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   516
     * please file a bug if you encounter one.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   517
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   518
     * @method isValidSelector
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   519
     * @param sel {String} the selector string
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   520
     * @return {Boolean}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   521
     * @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   522
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   523
    isValidSelector : function (sel) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   524
        var valid = false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   526
        if (sel && isString(sel)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   527
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   528
            if (!selectors.hasOwnProperty(sel)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   529
                // TEST: there should be nothing but white-space left after
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   530
                // these destructive regexs
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   531
                selectors[sel] = !/\S/.test(
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   532
                    // combinators
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   533
                    sel.replace(/\s+|\s*[+~>]\s*/g,' ').
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   534
                    // attribute selectors (contents not validated)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   535
                    replace(/([^ ])\[.*?\]/g,'$1').
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   536
                    // pseudo-class|element selectors (contents of parens
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   537
                    // such as :nth-of-type(2) or :not(...) not validated)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   538
                    replace(/([^ ])::?[a-z][a-z\-]+[a-z](?:\(.*?\))?/ig,'$1').
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   539
                    // element tags
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   540
                    replace(/(?:^| )[a-z0-6]+/ig,' ').
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   541
                    // escaped characters
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   542
                    replace(/\\./g,EMPTY).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   543
                    // class and id identifiers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   544
                    replace(/[.#]\w[\w\-]*/g,EMPTY));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   545
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   546
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   547
            valid = selectors[sel];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   548
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   549
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   550
        return valid;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   551
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   552
},true);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   553
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   554
Y.StyleSheet = StyleSheet;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   555
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   556
/*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   557
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   558
NOTES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   559
 * Style node must be added to the head element.  Safari does not honor styles
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   560
   applied to StyleSheet objects on style nodes in the body.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   561
 * StyleSheet object is created on the style node when the style node is added
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   562
   to the head element in Firefox 2 (and maybe 3?)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   563
 * The cssRules collection is replaced after insertRule/deleteRule calls in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   564
   Safari 3.1.  Existing Rules are used in the new collection, so the collection
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   565
   cannot be cached, but the rules can be.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   566
 * Opera requires that the index be passed with insertRule.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   567
 * Same-domain restrictions prevent modifying StyleSheet objects attached to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   568
   link elements with remote href (or "about:blank" or "javascript:false")
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   569
 * Same-domain restrictions prevent reading StyleSheet cssRules/rules
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   570
   collection of link elements with remote href (or "about:blank" or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   571
   "javascript:false")
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   572
 * Same-domain restrictions result in Safari not populating node.sheet property
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   573
   for link elements with remote href (et.al)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   574
 * IE names StyleSheet related properties and methods differently (see code)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   575
 * IE converts tag names to upper case in the Rule's selectorText
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   576
 * IE converts empty string assignment to complex properties to value settings
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   577
   for all child properties.  E.g. style.background = '' sets non-'' values on
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   578
   style.backgroundPosition, style.backgroundColor, etc.  All else clear
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   579
   style.background and all child properties.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   580
 * IE assignment style.filter = '' will result in style.cssText == 'FILTER:'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   581
 * All browsers support Rule.style.cssText as a read/write property, leaving
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   582
   only opacity needing to be accounted for.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   583
 * Benchmarks of style.property = value vs style.cssText += 'property: value'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   584
   indicate cssText is slightly slower for single property assignment.  For
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   585
   multiple property assignment, cssText speed stays relatively the same where
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   586
   style.property speed decreases linearly by the number of properties set.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   587
   Exception being Opera 9.27, where style.property is always faster than
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   588
   style.cssText.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   589
 * Opera 9.5b throws a syntax error when assigning cssText with a syntax error.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   590
 * Opera 9.5 doesn't honor rule.style.cssText = ''.  Previous style persists.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   591
   You have to remove the rule altogether.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   592
 * Stylesheet properties set with !important will trump inline style set on an
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   593
   element or in el.style.property.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   594
 * Creating a worker style collection like document.createElement('p').style;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   595
   will fail after a time in FF (~5secs of inactivity).  Property assignments
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   596
   will not alter the property or cssText.  It may be the generated node is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   597
   garbage collected and the style collection becomes inert (speculation).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   598
 * IE locks up when attempting to add a rule with a selector including at least
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   599
   characters {[]}~`!@%^&*()+=|? (unescaped) and leading _ or -
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   600
   such as addRule('-foo','{ color: red }') or addRule('._abc','{...}')
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   601
 * IE's addRule doesn't support comma separated selectors such as
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   602
   addRule('.foo, .bar','{..}')
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   603
 * IE throws an error on valid values with leading/trailing white space.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   604
 * When creating an entire sheet at once, only FF2/3 & Opera allow creating a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   605
   style node, setting its innerHTML and appending to head.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   606
 * When creating an entire sheet at once, Safari requires the style node to be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   607
   created with content in innerHTML of another element.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   608
 * When creating an entire sheet at once, IE requires the style node content to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   609
   be set via node.styleSheet.cssText
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   610
 * When creating an entire sheet at once in IE, styleSheet.cssText can't be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   611
   written until node.type = 'text/css'; is performed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   612
 * When creating an entire sheet at once in IE, load-time fork on
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   613
   var styleNode = d.createElement('style'); _method = styleNode.styleSheet ?..
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   614
   fails (falsey).  During run-time, the test for .styleSheet works fine
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   615
 * Setting complex properties in cssText will SOMETIMES allow child properties
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   616
   to be unset
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   617
   set         unset              FF2  FF3  S3.1  IE6  IE7  Op9.27  Op9.5
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   618
   ----------  -----------------  ---  ---  ----  ---  ---  ------  -----
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   619
   border      -top               NO   NO   YES   YES  YES  YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   620
               -top-color         NO   NO   YES             YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   621
               -color             NO   NO   NO              NO      NO
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   622
   background  -color             NO   NO   YES             YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   623
               -position          NO   NO   YES             YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   624
               -position-x        NO   NO   NO              NO      NO
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   625
   font        line-height        YES  YES  NO    NO   NO   NO      YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   626
               -style             YES  YES  NO              YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   627
               -size              YES  YES  NO              YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   628
               -size-adjust       ???  ???  n/a   n/a  n/a  ???     ???
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   629
   padding     -top               NO   NO   YES             YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   630
   margin      -top               NO   NO   YES             YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   631
   list-style  -type              YES  YES  YES             YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   632
               -position          YES  YES  YES             YES     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   633
   overflow    -x                 NO   NO   YES             n/a     YES
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   634
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   635
   ??? - unsetting font-size-adjust has the same effect as unsetting font-size
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   636
 * FireFox and WebKit populate rule.cssText as "SELECTOR { CSSTEXT }", but
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   637
   Opera and IE do not.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   638
 * IE6 and IE7 silently ignore the { and } if passed into addRule('.foo','{
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   639
   color:#000}',0).  IE8 does not and creates an empty rule.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   640
 * IE6-8 addRule('.foo','',n) throws an error.  Must supply *some* cssText
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   641
*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   642
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   643
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   644
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   645
}, '3.10.3', {"requires": ["yui-base"]});