Fixed non-unique results from .parent(), .parents(), .next(), etc. (Bug #1449)
[jquery.git] / src / jquery / jquery.js
index 8e8f7be..bc4bcd1 100644 (file)
@@ -852,7 +852,7 @@ jQuery.fn = jQuery.prototype = {
         * @cat DOM/Manipulation
         */
        clone: function(deep) {
-               deep = deep != undefined ? deep : true
+               deep = deep != undefined ? deep : true;
                var $this = this.add(this.find("*"));
                if (jQuery.browser.msie) {
                        // Need to remove events on the element and its descendants
@@ -938,7 +938,7 @@ jQuery.fn = jQuery.prototype = {
                return this.pushStack(
                        jQuery.isFunction( t ) &&
                        jQuery.grep(this, function(el, index){
-                               return t.apply(el, [index])
+                               return t.apply(el, [index]);
                        }) ||
 
                        jQuery.multiFilter(t,this) );
@@ -1191,7 +1191,7 @@ jQuery.fn = jQuery.prototype = {
                                        if ( this.src )
                                                jQuery.ajax({ url: this.src, async: false, dataType: "script" });
                                        else
-                                               (new Function( this.text || this.textContent || this.innerHTML || "" ))();
+                                               jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" );
                                } else
                                        fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
                        });
@@ -1322,6 +1322,21 @@ jQuery.extend({
                        elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
        },
 
+       // Evalulates a script in a global context
+       // Evaluates Async. in Safari 2 :-(
+       globalEval: function( data ) {
+               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 );
+                       else
+                               eval.call( window, data );
+               }
+       },
+
        nodeName: function( elem, name ) {
                return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
        },
@@ -1457,8 +1472,16 @@ jQuery.extend({
        },
 
        curCSS: function(elem, prop, force) {
-               var ret, getComputedStyle = document.defaultView &&
-                       document.defaultView.getComputedStyle, stack = [], swap = [];
+               var ret, stack = [], swap = [];
+
+               // A helper method for determining if an element's values are broken
+               function color(a){
+                       if ( !jQuery.browser.safari )
+                               return false;
+
+                       var ret = document.defaultView.getComputedStyle(a,null);
+                       return !ret || ret.getPropertyValue("color") == "";
+               }
 
                if (prop == "opacity" && jQuery.browser.msie) {
                        ret = jQuery.attr(elem.style, "opacity");
@@ -1471,13 +1494,13 @@ jQuery.extend({
                if (!force && elem.style[prop])
                        ret = elem.style[prop];
 
-               else if (getComputedStyle) {
+               else if (document.defaultView && document.defaultView.getComputedStyle) {
 
                        if (prop.match(/float/i))
                                prop = "float";
 
                        prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
-                       var cur = getComputedStyle(elem, null);
+                       var cur = document.defaultView.getComputedStyle(elem, null);
 
                        if ( cur && !color(elem) )
                                ret = cur.getPropertyValue(prop);
@@ -1501,7 +1524,7 @@ jQuery.extend({
                                // one special, otherwise get the value
                                ret = prop == "display" && swap[stack.length-1] != null ?
                                        "none" :
-                                       getComputedStyle(elem,null).getPropertyValue(prop) || "";
+                                       document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || "";
 
                                // Finally, revert the display styles back
                                for ( a = 0; a < swap.length; a++ )
@@ -1512,11 +1535,6 @@ jQuery.extend({
                        if ( prop == "opacity" && ret == "" )
                                ret = "1";
 
-                       // A helper method for determining if an element's values are broken
-                       function color(a){
-                               return jQuery.browser.safari && getComputedStyle(a,null).getPropertyValue("color") == "";
-                       }
-
                } else if (elem.currentStyle) {
                        var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
                        ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
@@ -1548,7 +1566,7 @@ jQuery.extend({
                                        !s.indexOf("<leg") &&
                                        [1, "<fieldset>", "</fieldset>"] ||
                                        
-                                       (!s.indexOf("<thead") || !s.indexOf("<tbody") || !s.indexOf("<tfoot") || !s.indexOf("<colg")) &&
+                                       s.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
                                        [1, "<table>", "</table>"] ||
                                        
                                        !s.indexOf("<tr") &&
@@ -1584,7 +1602,11 @@ jQuery.extend({
                                        for ( var n = tb.length-1; n >= 0 ; --n )
                                                if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
                                                        tb[n].parentNode.removeChild(tb[n]);
-                                       
+       
+                                       // IE completely kills leading whitespace when innerHTML is used        
+                                       if ( /^\s/.test(arg) )  
+                                               div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild );
+
                                }
                                
                                arg = jQuery.makeArray( div.childNodes );
@@ -1882,7 +1904,7 @@ new function() {
        // Check to see if the W3C box model is being used
        jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
 
-       jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat",
+       jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
 
        jQuery.props = {
                "for": "htmlFor",
@@ -2051,7 +2073,7 @@ jQuery.each({
                var ret = jQuery.map(this,n);
                if ( a && typeof a == "string" )
                        ret = jQuery.multiFilter(a,ret);
-               return this.pushStack( ret );
+               return this.pushStack( jQuery.unique(ret) );
        };
 });