/* * jQuery - New Wave Javascript * * Copyright (c) 2006 John Resig (jquery.com) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * $Date: 2006-09-07 10:12:12 +0200 (Do, 07 Sep 2006) $ * $Rev: 276 $ */ // Global undefined variable window.undefined = window.undefined; /** * Create a new jQuery Object * * @test ok( Array.prototype.push, "Array.push()" ); * @test ok( Function.prototype.apply, "Function.apply()" ); * @test ok( document.getElementById, "getElementById" ); * @test ok( document.getElementsByTagName, "getElementsByTagName" ); * @test ok( RegExp, "RegExp" ); * @test ok( jQuery, "jQuery" ); * @test ok( $, "$()" ); * * @constructor * @private * @name jQuery * @cat Core */ function jQuery(a,c) { // Shortcut for document ready (because $(document).each() is silly) if ( a && a.constructor == Function && jQuery.fn.ready ) return jQuery(document).ready(a); // Make sure that a selection was provided a = a || jQuery.context || document; // Watch for when a jQuery object is passed as the selector if ( a.jquery ) return jQuery( jQuery.merge( a, [] ) ); // Watch for when a jQuery object is passed at the context if ( c && c.jquery ) return jQuery( c ).find(a); // If the context is global, return a new object if ( window == this ) return new jQuery(a,c); // Handle HTML strings var m = /^[^<]*(<.+>)[^>]*$/.exec(a); if ( m ) a = jQuery.clean( [ m[1] ] ); // Watch for when an array is passed in this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ? // Assume that it is an array of DOM Elements jQuery.merge( a, [] ) : // Find the matching elements and save them for later jQuery.find( a, c ) ); // See if an extra function was provided var fn = arguments[ arguments.length - 1 ]; // If so, execute it in context if ( fn && fn.constructor == Function ) this.each(fn); } // Map over the $ in case of overwrite if ( typeof $ != "undefined" ) jQuery._$ = $; /** * This function accepts a string containing a CSS selector, * basic XPath, or raw HTML, which is then used to match a set of elements. * The HTML string is different from the traditional selectors in that * it creates the DOM elements representing that HTML string, on the fly, * to be (assumedly) inserted into the document later. * * The core functionality of jQuery centers around this function. * Everything in jQuery is based upon this, or uses this in some way. * The most basic use of this function is to pass in an expression * (usually consisting of CSS or XPath), which then finds all matching * elements and remembers them for later use. * * By default, $() looks for DOM elements within the context of the * current HTML document. * * @example $("div > p") * @desc This finds all p elements that are children of a div element. * @before

one

two

three

