// Map over jQuery in case of overwrite
var _jQuery = window.jQuery,
-// Map over the $ in case of overwrite
+// Map over the $ in case of overwrite
_$ = window.$;
var jQuery = window.jQuery = window.$ = function( selector, context ) {
// A simple way to check for HTML strings or ID strings
// (both of which we optimize for)
-var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
+var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
// Is it a simple selector
- isSimple = /^.[^:#\[\.]*$/;
+ isSimple = /^.[^:#\[\.]*$/,
+
+// Will speed up references to undefined, and allows munging its name.
+ undefined;
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
this[0] = selector;
this.length = 1;
return this;
-
+ }
// Handle HTML strings
- } else if ( typeof selector == "string" ) {
+ if ( typeof selector == "string" ) {
// Are we dealing with HTML string or an ID?
var match = quickExpr.exec( selector );
var elem = document.getElementById( match[3] );
// Make sure an element was located
- if ( elem )
+ if ( elem ){
// Handle the case where IE and Opera return items
// by name instead of ID
if ( elem.id != match[3] )
return jQuery().find( selector );
// Otherwise, we inject the element directly into the jQuery object
- else {
- this[0] = elem;
- this.length = 1;
- return this;
- }
-
- else
- selector = [];
+ return jQuery( elem );
+ }
+ selector = [];
}
// HANDLE: $(expr, [context])
// (which is just equivalent to: $(content).find(expr)
} else
- return new jQuery( context ).find( selector );
+ return jQuery( context ).find( selector );
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) )
- return new jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
-
+ return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
+
return this.setArray(jQuery.makeArray(selector));
},
-
+
// The current version of jQuery being used
jquery: "@VERSION",
size: function() {
return this.length;
},
-
- // The number of elements contained in the matched element set
- length: 0,
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
// Return just the object
this[ num ];
},
-
+
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems ) {
// Return the newly-formed element set
return ret;
},
-
+
// Force the current matched set of elements to become
// the specified array of elements (destroying the stack in the process)
// You should use pushStack() in order to do this, but maintain the stack
// is a super-fast way to populate an object with array-like properties
this.length = 0;
Array.prototype.push.apply( this, elems );
-
+
return this;
},
return jQuery.each( this, callback, args );
},
- // Determine the position of an element within
+ // Determine the position of an element within
// the matched set of elements
index: function( elem ) {
var ret = -1;
// Locate the position of the desired element
- this.each(function(i){
- if ( this == elem )
- ret = i;
- });
-
- return ret;
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem && elem.jquery ? elem[0] : elem
+ , this );
},
attr: function( name, value, type ) {
var options = name;
-
+
// Look for the case where we're accessing a style value
if ( name.constructor == String )
- if ( value == undefined )
- return this.length && jQuery[ type || "attr" ]( this[0], name ) || undefined;
+ if ( value === undefined )
+ return this[0] && jQuery[ type || "attr" ]( this[0], name );
else {
options = {};
options[ name ] = value;
}
-
+
// Check to see if we're setting style values
return this.each(function(i){
// Set all the styles
this.insertBefore( elem, this.firstChild );
});
},
-
+
before: function() {
return this.domManip(arguments, false, false, function(elem){
this.parentNode.insertBefore( elem, this );
return jQuery.find( selector, elem );
});
- return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
+ return this.pushStack( /[^+>] [^+>]/.test( selector ) ?
jQuery.unique( elems ) :
elems );
},
// using cloneNode. Calling detachEvent on the
// clone will also remove the events from the orignal
// In order to get around this, we use innerHTML.
- // Unfortunately, this means some modifications to
- // attributes in IE that are actually only stored
+ // Unfortunately, this means some modifications to
+ // attributes in IE that are actually only stored
// as properties will not be copied (such as the
// the name attribute on an input).
var clone = this.cloneNode(true),
if ( this[ expando ] != undefined )
this[ expando ] = null;
});
-
+
// Copy the events from the original to the clone
if ( events === true )
this.find("*").andSelf().each(function(i){
},
add: function( selector ) {
- return !selector ? this : this.pushStack( jQuery.merge(
+ return this.pushStack( jQuery.unique( jQuery.merge(
this.get(),
- selector.constructor == String ?
- jQuery( selector ).get() :
- selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ?
- selector : [selector] ) );
+ typeof selector == 'string' ?
+ jQuery( selector ) :
+ jQuery.makeArray( selector )
+ )));
},
is: function( selector ) {
hasClass: function( selector ) {
return this.is( "." + selector );
},
-
- val: function( value ) {
- if ( value == undefined ) {
- if ( this.length ) {
- var elem = this[0];
+ val: function( value ) {
+ if ( value == undefined ) {
+ var elem = this[0];
+ if ( elem ) {
+ if( jQuery.nodeName( elem, 'option' ) )
+ return (elem.attributes.value || {}).specified ? elem.value : elem.text;
+
// We need to handle select boxes special
if ( jQuery.nodeName( elem, "select" ) ) {
var index = elem.selectedIndex,
values = [],
options = elem.options,
one = elem.type == "select-one";
-
+
// Nothing was selected
if ( index < 0 )
return null;
if ( option.selected ) {
// Get the specifc value for the option
- value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
-
+ value = jQuery(option).val();
+
// We don't need an array for one selects
if ( one )
return value;
-
+
// Multi-Selects return an array
values.push( value );
}
}
-
- return values;
-
+
+ return values;
+ }
+
// Everything else, we just grab the value
- } else
- return (this[0].value || "").replace(/\r/g, "");
+ return (elem.value || "").replace(/\r/g, "");
}
return undefined;
}
+ if( value.constructor == Number )
+ value += '';
+
return this.each(function(){
if ( this.nodeType != 1 )
return;
jQuery.inArray(this.name, value) >= 0);
else if ( jQuery.nodeName( this, "select" ) ) {
- var values = value.constructor == Array ?
- value :
- [ value ];
+ var values = jQuery.makeArray(value);
jQuery( "option", this ).each(function(){
this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
this.value = value;
});
},
-
+
html: function( value ) {
return value == undefined ?
- (this.length ?
+ (this[0] ?
this[0].innerHTML :
null) :
this.empty().append( value );
},
eq: function( i ) {
- return this.slice( i, i + 1 );
+ return this.slice( i, +i + 1 );
},
slice: function() {
var parts = key.split(".");
parts[1] = parts[1] ? "." + parts[1] : "";
- if ( value == null ) {
+ if ( value === undefined ) {
var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
- if ( data == undefined && this.length )
+
+ if ( data === undefined && this.length )
data = jQuery.data( this[0], key );
- return data == null && parts[1] ?
+ return data === undefined && parts[1] ?
this.data( parts[0] ) :
data;
} else
jQuery.removeData( this, key );
});
},
-
+
domManip: function( args, table, reverse, callback ) {
- var clone = this.length > 1, elems;
+ var clone = this.length > 1, elems;
return this.each(function(){
if ( !elems ) {
this;
// execute all scripts after the elements have been injected
- if ( jQuery.nodeName( elem, "script" ) ) {
+ if ( jQuery.nodeName( elem, "script" ) )
scripts = scripts.add( elem );
- } else {
+ else {
// Remove any inner scripts for later evaluation
if ( elem.nodeType == 1 )
scripts = scripts.add( jQuery( "script", elem ).remove() );
if ( (options = arguments[ i ]) != null )
// Extend the base object
for ( var name in options ) {
- var src = target[ name ], copy = options[ name ];
-
+ var src = target[ name ], copy = options[ name ];
+
// Prevent never-ending loop
if ( target === copy )
continue;
// Recurse if we're merging object values
- if ( deep && copy && typeof copy == "object" && src && !copy.nodeType )
- target[ name ] = jQuery.extend( deep, src, copy );
+ if ( deep && copy && typeof copy == "object" && !copy.nodeType )
+ target[ name ] = jQuery.extend( deep,
+ // Never move original objects, clone them
+ src || ( copy.length != null ? [ ] : { } )
+ , copy );
// Don't bring in undefined values
else if ( copy !== undefined )
};
var expando = "jQuery" + now(), uuid = 0, windowData = {},
-
-// exclude the following css properties to add px
+ // exclude the following css properties to add px
exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
-// cache getComputedStyle
- getComputedStyle = document.defaultView && document.defaultView.getComputedStyle;
+ // cache defaultView
+ defaultView = document.defaultView || {};
jQuery.extend({
noConflict: function( deep ) {
},
// See test/unit/core.js for details concerning this function.
+ // Since 1.3 DOM methods and function like alert
+ // aren't supported. They return false on IE (#2968).
isFunction: function( fn ) {
- return !!fn && typeof fn != "string" && !fn.nodeName &&
- fn.constructor != Array && /function/i.test( fn + "" );
+ return fn instanceof Function;
},
-
+
// check if an element is in a (or is an) XML document
isXMLDoc: function( elem ) {
return elem.documentElement && !elem.body ||
else
script.appendChild( document.createTextNode( data ) );
- head.appendChild( script );
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709).
+ head.insertBefore( script, head.firstChild );
head.removeChild( script );
}
},
nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
},
-
+
cache: {},
-
+
data: function( elem, name, data ) {
elem = elem == window ?
windowData :
var id = elem[ expando ];
// Compute a unique ID for the element
- if ( !id )
+ if ( !id )
id = elem[ expando ] = ++uuid;
// Only generate the data cache if we're
// trying to access or manipulate it
if ( name && !jQuery.cache[ id ] )
jQuery.cache[ id ] = {};
-
+
// Prevent overriding the named cache with undefined values
- if ( data != undefined )
+ if ( data !== undefined )
jQuery.cache[ id ][ name ] = data;
-
- // Return the named cache data, or the ID for the element
+
+ // Return the named cache data, or the ID for the element
return name ?
jQuery.cache[ id ][ name ] :
id;
},
-
+
removeData: function( elem, name ) {
elem = elem == window ?
windowData :
// args is for internal usage only
each: function( object, callback, args ) {
+ var name, i = 0, length = object.length;
+
if ( args ) {
- if ( object.length == undefined ) {
- for ( var name in object )
+ if ( length == undefined ) {
+ for ( name in object )
if ( callback.apply( object[ name ], args ) === false )
break;
} else
- for ( var i = 0, length = object.length; i < length; i++ )
- if ( callback.apply( object[ i ], args ) === false )
+ for ( ; i < length; )
+ if ( callback.apply( object[ i++ ], args ) === false )
break;
// A special, fast, case for the most common use of each
} else {
- if ( object.length == undefined ) {
- for ( var name in object )
+ if ( length == undefined ) {
+ for ( name in object )
if ( callback.call( object[ name ], name, object[ name ] ) === false )
break;
} else
- for ( var i = 0, length = object.length, value = object[0];
+ for ( var value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
}
return object;
},
-
+
prop: function( elem, value, type, i, name ) {
- // Handle executable functions
- if ( jQuery.isFunction( value ) )
- value = value.call( elem, i );
-
- // Handle passing in a number to a CSS property
- return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
- value + "px" :
- value;
+ // Handle executable functions
+ if ( jQuery.isFunction( value ) )
+ value = value.call( elem, i );
+
+ // Handle passing in a number to a CSS property
+ return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
+ value + "px" :
+ value;
},
className: {
if (elem.nodeType == 1)
elem.className = classNames != undefined ?
jQuery.grep(elem.className.split(/\s+/), function(className){
- return !jQuery.className.has( classNames, className );
+ return !jQuery.className.has( classNames, className );
}).join(" ") :
"";
},
- // internal only, use is(".class")
+ // internal only, use hasClass("class")
has: function( elem, className ) {
return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
}
css: function( elem, name, force ) {
if ( name == "width" || name == "height" ) {
var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
-
+
function getWH() {
val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
var padding = 0, border = 0;
});
val -= Math.round(padding + border);
}
-
+
if ( jQuery(elem).is(":visible") )
getWH();
else
jQuery.swap( elem, props, getWH );
-
+
return Math.max(0, val);
}
-
+
return jQuery.curCSS( elem, name, force );
},
curCSS: function( elem, name, force ) {
- var ret;
+ var ret, style = elem.style;
// A helper method for determining if an element's values are broken
function color( elem ) {
if ( !jQuery.browser.safari )
return false;
-
- // getComputedStyle is cached
- var ret = getComputedStyle( elem, null );
+
+ // defaultView is cached
+ var ret = defaultView.getComputedStyle( elem, null );
return !ret || ret.getPropertyValue("color") == "";
}
// We need to handle opacity special in IE
if ( name == "opacity" && jQuery.browser.msie ) {
- ret = jQuery.attr( elem.style, "opacity" );
+ ret = jQuery.attr( style, "opacity" );
return ret == "" ?
"1" :
}
// Opera sometimes will give the wrong display answer, this fixes it, see #2037
if ( jQuery.browser.opera && name == "display" ) {
- var save = elem.style.outline;
- elem.style.outline = "0 solid black";
- elem.style.outline = save;
+ var save = style.outline;
+ style.outline = "0 solid black";
+ style.outline = save;
}
-
+
// Make sure we're using the right name for getting the float value
if ( name.match( /float/i ) )
name = styleFloat;
- if ( !force && elem.style && elem.style[ name ] )
- ret = elem.style[ name ];
+ if ( !force && style && style[ name ] )
+ ret = style[ name ];
- else if ( getComputedStyle ) {
+ else if ( defaultView.getComputedStyle ) {
// Only "float" is needed here
if ( name.match( /float/i ) )
name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
- var computedStyle = getComputedStyle( elem, null );
+ var computedStyle = defaultView.getComputedStyle( elem, null );
if ( computedStyle && !color( elem ) )
ret = computedStyle.getPropertyValue( name );
// but a number that has a weird ending, we need to convert it to pixels
if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
// Remember the original values
- var style = elem.style.left, runtimeStyle = elem.runtimeStyle.left;
+ var left = style.left, rsLeft = elem.runtimeStyle.left;
// Put in the new values to get a computed value out
elem.runtimeStyle.left = elem.currentStyle.left;
- elem.style.left = ret || 0;
- ret = elem.style.pixelLeft + "px";
+ style.left = ret || 0;
+ ret = style.pixelLeft + "px";
// Revert the changed values
- elem.style.left = style;
- elem.runtimeStyle.left = runtimeStyle;
+ style.left = left;
+ elem.runtimeStyle.left = rsLeft;
}
}
return ret;
},
-
+
clean: function( elems, context ) {
var ret = [];
context = context || document;
// !context.createElement fails in IE with an error but returns typeof 'object'
- if (typeof context.createElement == 'undefined')
+ if (typeof context.createElement == 'undefined')
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
jQuery.each(elems, function(i, elem){
+ if ( typeof elem == 'number' )
+ elem += '';
+
if ( !elem )
return;
- if ( elem.constructor == Number )
- elem += '';
-
// Convert html string into DOM nodes
if ( typeof elem == "string" ) {
// Fix "XHTML"-style tags in all browsers
// option or optgroup
!tags.indexOf("<opt") &&
[ 1, "<select multiple='multiple'>", "</select>" ] ||
-
+
!tags.indexOf("<leg") &&
[ 1, "<fieldset>", "</fieldset>" ] ||
-
+
tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
[ 1, "<table>", "</table>" ] ||
-
+
!tags.indexOf("<tr") &&
[ 2, "<table><tbody>", "</tbody></table>" ] ||
-
+
// <thead> matched above
(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
-
+
!tags.indexOf("<col") &&
[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
// IE can't serialize <link> and <script> tags normally
jQuery.browser.msie &&
[ 1, "div<div>", "</div>" ] ||
-
+
[ 0, "", "" ];
// Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + elem + wrap[2];
-
+
// Move to the right depth
while ( wrap[0]-- )
div = div.lastChild;
-
+
// Remove IE's autoinserted <tbody> from table fragments
if ( jQuery.browser.msie ) {
-
+
// String was a <table>, *may* have spurious <tbody>
var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
div.firstChild && div.firstChild.childNodes :
-
+
// String was a bare <thead> or <tfoot>
wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
div.childNodes :
[];
-
+
for ( var j = tbody.length - 1; j >= 0 ; --j )
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
tbody[ j ].parentNode.removeChild( tbody[ j ] );
-
- // IE completely kills leading whitespace when innerHTML is used
- if ( /^\s/.test( elem ) )
+
+ // IE completely kills leading whitespace when innerHTML is used
+ if ( /^\s/.test( elem ) )
div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
-
+
}
-
+
elem = jQuery.makeArray( div.childNodes );
}
return ret;
},
-
+
attr: function( elem, name, value ) {
// don't set attributes on text and comment nodes
if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
return undefined;
- var fix = jQuery.isXMLDoc( elem ) ?
- {} :
- jQuery.props;
+ var notxml = !jQuery.isXMLDoc( elem ),
+ // Whether we are setting (or getting)
+ set = value !== undefined,
+ msie = jQuery.browser.msie;
- // 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;
-
- // Certain attributes only work when accessed via the old DOM 0 way
- if ( fix[ name ] ) {
- if ( value != undefined )
- elem[ fix[ name ] ] = value;
+ // Try to normalize/fix the name
+ name = notxml && jQuery.props[ name ] || name;
- return elem[ fix[ name ] ];
+ // Only do all the following if this is a node (faster for style)
+ // IE elem.getAttribute passes even for style
+ if ( elem.tagName ) {
- } else if ( jQuery.browser.msie && name == "style" )
- return jQuery.attr( elem.style, "cssText", value );
+ // These attributes require special treatment
+ var special = /href|src|style/.test( name );
- else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName( elem, "form" ) && (name == "action" || name == "method") )
- return elem.getAttributeNode( name ).nodeValue;
+ // 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;
- // IE elem.getAttribute passes even for style
- else if ( elem.tagName ) {
+ // If applicable, access the attribute via the DOM 0 way
+ if ( name in elem && notxml && !special ) {
+ if ( set ){
+ // We can't allow the type property to be changed (since it causes problems in IE)
+ if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
+ throw "type property can't be changed";
+
+ elem[ name ] = value;
+ }
+
+ // browsers index elements by id/name on forms, give priority to attributes.
+ if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
+ return elem.getAttributeNode( name ).nodeValue;
+
+ return elem[ name ];
+ }
- if ( value != undefined ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
- throw "type property can't be changed";
+ if ( msie && notxml && name == "style" )
+ return jQuery.attr( elem.style, "cssText", value );
+ if ( set )
// convert the value to a string (all browsers do this but IE) see #1070
elem.setAttribute( name, "" + value );
- }
- if ( jQuery.browser.msie && /href|src/.test( name ) && !jQuery.isXMLDoc( elem ) )
- return elem.getAttribute( name, 2 );
+ var attr = msie && notxml && special
+ // Some attributes require a special call on IE
+ ? elem.getAttribute( name, 2 )
+ : elem.getAttribute( name );
- return elem.getAttribute( name );
+ // Non-existent attributes return null, we normalize to undefined
+ return attr === null ? undefined : attr;
+ }
// elem is actually elem.style ... set the style
- } else {
- // IE actually uses filters for opacity
- 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 && elem.filter.indexOf("opacity=") >= 0 ?
- (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() :
- "";
- }
- name = name.replace(/-([a-z])/ig, function(all, letter){
- return letter.toUpperCase();
- });
+ // IE uses filters for opacity
+ if ( msie && name == "opacity" ) {
+ if ( set ) {
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ elem.zoom = 1;
- if ( value != undefined )
- elem[ name ] = value;
+ // Set the alpha filter to set the opacity
+ elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
+ (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+ }
- return elem[ name ];
+ return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
+ (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
+ "";
}
+
+ name = name.replace(/-([a-z])/ig, function(all, letter){
+ return letter.toUpperCase();
+ });
+
+ if ( set )
+ elem[ name ] = value;
+
+ return elem[ name ];
},
-
+
trim: function( text ) {
return (text || "").replace( /^\s+|\s+$/g, "" );
},
makeArray: function( array ) {
var ret = [];
- if( array != undefined ){
+ if( array != null ){
var i = array.length;
//the window, strings and functions also have 'length'
- if( i != null && !array.split && array != window && !array.call )
+ if( i == null || array.split || array.setInterval || array.call )
+ ret[0] = array;
+ else
while( i )
ret[--i] = array[i];
- else
- ret[0] = array;
}
return ret;
inArray: function( elem, array ) {
for ( var i = 0, length = array.length; i < length; i++ )
- if ( array[ i ] == elem )
+ // Use === because on IE, window == document
+ if ( array[ i ] === elem )
return i;
return -1;
merge: function( first, second ) {
// We have to loop this way because IE & Opera overwrite the length
// expando of getElementsByTagName
-
+ var i = 0, elem, pos = first.length;
// 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 ] );
+ while ( elem = second[ i++ ] )
+ if ( elem.nodeType != 8 )
+ first[ pos++ ] = elem;
} else
- for ( var i = 0; second[ i ]; i++ )
- first.push( second[ i ] );
+ while ( elem = second[ i++ ] )
+ first[ pos++ ] = elem;
return first;
},
// Go through the array, only saving the items
// that pass the validator function
for ( var i = 0, length = elems.length; i < length; i++ )
- if ( !inv && callback( elems[ i ], i ) || inv && !callback( elems[ i ], i ) )
+ if ( !inv != !callback( elems[ i ], i ) )
ret.push( elems[ i ] );
return ret;
for ( var i = 0, length = elems.length; i < length; i++ ) {
var value = callback( elems[ i ], i );
- if ( value !== null && value != undefined ) {
- if ( value.constructor != Array )
- value = [ value ];
-
- ret = ret.concat( value );
- }
+ if ( value != null )
+ ret[ ret.length ] = value;
}
- return ret;
+ return ret.concat.apply( [], ret );
}
});
// Figure out what browser is being used
jQuery.browser = {
- version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
+ version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
safari: /webkit/.test( userAgent ),
opera: /opera/.test( userAgent ),
msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
var styleFloat = jQuery.browser.msie ?
"styleFloat" :
"cssFloat";
-
+
jQuery.extend({
// Check to see if the W3C box model is being used
boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
-
+
props: {
"for": "htmlFor",
"class": "className",
"float": styleFloat,
cssFloat: styleFloat,
styleFloat: styleFloat,
- innerHTML: "innerHTML",
- className: "className",
- value: "value",
- disabled: "disabled",
- checked: "checked",
readonly: "readOnly",
- selected: "selected",
maxlength: "maxLength",
- selectedIndex: "selectedIndex",
- defaultValue: "defaultValue",
- tagName: "tagName",
- nodeName: "nodeName"
+ cellspacing: "cellSpacing",
+ rowspan: "rowSpan"
}
});
jQuery.each({
removeAttr: function( name ) {
jQuery.attr( this, name, "" );
- if (this.nodeType == 1)
+ if (this.nodeType == 1)
this.removeAttribute( name );
},
remove: function( selector ) {
if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
// Prevent memory leaks
- jQuery( "*", this ).add(this).each(function(){
+ jQuery( "*", this ).add([this]).each(function(){
jQuery.event.remove(this);
jQuery.removeData(this);
});
empty: function() {
// Remove element nodes and prevent memory leaks
jQuery( ">*", this ).remove();
-
+
// Remove any remaining nodes
while ( this.firstChild )
this.removeChild( this.firstChild );
jQuery.each([ "Height", "Width" ], function(i, name){
var type = name.toLowerCase();
-
+
jQuery.fn[ type ] = function( size ) {
// Get window width or height
return this[0] == window ?
// Opera reports document.body.client[Width/Height] properly in both quirks and standards
- jQuery.browser.opera && document.body[ "client" + name ] ||
-
+ jQuery.browser.opera && document.body[ "client" + name ] ||
+
// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
jQuery.browser.safari && window[ "inner" + name ] ||
-
+
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
-
+
// Get document width or height
this[0] == document ?
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
- Math.max(
- Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
- Math.max(document.body["offset" + name], document.documentElement["offset" + name])
+ Math.max(
+ Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
+ Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) :
// Get or set width or height on the element
this.css( type, size.constructor == String ? size : size + "px" );
};
});
+
+// Helper function used by the dimensions and offset modules
+function num(elem, prop) {
+ return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+}