* @name jQuery
* @cat Core
*/
-function jQuery(a,c) {
+jQuery = function(a,c) {
// Shortcut for document ready (because $(document).each() is silly)
- if ( a && a.constructor == Function && jQuery.fn.ready )
+ if ( a && typeof a == "function" && jQuery.fn.ready )
return jQuery(document).ready(a);
// Make sure that a selection was provided
var fn = arguments[ arguments.length - 1 ];
// If so, execute it in context
- if ( fn && fn.constructor == Function )
+ if ( fn && typeof fn == "function" )
this.each(fn);
-}
+};
// Map over the $ in case of overwrite
if ( typeof $ != "undefined" )
* @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
* @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
* @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
* @test ok( $('#text1').attr('type') == "text", 'Check for type attribute' );
* @test ok( $('#radio1').attr('type') == "radio", 'Check for type attribute' );
* @test ok( $('#check1').attr('type') == "checkbox", 'Check for type attribute' );
+ * @test ok( $('#simon1').attr('rel') == "bookmark", 'Check for rel attribute' );
+ * @test ok( $('#google').attr('title') == "Google!", 'Check for title attribute' );
+ * @test ok( $('#mark').attr('hreflang') == "en", 'Check for hreflang attribute' );
+ * @test ok( $('#en').attr('lang') == "en", 'Check for lang attribute' );
+ * @test ok( $('#simon').attr('class') == "blog link", 'Check for class attribute' );
+ * @test ok( $('#name').attr('name') == "name", 'Check for name attribute' );
+ * @test ok( $('#text1').attr('name') == "action", 'Check for name attribute' );
+ * @test ok( $('#form').attr('action') == "formaction", 'Check for action attribute' );
*
* @name attr
* @type Object
* }
* ok( pass, "Set Attribute" );
*
+ * @test $("#name").attr('name', 'something');
+ * ok( $("#name").name() == 'something', 'Set name attribute' );
+ * @test $("#check2").attr('checked', true);
+ * ok( document.getElementById('check2').checked == true, 'Set checked attribute' );
+ * $("#check2").attr('checked', false);
+ * ok( document.getElementById('check2').checked == false, 'Set checked attribute' );
+ *
* @name attr
* @type jQuery
* @param String key The name of the property to set.
* 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:'
- * @test var result = $('#first').wrap('<div class="red">xx<span></span>yy</div>').text()
- * ok( 'xx' + defaultText + 'yy' == result, 'Check for wrapping' );
- * @test ok( $('#first').parent().parent().is('.red'), 'Check if wrapper div has class "red"' );
+ * var result = $('#first').wrap('<div class="red"><span></span></div>').text();
+ * 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
* 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
* var result = $('#first').append('<b>buga</b>');
* ok( result.text() == defaultText + 'buga', 'Check if text appending works' );
*
+ * @test reset();
+ * var expected = "Try them out: bla ";
+ * $('#first').append(" ");
+ * $('#first').append("bla ");
+ * ok( expected == $('#first').text(), "Check for appending of spaces" );
+ *
* @name append
* @type jQuery
* @param String html A string of HTML, that will be created on the fly and appended to the target.
* @before <p class="selected">Hello</p><p>How are you?</p>
* @result $("p").filter(".selected") == [ <p class="selected">Hello</p> ]
*
+ * @test isSet( $("input").filter(":checked").get(), q("radio2", "check1"), "Filter elements" );
+ *
* @name filter
* @type jQuery
* @param String expr An expression to search with.
t.constructor == Boolean &&
( t ? this.get() : [] ) ||
- t.constructor == Function &&
+ typeof t == "function" &&
jQuery.grep( this, t ) ||
jQuery.filter(t,this).r, arguments );
* @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
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 ) {
} else {
var old = this.get();
this.get( a );
- if ( fn.constructor == Function )
+ if ( typeof fn == "function" )
this.each( fn );
this.get( old );
}
};
/**
- *
+ * 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
o.className += ( o.className ? " " : "" ) + c;
},
remove: function(o,c){
+ /*
o.className = !c ? "" :
o.className.replace(
- new RegExp("(^|\\s*\\b[^-])"+c+"($|\\b(?=[^-]))", "g"), "");
+ new RegExp("(^|\\s*\\b[^-])"+c+"($|\\b(?=[^-]))", "g"), "");*/
+ if( !c ) {
+ o.className = "";
+ } else {
+ var classes = o.className.split(" ");
+ for(var i=0; i<classes.length; i++) {
+ if(classes[i] == c) {
+ classes.splice(i, 1);
+ break;
+ }
+ }
+ o.className = classes.join(' ');
+ }
},
has: function(e,a) {
if ( e.className != undefined )
visible: "a.type!='hidden'&&jQuery.css(a,'display')!='none'&&jQuery.css(a,'visibility')!='hidden'",
hidden: "a.type=='hidden'||jQuery.css(a,'display')=='none'||jQuery.css(a,'visibility')=='hidden'",
- // Form elements
+ // Form attributes
enabled: "!a.disabled",
disabled: "a.disabled",
checked: "a.checked",
- selected: "a.selected"
+ selected: "a.selected",
+
+ // Form elements
+ text: "a.type=='text'",
+ radio: "a.type=='radio'",
+ checkbox: "a.type=='checkbox'",
+ file: "a.type=='file'",
+ password: "a.type=='password'",
+ submit: "a.type=='submit'",
+ image: "a.type=='image'",
+ reset: "a.type=='reset'",
+ button: "a.type=='button'",
+ input: "a.nodeName.toLowerCase()=='input'||a.nodeName.toLowerCase()=='select'||a.nodeName.toLowerCase()=='textarea'"
},
".": "jQuery.className.has(a,m[2])",
"@": {
"=": "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"
* @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"] );
* @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"] );
* @test t( "Last Child", "p:last-child", ["sap"] );
* @test t( "Only Child", "a:only-child", ["simon1","anchor1","yahoo","anchor2"] );
* @test t( "Empty", "ul:empty", ["firstUL"] );
- * @test t( "Enabled UI Element", "input:enabled", ["text1","radio1","radio2","check1","check2","hidden1","hidden2"] );
+ * @test t( "Enabled UI Element", "input:enabled", ["text1","radio1","radio2","check1","check2","hidden1","hidden2","name"] );
* @test t( "Disabled UI Element", "input:disabled", ["text2"] );
* @test t( "Checked UI Element", "input:checked", ["radio2","check1"] );
* @test t( "Selected Option Element", "option:selected", ["option1a","option2d","option3b","option3c"] );
* @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"] );
* @test t( "Position Greater Than", "p:gt(0)", ["ap","sndp","en","sap","first"] );
* @test t( "Position Less Than", "p:lt(3)", ["firstp","ap","sndp"] );
* @test t( "Is A Parent", "p:parent", ["firstp","ap","sndp","en","sap","first"] );
- * @test t( "Is Visible", "input:visible", ["text1","text2","radio1","radio2","check1","check2"] );
+ * @test t( "Is Visible", "input:visible", ["text1","text2","radio1","radio2","check1","check2","name"] );
* @test t( "Is Hidden", "input:hidden", ["hidden1","hidden2"] );
*
+ * @test t( "Grouped Form Elements", "input[@name='foo[bar]']", ["hidden2"] );
+ *
+ * @test t( "All Children of ID", "#foo/*", ["sndp", "en", "sap"] );
+ * @test t( "All Children of ID with no children", "#firstUL/*", [] );
+ *
+ * @test t( "Form element :input", ":input", ["text1", "text2", "radio1", "radio2", "check1", "check2", "hidden1", "hidden2", "name", "area1", "select1", "select2", "select3"] );
+ * @test t( "Form element :radio", ":radio", ["radio1", "radio2"] );
+ * @test t( "Form element :checkbox", ":checkbox", ["check1", "check2"] );
+ * @test t( "Form element :text", ":text", ["text1", "text2", "hidden2", "name"] );
+ * @test t( "Form element :radio:checked", ":radio:checked", ["radio2"] );
+ * @test t( "Form element :checkbox:checked", ":checkbox:checked", ["check1"] );
+ * @test t( "Form element :checkbox:checked, :radio:checked", ":checkbox:checked, :radio:checked", ["check1", "radio2"] );
+ *
+ * @test t( ":not() Existing attribute", "input:not([@name])", ["text2", "check2"]);
+ * @test t( ":not() Equals attribute", "select:not([@name=select1])", ["select2", "select3"]);
+ * @test t( ":not() Equals quoted attribute", "select:not([@name='select1'])", ["select2", "select3"]);
+ *
* @name $.find
* @type Array<Element>
* @private
if ( fix[name] ) {
if ( value != undefined ) elem[fix[name]] = value;
return elem[fix[name]];
- } else if ( elem.getAttribute ) {
+ } else if ( elem.getAttribute != undefined ) {
if ( value != undefined ) elem.setAttribute( name, value );
return elem.getAttribute( name, 2 );
} else {
// The regular expressions that power the parsing engine
parse: [
// Match: [@value='test'], [@foo]
- [ "\\[ *(@)S *([!*$^=]*) *Q\\]", 1 ],
+ "\\[ *(@)S *([!*$^=]*)Q\\]",
// Match: [div], [div p]
- [ "(\\[)Q\\]", 0 ],
+ "(\\[)Q\\]",
// Match: :contains('foo')
- [ "(:)S\\(Q\\)", 0 ],
+ "(:)S\\(Q\\)",
// Match: :even, :last-chlid
- [ "([:.#]*)S", 0 ]
+ "([:.#]*)S"
],
filter: function(t,r,not) {
var p = jQuery.parse;
for ( var i = 0; i < p.length; i++ ) {
- var re = new RegExp( "^" + p[i][0]
-
+ // get number for backreference
+ var br = 0;
+ if(p[i].indexOf('Q') != -1){
+ br = p[i].replace(/\\\(/g,'').match(/\(|S/g).length+1;
+ }
+ var re = new RegExp( "^" + p[i]
+
// Look for a string-like sequence
.replace( 'S', "([a-z*_-][a-z0-9_-]*)" )
// Look for something (optionally) enclosed with quotes
- .replace( 'Q', " *'?\"?([^'\"]*?)'?\"? *" ), "i" );
+ .replace( 'Q', " *('|\"|)([^'\"]*?)\\"+br+" *" ), "i" );
var m = re.exec( t );
if ( m ) {
// Re-organize the match
- if ( p[i][1] )
- m = ["", m[1], m[3], m[2], m[4]];
-
+ if(br == 4){
+ m = ["",m[1], m[3], m[2], m[5]];
+ } else if(br != 0) {
+ m.splice(br,1);
+ }
// Remove what we just matched
t = t.replace( re, "" );
*/
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, {
var c = this.events[event.type];
+ var args = [].slice.call( arguments, 1 );
+ args.unshift( event );
+
for ( var j in c ) {
- if ( c[j].apply( this, [event] ) === false ) {
+ if ( c[j].apply( this, args ) === false ) {
event.preventDefault();
event.stopPropagation();
returnValue = false;
* @before <input type="text" id="test" value="some text"/>
* @result "test"
*
+ * @test ok( $(document.getElementById('main')).id() == "main", "Check for id" );
+ * @test ok( $("#foo").id() == "foo", "Check for id" );
+ * @test ok( !$("head").id(), "Check for id" );
+ *
* @name id
* @type String
* @cat DOM/Attributes
* @before <img src="test.jpg" title="my image"/>
* @result "my image"
*
+ * @test ok( $(document.getElementById('google')).title() == "Google!", "Check for title" );
+ * @test ok( !$("#yahoo").title(), "Check for title" );
+ *
* @name title
* @type String
* @cat DOM/Attributes
* @before <input type="text" name="username"/>
* @result "username"
*
+ * @test ok( $(document.getElementById('text1')).name() == "action", "Check for name" );
+ * @test ok( $("#hidden1").name() == "hidden", "Check for name" );
+ * @test ok( !$("#area1").name(), "Check for name" );
+ *
* @name name
* @type String
* @cat DOM/Attributes
* @before <p>Hello</p><div><span>Hello Again</span></div><p>And Again</p>
* @result [ <p>Hello</p>, <p>And Again</p> ]
*
+ * @test isSet( $("#en").siblings().get(), q("sndp", "sap"), "Check for siblings" );
+ *
* @name siblings
* @type jQuery
* @cat DOM/Traversing
* @before <div><span>Hello</span></div><p class="selected">Hello Again</p><p>And Again</p>
* @result [ <p class="selected">Hello Again</p> ]
*
+ * @test isSet( $("#sndp").siblings("[code]").get(), q("sap"), "Check for filtered siblings (has code child element)" );
+ * @test isSet( $("#sndp").siblings("[a]").get(), q("en", "sap"), "Check for filtered siblings (has anchor child element)" );
+ *
* @name siblings
* @type jQuery
* @param String expr An expression to filter the sibling Elements with
* @cat DOM/Traversing
*/
- siblings: jQuery.sibling,
+ siblings: "jQuery.sibling(a, null, true)",
/**
* @before <p>Hello</p><div><span>Hello Again</span></div><p>And Again</p>
* @result [ <span>Hello Again</span> ]
*
+ * @test isSet( $("#foo").children().get(), q("sndp", "en", "sap"), "Check for children" );
+ *
* @name children
* @type jQuery
* @cat DOM/Traversing
* @before <div><span>Hello</span><p class="selected">Hello Again</p><p>And Again</p></div>
* @result [ <p class="selected">Hello Again</p> ]
*
+ * @test isSet( $("#foo").children("[code]").get(), q("sndp", "sap"), "Check for filtered children" );
+ *
* @name children
* @type jQuery
* @param String expr An expression to filter the child Elements with
* }
* ok( pass, "Remove Class" );
*
+ * @test var div = $("div").addClass("test").addClass("foo").addClass("bar");
+ * div.removeClass("test").removeClass("bar").removeClass("foo");
+ * var pass = true;
+ * for ( var i = 0; i < div.size(); i++ ) {
+ * if ( div.get(i).className.match(/test|bar|foo/) ) pass = false;
+ * }
+ * ok( pass, "Remove multiple classes" );
+ *
* @name removeClass
* @type jQuery
* @param String class A CSS class to remove from the elements
},
/**
- * Binds a particular event (like click) to a each of a set of match elements.
- *
- * @example $("p").bind( "click", function() { alert("Hello"); } )
+ * Binds a handler to a particular event (like click) for each matched element.
+ * The event handler is passed an event object that you can use to prevent
+ * default behaviour. To stop both default action and event bubbling, your handler
+ * has to return false.
+ *
+ * @example $("p").bind( "click", function() {
+ * alert( $(this).text() );
+ * } )
* @before <p>Hello</p>
- * @result [ <p>Hello</p> ]
- *
- * Cancel a default action and prevent it from bubbling by returning false
- * from your function.
+ * @result alert("Hello")
*
* @example $("form").bind( "submit", function() { return false; } )
+ * @desc Cancel a default action and prevent it from bubbling by returning false
+ * from your function.
*
- * Cancel a default action by using the preventDefault method.
- *
- * @example $("form").bind( "submit", function() { e.preventDefault(); } )
+ * @example $("form").bind( "submit", function(event) {
+ * event.preventDefault();
+ * } );
+ * @desc Cancel only the default action by using the preventDefault method.
*
- * Stop an event from bubbling by using the stopPropogation method.
*
- * @example $("form").bind( "submit", function() { e.stopPropogation(); } )
+ * @example $("form").bind( "submit", function(event) {
+ * event.stopPropagation();
+ * } )
+ * @desc Stop only an event from bubbling by using the stopPropagation method.
*
* @name bind
* @type jQuery