Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
YUI.add('yui2-yahoo', function(Y) {
2
    /*
3
Copyright (c) 2011, Yahoo! Inc. All rights reserved.
4
Code licensed under the BSD License:
5
http://developer.yahoo.com/yui/license.html
6
version: 2.9.0
7
*/
8
/**
9
 * The YAHOO object is the single global object used by YUI Library.  It
10
 * contains utility function for setting up namespaces, inheritance, and
11
 * logging.  YAHOO.util, YAHOO.widget, and YAHOO.example are namespaces
12
 * created automatically for and used by the library.
13
 * @module yahoo
14
 * @title  YAHOO Global
15
 */
16
 
17
/**
18
 * YAHOO_config is not included as part of the library.  Instead it is an
19
 * object that can be defined by the implementer immediately before
20
 * including the YUI library.  The properties included in this object
21
 * will be used to configure global properties needed as soon as the
22
 * library begins to load.
23
 * @class YAHOO_config
24
 * @static
25
 */
26
 
27
/**
28
 * A reference to a function that will be executed every time a YAHOO module
29
 * is loaded.  As parameter, this function will receive the version
30
 * information for the module. See <a href="YAHOO.env.html#getVersion">
31
 * YAHOO.env.getVersion</a> for the description of the version data structure.
32
 * @property listener
33
 * @type Function
34
 * @static
35
 * @default undefined
36
 */
37
 
38
/**
39
 * Set to true if the library will be dynamically loaded after window.onload.
40
 * Defaults to false
41
 * @property injecting
42
 * @type boolean
43
 * @static
44
 * @default undefined
45
 */
46
 
47
/**
48
 * Instructs the yuiloader component to dynamically load yui components and
49
 * their dependencies.  See the yuiloader documentation for more information
50
 * about dynamic loading
51
 * @property load
52
 * @static
53
 * @default undefined
54
 * @see yuiloader
55
 */
56
 
57
/**
58
 * Forces the use of the supplied locale where applicable in the library
59
 * @property locale
60
 * @type string
61
 * @static
62
 * @default undefined
63
 */
64
 
65
if (typeof YAHOO == "undefined" || !YAHOO) {
66
    /**
67
     * The YAHOO global namespace object.  If YAHOO is already defined, the
68
     * existing YAHOO object will not be overwritten so that defined
69
     * namespaces are preserved.
70
     * @class YAHOO
71
     * @static
72
     */
73
    var YAHOO = {};
74
}
75
 
76
/**
77
 * Returns the namespace specified and creates it if it doesn't exist
78
 * <pre>
79
 * YAHOO.namespace("property.package");
80
 * YAHOO.namespace("YAHOO.property.package");
81
 * </pre>
82
 * Either of the above would create YAHOO.property, then
83
 * YAHOO.property.package
84
 *
85
 * Be careful when naming packages. Reserved words may work in some browsers
86
 * and not others. For instance, the following will fail in Safari:
87
 * <pre>
88
 * YAHOO.namespace("really.long.nested.namespace");
89
 * </pre>
90
 * This fails because "long" is a future reserved word in ECMAScript
91
 *
92
 * For implementation code that uses YUI, do not create your components
93
 * in the namespaces defined by YUI (
94
 * <code>YAHOO.util</code>,
95
 * <code>YAHOO.widget</code>,
96
 * <code>YAHOO.lang</code>,
97
 * <code>YAHOO.tool</code>,
98
 * <code>YAHOO.example</code>,
99
 * <code>YAHOO.env</code>) -- create your own namespace (e.g., 'companyname').
100
 *
101
 * @method namespace
102
 * @static
103
 * @param  {String*} arguments 1-n namespaces to create
104
 * @return {Object}  A reference to the last namespace object created
105
 */
106
YAHOO.namespace = function() {
107
    var a=arguments, o=null, i, j, d;
108
    for (i=0; i<a.length; i=i+1) {
109
        d=(""+a[i]).split(".");
110
        o=YAHOO;
111
 
112
        // YAHOO is implied, so it is ignored if it is included
113
        for (j=(d[0] == "YAHOO") ? 1 : 0; j<d.length; j=j+1) {
114
            o[d[j]]=o[d[j]] || {};
115
            o=o[d[j]];
116
        }
117
    }
118
 
119
    return o;
120
};
121
 
122
/**
123
 * Uses YAHOO.widget.Logger to output a log message, if the widget is
124
 * available.
125
 * Note: LogReader adds the message, category, and source to the DOM as HTML.
126
 *
127
 * @method log
128
 * @static
129
 * @param  {HTML}  msg  The message to log.
130
 * @param  {HTML}  cat  The log category for the message.  Default
131
 *                        categories are "info", "warn", "error", time".
132
 *                        Custom categories can be used as well. (opt)
133
 * @param  {HTML}  src  The source of the the message (opt)
134
 * @return {Boolean}      True if the log operation was successful.
135
 */
136
YAHOO.log = function(msg, cat, src) {
137
    var l=YAHOO.widget.Logger;
138
    if(l && l.log) {
139
        return l.log(msg, cat, src);
140
    } else {
141
        return false;
142
    }
143
};
144
 
145
/**
146
 * Registers a module with the YAHOO object
147
 * @method register
148
 * @static
149
 * @param {String}   name    the name of the module (event, slider, etc)
150
 * @param {Function} mainClass a reference to class in the module.  This
151
 *                             class will be tagged with the version info
152
 *                             so that it will be possible to identify the
153
 *                             version that is in use when multiple versions
154
 *                             have loaded
155
 * @param {Object}   data      metadata object for the module.  Currently it
156
 *                             is expected to contain a "version" property
157
 *                             and a "build" property at minimum.
158
 */
159
YAHOO.register = function(name, mainClass, data) {
160
    var mods = YAHOO.env.modules, m, v, b, ls, i;
161
 
162
    if (!mods[name]) {
163
        mods[name] = {
164
            versions:[],
165
            builds:[]
166
        };
167
    }
168
 
169
    m  = mods[name];
170
    v  = data.version;
171
    b  = data.build;
172
    ls = YAHOO.env.listeners;
173
 
174
    m.name = name;
175
    m.version = v;
176
    m.build = b;
177
    m.versions.push(v);
178
    m.builds.push(b);
179
    m.mainClass = mainClass;
180
 
181
    // fire the module load listeners
182
    for (i=0;i<ls.length;i=i+1) {
183
        ls[i](m);
184
    }
185
    // label the main class
186
    if (mainClass) {
187
        mainClass.VERSION = v;
188
        mainClass.BUILD = b;
189
    } else {
190
        YAHOO.log("mainClass is undefined for module " + name, "warn");
191
    }
192
};
193
 
194
/**
195
 * YAHOO.env is used to keep track of what is known about the YUI library and
196
 * the browsing environment
197
 * @class YAHOO.env
198
 * @static
199
 */
200
YAHOO.env = YAHOO.env || {
201
 
202
    /**
203
     * Keeps the version info for all YUI modules that have reported themselves
204
     * @property modules
205
     * @type Object[]
206
     */
207
    modules: [],
208
 
209
    /**
210
     * List of functions that should be executed every time a YUI module
211
     * reports itself.
212
     * @property listeners
213
     * @type Function[]
214
     */
215
    listeners: []
216
};
217
 
218
/**
219
 * Returns the version data for the specified module:
220
 *      <dl>
221
 *      <dt>name:</dt>      <dd>The name of the module</dd>
222
 *      <dt>version:</dt>   <dd>The version in use</dd>
223
 *      <dt>build:</dt>     <dd>The build number in use</dd>
224
 *      <dt>versions:</dt>  <dd>All versions that were registered</dd>
225
 *      <dt>builds:</dt>    <dd>All builds that were registered.</dd>
226
 *      <dt>mainClass:</dt> <dd>An object that was was stamped with the
227
 *                 current version and build. If
228
 *                 mainClass.VERSION != version or mainClass.BUILD != build,
229
 *                 multiple versions of pieces of the library have been
230
 *                 loaded, potentially causing issues.</dd>
231
 *       </dl>
232
 *
233
 * @method getVersion
234
 * @static
235
 * @param {String}  name the name of the module (event, slider, etc)
236
 * @return {Object} The version info
237
 */
238
YAHOO.env.getVersion = function(name) {
239
    return YAHOO.env.modules[name] || null;
240
};
241
 
242
/**
243
 * Do not fork for a browser if it can be avoided.  Use feature detection when
244
 * you can.  Use the user agent as a last resort.  YAHOO.env.ua stores a version
245
 * number for the browser engine, 0 otherwise.  This value may or may not map
246
 * to the version number of the browser using the engine.  The value is
247
 * presented as a float so that it can easily be used for boolean evaluation
248
 * as well as for looking for a particular range of versions.  Because of this,
249
 * some of the granularity of the version info may be lost (e.g., Gecko 1.8.0.9
250
 * reports 1.8).
251
 * @class YAHOO.env.ua
252
 * @static
253
 */
254
 
255
/**
256
 * parses a user agent string (or looks for one in navigator to parse if
257
 * not supplied).
258
 * @method parseUA
259
 * @since 2.9.0
260
 * @static
261
 */
262
YAHOO.env.parseUA = function(agent) {
263
 
264
        var numberify = function(s) {
265
            var c = 0;
266
            return parseFloat(s.replace(/\./g, function() {
267
                return (c++ == 1) ? '' : '.';
268
            }));
269
        },
270
 
271
        nav = navigator,
272
 
273
        o = {
274
 
275
        /**
276
         * Internet Explorer version number or 0.  Example: 6
277
         * @property ie
278
         * @type float
279
         * @static
280
         */
281
        ie: 0,
282
 
283
        /**
284
         * Opera version number or 0.  Example: 9.2
285
         * @property opera
286
         * @type float
287
         * @static
288
         */
289
        opera: 0,
290
 
291
        /**
292
         * Gecko engine revision number.  Will evaluate to 1 if Gecko
293
         * is detected but the revision could not be found. Other browsers
294
         * will be 0.  Example: 1.8
295
         * <pre>
296
         * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7
297
         * Firefox 1.5.0.9: 1.8.0.9 <-- 1.8
298
         * Firefox 2.0.0.3: 1.8.1.3 <-- 1.81
299
         * Firefox 3.0   <-- 1.9
300
         * Firefox 3.5   <-- 1.91
301
         * </pre>
302
         * @property gecko
303
         * @type float
304
         * @static
305
         */
306
        gecko: 0,
307
 
308
        /**
309
         * AppleWebKit version.  KHTML browsers that are not WebKit browsers
310
         * will evaluate to 1, other browsers 0.  Example: 418.9
311
         * <pre>
312
         * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
313
         *                                   latest available for Mac OSX 10.3.
314
         * Safari 2.0.2:         416     <-- hasOwnProperty introduced
315
         * Safari 2.0.4:         418     <-- preventDefault fixed
316
         * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
317
         *                                   different versions of webkit
318
         * Safari 2.0.4 (419.3): 419     <-- Tiger installations that have been
319
         *                                   updated, but not updated
320
         *                                   to the latest patch.
321
         * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with native
322
         * SVG and many major issues fixed).
323
         * Safari 3.0.4 (523.12) 523.12  <-- First Tiger release - automatic
324
         * update from 2.x via the 10.4.11 OS patch.
325
         * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded event.
326
         *                                   yahoo.com user agent hack removed.
327
         * </pre>
328
         * http://en.wikipedia.org/wiki/Safari_version_history
329
         * @property webkit
330
         * @type float
331
         * @static
332
         */
333
        webkit: 0,
334
 
335
        /**
336
         * Chrome will be detected as webkit, but this property will also
337
         * be populated with the Chrome version number
338
         * @property chrome
339
         * @type float
340
         * @static
341
         */
342
        chrome: 0,
343
 
344
        /**
345
         * The mobile property will be set to a string containing any relevant
346
         * user agent information when a modern mobile browser is detected.
347
         * Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
348
         * devices with the WebKit-based browser, and Opera Mini.
349
         * @property mobile
350
         * @type string
351
         * @static
352
         */
353
        mobile: null,
354
 
355
        /**
356
         * Adobe AIR version number or 0.  Only populated if webkit is detected.
357
         * Example: 1.0
358
         * @property air
359
         * @type float
360
         */
361
        air: 0,
362
        /**
363
         * Detects Apple iPad's OS version
364
         * @property ipad
365
         * @type float
366
         * @static
367
         */
368
        ipad: 0,
369
        /**
370
         * Detects Apple iPhone's OS version
371
         * @property iphone
372
         * @type float
373
         * @static
374
         */
375
        iphone: 0,
376
        /**
377
         * Detects Apples iPod's OS version
378
         * @property ipod
379
         * @type float
380
         * @static
381
         */
382
        ipod: 0,
383
        /**
384
         * General truthy check for iPad, iPhone or iPod
385
         * @property ios
386
         * @type float
387
         * @static
388
         */
389
        ios: null,
390
        /**
391
         * Detects Googles Android OS version
392
         * @property android
393
         * @type float
394
         * @static
395
         */
396
        android: 0,
397
        /**
398
         * Detects Palms WebOS version
399
         * @property webos
400
         * @type float
401
         * @static
402
         */
403
        webos: 0,
404
 
405
        /**
406
         * Google Caja version number or 0.
407
         * @property caja
408
         * @type float
409
         */
410
        caja: nav && nav.cajaVersion,
411
 
412
        /**
413
         * Set to true if the page appears to be in SSL
414
         * @property secure
415
         * @type boolean
416
         * @static
417
         */
418
        secure: false,
419
 
420
        /**
421
         * The operating system.  Currently only detecting windows or macintosh
422
         * @property os
423
         * @type string
424
         * @static
425
         */
426
        os: null
427
 
428
    },
429
 
430
    ua = agent || (navigator && navigator.userAgent),
431
 
432
    loc = window && window.location,
433
 
434
    href = loc && loc.href,
435
 
436
    m;
437
 
438
    o.secure = href && (href.toLowerCase().indexOf("https") === 0);
439
 
440
    if (ua) {
441
 
442
        if ((/windows|win32/i).test(ua)) {
443
            o.os = 'windows';
444
        } else if ((/macintosh/i).test(ua)) {
445
            o.os = 'macintosh';
446
        } else if ((/rhino/i).test(ua)) {
447
            o.os = 'rhino';
448
        }
449
 
450
        // Modern KHTML browsers should qualify as Safari X-Grade
451
        if ((/KHTML/).test(ua)) {
452
            o.webkit = 1;
453
        }
454
        // Modern WebKit browsers are at least X-Grade
455
        m = ua.match(/AppleWebKit\/([^\s]*)/);
456
        if (m && m[1]) {
457
            o.webkit = numberify(m[1]);
458
 
459
            // Mobile browser check
460
            if (/ Mobile\//.test(ua)) {
461
                o.mobile = 'Apple'; // iPhone or iPod Touch
462
 
463
                m = ua.match(/OS ([^\s]*)/);
464
                if (m && m[1]) {
465
                    m = numberify(m[1].replace('_', '.'));
466
                }
467
                o.ios = m;
468
                o.ipad = o.ipod = o.iphone = 0;
469
 
470
                m = ua.match(/iPad|iPod|iPhone/);
471
                if (m && m[0]) {
472
                    o[m[0].toLowerCase()] = o.ios;
473
                }
474
            } else {
475
                m = ua.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/);
476
                if (m) {
477
                    // Nokia N-series, Android, webOS, ex: NokiaN95
478
                    o.mobile = m[0];
479
                }
480
                if (/webOS/.test(ua)) {
481
                    o.mobile = 'WebOS';
482
                    m = ua.match(/webOS\/([^\s]*);/);
483
                    if (m && m[1]) {
484
                        o.webos = numberify(m[1]);
485
                    }
486
                }
487
                if (/ Android/.test(ua)) {
488
                    o.mobile = 'Android';
489
                    m = ua.match(/Android ([^\s]*);/);
490
                    if (m && m[1]) {
491
                        o.android = numberify(m[1]);
492
                    }
493
 
494
                }
495
            }
496
 
497
            m = ua.match(/Chrome\/([^\s]*)/);
498
            if (m && m[1]) {
499
                o.chrome = numberify(m[1]); // Chrome
500
            } else {
501
                m = ua.match(/AdobeAIR\/([^\s]*)/);
502
                if (m) {
503
                    o.air = m[0]; // Adobe AIR 1.0 or better
504
                }
505
            }
506
        }
507
 
508
        if (!o.webkit) { // not webkit
509
// @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
510
            m = ua.match(/Opera[\s\/]([^\s]*)/);
511
            if (m && m[1]) {
512
                o.opera = numberify(m[1]);
513
                m = ua.match(/Version\/([^\s]*)/);
514
                if (m && m[1]) {
515
                    o.opera = numberify(m[1]); // opera 10+
516
                }
517
                m = ua.match(/Opera Mini[^;]*/);
518
                if (m) {
519
                    o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
520
                }
521
            } else { // not opera or webkit
522
                m = ua.match(/MSIE\s([^;]*)/);
523
                if (m && m[1]) {
524
                    o.ie = numberify(m[1]);
525
                } else { // not opera, webkit, or ie
526
                    m = ua.match(/Gecko\/([^\s]*)/);
527
                    if (m) {
528
                        o.gecko = 1; // Gecko detected, look for revision
529
                        m = ua.match(/rv:([^\s\)]*)/);
530
                        if (m && m[1]) {
531
                            o.gecko = numberify(m[1]);
532
                        }
533
                    }
534
                }
535
            }
536
        }
537
    }
538
 
539
    return o;
540
};
541
 
