Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F104834568
yahoo-debug.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, Mar 12, 18:34
Size
34 KB
Mime Type
text/html
Expires
Fri, Mar 14, 18:34 (2 d)
Engine
blob
Format
Raw Data
Handle
24801587
Attached To
R4897 i2b2-webclient
yahoo-debug.js
View Options
/*
Copyright (c) 2010, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.com/yui/license.html
version: 2.8.2r1
*/
/**
* The YAHOO object is the single global object used by YUI Library. It
* contains utility function for setting up namespaces, inheritance, and
* logging. YAHOO.util, YAHOO.widget, and YAHOO.example are namespaces
* created automatically for and used by the library.
* @module yahoo
* @title YAHOO Global
*/
/**
* YAHOO_config is not included as part of the library. Instead it is an
* object that can be defined by the implementer immediately before
* including the YUI library. The properties included in this object
* will be used to configure global properties needed as soon as the
* library begins to load.
* @class YAHOO_config
* @static
*/
/**
* A reference to a function that will be executed every time a YAHOO module
* is loaded. As parameter, this function will receive the version
* information for the module. See <a href="YAHOO.env.html#getVersion">
* YAHOO.env.getVersion</a> for the description of the version data structure.
* @property listener
* @type Function
* @static
* @default undefined
*/
/**
* Set to true if the library will be dynamically loaded after window.onload.
* Defaults to false
* @property injecting
* @type boolean
* @static
* @default undefined
*/
/**
* Instructs the yuiloader component to dynamically load yui components and
* their dependencies. See the yuiloader documentation for more information
* about dynamic loading
* @property load
* @static
* @default undefined
* @see yuiloader
*/
/**
* Forces the use of the supplied locale where applicable in the library
* @property locale
* @type string
* @static
* @default undefined
*/
if
(
typeof
YAHOO
==
"undefined"
||
!
YAHOO
)
{
/**
* The YAHOO global namespace object. If YAHOO is already defined, the
* existing YAHOO object will not be overwritten so that defined
* namespaces are preserved.
* @class YAHOO
* @static
*/
var
YAHOO
=
{};
}
/**
* Returns the namespace specified and creates it if it doesn't exist
* <pre>
* YAHOO.namespace("property.package");
* YAHOO.namespace("YAHOO.property.package");
* </pre>
* Either of the above would create YAHOO.property, then
* YAHOO.property.package
*
* Be careful when naming packages. Reserved words may work in some browsers
* and not others. For instance, the following will fail in Safari:
* <pre>
* YAHOO.namespace("really.long.nested.namespace");
* </pre>
* This fails because "long" is a future reserved word in ECMAScript
*
* For implementation code that uses YUI, do not create your components
* in the namespaces defined by YUI (
* <code>YAHOO.util</code>,
* <code>YAHOO.widget</code>,
* <code>YAHOO.lang</code>,
* <code>YAHOO.tool</code>,
* <code>YAHOO.example</code>,
* <code>YAHOO.env</code>) -- create your own namespace (e.g., 'companyname').
*
* @method namespace
* @static
* @param {String*} arguments 1-n namespaces to create
* @return {Object} A reference to the last namespace object created
*/
YAHOO
.
namespace
=
function
()
{
var
a
=
arguments
,
o
=
null
,
i
,
j
,
d
;
for
(
i
=
0
;
i
<
a
.
length
;
i
=
i
+
1
)
{
d
=
(
""
+
a
[
i
]).
split
(
"."
);
o
=
YAHOO
;
// YAHOO is implied, so it is ignored if it is included
for
(
j
=
(
d
[
0
]
==
"YAHOO"
)
?
1
:
0
;
j
<
d
.
length
;
j
=
j
+
1
)
{
o
[
d
[
j
]]
=
o
[
d
[
j
]]
||
{};
o
=
o
[
d
[
j
]];
}
}
return
o
;
};
/**
* Uses YAHOO.widget.Logger to output a log message, if the widget is
* available.
*
* @method log
* @static
* @param {String} msg The message to log.
* @param {String} cat The log category for the message. Default
* categories are "info", "warn", "error", time".
* Custom categories can be used as well. (opt)
* @param {String} src The source of the the message (opt)
* @return {Boolean} True if the log operation was successful.
*/
YAHOO
.
log
=
function
(
msg
,
cat
,
src
)
{
var
l
=
YAHOO
.
widget
.
Logger
;
if
(
l
&&
l
.
log
)
{
return
l
.
log
(
msg
,
cat
,
src
);
}
else
{
return
false
;
}
};
/**
* Registers a module with the YAHOO object
* @method register
* @static
* @param {String} name the name of the module (event, slider, etc)
* @param {Function} mainClass a reference to class in the module. This
* class will be tagged with the version info
* so that it will be possible to identify the
* version that is in use when multiple versions
* have loaded
* @param {Object} data metadata object for the module. Currently it
* is expected to contain a "version" property
* and a "build" property at minimum.
*/
YAHOO
.
register
=
function
(
name
,
mainClass
,
data
)
{
var
mods
=
YAHOO
.
env
.
modules
,
m
,
v
,
b
,
ls
,
i
;
if
(
!
mods
[
name
])
{
mods
[
name
]
=
{
versions
:
[],
builds
:
[]
};
}
m
=
mods
[
name
];
v
=
data
.
version
;
b
=
data
.
build
;
ls
=
YAHOO
.
env
.
listeners
;
m
.
name
=
name
;
m
.
version
=
v
;
m
.
build
=
b
;
m
.
versions
.
push
(
v
);
m
.
builds
.
push
(
b
);
m
.
mainClass
=
mainClass
;
// fire the module load listeners
for
(
i
=
0
;
i
<
ls
.
length
;
i
=
i
+
1
)
{
ls
[
i
](
m
);
}
// label the main class
if
(
mainClass
)
{
mainClass
.
VERSION
=
v
;
mainClass
.
BUILD
=
b
;
}
else
{
YAHOO
.
log
(
"mainClass is undefined for module "
+
name
,
"warn"
);
}
};
/**
* YAHOO.env is used to keep track of what is known about the YUI library and
* the browsing environment
* @class YAHOO.env
* @static
*/
YAHOO
.
env
=
YAHOO
.
env
||
{
/**
* Keeps the version info for all YUI modules that have reported themselves
* @property modules
* @type Object[]
*/
modules
:
[],
/**
* List of functions that should be executed every time a YUI module
* reports itself.
* @property listeners
* @type Function[]
*/
listeners
:
[]
};
/**
* Returns the version data for the specified module:
* <dl>
* <dt>name:</dt> <dd>The name of the module</dd>
* <dt>version:</dt> <dd>The version in use</dd>
* <dt>build:</dt> <dd>The build number in use</dd>
* <dt>versions:</dt> <dd>All versions that were registered</dd>
* <dt>builds:</dt> <dd>All builds that were registered.</dd>
* <dt>mainClass:</dt> <dd>An object that was was stamped with the
* current version and build. If
* mainClass.VERSION != version or mainClass.BUILD != build,
* multiple versions of pieces of the library have been
* loaded, potentially causing issues.</dd>
* </dl>
*
* @method getVersion
* @static
* @param {String} name the name of the module (event, slider, etc)
* @return {Object} The version info
*/
YAHOO
.
env
.
getVersion
=
function
(
name
)
{
return
YAHOO
.
env
.
modules
[
name
]
||
null
;
};
/**
* Do not fork for a browser if it can be avoided. Use feature detection when
* you can. Use the user agent as a last resort. YAHOO.env.ua stores a version
* number for the browser engine, 0 otherwise. This value may or may not map
* to the version number of the browser using the engine. The value is
* presented as a float so that it can easily be used for boolean evaluation
* as well as for looking for a particular range of versions. Because of this,
* some of the granularity of the version info may be lost (e.g., Gecko 1.8.0.9
* reports 1.8).
* @class YAHOO.env.ua
* @static
*/
YAHOO
.
env
.
ua
=
function
()
{
var
numberfy
=
function
(
s
)
{
var
c
=
0
;
return
parseFloat
(
s
.
replace
(
/\./g
,
function
()
{
return
(
c
++
==
1
)
?
''
:
'.'
;
}));
},
nav
=
navigator
,
o
=
{
/**
* Internet Explorer version number or 0. Example: 6
* @property ie
* @type float
*/
ie
:
0
,
/**
* Opera version number or 0. Example: 9.2
* @property opera
* @type float
*/
opera
:
0
,
/**
* Gecko engine revision number. Will evaluate to 1 if Gecko
* is detected but the revision could not be found. Other browsers
* will be 0. Example: 1.8
* <pre>
* Firefox 1.0.0.4: 1.7.8 <-- Reports 1.7
* Firefox 1.5.0.9: 1.8.0.9 <-- Reports 1.8
* Firefox 2.0.0.3: 1.8.1.3 <-- Reports 1.8
* Firefox 3 alpha: 1.9a4 <-- Reports 1.9
* </pre>
* @property gecko
* @type float
*/
gecko
:
0
,
/**
* AppleWebKit version. KHTML browsers that are not WebKit browsers
* will evaluate to 1, other browsers 0. Example: 418.9.1
* <pre>
* Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
* latest available for Mac OSX 10.3.
* Safari 2.0.2: 416 <-- hasOwnProperty introduced
* Safari 2.0.4: 418 <-- preventDefault fixed
* Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
* different versions of webkit
* Safari 2.0.4 (419.3): 419 <-- Tiger installations that have been
* updated, but not updated
* to the latest patch.
* Webkit 212 nightly: 522+ <-- Safari 3.0 precursor (with native SVG
* and many major issues fixed).
* 3.x yahoo.com, flickr:422 <-- Safari 3.x hacks the user agent
* string when hitting yahoo.com and
* flickr.com.
* Safari 3.0.4 (523.12):523.12 <-- First Tiger release - automatic update
* from 2.x via the 10.4.11 OS patch
* Webkit nightly 1/2008:525+ <-- Supports DOMContentLoaded event.
* yahoo.com user agent hack removed.
*
* </pre>
* http://developer.apple.com/internet/safari/uamatrix.html
* @property webkit
* @type float
*/
webkit
:
0
,
/**
* The mobile property will be set to a string containing any relevant
* user agent information when a modern mobile browser is detected.
* Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
* devices with the WebKit-based browser, and Opera Mini.
* @property mobile
* @type string
*/
mobile
:
null
,
/**
* Adobe AIR version number or 0. Only populated if webkit is detected.
* Example: 1.0
* @property air
* @type float
*/
air
:
0
,
/**
* Google Caja version number or 0.
* @property caja
* @type float
*/
caja
:
nav
.
cajaVersion
,
/**
* Set to true if the page appears to be in SSL
* @property secure
* @type boolean
* @static
*/
secure
:
false
,
/**
* The operating system. Currently only detecting windows or macintosh
* @property os
* @type string
* @static
*/
os
:
null
},
ua
=
navigator
&&
navigator
.
userAgent
,
loc
=
window
&&
window
.
location
,
href
=
loc
&&
loc
.
href
,
m
;
o
.
secure
=
href
&&
(
href
.
toLowerCase
().
indexOf
(
"https"
)
===
0
);
if
(
ua
)
{
if
((
/windows|win32/i
).
test
(
ua
))
{
o
.
os
=
'windows'
;
}
else
if
((
/macintosh/i
).
test
(
ua
))
{
o
.
os
=
'macintosh'
;
}
// Modern KHTML browsers should qualify as Safari X-Grade
if
((
/KHTML/
).
test
(
ua
))
{
o
.
webkit
=
1
;
}
// Modern WebKit browsers are at least X-Grade
m
=
ua
.
match
(
/AppleWebKit\/([^\s]*)/
);
if
(
m
&&
m
[
1
])
{
o
.
webkit
=
numberfy
(
m
[
1
]);
// Mobile browser check
if
(
/ Mobile\//
.
test
(
ua
))
{
o
.
mobile
=
"Apple"
;
// iPhone or iPod Touch
}
else
{
m
=
ua
.
match
(
/NokiaN[^\/]*/
);
if
(
m
)
{
o
.
mobile
=
m
[
0
];
// Nokia N-series, ex: NokiaN95
}
}
m
=
ua
.
match
(
/AdobeAIR\/([^\s]*)/
);
if
(
m
)
{
o
.
air
=
m
[
0
];
// Adobe AIR 1.0 or better
}
}
if
(
!
o
.
webkit
)
{
// not webkit
// @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
m
=
ua
.
match
(
/Opera[\s\/]([^\s]*)/
);
if
(
m
&&
m
[
1
])
{
o
.
opera
=
numberfy
(
m
[
1
]);
m
=
ua
.
match
(
/Opera Mini[^;]*/
);
if
(
m
)
{
o
.
mobile
=
m
[
0
];
// ex: Opera Mini/2.0.4509/1316
}
}
else
{
// not opera or webkit
m
=
ua
.
match
(
/MSIE\s([^;]*)/
);
if
(
m
&&
m
[
1
])
{
o
.
ie
=
numberfy
(
m
[
1
]);
}
else
{
// not opera, webkit, or ie
m
=
ua
.
match
(
/Gecko\/([^\s]*)/
);
if
(
m
)
{
o
.
gecko
=
1
;
// Gecko detected, look for revision
m
=
ua
.
match
(
/rv:([^\s\)]*)/
);
if
(
m
&&
m
[
1
])
{
o
.
gecko
=
numberfy
(
m
[
1
]);
}
}
}
}
}
}
return
o
;
}();
/*
* Initializes the global by creating the default namespaces and applying
* any new configuration information that is detected. This is the setup
* for env.
* @method init
* @static
* @private
*/
(
function
()
{
YAHOO
.
namespace
(
"util"
,
"widget"
,
"example"
);
/*global YAHOO_config*/
if
(
"undefined"
!==
typeof
YAHOO_config
)
{
var
l
=
YAHOO_config
.
listener
,
ls
=
YAHOO
.
env
.
listeners
,
unique
=
true
,
i
;
if
(
l
)
{
// if YAHOO is loaded multiple times we need to check to see if
// this is a new config object. If it is, add the new component
// load listener to the stack
for
(
i
=
0
;
i
<
ls
.
length
;
i
++
)
{
if
(
ls
[
i
]
==
l
)
{
unique
=
false
;
break
;
}
}
if
(
unique
)
{
ls
.
push
(
l
);
}
}
}
})();
/**
* Provides the language utilites and extensions used by the library
* @class YAHOO.lang
*/
YAHOO
.
lang
=
YAHOO
.
lang
||
{};
(
function
()
{
var
L
=
YAHOO
.
lang
,
OP
=
Object
.
prototype
,
ARRAY_TOSTRING
=
'[object Array]'
,
FUNCTION_TOSTRING
=
'[object Function]'
,
OBJECT_TOSTRING
=
'[object Object]'
,
NOTHING
=
[],
// ADD = ["toString", "valueOf", "hasOwnProperty"],
ADD
=
[
"toString"
,
"valueOf"
],
OB
=
{
/**
* Determines wheather or not the provided object is an array.
* @method isArray
* @param {any} o The object being testing
* @return {boolean} the result
*/
isArray
:
function
(
o
)
{
return
OP
.
toString
.
apply
(
o
)
===
ARRAY_TOSTRING
;
},
/**
* Determines whether or not the provided object is a boolean
* @method isBoolean
* @param {any} o The object being testing
* @return {boolean} the result
*/
isBoolean
:
function
(
o
)
{
return
typeof
o
===
'boolean'
;
},
/**
* Determines whether or not the provided object is a function.
* Note: Internet Explorer thinks certain functions are objects:
*
* var obj = document.createElement("object");
* YAHOO.lang.isFunction(obj.getAttribute) // reports false in IE
*
* var input = document.createElement("input"); // append to body
* YAHOO.lang.isFunction(input.focus) // reports false in IE
*
* You will have to implement additional tests if these functions
* matter to you.
*
* @method isFunction
* @param {any} o The object being testing
* @return {boolean} the result
*/
isFunction
:
function
(
o
)
{
return
(
typeof
o
===
'function'
)
||
OP
.
toString
.
apply
(
o
)
===
FUNCTION_TOSTRING
;
},
/**
* Determines whether or not the provided object is null
* @method isNull
* @param {any} o The object being testing
* @return {boolean} the result
*/
isNull
:
function
(
o
)
{
return
o
===
null
;
},
/**
* Determines whether or not the provided object is a legal number
* @method isNumber
* @param {any} o The object being testing
* @return {boolean} the result
*/
isNumber
:
function
(
o
)
{
return
typeof
o
===
'number'
&&
isFinite
(
o
);
},
/**
* Determines whether or not the provided object is of type object
* or function
* @method isObject
* @param {any} o The object being testing
* @return {boolean} the result
*/
isObject
:
function
(
o
)
{
return
(
o
&&
(
typeof
o
===
'object'
||
L
.
isFunction
(
o
)))
||
false
;
},
/**
* Determines whether or not the provided object is a string
* @method isString
* @param {any} o The object being testing
* @return {boolean} the result
*/
isString
:
function
(
o
)
{
return
typeof
o
===
'string'
;
},
/**
* Determines whether or not the provided object is undefined
* @method isUndefined
* @param {any} o The object being testing
* @return {boolean} the result
*/
isUndefined
:
function
(
o
)
{
return
typeof
o
===
'undefined'
;
},
/**
* IE will not enumerate native functions in a derived object even if the
* function was overridden. This is a workaround for specific functions
* we care about on the Object prototype.
* @property _IEEnumFix
* @param {Function} r the object to receive the augmentation
* @param {Function} s the object that supplies the properties to augment
* @static
* @private
*/
_IEEnumFix
:
(
YAHOO
.
env
.
ua
.
ie
)
?
function
(
r
,
s
)
{
var
i
,
fname
,
f
;
for
(
i
=
0
;
i
<
ADD
.
length
;
i
=
i
+
1
)
{
fname
=
ADD
[
i
];
f
=
s
[
fname
];
if
(
L
.
isFunction
(
f
)
&&
f
!=
OP
[
fname
])
{
r
[
fname
]
=
f
;
}
}
}
:
function
(){},
/**
* Utility to set up the prototype, constructor and superclass properties to
* support an inheritance strategy that can chain constructors and methods.
* Static members will not be inherited.
*
* @method extend
* @static
* @param {Function} subc the object to modify
* @param {Function} superc the object to inherit
* @param {Object} overrides additional properties/methods to add to the
* subclass prototype. These will override the
* matching items obtained from the superclass
* if present.
*/
extend
:
function
(
subc
,
superc
,
overrides
)
{
if
(
!
superc
||!
subc
)
{
throw
new
Error
(
"extend failed, please check that "
+
"all dependencies are included."
);
}
var
F
=
function
()
{},
i
;
F
.
prototype
=
superc
.
prototype
;
subc
.
prototype
=
new
F
();
subc
.
prototype
.
constructor
=
subc
;
subc
.
superclass
=
superc
.
prototype
;
if
(
superc
.
prototype
.
constructor
==
OP
.
constructor
)
{
superc
.
prototype
.
constructor
=
superc
;
}
if
(
overrides
)
{
for
(
i
in
overrides
)
{
if
(
L
.
hasOwnProperty
(
overrides
,
i
))
{
subc
.
prototype
[
i
]
=
overrides
[
i
];
}
}
L
.
_IEEnumFix
(
subc
.
prototype
,
overrides
);
}
},
/**
* Applies all properties in the supplier to the receiver if the
* receiver does not have these properties yet. Optionally, one or
* more methods/properties can be specified (as additional
* parameters). This option will overwrite the property if receiver
* has it already. If true is passed as the third parameter, all
* properties will be applied and _will_ overwrite properties in
* the receiver.
*
* @method augmentObject
* @static
* @since 2.3.0
* @param {Function} r the object to receive the augmentation
* @param {Function} s the object that supplies the properties to augment
* @param {String*|boolean} arguments zero or more properties methods
* to augment the receiver with. If none specified, everything
* in the supplier will be used unless it would
* overwrite an existing property in the receiver. If true
* is specified as the third parameter, all properties will
* be applied and will overwrite an existing property in
* the receiver
*/
augmentObject
:
function
(
r
,
s
)
{
if
(
!
s
||!
r
)
{
throw
new
Error
(
"Absorb failed, verify dependencies."
);
}
var
a
=
arguments
,
i
,
p
,
overrideList
=
a
[
2
];
if
(
overrideList
&&
overrideList
!==
true
)
{
// only absorb the specified properties
for
(
i
=
2
;
i
<
a
.
length
;
i
=
i
+
1
)
{
r
[
a
[
i
]]
=
s
[
a
[
i
]];
}
}
else
{
// take everything, overwriting only if the third parameter is true
for
(
p
in
s
)
{
if
(
overrideList
||
!
(
p
in
r
))
{
r
[
p
]
=
s
[
p
];
}
}
L
.
_IEEnumFix
(
r
,
s
);
}
},
/**
* Same as YAHOO.lang.augmentObject, except it only applies prototype properties
* @see YAHOO.lang.augmentObject
* @method augmentProto
* @static
* @param {Function} r the object to receive the augmentation
* @param {Function} s the object that supplies the properties to augment
* @param {String*|boolean} arguments zero or more properties methods
* to augment the receiver with. If none specified, everything
* in the supplier will be used unless it would overwrite an existing
* property in the receiver. if true is specified as the third
* parameter, all properties will be applied and will overwrite an
* existing property in the receiver
*/
augmentProto
:
function
(
r
,
s
)
{
if
(
!
s
||!
r
)
{
throw
new
Error
(
"Augment failed, verify dependencies."
);
}
//var a=[].concat(arguments);
var
a
=
[
r
.
prototype
,
s
.
prototype
],
i
;
for
(
i
=
2
;
i
<
arguments
.
length
;
i
=
i
+
1
)
{
a
.
push
(
arguments
[
i
]);
}
L
.
augmentObject
.
apply
(
this
,
a
);
},
/**
* Returns a simple string representation of the object or array.
* Other types of objects will be returned unprocessed. Arrays
* are expected to be indexed. Use object notation for
* associative arrays.
* @method dump
* @since 2.3.0
* @param o {Object} The object to dump
* @param d {int} How deep to recurse child objects, default 3
* @return {String} the dump result
*/
dump
:
function
(
o
,
d
)
{
var
i
,
len
,
s
=
[],
OBJ
=
"{...}"
,
FUN
=
"f(){...}"
,
COMMA
=
', '
,
ARROW
=
' => '
;
// Cast non-objects to string
// Skip dates because the std toString is what we want
// Skip HTMLElement-like objects because trying to dump
// an element will cause an unhandled exception in FF 2.x
if
(
!
L
.
isObject
(
o
))
{
return
o
+
""
;
}
else
if
(
o
instanceof
Date
||
(
"nodeType"
in
o
&&
"tagName"
in
o
))
{
return
o
;
}
else
if
(
L
.
isFunction
(
o
))
{
return
FUN
;
}
// dig into child objects the depth specifed. Default 3
d
=
(
L
.
isNumber
(
d
))
?
d
:
3
;
// arrays [1, 2, 3]
if
(
L
.
isArray
(
o
))
{
s
.
push
(
"["
);
for
(
i
=
0
,
len
=
o
.
length
;
i
<
len
;
i
=
i
+
1
)
{
if
(
L
.
isObject
(
o
[
i
]))
{
s
.
push
((
d
>
0
)
?
L
.
dump
(
o
[
i
],
d
-
1
)
:
OBJ
);
}
else
{
s
.
push
(
o
[
i
]);
}
s
.
push
(
COMMA
);
}
if
(
s
.
length
>
1
)
{
s
.
pop
();
}
s
.
push
(
"]"
);
// objects {k1 => v1, k2 => v2}
}
else
{
s
.
push
(
"{"
);
for
(
i
in
o
)
{
if
(
L
.
hasOwnProperty
(
o
,
i
))
{
s
.
push
(
i
+
ARROW
);
if
(
L
.
isObject
(
o
[
i
]))
{
s
.
push
((
d
>
0
)
?
L
.
dump
(
o
[
i
],
d
-
1
)
:
OBJ
);
}
else
{
s
.
push
(
o
[
i
]);
}
s
.
push
(
COMMA
);
}
}
if
(
s
.
length
>
1
)
{
s
.
pop
();
}
s
.
push
(
"}"
);
}
return
s
.
join
(
""
);
},
/**
* Does variable substitution on a string. It scans through the string
* looking for expressions enclosed in { } braces. If an expression
* is found, it is used a key on the object. If there is a space in
* the key, the first word is used for the key and the rest is provided
* to an optional function to be used to programatically determine the
* value (the extra information might be used for this decision). If
* the value for the key in the object, or what is returned from the
* function has a string value, number value, or object value, it is
* substituted for the bracket expression and it repeats. If this
* value is an object, it uses the Object's toString() if this has
* been overridden, otherwise it does a shallow dump of the key/value
* pairs.
* @method substitute
* @since 2.3.0
* @param s {String} The string that will be modified.
* @param o {Object} An object containing the replacement values
* @param f {Function} An optional function that can be used to
* process each match. It receives the key,
* value, and any extra metadata included with
* the key inside of the braces.
* @return {String} the substituted string
*/
substitute
:
function
(
s
,
o
,
f
)
{
var
i
,
j
,
k
,
key
,
v
,
meta
,
saved
=
[],
token
,
DUMP
=
'dump'
,
SPACE
=
' '
,
LBRACE
=
'{'
,
RBRACE
=
'}'
,
dump
,
objstr
;
for
(;;)
{
i
=
s
.
lastIndexOf
(
LBRACE
);
if
(
i
<
0
)
{
break
;
}
j
=
s
.
indexOf
(
RBRACE
,
i
);
if
(
i
+
1
>=
j
)
{
break
;
}
//Extract key and meta info
token
=
s
.
substring
(
i
+
1
,
j
);
key
=
token
;
meta
=
null
;
k
=
key
.
indexOf
(
SPACE
);
if
(
k
>
-
1
)
{
meta
=
key
.
substring
(
k
+
1
);
key
=
key
.
substring
(
0
,
k
);
}
// lookup the value
v
=
o
[
key
];
// if a substitution function was provided, execute it
if
(
f
)
{
v
=
f
(
key
,
v
,
meta
);
}
if
(
L
.
isObject
(
v
))
{
if
(
L
.
isArray
(
v
))
{
v
=
L
.
dump
(
v
,
parseInt
(
meta
,
10
));
}
else
{
meta
=
meta
||
""
;
// look for the keyword 'dump', if found force obj dump
dump
=
meta
.
indexOf
(
DUMP
);
if
(
dump
>
-
1
)
{
meta
=
meta
.
substring
(
4
);
}
objstr
=
v
.
toString
();
// use the toString if it is not the Object toString
// and the 'dump' meta info was not found
if
(
objstr
===
OBJECT_TOSTRING
||
dump
>
-
1
)
{
v
=
L
.
dump
(
v
,
parseInt
(
meta
,
10
));
}
else
{
v
=
objstr
;
}
}
}
else
if
(
!
L
.
isString
(
v
)
&&
!
L
.
isNumber
(
v
))
{
// This {block} has no replace string. Save it for later.
v
=
"~-"
+
saved
.
length
+
"-~"
;
saved
[
saved
.
length
]
=
token
;
// break;
}
s
=
s
.
substring
(
0
,
i
)
+
v
+
s
.
substring
(
j
+
1
);
}
// restore saved {block}s
for
(
i
=
saved
.
length
-
1
;
i
>=
0
;
i
=
i
-
1
)
{
s
=
s
.
replace
(
new
RegExp
(
"~-"
+
i
+
"-~"
),
"{"
+
saved
[
i
]
+
"}"
,
"g"
);
}
return
s
;
},
/**
* Returns a string without any leading or trailing whitespace. If
* the input is not a string, the input will be returned untouched.
* @method trim
* @since 2.3.0
* @param s {string} the string to trim
* @return {string} the trimmed string
*/
trim
:
function
(
s
){
try
{
return
s
.
replace
(
/^\s+|\s+$/g
,
""
);
}
catch
(
e
)
{
return
s
;
}
},
/**
* Returns a new object containing all of the properties of
* all the supplied objects. The properties from later objects
* will overwrite those in earlier objects.
* @method merge
* @since 2.3.0
* @param arguments {Object*} the objects to merge
* @return the new merged object
*/
merge
:
function
()
{
var
o
=
{},
a
=
arguments
,
l
=
a
.
length
,
i
;
for
(
i
=
0
;
i
<
l
;
i
=
i
+
1
)
{
L
.
augmentObject
(
o
,
a
[
i
],
true
);
}
return
o
;
},
/**
* Executes the supplied function in the context of the supplied
* object 'when' milliseconds later. Executes the function a
* single time unless periodic is set to true.
* @method later
* @since 2.4.0
* @param when {int} the number of milliseconds to wait until the fn
* is executed
* @param o the context object
* @param fn {Function|String} the function to execute or the name of
* the method in the 'o' object to execute
* @param data [Array] data that is provided to the function. This accepts
* either a single item or an array. If an array is provided, the
* function is executed with one parameter for each array item. If
* you need to pass a single array parameter, it needs to be wrapped in
* an array [myarray]
* @param periodic {boolean} if true, executes continuously at supplied
* interval until canceled
* @return a timer object. Call the cancel() method on this object to
* stop the timer.
*/
later
:
function
(
when
,
o
,
fn
,
data
,
periodic
)
{
when
=
when
||
0
;
o
=
o
||
{};
var
m
=
fn
,
d
=
data
,
f
,
r
;
if
(
L
.
isString
(
fn
))
{
m
=
o
[
fn
];
}
if
(
!
m
)
{
throw
new
TypeError
(
"method undefined"
);
}
if
(
d
&&
!
L
.
isArray
(
d
))
{
d
=
[
data
];
}
f
=
function
()
{
m
.
apply
(
o
,
d
||
NOTHING
);
};
r
=
(
periodic
)
?
setInterval
(
f
,
when
)
:
setTimeout
(
f
,
when
);
return
{
interval
:
periodic
,
cancel
:
function
()
{
if
(
this
.
interval
)
{
clearInterval
(
r
);
}
else
{
clearTimeout
(
r
);
}
}
};
},
/**
* A convenience method for detecting a legitimate non-null value.
* Returns false for null/undefined/NaN, true for other values,
* including 0/false/''
* @method isValue
* @since 2.3.0
* @param o {any} the item to test
* @return {boolean} true if it is not null/undefined/NaN || false
*/
isValue
:
function
(
o
)
{
// return (o || o === false || o === 0 || o === ''); // Infinity fails
return
(
L
.
isObject
(
o
)
||
L
.
isString
(
o
)
||
L
.
isNumber
(
o
)
||
L
.
isBoolean
(
o
));
}
};
/**
* Determines whether or not the property was added
* to the object instance. Returns false if the property is not present
* in the object, or was inherited from the prototype.
* This abstraction is provided to enable hasOwnProperty for Safari 1.3.x.
* There is a discrepancy between YAHOO.lang.hasOwnProperty and
* Object.prototype.hasOwnProperty when the property is a primitive added to
* both the instance AND prototype with the same value:
* <pre>
* var A = function() {};
* A.prototype.foo = 'foo';
* var a = new A();
* a.foo = 'foo';
* alert(a.hasOwnProperty('foo')); // true
* alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
* </pre>
* @method hasOwnProperty
* @param {any} o The object being testing
* @param prop {string} the name of the property to test
* @return {boolean} the result
*/
L
.
hasOwnProperty
=
(
OP
.
hasOwnProperty
)
?
function
(
o
,
prop
)
{
return
o
&&
o
.
hasOwnProperty
(
prop
);
}
:
function
(
o
,
prop
)
{
return
!
L
.
isUndefined
(
o
[
prop
])
&&
o
.
constructor
.
prototype
[
prop
]
!==
o
[
prop
];
};
// new lang wins
OB
.
augmentObject
(
L
,
OB
,
true
);
/*
* An alias for <a href="YAHOO.lang.html">YAHOO.lang</a>
* @class YAHOO.util.Lang
*/
YAHOO
.
util
.
Lang
=
L
;
/**
* Same as YAHOO.lang.augmentObject, except it only applies prototype
* properties. This is an alias for augmentProto.
* @see YAHOO.lang.augmentObject
* @method augment
* @static
* @param {Function} r the object to receive the augmentation
* @param {Function} s the object that supplies the properties to augment
* @param {String*|boolean} arguments zero or more properties methods to
* augment the receiver with. If none specified, everything
* in the supplier will be used unless it would
* overwrite an existing property in the receiver. if true
* is specified as the third parameter, all properties will
* be applied and will overwrite an existing property in
* the receiver
*/
L
.
augment
=
L
.
augmentProto
;
/**
* An alias for <a href="YAHOO.lang.html#augment">YAHOO.lang.augment</a>
* @for YAHOO
* @method augment
* @static
* @param {Function} r the object to receive the augmentation
* @param {Function} s the object that supplies the properties to augment
* @param {String*} arguments zero or more properties methods to
* augment the receiver with. If none specified, everything
* in the supplier will be used unless it would
* overwrite an existing property in the receiver
*/
YAHOO
.
augment
=
L
.
augmentProto
;
/**
* An alias for <a href="YAHOO.lang.html#extend">YAHOO.lang.extend</a>
* @method extend
* @static
* @param {Function} subc the object to modify
* @param {Function} superc the object to inherit
* @param {Object} overrides additional properties/methods to add to the
* subclass prototype. These will override the
* matching items obtained from the superclass if present.
*/
YAHOO
.
extend
=
L
.
extend
;
})();
YAHOO
.
register
(
"yahoo"
,
YAHOO
,
{
version
:
"2.8.2r1"
,
build
:
"7"
});
Event Timeline
Log In to Comment