var _jQuery = window.jQuery;
var jQuery = window.jQuery = function( selector, context ) {
- // If the context is a namespace object, return a new object
- return this instanceof jQuery ?
- this.init( selector, context ) :
- new jQuery( selector, context );
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.prototype.init( selector, context );
};
// Map over the $ in case of overwrite
// (both of which we optimize for)
var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
+// Is it a simple selector
+var isSimple = /^.[^:#\[\.]*$/;
+
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
// Make sure that a selection was provided
return this;
// Handle HTML strings
- } else if ( typeof selector == "string" ) {
+ } else if ( typeof selector == "string" ) {
// Are we dealing with HTML string or an ID?
var match = quickExpr.exec( selector );
},
css: function( key, value ) {
+ // ignore negative width and height values
+ if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
+ value = undefined;
return this.attr( key, value, "curCSS" );
},
text: function( text ) {
if ( typeof text != "object" && text != null )
- return this.empty().append( document.createTextNode( text ) );
+ return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
var ret = "";
append: function() {
return this.domManip(arguments, true, false, function(elem){
- this.appendChild( elem );
+ if (this.nodeType == 1)
+ this.appendChild( elem );
});
},
prepend: function() {
return this.domManip(arguments, true, true, function(elem){
- this.insertBefore( elem, this.firstChild );
+ if (this.nodeType == 1)
+ this.insertBefore( elem, this.firstChild );
});
},
clone: function( events ) {
// Do the clone
var ret = this.map(function(){
- return this.outerHTML ?
- jQuery( this.outerHTML )[0] :
- this.cloneNode( true );
+ if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
+ // IE copies events bound via attachEvent when
+ // 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
+ // as properties will not be copied (such as the
+ // the name attribute on an input).
+ var clone = this.cloneNode(true),
+ container = document.createElement("div"),
+ container2 = document.createElement("div");
+ container.appendChild(clone);
+ container2.innerHTML = container.innerHTML;
+ return container2.firstChild;
+ } else
+ return this.cloneNode(true);
});
// Need to set the expando to null on the cloned set if it exists
},
not: function( selector ) {
- return this.pushStack(
- selector.constructor == String &&
- jQuery.multiFilter( selector, this, true ) ||
-
- jQuery.grep(this, function(elem) {
- return selector.constructor == Array || selector.jquery ?
- jQuery.inArray( elem, selector ) < 0 :
- elem != selector;
- }) );
+ if ( selector.constructor == String )
+ // test special case where just one selector is passed in
+ if ( isSimple.test( selector ) )
+ return this.pushStack( jQuery.multiFilter( selector, this, true ) );
+ else
+ selector = jQuery.multiFilter( selector, this );
+
+ return this.filter(function() {
+ return jQuery.inArray( this, selector ) < 0;
+ });
},
add: function( selector ) {
- return this.pushStack( jQuery.merge(
+ return !selector ? this : this.pushStack( jQuery.merge(
this.get(),
selector.constructor == String ?
jQuery( selector ).get() :
if ( this.length ) {
var elem = this[0];
-
+
// We need to handle select boxes special
if ( jQuery.nodeName( elem, "select" ) ) {
var index = elem.selectedIndex,
// Everything else, we just grab the value
} else
- return this[0].value.replace(/\r/g, "");
+ return (this[0].value || "").replace(/\r/g, "");
}
- } else
- return this.each(function(){
- if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
- this.checked = (jQuery.inArray(this.value, value) >= 0 ||
- jQuery.inArray(this.name, value) >= 0);
+ }
+
+ return this.each(function(){
+ if ( this.nodeType != 1 )
+ return;
- else if ( jQuery.nodeName( this, "select" ) ) {
- var values = value.constructor == Array ?
- value :
- [ value ];
+ if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
+ this.checked = (jQuery.inArray(this.value, value) >= 0 ||
+ jQuery.inArray(this.name, value) >= 0);
- jQuery( "option", this ).each(function(){
- this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
- jQuery.inArray( this.text, values ) >= 0);
- });
+ else if ( jQuery.nodeName( this, "select" ) ) {
+ var values = value.constructor == Array ?
+ value :
+ [ value ];
- if ( !values.length )
- this.selectedIndex = -1;
+ jQuery( "option", this ).each(function(){
+ this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
+ jQuery.inArray( this.text, values ) >= 0);
+ });
- } else
- this.value = value;
- });
+ if ( !values.length )
+ this.selectedIndex = -1;
+
+ } else
+ this.value = value;
+ });
},
html: function( value ) {
var obj = this;
if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
- obj = this.getElementsByTagName("tbody")[0] || this.appendChild( document.createElement("tbody") );
+ obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
var scripts = jQuery( [] );
this.cloneNode( true ) :
this;
+ // execute all scripts after the elements have been injected
if ( jQuery.nodeName( elem, "script" ) ) {
-
- // If scripts are waiting to be executed, wait on this script as well
- if ( scripts.length )
- scripts = scripts.add( elem );
-
- // If nothing is waiting to be executed, run immediately
- else
- evalScript( 0, elem );
-
+ scripts = scripts.add( elem );
} else {
// Remove any inner scripts for later evaluation
if ( elem.nodeType == 1 )
}
};
+// Give the init function the jQuery prototype for later instantiation
+jQuery.prototype.init.prototype = jQuery.prototype;
+
function evalScript( i, elem ) {
if ( elem.src )
jQuery.ajax({
}
// Handle case when target is a string or something (possible in deep copy)
- if ( typeof target != "object" )
+ if ( typeof target != "object" && typeof target != "function" )
target = {};
// extend jQuery itself if only one argument is passed
continue;
// Recurse if we're merging object values
- if ( deep && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )
+ if ( deep && options[ name ] && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )
target[ name ] = jQuery.extend( target[ name ], options[ name ] );
// Don't bring in undefined values
},
// Evalulates a script in a global context
- // Evaluates Async. in Safari 2 :-(
globalEval: function( data ) {
data = jQuery.trim( data );
// internal only, use addClass("class")
add: function( elem, classNames ) {
jQuery.each((classNames || "").split(/\s+/), function(i, className){
- if ( !jQuery.className.has( elem.className, className ) )
+ if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
elem.className += (elem.className ? " " : "") + className;
});
},
// internal only, use removeClass("class")
remove: function( elem, classNames ) {
- elem.className = classNames != undefined ?
- jQuery.grep(elem.className.split(/\s+/), function(className){
- return !jQuery.className.has( classNames, className );
- }).join(" ") :
- "";
+ if (elem.nodeType == 1)
+ elem.className = classNames != undefined ?
+ jQuery.grep(elem.className.split(/\s+/), function(className){
+ return !jQuery.className.has( classNames, className );
+ }).join(" ") :
+ "";
},
// internal only, use is(".class")
},
css: function( elem, name, force ) {
- if ( name == "height" || name == "width" ) {
- var old = {}, height, width;
-
- // Revert the padding and border widths to get the
- // correct height/width values
- jQuery.each([ "Top", "Bottom", "Right", "Left" ], function(){
- old[ "padding" + this ] = 0;
- old[ "border" + this + "Width" ] = 0;
- });
-
- // Swap out the padding/border values temporarily
- jQuery.swap( elem, old, function() {
-
- // If the element is visible, then the calculation is easy
- if ( jQuery( elem ).is(":visible") ) {
- height = elem.offsetHeight;
- width = elem.offsetWidth;
-
- // Otherwise, we need to flip out more values
- } else {
- elem = jQuery( elem.cloneNode(true) )
- .find(":radio").removeAttr("checked").removeAttr("defaultChecked").end()
- .css({
- visibility: "hidden",
- position: "absolute",
- display: "block",
- right: "0",
- left: "0"
- }).appendTo( elem.parentNode )[0];
-
- var position = jQuery.css( elem.parentNode, "position" ) || "static";
- if ( position == "static" )
- elem.parentNode.style.position = "relative";
-
- height = elem.clientHeight;
- width = elem.clientWidth;
-
- if ( position == "static" )
- elem.parentNode.style.position = "static";
-
- elem.parentNode.removeChild( elem );
- }
- });
+ if ( name == "width" || name == "height" ) {
+ var width, height, props = { position: "absolute", visibility: "hidden", display:"block" };
+
+ function getWH() {
+ width = elem.clientWidth;
+ height = elem.clientHeight;
+ }
+
+ if ( jQuery(elem).is(":visible") )
+ getWH();
+ else
+ jQuery.swap( elem, props, getWH );
- return name == "height" ?
- height :
- width;
+ return name == "width" ? width : height;
}
-
+
return jQuery.curCSS( elem, name, force );
},
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')
+ context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
jQuery.each(elems, function(i, elem){
if ( !elem )
div.childNodes :
[];
- for ( var i = tbody.length - 1; i >= 0 ; --i )
- if ( jQuery.nodeName( tbody[ i ], "tbody" ) && !tbody[ i ].childNodes.length )
- tbody[ i ].parentNode.removeChild( tbody[ i ] );
+ 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 ) )
},
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;
if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
throw "type property can't be changed";
- elem.setAttribute( name, value );
+ // 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 ) )
(parseFloat( value ).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
}
- return elem.filter ?
+ return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() :
"";
}
jQuery.each({
removeAttr: function( name ) {
jQuery.attr( this, name, "" );
- this.removeAttribute( name );
+ if (this.nodeType == 1)
+ this.removeAttribute( name );
},
addClass: function( classNames ) {
// Get document width or height
this[0] == document ?
- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater (Mozilla reports scrollWidth the same as offsetWidth)
- Math.max( document.body[ "scroll" + name ], document.body[ "offset" + name ] ) :
-
+ // 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])
+ ) :
+
// Get or set width or height on the element
size == undefined ?
// Get width or height on the element