542
YAHOO.env.ua = YAHOO.env.parseUA();
543
 
544
/*
545
 * Initializes the global by creating the default namespaces and applying
546
 * any new configuration information that is detected.  This is the setup
547
 * for env.
548
 * @method init
549
 * @static
550
 * @private
551
 */
552
(function() {
553
    YAHOO.namespace("util", "widget", "example");
554
    /*global YAHOO_config*/
555
    if ("undefined" !== typeof YAHOO_config) {
556
        var l=YAHOO_config.listener, ls=YAHOO.env.listeners,unique=true, i;
557
        if (l) {
558
            // if YAHOO is loaded multiple times we need to check to see if
559
            // this is a new config object.  If it is, add the new component
560
            // load listener to the stack
561
            for (i=0; i<ls.length; i++) {
562
                if (ls[i] == l) {
563
                    unique = false;
564
                    break;
565
                }
566
            }
567
 
568
            if (unique) {
569
                ls.push(l);
570
            }
571
        }
572
    }
573
})();
574
/**
575
 * Provides the language utilites and extensions used by the library
576
 * @class YAHOO.lang
577
 */
578
YAHOO.lang = YAHOO.lang || {};
579
 
580
(function() {
581
 
582
 
583
var L = YAHOO.lang,
584
 
585
    OP = Object.prototype,
586
    ARRAY_TOSTRING = '[object Array]',
587
    FUNCTION_TOSTRING = '[object Function]',
588
    OBJECT_TOSTRING = '[object Object]',
589
    NOTHING = [],
590
 
591
    HTML_CHARS = {
592
        '&': '&amp;',
593
        '<': '&lt;',
594
        '>': '&gt;',
595
        '"': '&quot;',
596
        "'": '&#x27;',
597
        '/': '&#x2F;',
598
        '`': '&#x60;'
599
    },
600
 
601
    // ADD = ["toString", "valueOf", "hasOwnProperty"],
602
    ADD = ["toString", "valueOf"],
603
 
604
    OB = {
605
 
606
    /**
607
     * Determines wheather or not the provided object is an array.
608
     * @method isArray
609
     * @param {any} o The object being testing
610
     * @return {boolean} the result
611
     */
612
    isArray: function(o) {
613
        return OP.toString.apply(o) === ARRAY_TOSTRING;
614
    },
615
 
616
    /**
617
     * Determines whether or not the provided object is a boolean
618
     * @method isBoolean
619
     * @param {any} o The object being testing
620
     * @return {boolean} the result
621
     */
622
    isBoolean: function(o) {
623
        return typeof o === 'boolean';
624
    },
625
 
626
    /**
627
     * Determines whether or not the provided object is a function.
628
     * Note: Internet Explorer thinks certain functions are objects:
629
     *
630
     * var obj = document.createElement("object");
631
     * YAHOO.lang.isFunction(obj.getAttribute) // reports false in IE
632
     *
633
     * var input = document.createElement("input"); // append to body
634
     * YAHOO.lang.isFunction(input.focus) // reports false in IE
635
     *
636
     * You will have to implement additional tests if these functions
637
     * matter to you.
638
     *
639
     * @method isFunction
640
     * @param {any} o The object being testing
641
     * @return {boolean} the result
642
     */
643
    isFunction: function(o) {
644
        return (typeof o === 'function') || OP.toString.apply(o) === FUNCTION_TOSTRING;
645
    },
646
 
647
    /**
648
     * Determines whether or not the provided object is null
649
     * @method isNull
650
     * @param {any} o The object being testing
651
     * @return {boolean} the result
652
     */
653
    isNull: function(o) {
654
        return o === null;
655
    },
656
 
657
    /**
658
     * Determines whether or not the provided object is a legal number
659
     * @method isNumber
660
     * @param {any} o The object being testing
661
     * @return {boolean} the result
662
     */
663
    isNumber: function(o) {
664
        return typeof o === 'number' && isFinite(o);
665
    },
666
 
667
    /**
668
     * Determines whether or not the provided object is of type object
669
     * or function
670
     * @method isObject
671
     * @param {any} o The object being testing
672
     * @return {boolean} the result
673
     */
674
    isObject: function(o) {
675
return (o && (typeof o === 'object' || L.isFunction(o))) || false;
676
    },
677
 
678
    /**
679
     * Determines whether or not the provided object is a string
680
     * @method isString
681
     * @param {any} o The object being testing
682
     * @return {boolean} the result
683
     */
684
    isString: function(o) {
685
        return typeof o === 'string';
686
    },
687
 
688
    /**
689
     * Determines whether or not the provided object is undefined
690
     * @method isUndefined
691
     * @param {any} o The object being testing
692
     * @return {boolean} the result
693
     */
694
    isUndefined: function(o) {
695
        return typeof o === 'undefined';
696
    },
697
 
698
 
699
    /**
700
     * IE will not enumerate native functions in a derived object even if the
701
     * function was overridden.  This is a workaround for specific functions
702
     * we care about on the Object prototype.
703
     * @property _IEEnumFix
704
     * @param {Function} r  the object to receive the augmentation
705
     * @param {Function} s  the object that supplies the properties to augment
706
     * @static
707
     * @private
708
     */
709
    _IEEnumFix: (YAHOO.env.ua.ie) ? function(r, s) {
710
            var i, fname, f;
711
            for (i=0;i<ADD.length;i=i+1) {
712
 
713
                fname = ADD[i];
714
                f = s[fname];
715
 
716
                if (L.isFunction(f) && f!=OP[fname]) {
717
                    r[fname]=f;
718
                }
719
            }
720
    } : function(){},
721
 
722
    /**
723
     * <p>
724
     * Returns a copy of the specified string with special HTML characters
725
     * escaped. The following characters will be converted to their
726
     * corresponding character entities:
727
     * <code>&amp; &lt; &gt; &quot; &#x27; &#x2F; &#x60;</code>
728
     * </p>
729
     *
730
     * <p>
731
     * This implementation is based on the
732
     * <a href="http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet">OWASP
733
     * HTML escaping recommendations</a>. In addition to the characters
734
     * in the OWASP recommendation, we also escape the <code>&#x60;</code>
735
     * character, since IE interprets it as an attribute delimiter when used in
736
     * innerHTML.
737
     * </p>
738
     *
739
     * @method escapeHTML
740
     * @param {String} html String to escape.
741
     * @return {String} Escaped string.
742
     * @static
743
     * @since 2.9.0
744
     */
745
    escapeHTML: function (html) {
746
        return html.replace(/[&<>"'\/`]/g, function (match) {
747
            return HTML_CHARS[match];
748
        });
749
    },
750
 
751
    /**
752
     * Utility to set up the prototype, constructor and superclass properties to
753
     * support an inheritance strategy that can chain constructors and methods.
754
     * Static members will not be inherited.
755
     *
756
     * @method extend
757
     * @static
758
     * @param {Function} subc   the object to modify
759
     * @param {Function} superc the object to inherit
760
     * @param {Object} overrides  additional properties/methods to add to the
761
     *                              subclass prototype.  These will override the
762
     *                              matching items obtained from the superclass
763
     *                              if present.
764
     */
765
    extend: function(subc, superc, overrides) {
766
        if (!superc||!subc) {
767
            throw new Error("extend failed, please check that " +
768
                            "all dependencies are included.");
769
        }
770
        var F = function() {}, i;
771
        F.prototype=superc.prototype;
772
        subc.prototype=new F();
773
        subc.prototype.constructor=subc;
774
        subc.superclass=superc.prototype;
775
        if (superc.prototype.constructor == OP.constructor) {
776
            superc.prototype.constructor=superc;
777
        }
778
 
779
        if (overrides) {
780
            for (i in overrides) {
781
                if (L.hasOwnProperty(overrides, i)) {
782
                    subc.prototype[i]=overrides[i];
783
                }
784
            }
785
 
786
            L._IEEnumFix(subc.prototype, overrides);
787
        }
788
    },
789
 
790
    /**
791
     * Applies all properties in the supplier to the receiver if the
792
     * receiver does not have these properties yet.  Optionally, one or
793
     * more methods/properties can be specified (as additional
794
     * parameters).  This option will overwrite the property if receiver
795
     * has it already.  If true is passed as the third parameter, all
796
     * properties will be applied and _will_ overwrite properties in
797
     * the receiver.
798
     *
799
     * @method augmentObject
800
     * @static
801
     * @since 2.3.0
802
     * @param {Function} r  the object to receive the augmentation
803
     * @param {Function} s  the object that supplies the properties to augment
804
     * @param {String*|boolean}  arguments zero or more properties methods
805
     *        to augment the receiver with.  If none specified, everything
806
     *        in the supplier will be used unless it would
807
     *        overwrite an existing property in the receiver. If true
808
     *        is specified as the third parameter, all properties will
809
     *        be applied and will overwrite an existing property in
810
     *        the receiver
811
     */
812
    augmentObject: function(r, s) {
813
        if (!s||!r) {
814
            throw new Error("Absorb failed, verify dependencies.");
815
        }
816
        var a=arguments, i, p, overrideList=a[2];
817
        if (overrideList && overrideList!==true) { // only absorb the specified properties
818
            for (i=2; i<a.length; i=i+1) {
819
                r[a[i]] = s[a[i]];
820
            }
821
        } else { // take everything, overwriting only if the third parameter is true
822
            for (p in s) {
823
                if (overrideList || !(p in r)) {
824
                    r[p] = s[p];
825
                }
826
            }
827
 
828
            L._IEEnumFix(r, s);
829
        }
830
 
831
        return r;
832
    },
833
 
834
    /**
835
     * Same as YAHOO.lang.augmentObject, except it only applies prototype properties
836
     * @see YAHOO.lang.augmentObject
837
     * @method augmentProto
838
     * @static
839
     * @param {Function} r  the object to receive the augmentation
840
     * @param {Function} s  the object that supplies the properties to augment
841
     * @param {String*|boolean}  arguments zero or more properties methods
842
     *        to augment the receiver with.  If none specified, everything
843
     *        in the supplier will be used unless it would overwrite an existing
844
     *        property in the receiver.  if true is specified as the third
845
     *        parameter, all properties will be applied and will overwrite an
846
     *        existing property in the receiver
847
     */
848
    augmentProto: function(r, s) {
849
        if (!s||!r) {
850
            throw new Error("Augment failed, verify dependencies.");
851
        }
852
        //var a=[].concat(arguments);
853
        var a=[r.prototype,s.prototype], i;
854
        for (i=2;i<arguments.length;i=i+1) {
855
            a.push(arguments[i]);
856
        }
857
        L.augmentObject.apply(this, a);
858
 
859
        return r;
860
    },
861
 
862
 
863
    /**
864
     * Returns a simple string representation of the object or array.
865
     * Other types of objects will be returned unprocessed.  Arrays
866
     * are expected to be indexed.  Use object notation for
867
     * associative arrays.
868
     * @method dump
869
     * @since 2.3.0
870
     * @param o {Object} The object to dump
871
     * @param d {int} How deep to recurse child objects, default 3
872
     * @return {String} the dump result
873
     */
874
    dump: function(o, d) {
875
        var i,len,s=[],OBJ="{...}",FUN="f(){...}",
876
            COMMA=', ', ARROW=' => ';
877
 
878
        // Cast non-objects to string
879
        // Skip dates because the std toString is what we want
880
        // Skip HTMLElement-like objects because trying to dump
881
        // an element will cause an unhandled exception in FF 2.x
882
        if (!L.isObject(o)) {
883
            return o + "";
884
        } else if (o instanceof Date || ("nodeType" in o && "tagName" in o)) {
885
            return o;
886
        } else if  (L.isFunction(o)) {
887
            return FUN;
888
        }
889
 
890
        // dig into child objects the depth specifed. Default 3
891
        d = (L.isNumber(d)) ? d : 3;
892
 
893
        // arrays [1, 2, 3]
894
        if (L.isArray(o)) {
895
            s.push("[");
896
            for (i=0,len=o.length;i<len;i=i+1) {
897
                if (L.isObject(o[i])) {
898
                    s.push((d > 0) ? L.dump(o[i], d-1) : OBJ);
899
                } else {
900
                    s.push(o[i]);
901
                }
902
                s.push(COMMA);
903
            }
904
            if (s.length > 1) {
905
                s.pop();
906
            }
907
            s.push("]");
908
        // objects {k1 => v1, k2 => v2}
909
        } else {
910
            s.push("{");
911
            for (i in o) {
912
                if (L.hasOwnProperty(o, i)) {
913
                    s.push(i + ARROW);
914
                    if (L.isObject(o[i])) {
915
                        s.push((d > 0) ? L.dump(o[i], d-1) : OBJ);
916
                    } else {
917
                        s.push(o[i]);
918
                    }
919
                    s.push(COMMA);
920
                }
921
            }
922
            if (s.length > 1) {
923
                s.pop();
924
            }
925
            s.push("}");
926
        }
927
 
928
        return s.join("");
929
    },
930
 
931
    /**
932
     * Does variable substitution on a string. It scans through the string
933
     * looking for expressions enclosed in { } braces. If an expression
934
     * is found, it is used a key on the object.  If there is a space in
935
     * the key, the first word is used for the key and the rest is provided
936
     * to an optional function to be used to programatically determine the
937
     * value (the extra information might be used for this decision). If
938
     * the value for the key in the object, or what is returned from the
939
     * function has a string value, number value, or object value, it is
940
     * substituted for the bracket expression and it repeats.  If this
941
     * value is an object, it uses the Object's toString() if this has
942
     * been overridden, otherwise it does a shallow dump of the key/value
943
     * pairs.
944
     *
945
     * By specifying the recurse option, the string is rescanned after
946
     * every replacement, allowing for nested template substitutions.
947
     * The side effect of this option is that curly braces in the
948
     * replacement content must be encoded.
949
     *
950
     * @method substitute
951
     * @since 2.3.0
952
     * @param s {String} The string that will be modified.
953
     * @param o {Object} An object containing the replacement values
954
     * @param f {Function} An optional function that can be used to
955
     *                     process each match.  It receives the key,
956
     *                     value, and any extra metadata included with
957
     *                     the key inside of the braces.
958
     * @param recurse {boolean} default true - if not false, the replaced
959
     * string will be rescanned so that nested substitutions are possible.
960
     * @return {String} the substituted string
961
     */
962
    substitute: function (s, o, f, recurse) {
963
        var i, j, k, key, v, meta, saved=[], token, lidx=s.length,
964
            DUMP='dump', SPACE=' ', LBRACE='{', RBRACE='}',
965
            dump, objstr;
966
 
967
        for (;;) {
968
            i = s.lastIndexOf(LBRACE, lidx);
969
            if (i < 0) {
970
                break;
971
            }
972
            j = s.indexOf(RBRACE, i);
973
            if (i + 1 > j) {
974
                break;
975
            }
976
 
977
            //Extract key and meta info
978
            token = s.substring(i + 1, j);
979
            key = token;
980
            meta = null;
981
            k = key.indexOf(SPACE);
982
            if (k > -1) {
983
                meta = key.substring(k + 1);
984
                key = key.substring(0, k);
985
            }
986
 
987
            // lookup the value
988
            v = o[key];
989
 
990
            // if a substitution function was provided, execute it
991
            if (f) {
992
                v = f(key, v, meta);
993
            }
994
 
995
            if (L.isObject(v)) {
996
                if (L.isArray(v)) {
997
                    v = L.dump(v, parseInt(meta, 10));
998
                } else {
999
                    meta = meta || "";
1000
 
1001
                    // look for the keyword 'dump', if found force obj dump
1002
                    dump = meta.indexOf(DUMP);
1003
                    if (dump > -1) {
1004
                        meta = meta.substring(4);
1005
                    }
1006
 
1007
                    objstr = v.toString();
1008
 
1009
                    // use the toString if it is not the Object toString
1010
                    // and the 'dump' meta info was not found
1011
                    if (objstr === OBJECT_TOSTRING || dump > -1) {
1012
                        v = L.dump(v, parseInt(meta, 10));
1013
                    } else {
1014
                        v = objstr;
1015
                    }
1016
                }
1017
            } else if (!L.isString(v) && !L.isNumber(v)) {
1018
                // This {block} has no replace string. Save it for later.
1019
                v = "~-" + saved.length + "-~";
1020
                saved[saved.length] = token;
1021
 
1022
                // break;
1023
            }
1024
 
1025
            s = s.substring(0, i) + v + s.substring(j + 1);
1026
 
1027
            if (recurse === false) {
1028
                lidx = i-1;
1029
            }
1030
 
1031
        }
1032
 
1033
        // restore saved {block}s
1034
        for (i=saved.length-1; i>=0; i=i-1) {
1035
            s = s.replace(new RegExp("~-" + i + "-~"), "{"  + saved[i] + "}", "g");
1036
        }
1037
 
1038
        return s;
1039
    },
1040
 
1041
 
1042
    /**
1043
     * Returns a string without any leading or trailing whitespace.  If
1044
     * the input is not a string, the input will be returned untouched.
1045
     * @method trim
1046
     * @since 2.3.0
1047
     * @param s {string} the string to trim
1048
     * @return {string} the trimmed string
1049
     */
1050
    trim: function(s){
1051
        try {
1052
            return s.replace(/^\s+|\s+$/g, "");
1053
        } catch(e) {
1054
            return s;
1055
        }
1056
    },
1057
 
1058
    /**
1059
     * Returns a new object containing all of the properties of
1060
     * all the supplied objects.  The properties from later objects
1061
     * will overwrite those in earlier objects.
1062
     * @method merge
1063
     * @since 2.3.0
1064
     * @param arguments {Object*} the objects to merge
1065
     * @return the new merged object
1066
     */
1067
    merge: function() {
1068
        var o={}, a=arguments, l=a.length, i;
1069
        for (i=0; i<l; i=i+1) {
1070
            L.augmentObject(o, a[i], true);
1071
        }
1072
        return o;
1073
    },
1074
 
1075
    /**
1076
     * Executes the supplied function in the context of the supplied
1077
     * object 'when' milliseconds later.  Executes the function a
1078
     * single time unless periodic is set to true.
1079
     * @method later
1080
     * @since 2.4.0
1081
     * @param when {int} the number of milliseconds to wait until the fn
1082
     * is executed
1083
     * @param o the context object
1084
     * @param fn {Function|String} the function to execute or the name of
1085
     * the method in the 'o' object to execute
1086
     * @param data [Array] data that is provided to the function.  This accepts
1087
     * either a single item or an array.  If an array is provided, the
1088
     * function is executed with one parameter for each array item.  If
1089
     * you need to pass a single array parameter, it needs to be wrapped in
1090
     * an array [myarray]
1091
     * @param periodic {boolean} if true, executes continuously at supplied
1092
     * interval until canceled
1093
     * @return a timer object. Call the cancel() method on this object to
1094
     * stop the timer.
1095
     */
1096
    later: function(when, o, fn, data, periodic) {
1097
        when = when || 0;
1098
        o = o || {};
1099
        var m=fn, d=data, f, r;
1100
 
1101
        if (L.isString(fn)) {
1102
            m = o[fn];
1103
        }
1104
 
1105
        if (!m) {
1106
            throw new TypeError("method undefined");
1107
        }
1108
 
1109
        if (!L.isUndefined(data) && !L.isArray(d)) {
1110
            d = [data];
1111
        }
1112
 
1113
        f = function() {
1114
            m.apply(o, d || NOTHING);
1115
        };
1116
 
1117
        r = (periodic) ? setInterval(f, when) : setTimeout(f, when);
1118
 
1119
        return {
1120
            interval: periodic,
1121
            cancel: function() {
1122
                if (this.interval) {
1123
                    clearInterval(r);
1124
                } else {
1125
                    clearTimeout(r);
1126
                }
1127
            }
1128
        };
1129
    },
1130
 
1131
    /**
1132
     * A convenience method for detecting a legitimate non-null value.
1133
     * Returns false for null/undefined/NaN, true for other values,
1134
     * including 0/false/''
1135
     * @method isValue
1136
     * @since 2.3.0
1137
     * @param o {any} the item to test
1138
     * @return {boolean} true if it is not null/undefined/NaN || false
1139
     */
1140
    isValue: function(o) {
1141
        // return (o || o === false || o === 0 || o === ''); // Infinity fails
1142
return (L.isObject(o) || L.isString(o) || L.isNumber(o) || L.isBoolean(o));
1143
    }
1144
 
1145
};
1146
 
1147
/**
1148
 * Determines whether or not the property was added
1149
 * to the object instance.  Returns false if the property is not present
1150
 * in the object, or was inherited from the prototype.
1151
 * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x.
1152
 * There is a discrepancy between YAHOO.lang.hasOwnProperty and
1153
 * Object.prototype.hasOwnProperty when the property is a primitive added to
1154
 * both the instance AND prototype with the same value:
1155
 * <pre>
1156
 * var A = function() {};
1157
 * A.prototype.foo = 'foo';
1158
 * var a = new A();
1159
 * a.foo = 'foo';
1160
 * alert(a.hasOwnProperty('foo')); // true
1161
 * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
1162
 * </pre>
1163
 * @method hasOwnProperty
1164
 * @param {any} o The object being testing
1165
 * @param prop {string} the name of the property to test
1166
 * @return {boolean} the result
1167
 */
1168
L.hasOwnProperty = (OP.hasOwnProperty) ?
1169
    function(o, prop) {
1170
        return o && o.hasOwnProperty && o.hasOwnProperty(prop);
1171
    } : function(o, prop) {
1172
        return !L.isUndefined(o[prop]) &&
1173
                o.constructor.prototype[prop] !== o[prop];
1174
    };
1175
 
1176
// new lang wins
1177
OB.augmentObject(L, OB, true);
1178
 
1179
/*
1180
 * An alias for <a href="YAHOO.lang.html">YAHOO.lang</a>
1181
 * @class YAHOO.util.Lang
1182
 */
1183
YAHOO.util.Lang = L;
1184
 
1185
/**
1186
 * Same as YAHOO.lang.augmentObject, except it only applies prototype
1187
 * properties.  This is an alias for augmentProto.
1188
 * @see YAHOO.lang.augmentObject
1189
 * @method augment
1190
 * @static
1191
 * @param {Function} r  the object to receive the augmentation
1192
 * @param {Function} s  the object that supplies the properties to augment
1193
 * @param {String*|boolean}  arguments zero or more properties methods to
1194
 *        augment the receiver with.  If none specified, everything
1195
 *        in the supplier will be used unless it would
1196
 *        overwrite an existing property in the receiver.  if true
1197
 *        is specified as the third parameter, all properties will
1198
 *        be applied and will overwrite an existing property in
1199
 *        the receiver
1200
 */
1201
L.augment = L.augmentProto;
1202
 
1203
/**
1204
 * An alias for <a href="YAHOO.lang.html#augment">YAHOO.lang.augment</a>
1205
 * @for YAHOO
1206
 * @method augment
1207
 * @static
1208
 * @param {Function} r  the object to receive the augmentation
1209
 * @param {Function} s  the object that supplies the properties to augment
1210
 * @param {String*}  arguments zero or more properties methods to
1211
 *        augment the receiver with.  If none specified, everything
1212
 *        in the supplier will be used unless it would
1213
 *        overwrite an existing property in the receiver
1214
 */
1215
YAHOO.augment = L.augmentProto;
1216
 
1217
/**
1218
 * An alias for <a href="YAHOO.lang.html#extend">YAHOO.lang.extend</a>
1219
 * @method extend
1220
 * @static
1221
 * @param {Function} subc   the object to modify
1222
 * @param {Function} superc the object to inherit
1223
 * @param {Object} overrides  additional properties/methods to add to the
1224
 *        subclass prototype.  These will override the
1225
 *        matching items obtained from the superclass if present.
1226
 */
1227
YAHOO.extend = L.extend;
1228
 
1229
})();
1230
YAHOO.register("yahoo", YAHOO, {version: "2.9.0", build: "2800"});
1231
 
1232
    Y.YUI2 = YAHOO;
1233
}, '2.9.0' ,{});