2006-12-23 06:07:21 +00:00
/ *
* jQuery @ VERSION - New Wave Javascript
*
2007-01-14 22:25:27 +00:00
* Copyright ( c ) 2007 John Resig ( jquery . com )
2006-12-23 06:07:21 +00:00
* Dual licensed under the MIT ( MIT - LICENSE . txt )
* and GPL ( GPL - LICENSE . txt ) licenses .
*
* $Date$
* $Rev$
* /
2007-08-22 05:44:47 +00:00
// Map over jQuery in case of overwrite
if ( typeof jQuery != "undefined" )
var _jQuery = jQuery ;
2007-08-21 07:00:06 +00:00
var jQuery = window . jQuery = function ( a , c ) {
2007-01-08 00:12:41 +00:00
// If the context is global, return a new object
2007-06-29 20:52:59 +00:00
if ( window == this || ! this . init )
2007-01-08 00:12:41 +00:00
return new jQuery ( a , c ) ;
2007-05-01 21:03:44 +00:00
return this . init ( a , c ) ;
2006-12-23 06:07:21 +00:00
} ;
// Map over the $ in case of overwrite
if ( typeof $ != "undefined" )
2007-08-22 05:44:47 +00:00
var _$ = $ ;
2006-12-23 06:07:21 +00:00
// Map the jQuery namespace to the '$' one
2007-08-21 05:43:44 +00:00
window . $ = jQuery ;
2006-12-23 06:07:21 +00:00
2007-08-21 08:25:11 +00:00
var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/ ;
2006-12-23 06:07:21 +00:00
jQuery . fn = jQuery . prototype = {
2007-05-01 21:03:44 +00:00
init : function ( a , c ) {
// Make sure that a selection was provided
a = a || document ;
// Handle HTML strings
if ( typeof a == "string" ) {
2007-08-21 08:25:11 +00:00
var m = quickExpr . exec ( a ) ;
if ( m && ( m [ 1 ] || ! c ) ) {
// HANDLE: $(html) -> $(array)
if ( m [ 1 ] )
2007-08-31 05:33:43 +00:00
a = jQuery . clean ( [ m [ 1 ] ] , c ) ;
2007-08-21 08:25:11 +00:00
// HANDLE: $("#id")
else {
var tmp = document . getElementById ( m [ 3 ] ) ;
if ( tmp )
// Handle the case where IE and Opera return items
// by name instead of ID
if ( tmp . id != m [ 3 ] )
return jQuery ( ) . find ( a ) ;
else {
this [ 0 ] = tmp ;
this . length = 1 ;
return this ;
}
else
a = [ ] ;
}
2007-05-01 21:03:44 +00:00
// HANDLE: $(expr)
2007-08-21 08:25:11 +00:00
} else
2007-05-02 02:41:57 +00:00
return new jQuery ( c ) . find ( a ) ;
2007-08-21 08:25:11 +00:00
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery . isFunction ( a ) )
return new jQuery ( document ) [ jQuery . fn . ready ? "ready" : "load" ] ( a ) ;
2007-05-01 21:03:44 +00:00
return this . setArray (
// HANDLE: $(array)
a . constructor == Array && a ||
// HANDLE: $(arraylike)
// Watch for when an array-like object is passed as the selector
2007-05-23 12:48:15 +00:00
( a . jquery || a . length && a != window && ! a . nodeType && a [ 0 ] != undefined && a [ 0 ] . nodeType ) && jQuery . makeArray ( a ) ||
2007-05-01 21:03:44 +00:00
// HANDLE: $(*)
[ a ] ) ;
} ,
2006-12-23 06:07:21 +00:00
jquery : "@VERSION" ,
size : function ( ) {
return this . length ;
} ,
2007-01-02 16:42:31 +00:00
length : 0 ,
2006-12-23 06:07:21 +00:00
get : function ( num ) {
return num == undefined ?
// Return a 'clean' array
jQuery . makeArray ( this ) :
// Return just the object
this [ num ] ;
} ,
2007-01-10 16:00:22 +00:00
pushStack : function ( a ) {
2007-01-23 16:58:03 +00:00
var ret = jQuery ( a ) ;
2007-01-02 16:42:31 +00:00
ret . prevObject = this ;
2007-01-23 16:58:03 +00:00
return ret ;
2007-01-02 16:42:31 +00:00
} ,
setArray : function ( a ) {
2006-12-23 06:07:21 +00:00
this . length = 0 ;
2007-08-20 07:08:01 +00:00
Array . prototype . push . apply ( this , a ) ;
2006-12-23 06:07:21 +00:00
return this ;
} ,
each : function ( fn , args ) {
return jQuery . each ( this , fn , args ) ;
} ,
index : function ( obj ) {
var pos = - 1 ;
this . each ( function ( i ) {
if ( this == obj ) pos = i ;
} ) ;
return pos ;
} ,
attr : function ( key , value , type ) {
2007-01-08 02:39:10 +00:00
var obj = key ;
// Look for the case where we're accessing a style value
if ( key . constructor == String )
if ( value == undefined )
2007-01-20 03:58:57 +00:00
return this . length && jQuery [ type || "attr" ] ( this [ 0 ] , key ) || undefined ;
2007-01-08 02:39:10 +00:00
else {
obj = { } ;
obj [ key ] = value ;
}
2006-12-23 06:07:21 +00:00
// Check to see if we're setting style values
2007-01-16 09:18:21 +00:00
return this . each ( function ( index ) {
2007-01-08 02:39:10 +00:00
// Set all the styles
for ( var prop in obj )
jQuery . attr (
type ? this . style : this ,
2007-01-16 14:19:01 +00:00
prop , jQuery . prop ( this , obj [ prop ] , type , index , prop )
2007-01-08 02:39:10 +00:00
) ;
} ) ;
2006-12-23 06:07:21 +00:00
} ,
css : function ( key , value ) {
return this . attr ( key , value , "curCSS" ) ;
} ,
2007-01-08 01:26:48 +00:00
text : function ( e ) {
2007-07-20 19:41:17 +00:00
if ( typeof e != "object" && e != null )
2007-01-14 21:09:43 +00:00
return this . empty ( ) . append ( document . createTextNode ( e ) ) ;
2007-01-14 21:49:59 +00:00
var t = "" ;
jQuery . each ( e || this , function ( ) {
jQuery . each ( this . childNodes , function ( ) {
if ( this . nodeType != 8 )
t += this . nodeType != 1 ?
this . nodeValue : jQuery . fn . text ( [ this ] ) ;
} ) ;
} ) ;
return t ;
2006-12-23 06:07:21 +00:00
} ,
2007-08-31 05:33:43 +00:00
wrapAll : function ( html ) {
if ( this [ 0 ] )
// The elements to wrap the target around
jQuery ( html , this [ 0 ] . ownerDocument )
. clone ( )
. insertBefore ( this [ 0 ] )
. map ( function ( ) {
var elem = this ;
while ( elem . firstChild )
elem = elem . firstChild ;
return elem ;
} )
. append ( this ) ;
2006-12-23 06:07:21 +00:00
2007-08-31 05:33:43 +00:00
return this ;
} ,
2006-12-23 06:07:21 +00:00
2007-08-31 05:33:43 +00:00
wrapInner : function ( html ) {
return this . each ( function ( ) {
jQuery ( this ) . contents ( ) . wrapAll ( html ) ;
} ) ;
} ,
2006-12-23 06:07:21 +00:00
2007-08-31 05:33:43 +00:00
wrap : function ( html ) {
return this . each ( function ( ) {
jQuery ( this ) . wrapAll ( html ) ;
2006-12-23 06:07:21 +00:00
} ) ;
} ,
append : function ( ) {
return this . domManip ( arguments , true , 1 , function ( a ) {
this . appendChild ( a ) ;
} ) ;
} ,
prepend : function ( ) {
return this . domManip ( arguments , true , - 1 , function ( a ) {
this . insertBefore ( a , this . firstChild ) ;
} ) ;
} ,
2007-01-02 19:03:12 +00:00
2006-12-23 06:07:21 +00:00
before : function ( ) {
return this . domManip ( arguments , false , 1 , function ( a ) {
this . parentNode . insertBefore ( a , this ) ;
} ) ;
} ,
after : function ( ) {
return this . domManip ( arguments , false , - 1 , function ( a ) {
this . parentNode . insertBefore ( a , this . nextSibling ) ;
} ) ;
} ,
end : function ( ) {
2007-01-02 16:42:31 +00:00
return this . prevObject || jQuery ( [ ] ) ;
2006-12-23 06:07:21 +00:00
} ,
find : function ( t ) {
2007-06-29 19:52:38 +00:00
var data = jQuery . map ( this , function ( a ) { return jQuery . find ( t , a ) ; } ) ;
return this . pushStack ( /[^+>] [^+>]/ . test ( t ) || t . indexOf ( ".." ) > - 1 ?
jQuery . unique ( data ) : data ) ;
2006-12-23 06:07:21 +00:00
} ,
2007-09-04 02:55:38 +00:00
clone : function ( ) {
2007-07-21 04:26:13 +00:00
var $this = this . add ( this . find ( "*" ) ) ;
2007-07-21 03:16:22 +00:00
if ( jQuery . browser . msie ) {
// Need to remove events on the element and its descendants
$this . each ( function ( ) {
this . _$events = { } ;
for ( var type in this . $events )
this . _$events [ type ] = jQuery . extend ( { } , this . $events [ type ] ) ;
} ) . unbind ( ) ;
}
2007-05-14 17:46:00 +00:00
// Do the clone
var r = this . pushStack ( jQuery . map ( this , function ( a ) {
2007-09-04 02:55:38 +00:00
return a . cloneNode ( true ) ;
2007-01-02 16:42:31 +00:00
} ) ) ;
2007-05-14 17:46:00 +00:00
2007-07-21 03:16:22 +00:00
if ( jQuery . browser . msie ) {
$this . each ( function ( ) {
2007-07-21 04:26:13 +00:00
// Add the events back to the original and its descendants
2007-07-21 03:16:22 +00:00
var events = this . _$events ;
for ( var type in events )
for ( var handler in events [ type ] )
jQuery . event . add ( this , type , events [ type ] [ handler ] , events [ type ] [ handler ] . data ) ;
this . _$events = null ;
} ) ;
2007-07-21 04:26:13 +00:00
}
// copy form values over
2007-09-04 02:55:38 +00:00
var inputs = r . add ( r . find ( '*' ) ) . filter ( 'select,input[@type=checkbox]' ) ;
$this . filter ( 'select,input[@type=checkbox]' ) . each ( function ( i ) {
if ( this . selectedIndex )
inputs [ i ] . selectedIndex = this . selectedIndex ;
if ( this . checked )
inputs [ i ] . checked = true ;
} ) ;
2007-05-14 17:46:00 +00:00
// Return the cloned set
return r ;
2006-12-23 06:07:21 +00:00
} ,
filter : function ( t ) {
2007-01-10 16:00:22 +00:00
return this . pushStack (
2007-01-14 07:17:41 +00:00
jQuery . isFunction ( t ) &&
2007-01-10 17:54:42 +00:00
jQuery . grep ( this , function ( el , index ) {
2007-08-07 22:23:30 +00:00
return t . apply ( el , [ index ] ) ;
2006-12-23 06:07:21 +00:00
} ) ||
2007-01-10 17:54:42 +00:00
jQuery . multiFilter ( t , this ) ) ;
2006-12-23 06:07:21 +00:00
} ,
not : function ( t ) {
2007-01-10 17:54:42 +00:00
return this . pushStack (
t . constructor == String &&
2007-01-23 10:32:41 +00:00
jQuery . multiFilter ( t , this , true ) ||
jQuery . grep ( this , function ( a ) {
return ( t . constructor == Array || t . jquery )
2007-01-23 11:07:10 +00:00
? jQuery . inArray ( a , t ) < 0
2007-01-23 10:32:41 +00:00
: a != t ;
} )
) ;
2006-12-23 06:07:21 +00:00
} ,
add : function ( t ) {
2007-01-10 16:00:22 +00:00
return this . pushStack ( jQuery . merge (
2007-01-10 09:37:22 +00:00
this . get ( ) ,
2007-01-20 04:16:25 +00:00
t . constructor == String ?
jQuery ( t ) . get ( ) :
2007-01-23 14:46:19 +00:00
t . length != undefined && ( ! t . nodeName || t . nodeName == "FORM" ) ?
2007-01-20 04:16:25 +00:00
t : [ t ] )
2007-01-10 09:37:22 +00:00
) ;
2006-12-23 06:07:21 +00:00
} ,
is : function ( expr ) {
2007-03-24 02:44:41 +00:00
return expr ? jQuery . multiFilter ( expr , this ) . length > 0 : false ;
2006-12-23 06:07:21 +00:00
} ,
2007-01-06 05:09:11 +00:00
val : function ( val ) {
2007-09-05 17:06:05 +00:00
if ( val == undefined ) {
if ( this . length ) {
var elem = this [ 0 ] ;
// We need to handle select boxes special
if ( jQuery . nodeName ( elem , "select" ) ) {
var index = elem . selectedIndex ,
a = [ ] ,
options = elem . options ,
one = elem . type == "select-one" ;
// Nothing was selected
if ( index < 0 )
return null ;
// Loop through all the selected options
for ( var i = one ? index : 0 , max = one ? index + 1 : options . length ; i < max ; i ++ ) {
var option = options [ i ] ;
if ( option . selected ) {
// Get the specifc value for the option
var val = jQuery . browser . msie && ! option . attributes [ "value" ] . specified ? option . text : option . value ;
// We don't need an array for one selects
if ( one )
return val ;
// Multi-Selects return an array
a . push ( val ) ;
}
}
return a ;
// Everything else, we just grab the value
} else
return this [ 0 ] . value . replace ( /\r/g , "" ) ;
}
} else
return this . attr ( "value" , val ) ;
2007-01-06 05:09:11 +00:00
} ,
html : function ( val ) {
2007-01-10 17:54:42 +00:00
return val == undefined ?
( this . length ? this [ 0 ] . innerHTML : null ) :
this . empty ( ) . append ( val ) ;
2007-01-06 05:09:11 +00:00
} ,
2007-08-20 02:51:57 +00:00
2007-08-25 05:12:20 +00:00
replaceWith : function ( val ) {
return this . after ( val ) . remove ( ) ;
} ,
2007-08-20 02:51:57 +00:00
slice : function ( ) {
return this . pushStack ( Array . prototype . slice . apply ( this , arguments ) ) ;
} ,
2007-08-31 03:26:03 +00:00
2007-09-04 04:44:54 +00:00
map : function ( fn ) {
2007-08-31 03:26:03 +00:00
return this . pushStack ( jQuery . map ( this , function ( elem , i ) {
return fn . call ( elem , i , elem ) ;
} ) ) ;
} ,
2007-09-04 04:44:54 +00:00
andSelf : function ( ) {
return this . add ( this . prevObject ) ;
} ,
2007-01-06 05:09:11 +00:00
2007-09-04 04:44:54 +00:00
domManip : function ( args , table , dir , fn ) {
2007-03-24 02:03:47 +00:00
var clone = this . length > 1 , a ;
2006-12-23 06:07:21 +00:00
return this . each ( function ( ) {
2007-03-24 02:03:47 +00:00
if ( ! a ) {
a = jQuery . clean ( args , this . ownerDocument ) ;
if ( dir < 0 )
a . reverse ( ) ;
}
2006-12-23 06:07:21 +00:00
var obj = this ;
2007-01-22 05:27:54 +00:00
if ( table && jQuery . nodeName ( this , "table" ) && jQuery . nodeName ( a [ 0 ] , "tr" ) )
2006-12-23 06:07:21 +00:00
obj = this . getElementsByTagName ( "tbody" ) [ 0 ] || this . appendChild ( document . createElement ( "tbody" ) ) ;
2007-01-14 21:49:59 +00:00
jQuery . each ( a , function ( ) {
2007-07-20 21:59:52 +00:00
if ( jQuery . nodeName ( this , "script" ) ) {
if ( this . src )
jQuery . ajax ( { url : this . src , async : false , dataType : "script" } ) ;
else
2007-07-31 02:59:53 +00:00
jQuery . globalEval ( this . text || this . textContent || this . innerHTML || "" ) ;
2007-07-20 21:59:52 +00:00
} else
fn . apply ( obj , [ clone ? this . cloneNode ( true ) : this ] ) ;
2007-01-14 21:49:59 +00:00
} ) ;
2006-12-23 06:07:21 +00:00
} ) ;
}
} ;
jQuery . extend = jQuery . fn . extend = function ( ) {
// copy reference to target object
2007-08-21 04:42:31 +00:00
var target = arguments [ 0 ] || { } , a = 1 , al = arguments . length , deep = false ;
// Handle a deep copy situation
if ( target . constructor == Boolean ) {
2007-08-21 04:46:07 +00:00
deep = target ;
2007-08-21 04:42:31 +00:00
target = arguments [ 1 ] || { } ;
}
2007-04-29 18:39:07 +00:00
2006-12-23 06:07:21 +00:00
// extend jQuery itself if only one argument is passed
2007-08-19 23:37:26 +00:00
if ( al == 1 ) {
2006-12-23 06:07:21 +00:00
target = this ;
a = 0 ;
}
2007-08-19 23:37:26 +00:00
2007-04-29 18:39:07 +00:00
var prop ;
2007-08-19 23:37:26 +00:00
for ( ; a < al ; a ++ )
// Only deal with non-null/undefined values
if ( ( prop = arguments [ a ] ) != null )
// Extend the base object
for ( var i in prop ) {
// Prevent never-ending loop
if ( target == prop [ i ] )
continue ;
// Recurse if we're merging object values
2007-08-21 04:42:31 +00:00
if ( deep && typeof prop [ i ] == 'object' && target [ i ] )
2007-08-19 23:37:26 +00:00
jQuery . extend ( target [ i ] , prop [ i ] ) ;
// Don't bring in undefined values
else if ( prop [ i ] != undefined )
target [ i ] = prop [ i ] ;
}
2006-12-23 06:07:21 +00:00
// Return the modified object
return target ;
} ;
jQuery . extend ( {
2007-08-22 05:44:47 +00:00
noConflict : function ( deep ) {
window . $ = _$ ;
if ( deep )
window . jQuery = _jQuery ;
2007-01-22 03:25:00 +00:00
return jQuery ;
2007-01-04 18:48:48 +00:00
} ,
2006-12-23 06:07:21 +00:00
2007-01-22 02:17:47 +00:00
// This may seem like some crazy code, but trust me when I say that this
// is the only cross-browser way to do this. --John
2007-01-14 06:22:20 +00:00
isFunction : function ( fn ) {
2007-02-25 17:40:27 +00:00
return ! ! fn && typeof fn != "string" && ! fn . nodeName &&
2007-03-16 00:00:46 +00:00
fn . constructor != Array && /function/i . test ( fn + "" ) ;
2007-01-14 06:22:20 +00:00
} ,
2007-02-05 20:16:46 +00:00
// check if an element is in a XML document
isXMLDoc : function ( elem ) {
2007-07-25 00:56:50 +00:00
return elem . documentElement && ! elem . body ||
elem . tagName && elem . ownerDocument && ! elem . ownerDocument . body ;
2007-02-05 20:16:46 +00:00
} ,
2007-01-14 06:22:20 +00:00
2007-07-31 02:59:53 +00:00
// Evalulates a script in a global context
// Evaluates Async. in Safari 2 :-(
globalEval : function ( data ) {
data = jQuery . trim ( data ) ;
if ( data ) {
if ( window . execScript )
window . execScript ( data ) ;
else if ( jQuery . browser . safari )
// safari doesn't provide a synchronous global eval
window . setTimeout ( data , 0 ) ;
else
eval . call ( window , data ) ;
}
} ,
2007-01-22 05:27:54 +00:00
nodeName : function ( elem , name ) {
return elem . nodeName && elem . nodeName . toUpperCase ( ) == name . toUpperCase ( ) ;
} ,
2006-12-23 06:07:21 +00:00
// args is for internal usage only
each : function ( obj , fn , args ) {
2007-08-20 07:04:00 +00:00
if ( args ) {
if ( obj . length == undefined )
for ( var i in obj )
fn . apply ( obj [ i ] , args ) ;
else
for ( var i = 0 , ol = obj . length ; i < ol ; i ++ )
if ( fn . apply ( obj [ i ] , args ) === false ) break ;
2007-08-20 06:29:41 +00:00
// A special, fast, case for the most common use of each
2007-08-20 07:04:00 +00:00
} else {
if ( obj . length == undefined )
for ( var i in obj )
fn . call ( obj [ i ] , i , obj [ i ] ) ;
else
for ( var i = 0 , ol = obj . length , val = obj [ 0 ] ;
2007-08-22 06:47:44 +00:00
i < ol && fn . call ( val , i , val ) !== false ; val = obj [ ++ i ] ) { }
2007-08-20 07:04:00 +00:00
}
2007-08-20 06:29:41 +00:00
2006-12-23 06:07:21 +00:00
return obj ;
} ,
2007-01-08 01:12:21 +00:00
2007-01-16 14:19:01 +00:00
prop : function ( elem , value , type , index , prop ) {
2007-01-10 18:06:19 +00:00
// Handle executable functions
2007-01-14 07:17:41 +00:00
if ( jQuery . isFunction ( value ) )
2007-02-13 22:41:58 +00:00
value = value . call ( elem , [ index ] ) ;
2007-01-16 14:19:01 +00:00
// exclude the following css properties to add px
2007-01-17 13:37:51 +00:00
var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i ;
2007-01-10 18:06:19 +00:00
// Handle passing in a number to a CSS property
2007-02-03 19:32:16 +00:00
return value && value . constructor == Number && type == "curCSS" && ! exclude . test ( prop ) ?
value + "px" :
value ;
2007-01-08 01:12:21 +00:00
} ,
2006-12-23 06:07:21 +00:00
className : {
2007-01-08 16:12:20 +00:00
// internal only, use addClass("class")
2006-12-29 17:21:48 +00:00
add : function ( elem , c ) {
2007-07-21 01:55:05 +00:00
jQuery . each ( ( c || "" ) . split ( /\s+/ ) , function ( i , cur ) {
2006-12-29 18:04:26 +00:00
if ( ! jQuery . className . has ( elem . className , cur ) )
elem . className += ( elem . className ? " " : "" ) + cur ;
} ) ;
2006-12-23 06:07:21 +00:00
} ,
2007-01-10 16:13:48 +00:00
2007-01-08 16:12:20 +00:00
// internal only, use removeClass("class")
2006-12-29 17:21:48 +00:00
remove : function ( elem , c ) {
2007-05-11 22:29:16 +00:00
elem . className = c != undefined ?
2007-01-10 16:13:48 +00:00
jQuery . grep ( elem . className . split ( /\s+/ ) , function ( cur ) {
return ! jQuery . className . has ( c , cur ) ;
2007-01-14 07:17:41 +00:00
} ) . join ( " " ) : "" ;
2006-12-23 06:07:21 +00:00
} ,
2007-01-10 16:13:48 +00:00
2007-01-08 16:12:20 +00:00
// internal only, use is(".class")
has : function ( t , c ) {
2007-03-25 02:04:03 +00:00
return jQuery . inArray ( c , ( t . className || t ) . toString ( ) . split ( /\s+/ ) ) > - 1 ;
2006-12-23 06:07:21 +00:00
}
} ,
swap : function ( e , o , f ) {
for ( var i in o ) {
e . style [ "old" + i ] = e . style [ i ] ;
e . style [ i ] = o [ i ] ;
}
f . apply ( e , [ ] ) ;
for ( var i in o )
e . style [ i ] = e . style [ "old" + i ] ;
} ,
css : function ( e , p ) {
if ( p == "height" || p == "width" ) {
var old = { } , oHeight , oWidth , d = [ "Top" , "Bottom" , "Right" , "Left" ] ;
2007-01-14 21:49:59 +00:00
jQuery . each ( d , function ( ) {
old [ "padding" + this ] = 0 ;
old [ "border" + this + "Width" ] = 0 ;
} ) ;
2006-12-23 06:07:21 +00:00
jQuery . swap ( e , old , function ( ) {
2007-04-03 03:04:38 +00:00
if ( jQuery ( e ) . is ( ':visible' ) ) {
2006-12-23 06:07:21 +00:00
oHeight = e . offsetHeight ;
oWidth = e . offsetWidth ;
} else {
e = jQuery ( e . cloneNode ( true ) )
. find ( ":radio" ) . removeAttr ( "checked" ) . end ( )
. css ( {
visibility : "hidden" , position : "absolute" , display : "block" , right : "0" , left : "0"
} ) . appendTo ( e . parentNode ) [ 0 ] ;
2007-04-03 03:04:38 +00:00
var parPos = jQuery . css ( e . parentNode , "position" ) || "static" ;
if ( parPos == "static" )
2006-12-23 06:07:21 +00:00
e . parentNode . style . position = "relative" ;
oHeight = e . clientHeight ;
oWidth = e . clientWidth ;
2007-04-03 03:04:38 +00:00
if ( parPos == "static" )
2006-12-23 06:07:21 +00:00
e . parentNode . style . position = "static" ;
e . parentNode . removeChild ( e ) ;
}
} ) ;
return p == "height" ? oHeight : oWidth ;
}
return jQuery . curCSS ( e , p ) ;
} ,
curCSS : function ( elem , prop , force ) {
2007-07-29 23:01:42 +00:00
var ret , stack = [ ] , swap = [ ] ;
// A helper method for determining if an element's values are broken
function color ( a ) {
if ( ! jQuery . browser . safari )
return false ;
var ret = document . defaultView . getComputedStyle ( a , null ) ;
return ! ret || ret . getPropertyValue ( "color" ) == "" ;
}
2007-03-16 20:37:10 +00:00
2007-03-22 01:37:28 +00:00
if ( prop == "opacity" && jQuery . browser . msie ) {
ret = jQuery . attr ( elem . style , "opacity" ) ;
return ret == "" ? "1" : ret ;
}
2007-03-16 20:37:10 +00:00
2007-05-16 16:21:50 +00:00
if ( prop . match ( /float/i ) )
2007-08-21 05:43:44 +00:00
prop = styleFloat ;
2006-12-23 06:07:21 +00:00
2007-01-08 02:39:10 +00:00
if ( ! force && elem . style [ prop ] )
2006-12-23 06:07:21 +00:00
ret = elem . style [ prop ] ;
2007-07-29 23:01:42 +00:00
else if ( document . defaultView && document . defaultView . getComputedStyle ) {
2006-12-23 06:07:21 +00:00
2007-05-16 16:21:50 +00:00
if ( prop . match ( /float/i ) )
2006-12-23 06:07:21 +00:00
prop = "float" ;
prop = prop . replace ( /([A-Z])/g , "-$1" ) . toLowerCase ( ) ;
2007-07-29 23:01:42 +00:00
var cur = document . defaultView . getComputedStyle ( elem , null ) ;
2006-12-23 06:07:21 +00:00
2007-07-29 22:32:06 +00:00
if ( cur && ! color ( elem ) )
2006-12-23 06:07:21 +00:00
ret = cur . getPropertyValue ( prop ) ;
2007-07-29 22:32:06 +00:00
// If the element isn't reporting its values properly in Safari
// then some display: none elements are involved
else {
// Locate all of the parent display: none elements
2007-08-19 07:06:15 +00:00
for ( var a = elem ; a && color ( a ) ; a = a . parentNode )
2007-07-29 22:32:06 +00:00
stack . unshift ( a ) ;
// Go through and make them visible, but in reverse
// (It would be better if we knew the exact display type that they had)
for ( a = 0 ; a < stack . length ; a ++ )
if ( color ( stack [ a ] ) ) {
swap [ a ] = stack [ a ] . style . display ;
stack [ a ] . style . display = "block" ;
}
// Since we flip the display style, we have to handle that
// one special, otherwise get the value
ret = prop == "display" && swap [ stack . length - 1 ] != null ?
"none" :
2007-07-29 23:01:42 +00:00
document . defaultView . getComputedStyle ( elem , null ) . getPropertyValue ( prop ) || "" ;
2007-07-29 22:32:06 +00:00
// Finally, revert the display styles back
for ( a = 0 ; a < swap . length ; a ++ )
if ( swap [ a ] != null )
stack [ a ] . style . display = swap [ a ] ;
}
2006-12-23 06:07:21 +00:00
2007-07-20 22:47:21 +00:00
if ( prop == "opacity" && ret == "" )
ret = "1" ;
2006-12-23 06:07:21 +00:00
} else if ( elem . currentStyle ) {
var newProp = prop . replace ( /\-(\w)/g , function ( m , c ) { return c . toUpperCase ( ) ; } ) ;
ret = elem . currentStyle [ prop ] || elem . currentStyle [ newProp ] ;
2007-09-07 21:39:44 +00:00
// From the awesome hack by Dean Edwards
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
// If we're not dealing with a regular pixel number
// but a number that has a weird ending, we need to convert it to pixels
if ( ! /^\d+(px)?$/i . test ( ret ) && /^\d/ . test ( ret ) ) {
var style = elem . style . left ;
var runtimeStyle = elem . runtimeStyle . left ;
elem . runtimeStyle . left = elem . currentStyle . left ;
elem . style . left = ret || 0 ;
ret = elem . style . pixelLeft + "px" ;
elem . style . left = style ;
elem . runtimeStyle . left = runtimeStyle ;
}
2006-12-23 06:07:21 +00:00
}
return ret ;
} ,
2007-03-24 02:03:47 +00:00
clean : function ( a , doc ) {
2006-12-23 06:07:21 +00:00
var r = [ ] ;
2007-03-24 02:03:47 +00:00
doc = doc || document ;
2007-01-11 03:57:19 +00:00
2007-01-14 21:49:59 +00:00
jQuery . each ( a , function ( i , arg ) {
if ( ! arg ) return ;
2007-01-11 18:44:53 +00:00
if ( arg . constructor == Number )
arg = arg . toString ( ) ;
2007-01-08 02:39:10 +00:00
2007-05-22 07:11:50 +00:00
// Convert html string into DOM nodes
2007-01-08 02:39:10 +00:00
if ( typeof arg == "string" ) {
2007-09-04 04:34:48 +00:00
// Fix "XHTML"-style tags in all browsers
arg = arg . replace ( /(<(\w+)[^>]*?)\/>/g , function ( m , all , tag ) {
return tag . match ( /^(abbr|br|col|img|input|link|meta|param|hr|area)$/i ) ? m : all + "></" + tag + ">" ;
} ) ;
2006-12-23 06:07:21 +00:00
// Trim whitespace, otherwise indexOf won't work as expected
2007-04-25 19:48:00 +00:00
var s = jQuery . trim ( arg ) . toLowerCase ( ) , div = doc . createElement ( "div" ) , tb = [ ] ;
2007-01-08 02:39:10 +00:00
var wrap =
2007-05-22 07:11:50 +00:00
// option or optgroup
2007-01-10 07:00:02 +00:00
! s . indexOf ( "<opt" ) &&
[ 1 , "<select>" , "</select>" ] ||
2007-04-25 18:41:49 +00:00
! s . indexOf ( "<leg" ) &&
[ 1 , "<fieldset>" , "</fieldset>" ] ||
2007-01-08 02:39:10 +00:00
2007-08-16 03:35:29 +00:00
s . match ( /^<(thead|tbody|tfoot|colg|cap)/ ) &&
2007-01-08 02:39:10 +00:00
[ 1 , "<table>" , "</table>" ] ||
! s . indexOf ( "<tr" ) &&
[ 2 , "<table><tbody>" , "</tbody></table>" ] ||
// <thead> matched above
2007-01-10 07:00:02 +00:00
( ! s . indexOf ( "<td" ) || ! s . indexOf ( "<th" ) ) &&
2007-01-08 02:39:10 +00:00
[ 3 , "<table><tbody><tr>" , "</tr></tbody></table>" ] ||
2007-04-30 01:43:52 +00:00
! s . indexOf ( "<col" ) &&
2007-08-19 23:37:26 +00:00
[ 2 , "<table><tbody></tbody><colgroup>" , "</colgroup></table>" ] ||
// IE can't serialize <link> and <script> tags normally
jQuery . browser . msie &&
[ 1 , "div<div>" , "</div>" ] ||
2007-04-30 01:43:52 +00:00
2007-01-08 02:39:10 +00:00
[ 0 , "" , "" ] ;
2006-12-23 06:07:21 +00:00
// Go to html and back, then peel off extra wrappers
2007-03-01 05:16:34 +00:00
div . innerHTML = wrap [ 1 ] + arg + wrap [ 2 ] ;
2007-01-08 02:39:10 +00:00
// Move to the right depth
while ( wrap [ 0 ] -- )
2007-08-19 23:37:26 +00:00
div = div . lastChild ;
2006-12-23 06:07:21 +00:00
// Remove IE's autoinserted <tbody> from table fragments
if ( jQuery . browser . msie ) {
2007-01-08 02:39:10 +00:00
2006-12-23 06:07:21 +00:00
// String was a <table>, *may* have spurious <tbody>
2007-01-08 02:39:10 +00:00
if ( ! s . indexOf ( "<table" ) && s . indexOf ( "<tbody" ) < 0 )
2006-12-23 06:07:21 +00:00
tb = div . firstChild && div . firstChild . childNodes ;
2007-01-08 02:39:10 +00:00
2006-12-23 06:07:21 +00:00
// String was a bare <thead> or <tfoot>
else if ( wrap [ 1 ] == "<table>" && s . indexOf ( "<tbody" ) < 0 )
tb = div . childNodes ;
2007-01-08 02:39:10 +00:00
for ( var n = tb . length - 1 ; n >= 0 ; -- n )
2007-01-22 05:27:54 +00:00
if ( jQuery . nodeName ( tb [ n ] , "tbody" ) && ! tb [ n ] . childNodes . length )
2007-01-08 02:39:10 +00:00
tb [ n ] . parentNode . removeChild ( tb [ n ] ) ;
2007-07-30 02:14:06 +00:00
// IE completely kills leading whitespace when innerHTML is used
if ( /^\s/ . test ( arg ) )
div . insertBefore ( doc . createTextNode ( arg . match ( /^\s*/ ) [ 0 ] ) , div . firstChild ) ;
2006-12-23 06:07:21 +00:00
}
2007-03-11 20:03:45 +00:00
arg = jQuery . makeArray ( div . childNodes ) ;
2007-01-08 02:39:10 +00:00
}
2007-01-14 19:30:40 +00:00
2007-06-29 22:05:25 +00:00
if ( 0 === arg . length && ( ! jQuery . nodeName ( arg , "form" ) && ! jQuery . nodeName ( arg , "select" ) ) )
2007-01-14 21:49:59 +00:00
return ;
2007-04-25 18:19:39 +00:00
2007-05-13 05:53:49 +00:00
if ( arg [ 0 ] == undefined || jQuery . nodeName ( arg , "form" ) || arg . options )
2007-01-08 02:39:10 +00:00
r . push ( arg ) ;
2006-12-23 06:07:21 +00:00
else
2007-01-08 02:39:10 +00:00
r = jQuery . merge ( r , arg ) ;
2007-01-10 07:00:02 +00:00
2007-01-14 21:49:59 +00:00
} ) ;
2006-12-23 06:07:21 +00:00
return r ;
} ,
attr : function ( elem , name , value ) {
2007-06-29 19:52:38 +00:00
var fix = jQuery . isXMLDoc ( elem ) ? { } : jQuery . props ;
2007-07-29 22:32:06 +00:00
// Safari mis-reports the default selected property of a hidden option
// Accessing the parent's selectedIndex property fixes it
if ( name == "selected" && jQuery . browser . safari )
elem . parentNode . selectedIndex ;
2006-12-23 06:07:21 +00:00
// Certain attributes only work when accessed via the old DOM 0 way
if ( fix [ name ] ) {
if ( value != undefined ) elem [ fix [ name ] ] = value ;
return elem [ fix [ name ] ] ;
2007-07-21 00:12:18 +00:00
} else if ( jQuery . browser . msie && name == "style" )
return jQuery . attr ( elem . style , "cssText" , value ) ;
2006-12-23 06:07:21 +00:00
2007-07-21 00:12:18 +00:00
else if ( value == undefined && jQuery . browser . msie && jQuery . nodeName ( elem , "form" ) && ( name == "action" || name == "method" ) )
2006-12-23 06:07:21 +00:00
return elem . getAttributeNode ( name ) . nodeValue ;
// IE elem.getAttribute passes even for style
2007-01-08 02:39:10 +00:00
else if ( elem . tagName ) {
2007-07-02 15:27:58 +00:00
2007-09-04 04:17:14 +00:00
if ( value != undefined ) {
if ( name == "type" && jQuery . nodeName ( elem , "input" ) && elem . parentNode )
throw "type property can't be changed" ;
elem . setAttribute ( name , value ) ;
}
2007-07-02 15:27:58 +00:00
if ( jQuery . browser . msie && /href|src/ . test ( name ) && ! jQuery . isXMLDoc ( elem ) )
return elem . getAttribute ( name , 2 ) ;
2007-09-04 04:17:14 +00:00
2007-07-02 15:27:58 +00:00
return elem . getAttribute ( name ) ;
// elem is actually elem.style ... set the style
} else {
// IE actually uses filters for opacity
2007-06-29 19:52:38 +00:00
if ( name == "opacity" && jQuery . browser . msie ) {
if ( value != undefined ) {
// IE has trouble with opacity if it does not have layout
// Force it by setting the zoom level
elem . zoom = 1 ;
// Set the alpha filter to set the opacity
elem . filter = ( elem . filter || "" ) . replace ( /alpha\([^)]*\)/ , "" ) +
( parseFloat ( value ) . toString ( ) == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")" ) ;
}
return elem . filter ?
( parseFloat ( elem . filter . match ( /opacity=([^)]*)/ ) [ 1 ] ) / 100 ) . toString ( ) : "" ;
}
2006-12-23 06:07:21 +00:00
name = name . replace ( /-([a-z])/ig , function ( z , b ) { return b . toUpperCase ( ) ; } ) ;
if ( value != undefined ) elem [ name ] = value ;
return elem [ name ] ;
}
} ,
2006-12-31 05:22:06 +00:00
2006-12-23 06:07:21 +00:00
trim : function ( t ) {
2007-07-20 19:44:15 +00:00
return ( t || "" ) . replace ( /^\s+|\s+$/g , "" ) ;
2006-12-23 06:07:21 +00:00
} ,
makeArray : function ( a ) {
var r = [ ] ;
2007-03-16 04:32:37 +00:00
// Need to use typeof to fight Safari childNodes crashes
if ( typeof a != "array" )
2006-12-29 18:04:26 +00:00
for ( var i = 0 , al = a . length ; i < al ; i ++ )
2006-12-23 06:07:21 +00:00
r . push ( a [ i ] ) ;
2007-01-08 02:39:10 +00:00
else
2006-12-23 06:07:21 +00:00
r = a . slice ( 0 ) ;
return r ;
} ,
inArray : function ( b , a ) {
2006-12-29 18:04:26 +00:00
for ( var i = 0 , al = a . length ; i < al ; i ++ )
2006-12-23 06:07:21 +00:00
if ( a [ i ] == b )
return i ;
return - 1 ;
} ,
merge : function ( first , second ) {
2007-03-25 20:28:34 +00:00
// We have to loop this way because IE & Opera overwrite the length
// expando of getElementsByTagName
2007-08-19 07:28:41 +00:00
// Also, we need to make sure that the correct elements are being returned
// (IE returns comment nodes in a '*' query)
if ( jQuery . browser . msie ) {
for ( var i = 0 ; second [ i ] ; i ++ )
if ( second [ i ] . nodeType != 8 )
first . push ( second [ i ] ) ;
} else
for ( var i = 0 ; second [ i ] ; i ++ )
first . push ( second [ i ] ) ;
2006-12-23 06:07:21 +00:00
return first ;
} ,
2007-03-24 21:55:03 +00:00
unique : function ( first ) {
var r = [ ] , num = jQuery . mergeNum ++ ;
2007-07-20 18:08:29 +00:00
try {
for ( var i = 0 , fl = first . length ; i < fl ; i ++ )
if ( num != first [ i ] . mergeNum ) {
first [ i ] . mergeNum = num ;
r . push ( first [ i ] ) ;
}
} catch ( e ) {
r = first ;
}
2007-03-24 21:55:03 +00:00
return r ;
} ,
mergeNum : 0 ,
2006-12-23 06:07:21 +00:00
grep : function ( elems , fn , inv ) {
// If a string is passed in for the function, make a function
// for it (a handy shortcut)
if ( typeof fn == "string" )
2007-08-22 06:19:22 +00:00
fn = eval ( "false||function(a,i){return " + fn + "}" ) ;
2006-12-23 06:07:21 +00:00
var result = [ ] ;
// Go through the array, only saving the items
// that pass the validator function
2006-12-29 18:04:26 +00:00
for ( var i = 0 , el = elems . length ; i < el ; i ++ )
2006-12-23 06:07:21 +00:00
if ( ! inv && fn ( elems [ i ] , i ) || inv && ! fn ( elems [ i ] , i ) )
result . push ( elems [ i ] ) ;
return result ;
} ,
map : function ( elems , fn ) {
// If a string is passed in for the function, make a function
// for it (a handy shortcut)
if ( typeof fn == "string" )
2007-08-22 06:19:22 +00:00
fn = eval ( "false||function(a){return " + fn + "}" ) ;
2006-12-23 06:07:21 +00:00
2007-05-22 10:37:54 +00:00
var result = [ ] ;
2006-12-23 06:07:21 +00:00
// Go through the array, translating each of the items to their
// new value (or values).
2006-12-29 18:04:26 +00:00
for ( var i = 0 , el = elems . length ; i < el ; i ++ ) {
2006-12-23 06:07:21 +00:00
var val = fn ( elems [ i ] , i ) ;
if ( val !== null && val != undefined ) {
if ( val . constructor != Array ) val = [ val ] ;
result = result . concat ( val ) ;
}
}
2007-03-24 21:55:03 +00:00
return result ;
2006-12-23 06:07:21 +00:00
}
} ) ;
2007-08-21 05:43:44 +00:00
var userAgent = navigator . userAgent . toLowerCase ( ) ;
// Figure out what browser is being used
jQuery . browser = {
version : ( userAgent . match ( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [ ] ) [ 1 ] ,
safari : /webkit/ . test ( userAgent ) ,
opera : /opera/ . test ( userAgent ) ,
msie : /msie/ . test ( userAgent ) && ! /opera/ . test ( userAgent ) ,
mozilla : /mozilla/ . test ( userAgent ) && ! /(compatible|webkit)/ . test ( userAgent )
} ;
2006-12-23 06:07:21 +00:00
2007-08-21 05:43:44 +00:00
var styleFloat = jQuery . browser . msie ? "styleFloat" : "cssFloat" ;
jQuery . extend ( {
2006-12-23 06:07:21 +00:00
// Check to see if the W3C box model is being used
2007-08-21 05:43:44 +00:00
boxModel : ! jQuery . browser . msie || document . compatMode == "CSS1Compat" ,
styleFloat : jQuery . browser . msie ? "styleFloat" : "cssFloat" ,
props : {
2007-06-29 19:52:38 +00:00
"for" : "htmlFor" ,
"class" : "className" ,
2007-08-21 05:43:44 +00:00
"float" : styleFloat ,
cssFloat : styleFloat ,
styleFloat : styleFloat ,
2007-06-29 19:52:38 +00:00
innerHTML : "innerHTML" ,
className : "className" ,
value : "value" ,
disabled : "disabled" ,
checked : "checked" ,
readonly : "readOnly" ,
selected : "selected" ,
maxlength : "maxLength"
2007-08-21 05:43:44 +00:00
}
} ) ;
2006-12-23 06:07:21 +00:00
2007-01-06 05:09:11 +00:00
jQuery . each ( {
parent : "a.parentNode" ,
2007-01-09 15:19:40 +00:00
parents : "jQuery.parents(a)" ,
2007-01-09 15:44:24 +00:00
next : "jQuery.nth(a,2,'nextSibling')" ,
prev : "jQuery.nth(a,2,'previousSibling')" ,
2007-01-06 05:09:11 +00:00
siblings : "jQuery.sibling(a.parentNode.firstChild,a)" ,
2007-08-31 03:38:02 +00:00
children : "jQuery.sibling(a.firstChild)" ,
contents : "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"
2007-01-06 05:09:11 +00:00
} , function ( i , n ) {
jQuery . fn [ i ] = function ( a ) {
var ret = jQuery . map ( this , n ) ;
if ( a && typeof a == "string" )
2007-01-10 17:54:42 +00:00
ret = jQuery . multiFilter ( a , ret ) ;
2007-08-19 00:07:41 +00:00
return this . pushStack ( jQuery . unique ( ret ) ) ;
2007-01-06 05:09:11 +00:00
} ;
} ) ;
2006-12-23 06:07:21 +00:00
2007-01-06 05:09:11 +00:00
jQuery . each ( {
appendTo : "append" ,
prependTo : "prepend" ,
insertBefore : "before" ,
2007-08-25 05:12:20 +00:00
insertAfter : "after" ,
replaceAll : "replaceWith"
2007-01-06 05:09:11 +00:00
} , function ( i , n ) {
jQuery . fn [ i ] = function ( ) {
var a = arguments ;
return this . each ( function ( ) {
for ( var j = 0 , al = a . length ; j < al ; j ++ )
jQuery ( a [ j ] ) [ n ] ( this ) ;
} ) ;
} ;
} ) ;
2006-12-23 06:07:21 +00:00
2007-01-06 05:09:11 +00:00
jQuery . each ( {
removeAttr : function ( key ) {
jQuery . attr ( this , key , "" ) ;
this . removeAttribute ( key ) ;
2006-12-23 06:07:21 +00:00
} ,
2007-01-06 05:09:11 +00:00
addClass : function ( c ) {
jQuery . className . add ( this , c ) ;
} ,
removeClass : function ( c ) {
jQuery . className . remove ( this , c ) ;
} ,
toggleClass : function ( c ) {
jQuery . className [ jQuery . className . has ( this , c ) ? "remove" : "add" ] ( this , c ) ;
} ,
remove : function ( a ) {
2007-01-10 16:13:48 +00:00
if ( ! a || jQuery . filter ( a , [ this ] ) . r . length )
2007-01-06 05:09:11 +00:00
this . parentNode . removeChild ( this ) ;
} ,
empty : function ( ) {
while ( this . firstChild )
this . removeChild ( this . firstChild ) ;
}
} , function ( i , n ) {
jQuery . fn [ i ] = function ( ) {
return this . each ( n , arguments ) ;
} ;
} ) ;
2006-12-23 06:07:21 +00:00
2007-01-10 16:40:32 +00:00
jQuery . each ( [ "height" , "width" ] , function ( i , n ) {
jQuery . fn [ n ] = function ( h ) {
return h == undefined ?
( this . length ? jQuery . css ( this [ 0 ] , n ) : null ) :
this . css ( n , h . constructor == String ? h : h + "px" ) ;
} ;
} ) ;