+jQuery.fn.extend({
+
+ /**
+ * Load HTML from a remote file and inject it into the DOM, only if it's
+ * been modified by the server.
+ *
+ * @example $("#feeds").loadIfModified("feeds.html")
+ * @before <div id="feeds"></div>
+ * @result <div id="feeds"><b>45</b> feeds found.</div>
+ *
+ * @name loadIfModified
+ * @type jQuery
+ * @param String url The URL of the HTML file to load.
+ * @param Hash params A set of key/value pairs that will be sent to the server.
+ * @param Function callback A function to be executed whenever the data is loaded.
+ * @cat AJAX
+ */
+ loadIfModified: function( url, params, callback ) {
+ this.load( url, params, callback, 1 );
+ },
+
+ /**
+ * Load HTML from a remote file and inject it into the DOM.
+ *
+ * @example $("#feeds").load("feeds.html")
+ * @before <div id="feeds"></div>
+ * @result <div id="feeds"><b>45</b> feeds found.</div>
+ *
+ * @example $("#feeds").load("feeds.html",
+ * {test: true},
+ * function() { alert("load is done"); }
+ * );
+ * @desc Same as above, but with an additional parameter
+ * and a callback that is executed when the data was loaded.
+ *
+ * @name load
+ * @type jQuery
+ * @param String url The URL of the HTML file to load.
+ * @param Object params A set of key/value pairs that will be sent as data to the server.
+ * @param Function callback A function to be executed whenever the data is loaded (parameters: responseText, status and reponse itself).
+ * @cat AJAX
+ */
+ load: function( url, params, callback, ifModified ) {
+ if ( url.constructor == Function )
+ return this.bind("load", url);
+
+ callback = callback || function(){};
+
+ // Default to a GET request
+ var type = "GET";
+
+ // If the second parameter was provided
+ if ( params ) {
+ // If it's a function
+ if ( params.constructor == Function ) {
+ // We assume that it's the callback
+ callback = params;
+ params = null;
+
+ // Otherwise, build a param string
+ } else {
+ params = jQuery.param( params );
+ type = "POST";
+ }
+ }
+
+ var self = this;
+
+ // Request the remote document
+ jQuery.ajax({
+ url: url,
+ type: type,
+ data: params,
+ ifModified: ifModified,
+ complete: function(res, status){
+ if ( status == "success" || !ifModified && status == "notmodified" ) {
+ // Inject the HTML into all the matched elements
+ self.html(res.responseText)
+ // Execute all the scripts inside of the newly-injected HTML
+ .evalScripts()
+ // Execute callback
+ .each( callback, [res.responseText, status, res] );
+ } else
+ callback.apply( self, [res.responseText, status, res] );
+ }
+ });
+ return this;
+ },
+
+ /**
+ * Serializes a set of input elements into a string of data.
+ * This will serialize all given elements. If you need
+ * serialization similar to the form submit of a browser,
+ * you should use the form plugin. This is also true for
+ * selects with multiple attribute set, only a single option
+ * is serialized.
+ *
+ * @example $("input[@type=text]").serialize();
+ * @before <input type='text' name='name' value='John'/>
+ * <input type='text' name='location' value='Boston'/>
+ * @after name=John&location=Boston
+ * @desc Serialize a selection of input elements to a string
+ *
+ * @name serialize
+ * @type String
+ * @cat AJAX
+ */
+ serialize: function() {
+ return jQuery.param( this );
+ },
+
+ /**
+ * Evaluate all script tags inside this jQuery. If they have a src attribute,
+ * the script is loaded, otherwise it's content is evaluated.
+ *
+ * @name evalScripts
+ * @type jQuery
+ * @private
+ * @cat AJAX
+ */
+ evalScripts: function() {
+ return this.find('script').each(function(){
+ if ( this.src )
+ // for some weird reason, it doesn't work if the callback is ommited
+ jQuery.getScript( this.src );
+ else
+ eval.call( window, this.text || this.textContent || this.innerHTML || "" );
+ }).end();
+ }
+
+});
+
+// If IE is used, create a wrapper for the XMLHttpRequest object
+if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" )
+ XMLHttpRequest = function(){
+ return new ActiveXObject(
+ navigator.userAgent.indexOf("MSIE 5") >= 0 ?
+ "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"
+ );
+ };
+
+// Attach a bunch of functions for handling common AJAX events