src/cm/media/js/lib/yui/yui3.0.0/build/oop/oop-debug.js
author raph
Mon, 23 Nov 2009 15:14:29 +0100
changeset 0 40c8f766c9b8
permissions -rw-r--r--
import from internal svn r 4007
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
Code licensed under the BSD License:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
http://developer.yahoo.net/yui/license.txt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
version: 3.0.0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
build: 1549
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('oop', 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
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
 * Supplies object inheritance and manipulation utilities.  This adds
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
 * additional functionaity to what is provided in yui-base, and the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
 * methods are applied directly to the YUI instance.  This module
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
 * is required for most YUI components.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
 * @module oop
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
    var L  = Y.Lang, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
        A  = Y.Array,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
        OP = Object.prototype,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
        CLONE_MARKER = "_~yuim~_";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
        // dispatch = function(o, f, c, proto, action) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
        //     if (o[action] && o.item) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
        //         return o[action].call(o, f, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
        //     } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
        //         switch (A.test(o)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
        //             case 1:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
        //                 return A[action](o, f, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
        //             case 2:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
        //                 return A[action](Y.Array(o, 0, true), f, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
        //             default:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
        //                 return Y.Object[action](o, f, c, proto);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
        //         }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
        //     }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
        // };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
     * The following methods are added to the YUI instance
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
     * @class YUI~oop
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
     * Applies prototype properties from the supplier to the receiver.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
     * The receiver can be a constructor or an instance.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
     * @method augment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
     * @param {Function} r  the object to receive the augmentation
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
     * @param {Function} s  the object that supplies the properties to augment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
     * @param ov {boolean} if true, properties already on the receiver
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
     * will be overwritten if found on the supplier.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
     * @param wl {string[]} a whitelist.  If supplied, only properties in 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
     * this list will be applied to the receiver.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
     * @param args {Array | Any} arg or arguments to apply to the supplier
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
     * constructor when initializing.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
     * @return {object} the augmented object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
     * @todo constructor optional?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
     * @todo understanding what an instance is augmented with
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
     * @TODO best practices for overriding sequestered methods.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
    Y.augment = function(r, s, ov, wl, args) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
        var sProto           = s.prototype, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
            newProto         = null, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
            construct        = s, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
            a                = (args) ? Y.Array(args) : [], 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
            rProto           = r.prototype, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
            target           = rProto || r, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
            applyConstructor = false,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
            sequestered, replacements, i;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
        // working on a class, so apply constructor infrastructure
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
        if (rProto && construct) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
            sequestered  = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
            replacements = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
            newProto     = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
            // sequester all of the functions in the supplier and replace with
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
            // one that will restore all of them.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
            Y.each(sProto, function(v, k) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
                replacements[k] = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
// Y.log('sequestered function "' + k + '" executed.  Initializing EventTarget');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
// overwrite the prototype with all of the sequestered functions,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
// but only if it hasn't been overridden
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
                    for (i in sequestered) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
                        if (sequestered.hasOwnProperty(i) && (this[i] === replacements[i])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
                            // Y.log('... restoring ' + k);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
                            this[i] = sequestered[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
                        }
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
                    // apply the constructor
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
                    construct.apply(this, a);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
                    // apply the original sequestered function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
                    return sequestered[k].apply(this, arguments);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
                };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
                if ((!wl || (k in wl)) && (ov || !(k in this))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
                    // Y.log('augment: ' + k);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
                    if (L.isFunction(v)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
                        // sequester the function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
                        sequestered[k] = v;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
// replace the sequestered function with a function that will
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
// restore all sequestered functions and exectue the constructor.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
                        this[k] = replacements[k];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
                    } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
                        // Y.log('augment() applying non-function: ' + k);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
                        this[k] = v;
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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
            }, newProto, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
        // augmenting an instance, so apply the constructor immediately
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
            applyConstructor = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
        Y.mix(target, newProto || sProto, ov, wl);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
        if (applyConstructor) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
            s.apply(target, a);
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
        return r;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
     * Applies object properties from the supplier to the receiver.  If
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
     * the target has the property, and the property is an object, the target
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
     * object will be augmented with the supplier's value.  If the property
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
     * is an array, the suppliers value will be appended to the target.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
     * @method aggregate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
     * @param {Function} r  the object to receive the augmentation
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
     * @param {Function} s  the object that supplies the properties to augment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
     * @param ov {boolean} if true, properties already on the receiver
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
     * will be overwritten if found on the supplier.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
     * @param wl {string[]} a whitelist.  If supplied, only properties in 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
     * this list will be applied to the receiver.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
     * @return {object} the extended object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
    Y.aggregate = function(r, s, ov, wl) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
        return Y.mix(r, s, ov, wl, 0, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
     * Utility to set up the prototype, constructor and superclass properties to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
     * support an inheritance strategy that can chain constructors and methods.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
     * Static members will not be inherited.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
     * @method extend
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
     * @param {Function} r   the object to modify
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
     * @param {Function} s the object to inherit
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
     * @param {Object} px prototype properties to add/override
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
     * @param {Object} sx static properties to add/override
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
     * @return {YUI} the YUI instance
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
    Y.extend = function(r, s, px, sx) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
        if (!s||!r) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
            // @TODO error symbols
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
            Y.error("extend failed, verify dependencies");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
        var sp = s.prototype, rp=Y.Object(sp);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
        r.prototype=rp;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
        rp.constructor=r;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
        r.superclass=sp;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
        // assign constructor property
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
        if (s != Object && sp.constructor == OP.constructor) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
            sp.constructor=s;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
        // add prototype overrides
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
        if (px) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
            Y.mix(rp, px, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
        // add object overrides
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
        if (sx) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
            Y.mix(r, sx, true);
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
        return r;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
     * Executes the supplied function for each item in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
     * a collection.  Supports arrays, objects, and
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
     * Y.NodeLists
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
     * @method each
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
     * @param o the object to iterate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
     * @param f the function to execute.  This function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
     * receives the value, key, and object as parameters
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
     * @param proto if true, prototype properties are
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
     * iterated on objects
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
     * @return {YUI} the YUI instance
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
    Y.each = function(o, f, c, proto) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
        if (o.each && o.item) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
            return o.each.call(o, f, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
            switch (A.test(o)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
                case 1:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
                    return A.each(o, f, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
                case 2:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
                    return A.each(Y.Array(o, 0, true), f, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
                default:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
                    return Y.Object.each(o, f, c, proto);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
            }
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
        // return Y.Object.each(o, f, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
    // Y.each = function(o, f, c, proto) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
    //     return dispatch(o, f, c, proto, 'each');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
    // };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
     * Executes the supplied function for each item in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
     * a collection.  The operation stops if the function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
     * returns true. Supports arrays, objects, and
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
     * Y.NodeLists.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
     * @method some
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
     * @param o the object to iterate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
     * @param f the function to execute.  This function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
     * receives the value, key, and object as parameters
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
     * @param proto if true, prototype properties are
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
     * iterated on objects
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
     * @return {boolean} true if the function ever returns true, false otherwise
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
    // Y.some = function(o, f, c, proto) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
    //     return dispatch(o, f, c, proto, 'some');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
    // };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
     * Deep obj/array copy.  Functions are cloned with Y.bind.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
     * Array-like objects are treated as arrays.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
     * Primitives are returned untouched.  Optionally, a
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
     * function can be provided to handle other data types,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
     * filter keys, validate values, etc.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
     * @method clone
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
     * @param o what to clone
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
     * @param safe {boolean} if true, objects will not have prototype
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
     * items from the source.  If false, they will.  In this case, the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
     * original is initially protected, but the clone is not completely immune
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
     * from changes to the source object prototype.  Also, cloned prototype
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
     * items that are deleted from the clone will result in the value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
     * of the source prototype being exposed.  If operating on a non-safe
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
     * clone, items should be nulled out rather than deleted.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
     * @TODO review
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
     * @param f optional function to apply to each item in a collection;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
     *          it will be executed prior to applying the value to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
     *          the new object.  Return false to prevent the copy.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
     * @param c optional execution context for f
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
     * @param owner Owner object passed when clone is iterating an
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
     * object.  Used to set up context for cloned functions.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
     * @return {Array|Object} the cloned object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
    Y.clone = function(o, safe, f, c, owner, cloned) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
        if (!L.isObject(o)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
            return o;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
        var o2, marked = cloned || {}, stamp;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
        switch (L.type(o)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
            case 'date':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
                return new Date(o);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
            case 'regexp':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
                return new RegExp(o.source);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
            case 'function':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
                o2 = Y.bind(o, owner);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
            case 'array':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
                o2 = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
            default:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
                // #2528250 only one clone of a given object should be created.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
                if (o[CLONE_MARKER]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
                    return marked[o[CLONE_MARKER]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
                stamp = Y.guid();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
                o2 = (safe) ? {} : Y.Object(o);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
                o[CLONE_MARKER] = stamp;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
                marked[stamp] = o;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
        // #2528250 don't try to clone element properties
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
        if (!o.addEventListener && !o.attachEvent) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
            Y.each(o, function(v, k) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
                if (!f || (f.call(c || this, v, k, this, o) !== false)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
                    if (k !== CLONE_MARKER) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
                        this[k] = Y.clone(v, safe, f, c, owner || o, marked);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
            }, o2);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
        if (!cloned) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
            Y.each(marked, function(v, k) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
                delete v[CLONE_MARKER];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
            });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
            marked = null;
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 o2;
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
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
     * Returns a function that will execute the supplied function in the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
     * supplied object's context, optionally adding any additional
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
     * supplied parameters to the beginning of the arguments collection the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
     * supplied to the function.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
     * @method bind
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
     * @param f {Function|String} the function to bind, or a function name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
     * to execute on the context object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
     * @param c the execution context
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
     * @param args* 0..n arguments to include before the arguments the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
     * function is executed with.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
     * @return {function} the wrapped function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
    Y.bind = function(f, c) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
        var xargs = arguments.length > 2 ? Y.Array(arguments, 2, true) : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
        return function () {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
            var fn = L.isString(f) ? c[f] : f, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
                args = (xargs) ? xargs.concat(Y.Array(arguments, 0, true)) : arguments;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
            return fn.apply(c || fn, args);
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
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
     * Returns a function that will execute the supplied function in the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
     * supplied object's context, optionally adding any additional
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
     * supplied parameters to the end of the arguments the function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
     * is executed with.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
     * @method rbind
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
     * @param f {Function|String} the function to bind, or a function name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
     * to execute on the context object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
     * @param c the execution context
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
     * @param args* 0..n arguments to append to the end of arguments collection
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
     * supplied to the function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
     * @return {function} the wrapped function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
    Y.rbind = function(f, c) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
        var xargs = arguments.length > 2 ? Y.Array(arguments, 2, true) : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
        return function () {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
            var fn = L.isString(f) ? c[f] : f, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
                args = (xargs) ? Y.Array(arguments, 0, true).concat(xargs) : arguments;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
            return fn.apply(c || fn, args);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
        };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
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
}, '3.0.0' );