*/
// Map over jQuery in case of overwrite
-if ( typeof jQuery != "undefined" )
- var _jQuery = jQuery;
+if ( window.jQuery )
+ var _jQuery = window.jQuery;
var jQuery = window.jQuery = function( selector, context ) {
// If the context is a namespace object, return a new object
};
// Map over the $ in case of overwrite
-if ( typeof $ != "undefined" )
- var _$ = $;
+if ( window.$ )
+ var _$ = window.$;
// Map the jQuery namespace to the '$' one
window.$ = jQuery;
// Make sure that a selection was provided
selector = selector || document;
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this[0] = selector;
+ this.length = 1;
+ return this;
+
// Handle HTML strings
- if ( typeof selector == "string" ) {
+ } else if ( typeof selector == "string" ) {
// Are we dealing with HTML string or an ID?
var match = quickExpr.exec( selector );
},
add: function( selector ) {
- return this.pushStack( jQuery.merge( this.get(), jQuery( selector ) ) );
+ return this.pushStack( jQuery.merge(
+ this.get(),
+ selector.constructor == String ?
+ jQuery( selector ).get() :
+ selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ?
+ selector : [selector] ) );
},
is: function( selector ) {
jQuery.inArray( this.text, values ) >= 0);
});
- if ( !tmp.length )
+ if ( !values.length )
this.selectedIndex = -1;
} else
if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
obj = this.getElementsByTagName("tbody")[0] || this.appendChild( document.createElement("tbody") );
+ var scripts = jQuery( [] );
+
jQuery.each(elems, function(){
var elem = clone ?
this.cloneNode( true ) :
this;
- if ( !evalScript( 0, elem ) )
+ 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 );
+
+ } else {
+ // Remove any inner scripts for later evaluation
+ if ( elem.nodeType == 1 )
+ scripts = scripts.add( jQuery( "script", elem ).remove() );
+
+ // Inject the elements into the document
callback.call( obj, elem );
+ }
});
+
+ scripts.each( evalScript );
});
}
};
function evalScript( i, elem ) {
- var script = jQuery.nodeName( elem, "script" );
-
- if ( script ) {
- if ( elem.src )
- jQuery.ajax({
- url: elem.src,
- async: false,
- dataType: "script"
- });
-
- else
- jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
-
- if ( elem.parentNode )
- elem.parentNode.removeChild( elem );
+ if ( elem.src )
+ jQuery.ajax({
+ url: elem.src,
+ async: false,
+ dataType: "script"
+ });
- } else if ( elem.nodeType == 1 )
- jQuery( "script", elem ).each( evalScript );
+ else
+ jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
- return script;
+ if ( elem.parentNode )
+ elem.parentNode.removeChild( elem );
}
jQuery.extend = jQuery.fn.extend = function() {
if ( target.constructor == Boolean ) {
deep = target;
target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
}
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target != "object" )
+ target = {};
+
// extend jQuery itself if only one argument is passed
if ( length == 1 ) {
target = this;
// Extend the base object
for ( var name in options ) {
// Prevent never-ending loop
- if ( target == options[ name ] )
+ if ( target === options[ name ] )
continue;
// Recurse if we're merging object values
- if ( deep && typeof options[ name ] == "object" && target[ name ] )
- jQuery.extend( target[ name ], options[ name ] );
+ if ( deep && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )
+ target[ name ] = jQuery.extend( target[ name ], options[ name ] );
// Don't bring in undefined values
else if ( options[ name ] != undefined )
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 );
-
+ // Inspired by code by Andrea Giammarchi
+ // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+ var head = document.getElementsByTagName("head")[0] || document.documentElement,
+ script = document.createElement("script");
+
+ script.type = "text/javascript";
+ if ( jQuery.browser.msie )
+ script.text = data;
else
- eval.call( window, data );
+ script.appendChild( document.createTextNode( data ) );
+
+ head.appendChild( script );
+ head.removeChild( script );
}
},
// Otherwise, we need to flip out more values
} else {
elem = jQuery( elem.cloneNode(true) )
- .find(":radio").removeAttr("checked").end()
+ .find(":radio").removeAttr("checked").removeAttr("defaultChecked").end()
.css({
visibility: "hidden",
position: "absolute",
// one special, otherwise get the value
ret = name == "display" && swap[ stack.length - 1 ] != null ?
"none" :
- document.defaultView.getComputedStyle( elem, null ).getPropertyValue( name ) || "";
+ ( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || "";
// Finally, revert the display styles back
for ( var i = 0; i < swap.length; i++ )
var wrap =
// option or optgroup
!tags.indexOf("<opt") &&
- [ 1, "<select>", "</select>" ] ||
+ [ 1, "<select multiple='multiple'>", "</select>" ] ||
!tags.indexOf("<leg") &&
[ 1, "<fieldset>", "</fieldset>" ] ||
div.firstChild && div.firstChild.childNodes :
// String was a bare <thead> or <tfoot>
- wrap[1] == "<table>" && s.indexOf("<tbody") < 0 ?
+ wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
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 ] );
-
+
// 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 );
readonly: "readOnly",
selected: "selected",
maxlength: "maxLength",
- selectedIndex: "selectedIndex"
+ selectedIndex: "selectedIndex",
+ defaultValue: "defaultValue",
+ tagName: "tagName",
+ nodeName: "nodeName"
}
});
remove: function( selector ) {
if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
- jQuery.removeData( this );
- this.parentNode.removeChild( this );
+ // Prevent memory leaks
+ jQuery( "*", this ).add(this).each(function(){
+ jQuery.event.remove(this);
+ jQuery.removeData(this);
+ });
+ if (this.parentNode)
+ this.parentNode.removeChild( this );
}
},
empty: function() {
- // Clean up the cache
- jQuery( "*", this ).each(function(){
- jQuery.removeData(this);
- });
-
+ // Remove element nodes and prevent memory leaks
+ jQuery( ">*", this ).remove();
+
+ // Remove any remaining nodes
while ( this.firstChild )
this.removeChild( this.firstChild );
}
jQuery.browser.opera && document.body[ "client" + name ] ||
// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
- jQuery.browser.safari && self[ "inner" + name ] ||
+ 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 ] :