* @result [

two

] * * @example $("

Hello

").appendTo("#body") * @desc Creates a div element (and all of its contents) dynamically, and appends it to the element with the ID of body. * * @name $ * @param String expr An expression to search with, or a string of HTML to create on the fly. * @cat Core * @type jQuery */ /** * This function accepts a string containing a CSS selector, or * basic XPath, which is then used to match a set of elements with the * context of the specified DOM element, or document * * @example $("div", xml.responseXML) * @desc This finds all div elements within the specified XML document. * * @name $ * @param String expr An expression to search with. * @param Element context A DOM Element, or Document, representing the base context. * @cat Core * @type jQuery */ /** * Wrap jQuery functionality around a specific DOM Element. * This function also accepts XML Documents and Window objects * as valid arguments (even though they are not DOM Elements). * * @example $(document).find("div > p") * @before

one

two

three

* @result [

two

] * * @example $(document.body).background( "black" ); * @desc Sets the background color of the page to black. * * @name $ * @param Element elem A DOM element to be encapsulated by a jQuery object. * @cat Core * @type jQuery */ /** * Wrap jQuery functionality around a set of DOM Elements. * * @example $( myForm.elements ).hide() * @desc Hides all the input elements within a form * * @name $ * @param Array elems An array of DOM elements to be encapsulated by a jQuery object. * @cat Core * @type jQuery */ /** * A shorthand for $(document).ready(), allowing you to bind a function * to be executed when the DOM document has finished loading. This function * behaves just like $(document).ready(), in that it should be used to wrap * all of the other $() operations on your page. While this function is, * technically, chainable - there really isn't much use for chaining against it. * * @example $(function(){ * // Document is ready * }); * @desc Executes the function when the DOM is ready to be used. * * @name $ * @param Function fn The function to execute when the DOM is ready. * @cat Core * @type jQuery */ /** * A means of creating a cloned copy of a jQuery object. This function * copies the set of matched elements from one jQuery object and creates * another, new, jQuery object containing the same elements. * * @example var div = $("div"); * $( div ).find("p"); * @desc Locates all p elements with all div elements, without disrupting the original jQuery object contained in 'div' (as would normally be the case if a simple div.find("p") was done). * * @name $ * @param jQuery obj The jQuery object to be cloned. * @cat Core * @type jQuery */ // Map the jQuery namespace to the '$' one var $ = jQuery; jQuery.fn = jQuery.prototype = { /** * The current SVN version of jQuery. * * @private * @property * @name jquery * @type String * @cat Core */ jquery: "$Rev: 276 $", /** * The number of elements currently matched. * * @example $("img").length; * @before * @result 2 * * @test cmpOK( $("div").length, "==", 2, "Get Number of Elements Found" ); * * @property * @name length * @type Number * @cat Core */ /** * The number of elements currently matched. * * @example $("img").size(); * @before * @result 2 * * @test cmpOK( $("div").size(), "==", 2, "Get Number of Elements Found" ); * * @name size * @type Number * @cat Core */ size: function() { return this.length; }, /** * Access all matched elements. This serves as a backwards-compatible * way of accessing all matched elements (other than the jQuery object * itself, which is, in fact, an array of elements). * * @example $("img").get(); * @before * @result [ ] * * @test isSet( $("div").get(), q("main","foo"), "Get All Elements" ); * * @name get * @type Array * @cat Core */ /** * Access a single matched element. num is used to access the * Nth element matched. * * @example $("img").get(1); * @before * @result [ ] * * @test cmpOK( $("div").get(0), "==", document.getElementById("main"), "Get A Single Element" ); * * @name get * @type Element * @param Number num Access the element in the Nth position. * @cat Core */ /** * Set the jQuery object to an array of elements. * * @example $("img").get([ document.body ]); * @result $("img").get() == [ document.body ] * * @private * @name get * @type jQuery * @param Elements elems An array of elements * @cat Core */ get: function( num ) { // Watch for when an array (of elements) is passed in if ( num && num.constructor == Array ) { // Use a tricky hack to make the jQuery object // look and feel like an array this.length = 0; [].push.apply( this, num ); return this; } else return num == undefined ? // Return a 'clean' array jQuery.merge( this, [] ) : // Return just the object this[num]; }, /** * Execute a function within the context of every matched element. * This means that every time the passed-in function is executed * (which is once for every element matched) the 'this' keyword * points to the specific element. * * Additionally, the function, when executed, is passed a single * argument representing the position of the element in the matched * set. * * @example $("img").each(function(){ * this.src = "test.jpg"; * }); * @before * @result * * @example $("img").each(function(i){ * alert( "Image #" + i + " is " + this ); * }); * @before * @result * * @test var div = $("div"); * div.each(function(){this.foo = 'zoo';}); * var pass = true; * for ( var i = 0; i < div.size(); i++ ) { * if ( div.get(i).foo != "zoo" ) pass = false; * } * ok( pass, "Execute a function, Relative" ); * * @name each * @type jQuery * @param Function fn A function to execute * @cat Core */ each: function( fn, args ) { return jQuery.each( this, fn, args ); }, /** * Searches every matched element for the object and returns * the index of the element, if found, starting with zero. * Returns -1 if the object wasn't found. * * @example $("*").index(document.getElementById('foobar')) * @before
* @result 0 * * @example $("*").index(document.getElementById('foo')) * @before
* @result 2 * * @example $("*").index(document.getElementById('bar')) * @before
* @result -1 * * @test ok( $([window, document]).index(window) == 0, "Check for index of elements" ); * @test ok( $([window, document]).index(document) == 1, "Check for index of elements" ); * @test var inputElements = $('#radio1,#radio2,#check1,#check2'); * @test ok( inputElements.index(document.getElementById('radio1')) == 0, "Check for index of elements" ); * @test ok( inputElements.index(document.getElementById('radio2')) == 1, "Check for index of elements" ); * @test ok( inputElements.index(document.getElementById('check1')) == 2, "Check for index of elements" ); * @test ok( inputElements.index(document.getElementById('check2')) == 3, "Check for index of elements" ); * @test ok( inputElements.index(window) == -1, "Check for not found index" ); * @test ok( inputElements.index(document) == -1, "Check for not found index" ); * * @name index * @type Number * @param Object obj Object to search for * @cat Core */ index: function( obj ) { var pos = -1; this.each(function(i){ if ( this == obj ) pos = i; }); return pos; }, /** * Access a property on the first matched element. * This method makes it easy to retrieve a property value * from the first matched element. * * @example $("img").attr("src"); * @before * @result test.jpg * * @test ok( $('#text1').attr('value') == "Test", 'Check for value attribute' ); * @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' ); * * @name attr * @type Object * @param String name The name of the property to access. * @cat DOM */ /** * Set a hash of key/value object properties to all matched elements. * This serves as the best way to set a large number of properties * on all matched elements. * * @example $("img").attr({ src: "test.jpg", alt: "Test Image" }); * @before * @result Test Image * * @test var pass = true; * $("div").attr({foo: 'baz', zoo: 'ping'}).each(function(){ * if ( this.getAttribute('foo') != "baz" && this.getAttribute('zoo') != "ping" ) pass = false; * }); * ok( pass, "Set Multiple Attributes" ); * * @name attr * @type jQuery * @param Hash prop A set of key/value pairs to set as object properties. * @cat DOM */ /** * Set a single property to a value, on all matched elements. * * @example $("img").attr("src","test.jpg"); * @before * @result * * @test var div = $("div"); * div.attr("foo", "bar"); * var pass = true; * for ( var i = 0; i < div.size(); i++ ) { * if ( div.get(i).getAttribute('foo') != "bar" ) pass = false; * } * ok( pass, "Set Attribute" ); * * @test $("#name").attr('name', 'something'); * ok( $("#name").name() == 'something', 'Set name attribute' ); * * @name attr * @type jQuery * @param String key The name of the property to set. * @param Object value The value to set the property to. * @cat DOM */ attr: function( key, value, type ) { // Check to see if we're setting style values return key.constructor != String || value != undefined ? this.each(function(){ // See if we're setting a hash of styles if ( value == undefined ) // Set all the styles for ( var prop in key ) jQuery.attr( type ? this.style : this, prop, key[prop] ); // See if we're setting a single key/value style else jQuery.attr( type ? this.style : this, key, value ); }) : // Look for the case where we're accessing a style value jQuery[ type || "attr" ]( this[0], key ); }, /** * Access a style property on the first matched element. * This method makes it easy to retrieve a style property value * from the first matched element. * * @example $("p").css("color"); * @before

Test Paragraph.

* @result red * @desc Retrieves the color style of the first paragraph * * @example $("p").css("fontWeight"); * @before

Test Paragraph.

* @result bold * @desc Retrieves the font-weight style of the first paragraph. * Note that for all style properties with a dash (like 'font-weight'), you have to * write it in camelCase. In other words: Every time you have a '-' in a * property, remove it and replace the next character with an uppercase * representation of itself. Eg. fontWeight, fontSize, fontFamily, borderWidth, * borderStyle, borderBottomWidth etc. * * @test ok( $('#foo').css("display") == 'block', 'Check for css property "display"'); * * @name css * @type Object * @param String name The name of the property to access. * @cat CSS */ /** * Set a hash of key/value style properties to all matched elements. * This serves as the best way to set a large number of style properties * on all matched elements. * * @example $("p").css({ color: "red", background: "blue" }); * @before

Test Paragraph.

* @result

Test Paragraph.

* * @test ok( $('#foo').is(':visible'), 'Modifying CSS display: Assert element is visible'); * @test $('#foo').css({display: 'none'}); * ok( !$('#foo').is(':visible'), 'Modified CSS display: Assert element is hidden'); * @test $('#foo').css({display: 'block'}); * ok( $('#foo').is(':visible'), 'Modified CSS display: Assert element is visible'); * * @name css * @type jQuery * @param Hash prop A set of key/value pairs to set as style properties. * @cat CSS */ /** * Set a single style property to a value, on all matched elements. * * @example $("p").css("color","red"); * @before

Test Paragraph.

* @result

Test Paragraph.

* @desc Changes the color of all paragraphs to red * * * @test ok( $('#foo').is(':visible'), 'Modifying CSS display: Assert element is visible'); * @test $('#foo').css('display', 'none'); * ok( !$('#foo').is(':visible'), 'Modified CSS display: Assert element is hidden'); * @test $('#foo').css('display', 'block'); * ok( $('#foo').is(':visible'), 'Modified CSS display: Assert element is visible'); * * @name css * @type jQuery * @param String key The name of the property to set. * @param Object value The value to set the property to. * @cat CSS */ css: function( key, value ) { return this.attr( key, value, "curCSS" ); }, /** * Retrieve the text contents of all matched elements. The result is * a string that contains the combined text contents of all matched * elements. This method works on both HTML and XML documents. * * @example $("p").text(); * @before

Test Paragraph.

* @result Test Paragraph. * * @test var expected = "This link has class=\"blog\": Simon Willison's Weblog"; * ok( $('#sap').text() == expected, 'Check for merged text of more then one element.' ); * * @name text * @type String * @cat DOM */ text: function(e) { e = e || this; var t = ""; for ( var j = 0; j < e.length; j++ ) { var r = e[j].childNodes; for ( var i = 0; i < r.length; i++ ) if ( r[i].nodeType != 8 ) t += r[i].nodeType != 1 ? r[i].nodeValue : jQuery.fn.text([ r[i] ]); } return t; }, /** * Wrap all matched elements with a structure of other elements. * This wrapping process is most useful for injecting additional * stucture into a document, without ruining the original semantic * qualities of a document. * * This works by going through the first element * provided (which is generated, on the fly, from the provided HTML) * and finds the deepest ancestor element within its * structure - it is that element that will en-wrap everything else. * * @example $("p").wrap("
"); * @before

Test Paragraph.

* @result

Test Paragraph.

* * @test var defaultText = 'Try them out:' * var result = $('#first').wrap('
').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('
xxyy
').text() * ok( 'xx' + defaultText + 'yy' == result, 'Check for wrapping' ); * ok( $('#first').parent().parent().is('.red'), 'Check if wrapper div has class "red"' ); * * @name wrap * @type jQuery * @param String html A string of HTML, that will be created on the fly and wrapped around the target. * @cat DOM/Manipulation */ /** * Wrap all matched elements with a structure of other elements. * This wrapping process is most useful for injecting additional * stucture into a document, without ruining the original semantic * qualities of a document. * * This works by going through the first element * provided and finding the deepest ancestor element within its * structure - it is that element that will en-wrap everything else. * * @example $("p").wrap("
"); * @before

Test Paragraph.

* @result

Test Paragraph.

* * @name wrap * @type jQuery * @param Element elem A DOM element that will be wrapped. * @cat DOM/Manipulation */ wrap: function() { // The elements to wrap the target around var a = jQuery.clean(arguments); // Wrap each of the matched elements individually return this.each(function(){ // Clone the structure that we're using to wrap var b = a[0].cloneNode(true); // Insert it before the element to be wrapped this.parentNode.insertBefore( b, this ); // Find he deepest point in the wrap structure while ( b.firstChild ) b = b.firstChild; // Move the matched element to within the wrap structure b.appendChild( this ); }); }, /** * Append any number of elements to the inside of every matched elements, * generated from the provided HTML. * This operation is similar to doing an appendChild to all the * specified elements, adding them into the document. * * @example $("p").append("Hello"); * @before

I would like to say:

* @result

I would like to say: Hello

* * @test var defaultText = 'Try them out:' * var result = $('#first').append('buga'); * ok( result.text() == defaultText + 'buga', 'Check if text appending works' ); * * @name append * @type jQuery * @param String html A string of HTML, that will be created on the fly and appended to the target. * @cat DOM/Manipulation */ /** * Append an element to the inside of all matched elements. * This operation is similar to doing an appendChild to all the * specified elements, adding them into the document. * * @example $("p").append( $("#foo")[0] ); * @before

I would like to say:

Hello * @result

I would like to say: Hello

* * @test var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:"; * $('#sap').append(document.getElementById('first')); * ok( expected == $('#sap').text(), "Check for appending of element" ); * * @name append * @type jQuery * @param Element elem A DOM element that will be appended. * @cat DOM/Manipulation */ /** * Append any number of elements to the inside of all matched elements. * This operation is similar to doing an appendChild to all the * specified elements, adding them into the document. * * @example $("p").append( $("b") ); * @before

I would like to say:

Hello * @result

I would like to say: Hello

* * @test var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo"; * $('#sap').append([document.getElementById('first'), document.getElementById('yahoo')]); * ok( expected == $('#sap').text(), "Check for appending of array of elements" ); * * @name append * @type jQuery * @param Array elems An array of elements, all of which will be appended. * @cat DOM/Manipulation */ append: function() { return this.domManip(arguments, true, 1, function(a){ this.appendChild( a ); }); },