More bug fixes and added documentation - passes the test suite now.
authorJohn Resig <jeresig@gmail.com>
Mon, 10 Jul 2006 03:20:56 +0000 (03:20 +0000)
committerJohn Resig <jeresig@gmail.com>
Mon, 10 Jul 2006 03:20:56 +0000 (03:20 +0000)
ajax/ajax.js
event/event.js
fx/fx.js
jquery/jquery.js

index f6a1d9e..4b062e9 100644 (file)
@@ -5,7 +5,7 @@
 /**
  * Load HTML from a remote file and inject it into the DOM
  */
-jQuery.prototype.load = function( url, params, callback ) {
+jQuery.fn.load = function( url, params, callback ) {
        // I overwrote the event plugin's .load
        // this won't happen again, I hope -John
        if ( url && url.constructor == Function )
@@ -52,159 +52,173 @@ jQuery.prototype.load = function( url, params, callback ) {
        return this;
 };
 
-/**
- * Load a remote page using a GET request
- */
-jQuery.get = function( url, callback, type ) {
-       // Build and start the HTTP Request
-       jQuery.ajax( "GET", url, null, function(r) {
-               if ( callback ) callback( jQuery.httpData(r,type) );
-       });
-};
-
-/**
- * Load a remote page using a POST request.
- */
-jQuery.post = function( url, data, callback, type ) {
-       // Build and start the HTTP Request
-       jQuery.ajax( "POST", url, jQuery.param(data), function(r) {
-               if ( callback ) callback( jQuery.httpData(r,type) );
-       });
-};
-
 // If IE is used, create a wrapper for the XMLHttpRequest object
-if ( jQuery.browser == "msie" )
+if ( jQuery.browser.msie )
        XMLHttpRequest = function(){
                return new ActiveXObject(
-                       (navigator.userAgent.toLowerCase().indexOf("msie 5") >= 0) ?
+                       navigator.userAgent.indexOf("MSIE 5") >= 0 ?
                        "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"
                );
        };
 
 // Attach a bunch of functions for handling common AJAX events
-(function(){
+new function(){
        var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(',');
        
-       for ( var i = 0; i < e.length; i++ ){ (function(){
+       for ( var i = 0; i < e.length; i++ ) new function(){
                var o = e[i];
-               jQuery.fn[o] = function(f){return this.bind(o, f);};
-       })();}
-})();
-
-/**
- * A common wrapper for making XMLHttpRequests
- */
-jQuery.ajax = function( type, url, data, ret ) {
-       // If only a single argument was passed in,
-       // assume that it is a object of key/value pairs
-       if ( !url ) {
-               ret = type.complete;
-               var success = type.success;
-               var error = type.error;
-               data = type.data;
-               url = type.url;
-               type = type.type;
+               jQuery.fn[o] = function(f){
+                       return this.bind(o, f);
+               };
        }
-       
-       // Watch for a new set of requests
-       if ( ! jQuery.ajax.active++ )
-               jQuery.event.trigger( "ajaxStart" );
+}
 
-       // Create the request object
-       var xml = new XMLHttpRequest();
+jQuery.extend({
 
-       // Open the socket
-       xml.open(type || "GET", url, true);
+       /**
+        * Load a remote page using a GET request
+        */
+       get: function( url, data, callback, type ) {
+               if ( data.constructor == Function ) {
+                       callback = data;
+                       data = null;
+               }
+               
+               if ( data )
+                       url += "?" + jQuery.param(data);
+               
+               // Build and start the HTTP Request
+               jQuery.ajax( "GET", url, null, function(r) {
+                       if ( callback ) callback( jQuery.httpData(r,type) );
+               });
+       },
        
-       // Set the correct header, if data is being sent
-       if ( data )
-               xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
-
-       // Set header so calling script knows that it's an XMLHttpRequest
-       xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
-
-       // Make sure the browser sends the right content length
-       if ( xml.overrideMimeType )
-               xml.setRequestHeader("Connection", "close");
-
-       // Wait for a response to come back
-       xml.onreadystatechange = function(){
-               // The transfer is complete and the data is available
-               if ( xml.readyState == 4 ) {
-                       // Make sure that the request was successful
-                       if ( jQuery.httpSuccess( xml ) ) {
-                       
-                               // If a local callback was specified, fire it
-                               if ( success ) success( xml );
+       /**
+        * Load a remote page using a POST request.
+        */
+       post: function( url, data, callback, type ) {
+               // Build and start the HTTP Request
+               jQuery.ajax( "POST", url, jQuery.param(data), function(r) {
+                       if ( callback ) callback( jQuery.httpData(r,type) );
+               });
+       },
+       
+       /**
+        * A common wrapper for making XMLHttpRequests
+        */
+       ajax: function( type, url, data, ret ) {
+               // If only a single argument was passed in,
+               // assume that it is a object of key/value pairs
+               if ( !url ) {
+                       ret = type.complete;
+                       var success = type.success;
+                       var error = type.error;
+                       data = type.data;
+                       url = type.url;
+                       type = type.type;
+               }
+               
+               // Watch for a new set of requests
+               if ( ! jQuery.active++ )
+                       jQuery.event.trigger( "ajaxStart" );
+       
+               // Create the request object
+               var xml = new XMLHttpRequest();
+       
+               // Open the socket
+               xml.open(type || "GET", url, true);
+               
+               // Set the correct header, if data is being sent
+               if ( data )
+                       xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+       
+               // Set header so calling script knows that it's an XMLHttpRequest
+               xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+       
+               // Make sure the browser sends the right content length
+               if ( xml.overrideMimeType )
+                       xml.setRequestHeader("Connection", "close");
+       
+               // Wait for a response to come back
+               xml.onreadystatechange = function(){
+                       // The transfer is complete and the data is available
+                       if ( xml.readyState == 4 ) {
+                               // Make sure that the request was successful
+                               if ( jQuery.httpSuccess( xml ) ) {
                                
-                               // Fire the global callback
-                               jQuery.event.trigger( "ajaxSuccess" );
-                       
-                       // Otherwise, the request was not successful
-                       } else {
-                               // If a local callback was specified, fire it
-                               if ( error ) error( xml );
+                                       // If a local callback was specified, fire it
+                                       if ( success ) success( xml );
+                                       
+                                       // Fire the global callback
+                                       jQuery.event.trigger( "ajaxSuccess" );
                                
-                               // Fire the global callback
-                               jQuery.event.trigger( "ajaxError" );
+                               // Otherwise, the request was not successful
+                               } else {
+                                       // If a local callback was specified, fire it
+                                       if ( error ) error( xml );
+                                       
+                                       // Fire the global callback
+                                       jQuery.event.trigger( "ajaxError" );
+                               }
+                               
+                               // The request was completed
+                               jQuery.event.trigger( "ajaxComplete" );
+                               
+                               // Handle the global AJAX counter
+                               if ( ! --jQuery.active )
+                                       jQuery.event.trigger( "ajaxStop" );
+       
+                               // Process result
+                               if ( ret ) ret(xml);
                        }
-                       
-                       // The request was completed
-                       jQuery.event.trigger( "ajaxComplete" );
-                       
-                       // Handle the global AJAX counter
-                       if ( ! --jQuery.ajax.active )
-                               jQuery.event.trigger( "ajaxStop" );
-
-                       // Process result
-                       if ( ret ) ret(xml);
                }
-       };
-
-       // Send the data
-       xml.send(data);
-};
-
-// Counter for holding the number of active queries
-jQuery.ajax.active = 0;
-
-// Determines if an XMLHttpRequest was successful or not
-jQuery.httpSuccess = function(r) {
-  try {
-    return r.status ?
-      ( r.status >= 200 && r.status < 300 ) || r.status == 304 :
-      location.protocol == "file:";
-  } catch(e){}
-  return false;
-};
-
-// Get the data out of an XMLHttpRequest.
-// Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
-// otherwise return plain text.
-jQuery.httpData = function(r,type) {
-  var ct = r.getResponseHeader("content-type");
-       var xml = ( !type || type == "xml" ) && ct && ct.indexOf("xml") >= 0;
-       return xml ? r.responseXML : r.responseText;
-};
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function(a) {
-       var s = [];
-       
-       // If an array was passed in, assume that it is an array
-       // of form elements
-       if ( a.constructor == Array )
-               // Serialize the form elements
-               for ( var i = 0; i < a.length; i++ )
-                       s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) );
+       
+               // Send the data
+               xml.send(data);
+       },
+       
+       // Counter for holding the number of active queries
+       active: 0,
+       
+       // Determines if an XMLHttpRequest was successful or not
+       httpSuccess: function(r) {
+               try {
+                       return r.status ?
+                               ( r.status >= 200 && r.status < 300 ) || r.status == 304 :
+                               location.protocol == "file:";
+               } catch(e){}
+               return false;
+       },
+       
+       // Get the data out of an XMLHttpRequest.
+       // Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
+       // otherwise return plain text.
+       httpData: function(r,type) {
+               var ct = r.getResponseHeader("content-type");
+               var xml = ( !type || type == "xml" ) && ct && ct.indexOf("xml") >= 0;
+               return xml ? r.responseXML : r.responseText;
+       },
+       
+       // Serialize an array of form elements or a set of
+       // key/values into a query string
+       param: function(a) {
+               var s = [];
                
-       // Otherwise, assume that it's an object of key/value pairs
-       else
-               // Serialize the key/values
-               for ( var j in a )
-                       s.push( j + "=" + encodeURIComponent( a[j] ) );
-       
-       // Return the resulting serialization
-       return s.join("&");
-};
+               // If an array was passed in, assume that it is an array
+               // of form elements
+               if ( a.constructor == Array )
+                       // Serialize the form elements
+                       for ( var i = 0; i < a.length; i++ )
+                               s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) );
+                       
+               // Otherwise, assume that it's an object of key/value pairs
+               else
+                       // Serialize the key/values
+                       for ( var j in a )
+                               s.push( j + "=" + encodeURIComponent( a[j] ) );
+               
+               // Return the resulting serialization
+               return s.join("&");
+       }
+
+});
index fe6e621..0c7b0b1 100644 (file)
-// We're overriding the old toggle function, so
-// remember it for later
-jQuery.prototype._toggle = jQuery.prototype.toggle;
+jQuery.fn.extend({
 
-/**
- * Toggle between two function calls every other click.
- */
-jQuery.prototype.toggle = function(a,b) {
-       // If two functions are passed in, we're
-       // toggling on a click
-       return a && b ? this.click(function(e){
-               // Figure out which function to execute
-               this.last = this.last == a ? b : a;
-               
-               // Make sure that clicks stop
-               e.preventDefault();
-               
-               // and execute the function
-               return this.last.apply( this, [e] ) || false;
-       }) :
+       // We're overriding the old toggle function, so
+       // remember it for later
+       _toggle: jQuery.fn.toggle,
        
-       // Otherwise, execute the old toggle function
-       this._toggle();
-};
-
-/**
- * Toggle between two function calls on mouse over/out.
- */
-jQuery.prototype.hover = function(f,g) {
-       
-       // A private function for haandling mouse 'hovering'
-       function handleHover(e) {
-               // Check if mouse(over|out) are still within the same parent element
-               var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
-
-               // Traverse up the tree
-               while ( p && p != this ) p = p.parentNode;
+       /**
+        * Toggle between two function calls every other click.
+        */
+       toggle: function(a,b) {
+               // If two functions are passed in, we're
+               // toggling on a click
+               return a && b ? this.click(function(e){
+                       // Figure out which function to execute
+                       this.last = this.last == a ? b : a;
+                       
+                       // Make sure that clicks stop
+                       e.preventDefault();
+                       
+                       // and execute the function
+                       return this.last.apply( this, [e] ) || false;
+               }) :
                
-               // If we actually just moused on to a sub-element, ignore it
-               if ( p == this ) return false;
+               // Otherwise, execute the old toggle function
+               this._toggle();
+       },
+       
+       /**
+        * Toggle between two function calls on mouse over/out.
+        */
+       hover: function(f,g) {
                
-               // Execute the right function
-               return (e.type == "mouseover" ? f : g).apply(this, [e]);
-       }
+               // A private function for haandling mouse 'hovering'
+               function handleHover(e) {
+                       // Check if mouse(over|out) are still within the same parent element
+                       var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
        
-       // Bind the function to the two event listeners
-       return this.mouseover(handleHover).mouseout(handleHover);
-};
-
-/**
- * Bind a function to fire when the DOM is ready.
- */
-jQuery.prototype.ready = function(f) {
-       // If the DOM is already ready
-       if ( jQuery.isReady )
-               // Execute the function immediately
-               f.apply( document );
+                       // Traverse up the tree
+                       while ( p && p != this ) p = p.parentNode;
+                       
+                       // If we actually just moused on to a sub-element, ignore it
+                       if ( p == this ) return false;
+                       
+                       // Execute the right function
+                       return (e.type == "mouseover" ? f : g).apply(this, [e]);
+               }
                
-       // Otherwise, remember the function for later
-       else {
-               // Add the function to the wait list
-               jQuery.readyList.push( f );
+               // Bind the function to the two event listeners
+               return this.mouseover(handleHover).mouseout(handleHover);
+       },
+       
+       /**
+        * Bind a function to fire when the DOM is ready.
+        */
+       ready: function(f) {
+               // If the DOM is already ready
+               if ( jQuery.isReady )
+                       // Execute the function immediately
+                       f.apply( document );
+                       
+               // Otherwise, remember the function for later
+               else {
+                       // Add the function to the wait list
+                       jQuery.readyList.push( f );
+               }
+       
+               return this;
        }
+});
 
-       return this;
-};
+jQuery.extend({
+       /*
+        * All the code that makes DOM Ready work nicely.
+        */
+       isReady: false,
+       readyList: [],
+       
+       // Handle when the DOM is ready
+       ready: function() {
+               // Make sure that the DOM is not already loaded
+               if ( !jQuery.isReady ) {
+                       // Remember that the DOM is ready
+                       jQuery.isReady = true;
+                       
+                       // If there are functions bound, to execute
+                       if ( jQuery.readyList ) {
+                               // Execute all of them
+                               for ( var i = 0; i < jQuery.readyList.length; i++ )
+                                       jQuery.readyList[i].apply( document );
+                               
+                               // Reset the list of functions
+                               jQuery.readyList = null;
+                       }
+               }
+       }
+});
 
-(function(){
+new function(){
        /*
         * Bind a number of event-handling functions, dynamically
         */
-       var e = ("blur,focus,contextmenu,load,resize,scroll,unload,click,dblclick," +
-               "mousedown,mouseup,mouseenter,mouseleave,mousemove,mouseover,mouseout," +
-               "change,reset,select,submit,keydown,keypress,keyup").split(",");
+       var e = ("blur,focus,load,resize,scroll,unload,click,dblclick," +
+               "mousedown,mouseup,mousemove,mouseover,mouseout,change,reset,select," + 
+               "submit,keydown,keypress,keyup,error").split(",");
 
        // Go through all the event names, but make sure that
        // it is enclosed properly
-       for ( var i = 0; i < e.length; i++ ) {(function(){
+       for ( var i = 0; i < e.length; i++ ) new function(){
                        
                var o = e[i];
                
                // Handle event binding
-               jQuery.prototype[o] = function(f){ return this.bind(o, f); };
+               jQuery.fn[o] = function(f){
+                       return f ? this.bind(o, f) : this.trigger(o);
+               };
                
                // Handle event unbinding
-               jQuery.prototype["un"+o] = function(f){ return this.unbind(o, f); };
-               
-               // Handle event triggering
-               jQuery.prototype["do"+o] = function(){ return this.trigger(o); };
+               jQuery.fn["un"+o] = function(f){ return this.unbind(o, f); };
                
                // Finally, handle events that only fire once
-               jQuery.prototype["one"+o] = function(f){
+               jQuery.fn["one"+o] = function(f){
                        // Attach the event listener
                        return this.bind(o, function(e){
                                // TODO: Remove the event listener, instead of this hack
                                
                                // If this function has already been executed, stop
-                               if ( this[o+f] !== null )
-                                       return true;
+                               if ( this[o+f] !== null ) return;
                                
                                // Otherwise, mark as having been executed
                                this[o+f]++;
@@ -106,42 +134,16 @@ jQuery.prototype.ready = function(f) {
                        });
                };
                        
-       })();}
-               
-       /*
-        * All the code that makes DOM Ready work nicely.
-        */
-        
-       jQuery.isReady = false;
-       jQuery.readyList = [];
-       
-       // Handle when the DOM is ready
-       jQuery.ready = function() {
-               // Make sure that the DOM is not already loaded
-               if ( !jQuery.isReady ) {
-                       // Remember that the DOM is ready
-                       jQuery.isReady = true;
-                       
-                       // If there are functions bound, to execute
-                       if ( jQuery.readyList ) {
-                               // Execute all of them
-                               for ( var i = 0; i < jQuery.readyList.length; i++ )
-                                       jQuery.readyList[i].apply( document );
-                               
-                               // Reset the list of functions
-                               jQuery.readyList = null;
-                       }
-               }
-       };
+       }
        
        // If Mozilla is used
-       if ( jQuery.browser == "mozilla" || jQuery.browser == "opera" ) {
+       if ( jQuery.browser.mozilla || jQuery.browser.opera ) {
                // Use the handy event callback
                document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
        
        // If IE is used, use the excellent hack by Matthias Miller
        // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
-       } else if ( jQuery.browser == "msie" ) {
+       } else if ( jQuery.browser.msie ) {
        
                // Only works if you document.write() it
                document.write("<scr" + "ipt id=__ie_init defer=true " + 
@@ -158,7 +160,7 @@ jQuery.prototype.ready = function(f) {
                script = null;
        
        // If Safari  is used
-       } else if ( jQuery.browser == "safari" ) {
+       } else if ( jQuery.browser.safari ) {
                // Continually check to see if the document.readyState is valid
                jQuery.safariTimer = setInterval(function(){
                        // loaded and complete are both valid states
@@ -178,4 +180,4 @@ jQuery.prototype.ready = function(f) {
        // A fallback to window.onload, that will always work
        jQuery.event.add( window, "load", jQuery.ready );
        
-})();
+}
index e8474a8..71764c0 100644 (file)
--- a/fx/fx.js
+++ b/fx/fx.js
-// overwrite the old show method
-jQuery.prototype._show = jQuery.prototype.show;
+jQuery.fn.extend({
 
-/**
- * The effects module overloads the show method to now allow 
- * for a speed to the show operation. What actually happens is 
- * that the height, width, and opacity to the matched elements 
- * are changed dynamically. The only three current speeds are 
- * "slow", "normal", and "fast". For example:
- *   $("p").show("slow");
- * Note: You should not run the show method on things 
- * that are already shown. This can be circumvented by doing this:
- *   $("p:hidden").show("slow");
- */
-jQuery.prototype.show = function(speed,callback){
-       return speed ? this.animate({
-               height: "show", width: "show", opacity: "show"
-       }, speed, callback) : this._show();
-};
-
-// We're overwriting the old hide method
-jQuery.prototype._hide = jQuery.prototype.hide;
-
-
-/**
- * The hide function behaves very similary to the show function, 
- * but is just the opposite.
- *   $("p:visible").hide("slow");
- */
-jQuery.prototype.hide = function(speed,callback){
-       return speed ? this.animate({
-               height: "hide",
-               width: "hide",
-               opacity: "hide"
-       }, speed, callback) : this._hide();
-};
-
-/**
- * This function increases the height and opacity for all matched 
- * elements. This is very similar to 'show', but does not change 
- * the width - creating a neat sliding effect.
- *   $("p:hidden").slideDown("slow");
- */
-jQuery.prototype.slideDown = function(speed,callback){
-       return this.animate({height: "show"}, speed, callback);
-};
-
-/**
- * Just like slideDown, only it hides all matched elements.
- *   $("p:visible").slideUp("slow");
- */
-jQuery.prototype.slideUp = function(speed,callback){
-       return this.animate({height: "hide"}, speed, callback);
-};
-
-/**
- * Adjusts the opacity of all matched elements from a hidden, 
- * to a fully visible, state.
- *   $("p:hidden").fadeIn("slow");
- */
-jQuery.prototype.fadeIn = function(speed,callback){
-       return this.animate({opacity: "show"}, speed, callback);
-};
-
-/**
- * Same as fadeIn, but transitions from a visible, to a hidden state.
- *   $("p:visible").fadeOut("slow");
- */
-jQuery.prototype.fadeOut = function(speed,callback){
-       return this.animate({opacity: "hide"}, speed, callback);
-};
-
-/**
- * ...
- */
-jQuery.prototype.fadeTo = function(speed,to,callback){
-       return this.animate({opacity: to}, speed, callback);
-};
-
-/**
- *
- */
-jQuery.prototype.animate = function(prop,speed,callback) {
-       return this.queue(function(){
-               var i = 0;
-               for ( var p in prop ) {
-                       var e = new jQuery.fx( this, jQuery.speed(speed,callback,i++), p );
-                       if ( prop[p].constructor == Number )
-                               e.custom( e.cur(), prop[p] );
-                       else
-                               e[ prop[p] ]();
+       // overwrite the old show method
+       _show: jQuery.fn.show,
+       
+       /**
+        * The effects module overloads the show method to now allow 
+        * for a speed to the show operation. What actually happens is 
+        * that the height, width, and opacity to the matched elements 
+        * are changed dynamically. The only three current speeds are 
+        * "slow", "normal", and "fast". For example:
+        *   $("p").show("slow");
+        * Note: You should not run the show method on things 
+        * that are already shown. This can be circumvented by doing this:
+        *   $("p:hidden").show("slow");
+        */
+       show: function(speed,callback){
+               return speed ? this.animate({
+                       height: "show", width: "show", opacity: "show"
+               }, speed, callback) : this._show();
+       },
+       
+       // We're overwriting the old hide method
+       _hide: jQuery.fn.hide,
+       
+       /**
+        * The hide function behaves very similary to the show function, 
+        * but is just the opposite.
+        *   $("p:visible").hide("slow");
+        */
+       hide: function(speed,callback){
+               return speed ? this.animate({
+                       height: "hide", width: "hide", opacity: "hide"
+               }, speed, callback) : this._hide();
+       },
+       
+       /**
+        * This function increases the height and opacity for all matched 
+        * elements. This is very similar to 'show', but does not change 
+        * the width - creating a neat sliding effect.
+        *   $("p:hidden").slideDown("slow");
+        */
+       slideDown: function(speed,callback){
+               return this.animate({height: "show"}, speed, callback);
+       },
+       
+       /**
+        * Just like slideDown, only it hides all matched elements.
+        *   $("p:visible").slideUp("slow");
+        */
+       slideUp: function(speed,callback){
+               return this.animate({height: "hide"}, speed, callback);
+       },
+       
+       /**
+        * Adjusts the opacity of all matched elements from a hidden, 
+        * to a fully visible, state.
+        *   $("p:hidden").fadeIn("slow");
+        */
+       fadeIn: function(speed,callback){
+               return this.animate({opacity: "show"}, speed, callback);
+       },
+       
+       /**
+        * Same as fadeIn, but transitions from a visible, to a hidden state.
+        *   $("p:visible").fadeOut("slow");
+        */
+       fadeOut: function(speed,callback){
+               return this.animate({opacity: "hide"}, speed, callback);
+       },
+       
+       /**
+        * ...
+        */
+       fadeTo: function(speed,to,callback){
+               return this.animate({opacity: to}, speed, callback);
+       },
+       
+       /**
+        *
+        */
+       animate: function(prop,speed,callback) {
+               return this.queue(function(){
+                       var i = 0;
+                       for ( var p in prop ) {
+                               var e = new jQuery.fx( this, jQuery.speed(speed,callback,i++), p );
+                               if ( prop[p].constructor == Number )
+                                       e.custom( e.cur(), prop[p] );
+                               else
+                                       e[ prop[p] ]();
+                       }
+               });
+       },
+       
+       /**
+        *
+        * @private
+        */
+       queue: function(type,fn){
+               if ( !fn ) {
+                       fn = type;
+                       type = "fx";
                }
-       });
-};
-
-jQuery.speed = function(s,o,i) {
-       o = o || {};
        
-       if ( o.constructor == Function )
-               o = { complete: o };
+               return this.each(function(){
+                       if ( !this.queue )
+                               this.queue = {};
        
-       var ss = {"slow":600,"fast":200};
-       o.duration = (s && s.constructor == Number ? s : ss[s]) || 400;
-
-       // Queueing
-       o.oldComplete = o.complete;
-       o.complete = function(){
-               jQuery.dequeue(this, "fx");
-               if ( o.oldComplete && o.oldComplete.constructor == Function )
-                       o.oldComplete.apply( this );
-       };
-       
-       if ( i > 0 )
-               o.complete = null;
-
-       return o;
-};
-
-jQuery.queue = {};
-
-jQuery.dequeue = function(elem,type){
-       type = type || "fx";
-
-       if ( elem.queue && elem.queue[type] ) {
-               // Remove self
-               elem.queue[type].shift();
-
-               // Get next function
-               var f = elem.queue[type][0];
+                       if ( !this.queue[type] )
+                               this.queue[type] = [];
        
-               if ( f )
-                       f.apply( elem );
-       }
-};
-
-jQuery.prototype.queue = function(type,fn){
-       if ( !fn ) {
-               fn = type;
-               type = "fx";
+                       this.queue[type].push( fn );
+               
+                       if ( this.queue[type].length == 1 )
+                               fn.apply(this);
+               });
        }
 
-       return this.each(function(){
-               if ( !this.queue )
-                       this.queue = {};
+});
 
-               if ( !this.queue[type] )
-                       this.queue[type] = [];
+jQuery.extend({
 
-               this.queue[type].push( fn );
+       setAuto: function(e,p) {
+               var a = e.style[p];
+               var o = jQuery.css(e,p);
+               e.style[p] = "auto";
+               var n = jQuery.css(e,p);
+               if ( o != n )
+                       e.style[p] = a;
+       },
        
-               if ( this.queue[type].length == 1 )
-                       fn.apply(this);
-       });
-};
-
-jQuery.setAuto = function(e,p) {
-       var a = e.style[p];
-       var o = jQuery.css(e,p);
-       e.style[p] = "auto";
-       var n = jQuery.css(e,p);
-       if ( o != n )
-               e.style[p] = a;
-};
-
-/*
- * I originally wrote fx() as a clone of moo.fx and in the process
- * of making it small in size the code became illegible to sane
- * people. You've been warned.
- */
-
-jQuery.fx = function( elem, options, prop ){
-
-       var z = this;
-
-       // The users options
-       z.o = {
-               duration: options.duration || 400,
-               complete: options.complete
-       };
-
-       // The element
-       z.el = elem;
-
-       // The styles
-       var y = z.el.style;
-
-       // Simple function for setting a style value
-       z.a = function(){
-               if ( prop == "opacity" ) {
-                       if (z.now == 1) z.now = 0.9999;
-                       if (window.ActiveXObject)
-                               y.filter = "alpha(opacity=" + z.now*100 + ")";
-                       y.opacity = z.now;
-               } else
-                       y[prop] = z.now+"px";
-       };
-
-       // Figure out the maximum number to run to
-       z.max = function(){
-               return z.el["orig"+prop] || z.cur();
-       };
-
-       // Get the current size
-       z.cur = function(){
-               return parseFloat( jQuery.css(z.el,prop) );
-       };
-
-       // Start an animation from one number to another
-       z.custom = function(from,to){
-               z.startTime = (new Date()).getTime();
-               z.now = from;
-               z.a();
-
-               z.timer = setInterval(function(){
-                       z.step(from, to);
-               }, 13);
-       };
-
-       // Simple 'show' function
-       z.show = function(){
-               y.display = "block";
-               z.o.auto = true;
-               z.custom(0,z.max());
-       };
-
-       // Simple 'hide' function
-       z.hide = function(){
-               // Remember where we started, so that we can go back to it later
-               z.el["orig"+prop] = this.cur();
-
-               // Begin the animation
-               z.custom(z.cur(),0);
-       };
-
-       // IE has trouble with opacity if it doesn't have layout
-       if ( jQuery.browser == "msie" && !z.el.currentStyle.hasLayout )
-               y.zoom = 1;
-
-       // Remember  the overflow of the element
-       z.oldOverflow = y.overflow;
-
-       // Make sure that nothing sneaks out
-       y.overflow = "hidden";
-
-       // Each step of an animation
-       z.step = function(firstNum, lastNum){
-               var t = (new Date()).getTime();
-
-               if (t > z.o.duration + z.startTime) {
-                       // Stop the timer
-                       clearInterval(z.timer);
-                       z.timer = null;
+       speed: function(s,o,i) {
+               o = o || {};
+               
+               if ( o.constructor == Function )
+                       o = { complete: o };
+               
+               var ss = { slow: 600, fast: 200 };
+               o.duration = (s && s.constructor == Number ? s : ss[s]) || 400;
+       
+               // Queueing
+               o.oldComplete = o.complete;
+               o.complete = function(){
+                       jQuery.dequeue(this, "fx");
+                       if ( o.oldComplete && o.oldComplete.constructor == Function )
+                               o.oldComplete.apply( this );
+               };
+               
+               if ( i > 0 )
+                       o.complete = null;
+       
+               return o;
+       },
+       
+       queue: {},
+       
+       dequeue: function(elem,type){
+               type = type || "fx";
+       
+               if ( elem.queue && elem.queue[type] ) {
+                       // Remove self
+                       elem.queue[type].shift();
+       
+                       // Get next function
+                       var f = elem.queue[type][0];
+               
+                       if ( f )
+                               f.apply( elem );
+               }
+       },
 
-                       z.now = lastNum;
+       /*
+        * I originally wrote fx() as a clone of moo.fx and in the process
+        * of making it small in size the code became illegible to sane
+        * people. You've been warned.
+        */
+       
+       fx: function( elem, options, prop ){
+       
+               var z = this;
+       
+               // The users options
+               z.o = {
+                       duration: options.duration || 400,
+                       complete: options.complete
+               };
+       
+               // The element
+               z.el = elem;
+       
+               // The styles
+               var y = z.el.style;
+       
+               // Simple function for setting a style value
+               z.a = function(){
+                       if ( prop == "opacity" ) {
+                               if (z.now == 1) z.now = 0.9999;
+                               if (window.ActiveXObject)
+                                       y.filter = "alpha(opacity=" + z.now*100 + ")";
+                               y.opacity = z.now;
+                       } else
+                               y[prop] = z.now+"px";
+               };
+       
+               // Figure out the maximum number to run to
+               z.max = function(){
+                       return z.el["orig"+prop] || z.cur();
+               };
+       
+               // Get the current size
+               z.cur = function(){
+                       return parseFloat( jQuery.css(z.el,prop) );
+               };
+       
+               // Start an animation from one number to another
+               z.custom = function(from,to){
+                       z.startTime = (new Date()).getTime();
+                       z.now = from;
                        z.a();
-
-                       // Reset the overflow
-                       y.overflow = z.oldOverflow;
-
-                       // If the element was shown, and not using a custom number,
-                       // set its height and/or width to auto
-                       if ( (prop == "height" || prop == "width") && z.o.auto )
-                               jQuery.setAuto( z.el, prop );
-
-                       // If a callback was provided, execute it
-                       if( z.o.complete && z.o.complete.constructor == Function ) {
-
-                               // Yes, this is a weird place for this, but it needs to be executed
-                               // only once per cluster of effects.
-                               // If the element is, effectively, hidden - hide it
-                               if ( y.height == "0px" || y.width == "0px" )
-                                       y.display = "none";
-
-                               // Execute the complete function
-                               z.o.complete.apply( z.el );
+       
+                       z.timer = setInterval(function(){
+                               z.step(from, to);
+                       }, 13);
+               };
+       
+               // Simple 'show' function
+               z.show = function(){
+                       y.display = "block";
+                       z.o.auto = true;
+                       z.custom(0,z.max());
+               };
+       
+               // Simple 'hide' function
+               z.hide = function(){
+                       // Remember where we started, so that we can go back to it later
+                       z.el["orig"+prop] = this.cur();
+       
+                       // Begin the animation
+                       z.custom(z.cur(),0);
+               };
+       
+               // IE has trouble with opacity if it doesn't have layout
+               if ( jQuery.browser.msie && !z.el.currentStyle.hasLayout )
+                       y.zoom = 1;
+       
+               // Remember  the overflow of the element
+               z.oldOverflow = y.overflow;
+       
+               // Make sure that nothing sneaks out
+               y.overflow = "hidden";
+       
+               // Each step of an animation
+               z.step = function(firstNum, lastNum){
+                       var t = (new Date()).getTime();
+       
+                       if (t > z.o.duration + z.startTime) {
+                               // Stop the timer
+                               clearInterval(z.timer);
+                               z.timer = null;
+       
+                               z.now = lastNum;
+                               z.a();
+       
+                               // Reset the overflow
+                               y.overflow = z.oldOverflow;
+       
+                               // If the element was shown, and not using a custom number,
+                               // set its height and/or width to auto
+                               if ( (prop == "height" || prop == "width") && z.o.auto )
+                                       jQuery.setAuto( z.el, prop );
+       
+                               // If a callback was provided, execute it
+                               if( z.o.complete && z.o.complete.constructor == Function ) {
+       
+                                       // Yes, this is a weird place for this, but it needs to be executed
+                                       // only once per cluster of effects.
+                                       // If the element is, effectively, hidden - hide it
+                                       if ( y.height == "0px" || y.width == "0px" )
+                                               y.display = "none";
+       
+                                       // Execute the complete function
+                                       z.o.complete.apply( z.el );
+                               }
+                       } else {
+                               // Figure out where in the animation we are and set the number
+                               var p = (t - this.startTime) / z.o.duration;
+                               z.now = ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
+       
+                               // Perform the next step of the animation
+                               z.a();
                        }
-               } else {
-                       // Figure out where in the animation we are and set the number
-                       var p = (t - this.startTime) / z.o.duration;
-                       z.now = ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
-
-                       // Perform the next step of the animation
-                       z.a();
-               }
-       };
+               };
+       
+       }
 
-};
+});
index 86a7060..a9ab304 100644 (file)
@@ -457,9 +457,9 @@ jQuery.fn = jQuery.prototype = {
        },
        
        /**
-        * End all 'destructive' operations, reverting the list of matched elements.
-        * After an end operation, the list of matched elements will revert to the last
-        * state of matched elements.
+        * End the most recent 'destructive' operation, reverting the list of matched elements
+        * back to its previous state. After an end operation, the list of matched elements will 
+        * revert to the last state of matched elements.
         *
         * @example $("p").find("span").end();
         * @before <p><span>Hello</span>, how are you?</p>
@@ -472,6 +472,22 @@ jQuery.fn = jQuery.prototype = {
                return this.get( this.stack.pop() );
        },
        
+       /**
+        * Searches for all elements that match the specified expression.
+        * This method is the optimal way of finding additional descendant
+        * elements with which to process.
+        *
+        * All searching is done using a jQuery expression. The expression can be 
+        * written using CSS 1-3 Selector sytax, or basic XPath.
+        *
+        * @example $("p").find("span");
+        * @before <p><span>Hello</span>, how are you?</p>
+        * @result $("p").find("span") == [ <span>Hello</span> ]
+        *
+        * @name find
+        * @type jQuery
+        * @param String expr An expression to search with.
+        */
        find: function(t) {
                return this.pushStack( jQuery.map( this, function(a){
                        return jQuery.find(t,a);
@@ -515,7 +531,7 @@ jQuery.fn = jQuery.prototype = {
        },
        
        /**
-        * :-P
+        * 
         *
         * @private
         * @name domManip
@@ -926,7 +942,7 @@ jQuery.extend({
                                
                                if ( m ) {
                                        r = ret = jQuery.map( ret, jQuery.token[i+1] );
-                                       t = jQuery.trim(t).replace( re, "" );
+                                       t = jQuery.trim( t.replace( re, "" ) );
                                        foundToken = true;
                                }
                        }
@@ -1058,10 +1074,14 @@ jQuery.extend({
                        
                        // Otherwise, find the expression to execute
                        else {
+                               var f = jQuery.expr[m[1]];
+                               if ( f.constructor != String )
+                                       f = jQuery.expr[m[1]][m[2]];
+                                       
                                // Build a custom macro to enclose it
                                eval("f = function(a,i){" + 
                                        ( m[1] == "@" ? "z=jQuery.attr(a,m[3]);" : "" ) + 
-                                       "return " + jQuery.expr[m[1]] + "}");
+                                       "return " + f + "}");
                                
                                // Execute it against the current filter
                                r = g( r, f );