Merging in jQuery.proxy() branch.
[jquery.git] / src / core.js
index 2c5445a..975d23c 100644 (file)
@@ -33,7 +33,10 @@ var jQuery = function( selector, context ) {
        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
 
        // Keep a UserAgent string for use with jQuery.browser
-       userAgent = navigator.userAgent.toLowerCase(),
+       userAgent = navigator.userAgent,
+
+       // For matching the engine and version of thte browser
+       browserMatch,
        
        // Has the ready events already been bound?
        readyBound = false,
@@ -464,6 +467,8 @@ jQuery.extend({
                return true;
        },
 
+       noop: function() {},
+
        // Evalulates a script in a global context
        globalEval: function( data ) {
                if ( data && rnotwhite.test(data) ) {
@@ -618,17 +623,28 @@ jQuery.extend({
        guid: 1,
 
        proxy: function( fn, proxy, thisObject ) {
-               if ( arguments.length === 2 && proxy && !jQuery.isFunction( proxy ) ) {
-                       thisObject = proxy;
-                       proxy = undefined;
+               if ( arguments.length === 2 ) {
+                       if ( typeof proxy === "string" ) {
+                               thisObject = fn;
+                               fn = thisObject[ proxy ];
+                               proxy = undefined;
+
+                       } else if ( proxy && !jQuery.isFunction( proxy ) ) {
+                               thisObject = proxy;
+                               proxy = undefined;
+                       }
                }
 
-               proxy = proxy || function() {
-                       return fn.apply( thisObject || this, arguments );
-               };
+               if ( !proxy && fn ) {
+                       proxy = function() {
+                               return fn.apply( thisObject || this, arguments );
+                       };
+               }
 
                // Set the guid of unique handler to the same of original handler, so it can be removed
-               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+               if ( fn ) {
+                       proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+               }
 
                // So proxy can be declared as an argument
                return proxy;
@@ -636,17 +652,42 @@ jQuery.extend({
 
        // Use of jQuery.browser is frowned upon.
        // More details: http://docs.jquery.com/Utilities/jQuery.browser
-       browser: {
-               version: (/.*?(?:firefox|safari|opera|msie)[\/ ]([\d.]+)/.exec(userAgent) || [0,"0"])[1],
-               safari: /safari/.test( userAgent ),
-               opera: /opera/.test( userAgent ),
-               msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
-               firefox: /firefox/.test( userAgent )
-       }
+       uaMatch: function( ua ) {
+               var ret = { browser: "" };
+
+               ua = ua.toLowerCase();
+
+               if ( /webkit/.test( ua ) ) {
+                       ret = { browser: "webkit", version: /webkit[\/ ]([\w.]+)/ };
+
+               } else if ( /opera/.test( ua ) ) {
+                       ret = { browser: "opera", version: /opera[\/ ]([\w.]+)/ };
+
+               } else if ( /msie/.test( ua ) ) {
+                       ret = { browser: "msie", version: /msie ([\w.]+)/ };
+
+               } else if ( /mozilla/.test( ua ) && !/compatible/.test( ua ) ) {
+                       ret = { browser: "mozilla", version: /rv:([\w.]+)/ };
+               }
+
+               ret.version = (ret.version && ret.version.exec( ua ) || [0, "0"])[1];
+
+               return ret;
+       },
+
+       browser: {}
 });
 
-// Deprecated
-jQuery.browser.mozilla = /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent );
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+       jQuery.browser[ browserMatch.browser ] = true;
+       jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+       jQuery.browser.safari = true;
+}
 
 if ( indexOf ) {
        jQuery.inArray = function( elem, array ) {