Fixed bug #178
[jquery.git] / src / jquery / jquery.js
index bc98854..dca1867 100644 (file)
@@ -203,7 +203,7 @@ jQuery.fn = jQuery.prototype = {
         * @before <img src="test1.jpg"/> <img src="test2.jpg"/>
         * @result 2
         *
-        * @test cmpOK( $("div").length, "==", 2, "Get Number of Elements Found" );
+        * @test ok( $("div").length == 2, "Get Number of Elements Found" );
         *
         * @property
         * @name length
@@ -218,7 +218,7 @@ jQuery.fn = jQuery.prototype = {
         * @before <img src="test1.jpg"/> <img src="test2.jpg"/>
         * @result 2
         *
-        * @test cmpOK( $("div").size(), "==", 2, "Get Number of Elements Found" );
+        * @test ok( $("div").size() == 2, "Get Number of Elements Found" );
         *
         * @name size
         * @type Number
@@ -252,7 +252,7 @@ jQuery.fn = jQuery.prototype = {
         * @before <img src="test1.jpg"/> <img src="test2.jpg"/>
         * @result [ <img src="test1.jpg"/> ]
         *
-        * @test cmpOK( $("div").get(0), "==", document.getElementById("main"), "Get A Single Element" );
+        * @test ok( $("div").get(0) == document.getElementById("main"), "Get A Single Element" );
         *
         * @name get
         * @type Element
@@ -587,19 +587,17 @@ jQuery.fn = jQuery.prototype = {
         * and finds the deepest ancestor element within its
         * structure - it is that element that will en-wrap everything else.
         *
+        * This does not work with elements that contain text. Any necessary text
+        * must be added after the wrapping is done.
+        *
         * @example $("p").wrap("<div class='wrap'></div>");
         * @before <p>Test Paragraph.</p>
         * @result <div class='wrap'><p>Test Paragraph.</p></div>
         * 
         * @test var defaultText = 'Try them out:'
         * var result = $('#first').wrap('<div class="red"><span></span></div>').text();
-        * ok( defaultText == result, 'Check for simple wrapping' );
-        * ok( $('#first').parent().parent().is('.red'), 'Check if wrapper div has class "red"' );
-        *
-        * @test var defaultText = 'Try them out:'
-        * var result = $('#first').wrap('<div class="red">xx<span></span>yy</div>').text()
-        * ok( 'xx' + defaultText + 'yy' == result, 'Check for wrapping' );
-        * ok( $('#first').parent().parent().is('.red'), 'Check if wrapper div has class "red"' );
+        * ok( defaultText == result, 'Check for wrapping of on-the-fly html' );
+        * ok( $('#first').parent().parent().is('.red'), 'Check if wrapper has class "red"' );
         *
         * @name wrap
         * @type jQuery
@@ -617,9 +615,17 @@ jQuery.fn = jQuery.prototype = {
         * provided and finding the deepest ancestor element within its
         * structure - it is that element that will en-wrap everything else.
         *
-        * @example $("p").wrap("<div class='wrap'></div>");
-        * @before <p>Test Paragraph.</p>
-        * @result <div class='wrap'><p>Test Paragraph.</p></div>
+        * This does not work with elements that contain text. Any necessary text
+        * must be added after the wrapping is done.
+        *
+        * @example $("p").wrap( document.getElementById('content') );
+        * @before <p>Test Paragraph.</p><div id="content"></div>
+        * @result <div id="content"><p>Test Paragraph.</p></div>
+        *
+        * @test var defaultText = 'Try them out:'
+        * var result = $('#first').wrap(document.getElementById('empty')).parent();
+        * ok( result.is('ol'), 'Check for element wrapping' );
+        * ok( result.text() == defaultText, 'Check for element wrapping' );
         *
         * @name wrap
         * @type jQuery
@@ -1035,7 +1041,7 @@ jQuery.fn = jQuery.prototype = {
         * @example $("p").not("#selected")
         * @before <p>Hello</p><p id="selected">Hello Again</p>
         * @result [ <p>Hello</p> ]
-        * @test cmpOK($("#main > p#ap > a").not("#google").length, "==", 2, ".not")
+        * @test ok($("#main > p#ap > a").not("#google").length == 2, ".not")
         *
         * @name not
         * @type jQuery
@@ -1165,7 +1171,7 @@ jQuery.fn = jQuery.prototype = {
                return this.each(function(){
                        var obj = this;
 
-                       if ( table && this.nodeName == "TABLE" && a[0].nodeName != "THEAD" ) {
+                       if ( table && this.nodeName.toUpperCase() == "TABLE" && a[0].nodeName.toUpperCase() != "THEAD" ) {
                                var tbody = this.getElementsByTagName("tbody");
 
                                if ( !tbody.length ) {
@@ -1212,7 +1218,20 @@ jQuery.fn = jQuery.prototype = {
 };
 
 /**
- *
+ * Extends the jQuery object itself. Can be used to add both static
+ * functions and plugin methods.
+ * 
+ * @example $.fn.extend({
+ *   check: function() {
+ *     this.each(function() { this.checked = true; });
+ *   ),
+ *   uncheck: function() {
+ *     this.each(function() { this.checked = false; });
+ *   }
+ * });
+ * $("input[@type=checkbox]").check();
+ * $("input[@type=radio]").uncheck();
+ * @desc Adds two plugin methods.
  *
  * @private
  * @name extend
@@ -1522,9 +1541,9 @@ jQuery.extend({
                "@": {
                        "=": "z==m[4]",
                        "!=": "z!=m[4]",
-                       "^=": "!z.indexOf(m[4])",
-                       "$=": "z.substr(z.length - m[4].length,m[4].length)==m[4]",
-                       "*=": "z.indexOf(m[4])>=0",
+                       "^=": "z && !z.indexOf(m[4])",
+                       "$=": "z && z.substr(z.length - m[4].length,m[4].length)==m[4]",
+                       "*=": "z && z.indexOf(m[4])>=0",
                        "": "z"
                },
                "[": "jQuery.find(m[2],a).length"
@@ -1549,7 +1568,7 @@ jQuery.extend({
         * @test t( "Element Selector", "div", ["main","foo"] );
         * @test t( "Element Selector", "body", ["body"] );
         * @test t( "Element Selector", "html", ["html"] );
-        * @test cmpOK( $("*").size(), ">=", 30, "Element Selector" );
+        * @test ok( $("*").size() >= 30, "Element Selector" );
         * @test t( "Parent Element", "div div", ["foo"] );
         *
         * @test t( "ID Selector", "#body", ["body"] );
@@ -1583,6 +1602,11 @@ jQuery.extend({
         * @test t( "Attribute Exists", "a[@title]", ["google"] );
         * @test t( "Attribute Exists", "*[@title]", ["google"] );
         * @test t( "Attribute Exists", "[@title]", ["google"] );
+        * 
+        * @test t( "Non-existing part of attribute [@name*=bla]", "[@name*=bla]", [] ); 
+        * @test t( "Non-existing start of attribute [@name^=bla]", "[@name^=bla]", [] ); 
+        * @test t( "Non-existing end of attribute [@name$=bla]", "[@name$=bla]", [] ); 
+        *
         * @test t( "Attribute Equals", "a[@rel='bookmark']", ["simon1"] );
         * @test t( "Attribute Equals", 'a[@rel="bookmark"]', ["simon1"] );
         * @test t( "Attribute Equals", "a[@rel=bookmark]", ["simon1"] );
@@ -1606,7 +1630,7 @@ jQuery.extend({
         * @test t( "Element Preceded By", "p ~ div", ["foo"] );
         * @test t( "Not", "a.blog:not(.link)", ["mark"] );
         *
-        * @test cmpOK( jQuery.find("//*").length, ">=", 30, "All Elements (//*)" );
+        * @test ok( jQuery.find("//*").length >= 30, "All Elements (//*)" );
         * @test t( "All Div Elements", "//div", ["main","foo"] );
         * @test t( "Absolute Path", "/html/body", ["body"] );
         * @test t( "Absolute Path w/ *", "/* /body", ["body"] );
@@ -1892,15 +1916,17 @@ jQuery.extend({
         */
        sibling: function(elem, pos, not) {
                var elems = [];
-
-               var siblings = elem.parentNode.childNodes;
-               for ( var i = 0; i < siblings.length; i++ ) {
-                       if ( not === true && siblings[i] == elem ) continue;
-
-                       if ( siblings[i].nodeType == 1 )
-                               elems.push( siblings[i] );
-                       if ( siblings[i] == elem )
-                               elems.n = elems.length - 1;
+               
+               if(elem) {
+                       var siblings = elem.parentNode.childNodes;
+                       for ( var i = 0; i < siblings.length; i++ ) {
+                               if ( not === true && siblings[i] == elem ) continue;
+       
+                               if ( siblings[i].nodeType == 1 )
+                                       elems.push( siblings[i] );
+                               if ( siblings[i] == elem )
+                                       elems.n = elems.length - 1;
+                       }
                }
 
                return jQuery.extend( elems, {