Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / lib / jquery-1.7.1.js @ dbddee9c

History | View | Annotate | Download (242.4 kB)

1 a7dd0415 Kostas Papadimitriou
/*!
2 a7dd0415 Kostas Papadimitriou
 * jQuery JavaScript Library v1.7.1
3 a7dd0415 Kostas Papadimitriou
 * http://jquery.com/
4 a7dd0415 Kostas Papadimitriou
 *
5 a7dd0415 Kostas Papadimitriou
 * Copyright 2011, John Resig
6 a7dd0415 Kostas Papadimitriou
 * Dual licensed under the MIT or GPL Version 2 licenses.
7 a7dd0415 Kostas Papadimitriou
 * http://jquery.org/license
8 a7dd0415 Kostas Papadimitriou
 *
9 a7dd0415 Kostas Papadimitriou
 * Includes Sizzle.js
10 a7dd0415 Kostas Papadimitriou
 * http://sizzlejs.com/
11 a7dd0415 Kostas Papadimitriou
 * Copyright 2011, The Dojo Foundation
12 a7dd0415 Kostas Papadimitriou
 * Released under the MIT, BSD, and GPL Licenses.
13 a7dd0415 Kostas Papadimitriou
 *
14 a7dd0415 Kostas Papadimitriou
 * Date: Mon Nov 21 21:11:03 2011 -0500
15 a7dd0415 Kostas Papadimitriou
 */
16 a7dd0415 Kostas Papadimitriou
(function( window, undefined ) {
17 a7dd0415 Kostas Papadimitriou
18 a7dd0415 Kostas Papadimitriou
// Use the correct document accordingly with window argument (sandbox)
19 a7dd0415 Kostas Papadimitriou
var document = window.document,
20 a7dd0415 Kostas Papadimitriou
        navigator = window.navigator,
21 a7dd0415 Kostas Papadimitriou
        location = window.location;
22 a7dd0415 Kostas Papadimitriou
var jQuery = (function() {
23 a7dd0415 Kostas Papadimitriou
24 a7dd0415 Kostas Papadimitriou
// Define a local copy of jQuery
25 a7dd0415 Kostas Papadimitriou
var jQuery = function( selector, context ) {
26 a7dd0415 Kostas Papadimitriou
                // The jQuery object is actually just the init constructor 'enhanced'
27 a7dd0415 Kostas Papadimitriou
                return new jQuery.fn.init( selector, context, rootjQuery );
28 a7dd0415 Kostas Papadimitriou
        },
29 a7dd0415 Kostas Papadimitriou
30 a7dd0415 Kostas Papadimitriou
        // Map over jQuery in case of overwrite
31 a7dd0415 Kostas Papadimitriou
        _jQuery = window.jQuery,
32 a7dd0415 Kostas Papadimitriou
33 a7dd0415 Kostas Papadimitriou
        // Map over the $ in case of overwrite
34 a7dd0415 Kostas Papadimitriou
        _$ = window.$,
35 a7dd0415 Kostas Papadimitriou
36 a7dd0415 Kostas Papadimitriou
        // A central reference to the root jQuery(document)
37 a7dd0415 Kostas Papadimitriou
        rootjQuery,
38 a7dd0415 Kostas Papadimitriou
39 a7dd0415 Kostas Papadimitriou
        // A simple way to check for HTML strings or ID strings
40 a7dd0415 Kostas Papadimitriou
        // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
41 a7dd0415 Kostas Papadimitriou
        quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
42 a7dd0415 Kostas Papadimitriou
43 a7dd0415 Kostas Papadimitriou
        // Check if a string has a non-whitespace character in it
44 a7dd0415 Kostas Papadimitriou
        rnotwhite = /\S/,
45 a7dd0415 Kostas Papadimitriou
46 a7dd0415 Kostas Papadimitriou
        // Used for trimming whitespace
47 a7dd0415 Kostas Papadimitriou
        trimLeft = /^\s+/,
48 a7dd0415 Kostas Papadimitriou
        trimRight = /\s+$/,
49 a7dd0415 Kostas Papadimitriou
50 a7dd0415 Kostas Papadimitriou
        // Match a standalone tag
51 a7dd0415 Kostas Papadimitriou
        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
52 a7dd0415 Kostas Papadimitriou
53 a7dd0415 Kostas Papadimitriou
        // JSON RegExp
54 a7dd0415 Kostas Papadimitriou
        rvalidchars = /^[\],:{}\s]*$/,
55 a7dd0415 Kostas Papadimitriou
        rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
56 a7dd0415 Kostas Papadimitriou
        rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
57 a7dd0415 Kostas Papadimitriou
        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
58 a7dd0415 Kostas Papadimitriou
59 a7dd0415 Kostas Papadimitriou
        // Useragent RegExp
60 a7dd0415 Kostas Papadimitriou
        rwebkit = /(webkit)[ \/]([\w.]+)/,
61 a7dd0415 Kostas Papadimitriou
        ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
62 a7dd0415 Kostas Papadimitriou
        rmsie = /(msie) ([\w.]+)/,
63 a7dd0415 Kostas Papadimitriou
        rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
64 a7dd0415 Kostas Papadimitriou
65 a7dd0415 Kostas Papadimitriou
        // Matches dashed string for camelizing
66 a7dd0415 Kostas Papadimitriou
        rdashAlpha = /-([a-z]|[0-9])/ig,
67 a7dd0415 Kostas Papadimitriou
        rmsPrefix = /^-ms-/,
68 a7dd0415 Kostas Papadimitriou
69 a7dd0415 Kostas Papadimitriou
        // Used by jQuery.camelCase as callback to replace()
70 a7dd0415 Kostas Papadimitriou
        fcamelCase = function( all, letter ) {
71 a7dd0415 Kostas Papadimitriou
                return ( letter + "" ).toUpperCase();
72 a7dd0415 Kostas Papadimitriou
        },
73 a7dd0415 Kostas Papadimitriou
74 a7dd0415 Kostas Papadimitriou
        // Keep a UserAgent string for use with jQuery.browser
75 a7dd0415 Kostas Papadimitriou
        userAgent = navigator.userAgent,
76 a7dd0415 Kostas Papadimitriou
77 a7dd0415 Kostas Papadimitriou
        // For matching the engine and version of the browser
78 a7dd0415 Kostas Papadimitriou
        browserMatch,
79 a7dd0415 Kostas Papadimitriou
80 a7dd0415 Kostas Papadimitriou
        // The deferred used on DOM ready
81 a7dd0415 Kostas Papadimitriou
        readyList,
82 a7dd0415 Kostas Papadimitriou
83 a7dd0415 Kostas Papadimitriou
        // The ready event handler
84 a7dd0415 Kostas Papadimitriou
        DOMContentLoaded,
85 a7dd0415 Kostas Papadimitriou
86 a7dd0415 Kostas Papadimitriou
        // Save a reference to some core methods
87 a7dd0415 Kostas Papadimitriou
        toString = Object.prototype.toString,
88 a7dd0415 Kostas Papadimitriou
        hasOwn = Object.prototype.hasOwnProperty,
89 a7dd0415 Kostas Papadimitriou
        push = Array.prototype.push,
90 a7dd0415 Kostas Papadimitriou
        slice = Array.prototype.slice,
91 a7dd0415 Kostas Papadimitriou
        trim = String.prototype.trim,
92 a7dd0415 Kostas Papadimitriou
        indexOf = Array.prototype.indexOf,
93 a7dd0415 Kostas Papadimitriou
94 a7dd0415 Kostas Papadimitriou
        // [[Class]] -> type pairs
95 a7dd0415 Kostas Papadimitriou
        class2type = {};
96 a7dd0415 Kostas Papadimitriou
97 a7dd0415 Kostas Papadimitriou
jQuery.fn = jQuery.prototype = {
98 a7dd0415 Kostas Papadimitriou
        constructor: jQuery,
99 a7dd0415 Kostas Papadimitriou
        init: function( selector, context, rootjQuery ) {
100 a7dd0415 Kostas Papadimitriou
                var match, elem, ret, doc;
101 a7dd0415 Kostas Papadimitriou
102 a7dd0415 Kostas Papadimitriou
                // Handle $(""), $(null), or $(undefined)
103 a7dd0415 Kostas Papadimitriou
                if ( !selector ) {
104 a7dd0415 Kostas Papadimitriou
                        return this;
105 a7dd0415 Kostas Papadimitriou
                }
106 a7dd0415 Kostas Papadimitriou
107 a7dd0415 Kostas Papadimitriou
                // Handle $(DOMElement)
108 a7dd0415 Kostas Papadimitriou
                if ( selector.nodeType ) {
109 a7dd0415 Kostas Papadimitriou
                        this.context = this[0] = selector;
110 a7dd0415 Kostas Papadimitriou
                        this.length = 1;
111 a7dd0415 Kostas Papadimitriou
                        return this;
112 a7dd0415 Kostas Papadimitriou
                }
113 a7dd0415 Kostas Papadimitriou
114 a7dd0415 Kostas Papadimitriou
                // The body element only exists once, optimize finding it
115 a7dd0415 Kostas Papadimitriou
                if ( selector === "body" && !context && document.body ) {
116 a7dd0415 Kostas Papadimitriou
                        this.context = document;
117 a7dd0415 Kostas Papadimitriou
                        this[0] = document.body;
118 a7dd0415 Kostas Papadimitriou
                        this.selector = selector;
119 a7dd0415 Kostas Papadimitriou
                        this.length = 1;
120 a7dd0415 Kostas Papadimitriou
                        return this;
121 a7dd0415 Kostas Papadimitriou
                }
122 a7dd0415 Kostas Papadimitriou
123 a7dd0415 Kostas Papadimitriou
                // Handle HTML strings
124 a7dd0415 Kostas Papadimitriou
                if ( typeof selector === "string" ) {
125 a7dd0415 Kostas Papadimitriou
                        // Are we dealing with HTML string or an ID?
126 a7dd0415 Kostas Papadimitriou
                        if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
127 a7dd0415 Kostas Papadimitriou
                                // Assume that strings that start and end with <> are HTML and skip the regex check
128 a7dd0415 Kostas Papadimitriou
                                match = [ null, selector, null ];
129 a7dd0415 Kostas Papadimitriou
130 a7dd0415 Kostas Papadimitriou
                        } else {
131 a7dd0415 Kostas Papadimitriou
                                match = quickExpr.exec( selector );
132 a7dd0415 Kostas Papadimitriou
                        }
133 a7dd0415 Kostas Papadimitriou
134 a7dd0415 Kostas Papadimitriou
                        // Verify a match, and that no context was specified for #id
135 a7dd0415 Kostas Papadimitriou
                        if ( match && (match[1] || !context) ) {
136 a7dd0415 Kostas Papadimitriou
137 a7dd0415 Kostas Papadimitriou
                                // HANDLE: $(html) -> $(array)
138 a7dd0415 Kostas Papadimitriou
                                if ( match[1] ) {
139 a7dd0415 Kostas Papadimitriou
                                        context = context instanceof jQuery ? context[0] : context;
140 a7dd0415 Kostas Papadimitriou
                                        doc = ( context ? context.ownerDocument || context : document );
141 a7dd0415 Kostas Papadimitriou
142 a7dd0415 Kostas Papadimitriou
                                        // If a single string is passed in and it's a single tag
143 a7dd0415 Kostas Papadimitriou
                                        // just do a createElement and skip the rest
144 a7dd0415 Kostas Papadimitriou
                                        ret = rsingleTag.exec( selector );
145 a7dd0415 Kostas Papadimitriou
146 a7dd0415 Kostas Papadimitriou
                                        if ( ret ) {
147 a7dd0415 Kostas Papadimitriou
                                                if ( jQuery.isPlainObject( context ) ) {
148 a7dd0415 Kostas Papadimitriou
                                                        selector = [ document.createElement( ret[1] ) ];
149 a7dd0415 Kostas Papadimitriou
                                                        jQuery.fn.attr.call( selector, context, true );
150 a7dd0415 Kostas Papadimitriou
151 a7dd0415 Kostas Papadimitriou
                                                } else {
152 a7dd0415 Kostas Papadimitriou
                                                        selector = [ doc.createElement( ret[1] ) ];
153 a7dd0415 Kostas Papadimitriou
                                                }
154 a7dd0415 Kostas Papadimitriou
155 a7dd0415 Kostas Papadimitriou
                                        } else {
156 a7dd0415 Kostas Papadimitriou
                                                ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
157 a7dd0415 Kostas Papadimitriou
                                                selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
158 a7dd0415 Kostas Papadimitriou
                                        }
159 a7dd0415 Kostas Papadimitriou
160 a7dd0415 Kostas Papadimitriou
                                        return jQuery.merge( this, selector );
161 a7dd0415 Kostas Papadimitriou
162 a7dd0415 Kostas Papadimitriou
                                // HANDLE: $("#id")
163 a7dd0415 Kostas Papadimitriou
                                } else {
164 a7dd0415 Kostas Papadimitriou
                                        elem = document.getElementById( match[2] );
165 a7dd0415 Kostas Papadimitriou
166 a7dd0415 Kostas Papadimitriou
                                        // Check parentNode to catch when Blackberry 4.6 returns
167 a7dd0415 Kostas Papadimitriou
                                        // nodes that are no longer in the document #6963
168 a7dd0415 Kostas Papadimitriou
                                        if ( elem && elem.parentNode ) {
169 a7dd0415 Kostas Papadimitriou
                                                // Handle the case where IE and Opera return items
170 a7dd0415 Kostas Papadimitriou
                                                // by name instead of ID
171 a7dd0415 Kostas Papadimitriou
                                                if ( elem.id !== match[2] ) {
172 a7dd0415 Kostas Papadimitriou
                                                        return rootjQuery.find( selector );
173 a7dd0415 Kostas Papadimitriou
                                                }
174 a7dd0415 Kostas Papadimitriou
175 a7dd0415 Kostas Papadimitriou
                                                // Otherwise, we inject the element directly into the jQuery object
176 a7dd0415 Kostas Papadimitriou
                                                this.length = 1;
177 a7dd0415 Kostas Papadimitriou
                                                this[0] = elem;
178 a7dd0415 Kostas Papadimitriou
                                        }
179 a7dd0415 Kostas Papadimitriou
180 a7dd0415 Kostas Papadimitriou
                                        this.context = document;
181 a7dd0415 Kostas Papadimitriou
                                        this.selector = selector;
182 a7dd0415 Kostas Papadimitriou
                                        return this;
183 a7dd0415 Kostas Papadimitriou
                                }
184 a7dd0415 Kostas Papadimitriou
185 a7dd0415 Kostas Papadimitriou
                        // HANDLE: $(expr, $(...))
186 a7dd0415 Kostas Papadimitriou
                        } else if ( !context || context.jquery ) {
187 a7dd0415 Kostas Papadimitriou
                                return ( context || rootjQuery ).find( selector );
188 a7dd0415 Kostas Papadimitriou
189 a7dd0415 Kostas Papadimitriou
                        // HANDLE: $(expr, context)
190 a7dd0415 Kostas Papadimitriou
                        // (which is just equivalent to: $(context).find(expr)
191 a7dd0415 Kostas Papadimitriou
                        } else {
192 a7dd0415 Kostas Papadimitriou
                                return this.constructor( context ).find( selector );
193 a7dd0415 Kostas Papadimitriou
                        }
194 a7dd0415 Kostas Papadimitriou
195 a7dd0415 Kostas Papadimitriou
                // HANDLE: $(function)
196 a7dd0415 Kostas Papadimitriou
                // Shortcut for document ready
197 a7dd0415 Kostas Papadimitriou
                } else if ( jQuery.isFunction( selector ) ) {
198 a7dd0415 Kostas Papadimitriou
                        return rootjQuery.ready( selector );
199 a7dd0415 Kostas Papadimitriou
                }
200 a7dd0415 Kostas Papadimitriou
201 a7dd0415 Kostas Papadimitriou
                if ( selector.selector !== undefined ) {
202 a7dd0415 Kostas Papadimitriou
                        this.selector = selector.selector;
203 a7dd0415 Kostas Papadimitriou
                        this.context = selector.context;
204 a7dd0415 Kostas Papadimitriou
                }
205 a7dd0415 Kostas Papadimitriou
206 a7dd0415 Kostas Papadimitriou
                return jQuery.makeArray( selector, this );
207 a7dd0415 Kostas Papadimitriou
        },
208 a7dd0415 Kostas Papadimitriou
209 a7dd0415 Kostas Papadimitriou
        // Start with an empty selector
210 a7dd0415 Kostas Papadimitriou
        selector: "",
211 a7dd0415 Kostas Papadimitriou
212 a7dd0415 Kostas Papadimitriou
        // The current version of jQuery being used
213 a7dd0415 Kostas Papadimitriou
        jquery: "1.7.1",
214 a7dd0415 Kostas Papadimitriou
215 a7dd0415 Kostas Papadimitriou
        // The default length of a jQuery object is 0
216 a7dd0415 Kostas Papadimitriou
        length: 0,
217 a7dd0415 Kostas Papadimitriou
218 a7dd0415 Kostas Papadimitriou
        // The number of elements contained in the matched element set
219 a7dd0415 Kostas Papadimitriou
        size: function() {
220 a7dd0415 Kostas Papadimitriou
                return this.length;
221 a7dd0415 Kostas Papadimitriou
        },
222 a7dd0415 Kostas Papadimitriou
223 a7dd0415 Kostas Papadimitriou
        toArray: function() {
224 a7dd0415 Kostas Papadimitriou
                return slice.call( this, 0 );
225 a7dd0415 Kostas Papadimitriou
        },
226 a7dd0415 Kostas Papadimitriou
227 a7dd0415 Kostas Papadimitriou
        // Get the Nth element in the matched element set OR
228 a7dd0415 Kostas Papadimitriou
        // Get the whole matched element set as a clean array
229 a7dd0415 Kostas Papadimitriou
        get: function( num ) {
230 a7dd0415 Kostas Papadimitriou
                return num == null ?
231 a7dd0415 Kostas Papadimitriou
232 a7dd0415 Kostas Papadimitriou
                        // Return a 'clean' array
233 a7dd0415 Kostas Papadimitriou
                        this.toArray() :
234 a7dd0415 Kostas Papadimitriou
235 a7dd0415 Kostas Papadimitriou
                        // Return just the object
236 a7dd0415 Kostas Papadimitriou
                        ( num < 0 ? this[ this.length + num ] : this[ num ] );
237 a7dd0415 Kostas Papadimitriou
        },
238 a7dd0415 Kostas Papadimitriou
239 a7dd0415 Kostas Papadimitriou
        // Take an array of elements and push it onto the stack
240 a7dd0415 Kostas Papadimitriou
        // (returning the new matched element set)
241 a7dd0415 Kostas Papadimitriou
        pushStack: function( elems, name, selector ) {
242 a7dd0415 Kostas Papadimitriou
                // Build a new jQuery matched element set
243 a7dd0415 Kostas Papadimitriou
                var ret = this.constructor();
244 a7dd0415 Kostas Papadimitriou
245 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isArray( elems ) ) {
246 a7dd0415 Kostas Papadimitriou
                        push.apply( ret, elems );
247 a7dd0415 Kostas Papadimitriou
248 a7dd0415 Kostas Papadimitriou
                } else {
249 a7dd0415 Kostas Papadimitriou
                        jQuery.merge( ret, elems );
250 a7dd0415 Kostas Papadimitriou
                }
251 a7dd0415 Kostas Papadimitriou
252 a7dd0415 Kostas Papadimitriou
                // Add the old object onto the stack (as a reference)
253 a7dd0415 Kostas Papadimitriou
                ret.prevObject = this;
254 a7dd0415 Kostas Papadimitriou
255 a7dd0415 Kostas Papadimitriou
                ret.context = this.context;
256 a7dd0415 Kostas Papadimitriou
257 a7dd0415 Kostas Papadimitriou
                if ( name === "find" ) {
258 a7dd0415 Kostas Papadimitriou
                        ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
259 a7dd0415 Kostas Papadimitriou
                } else if ( name ) {
260 a7dd0415 Kostas Papadimitriou
                        ret.selector = this.selector + "." + name + "(" + selector + ")";
261 a7dd0415 Kostas Papadimitriou
                }
262 a7dd0415 Kostas Papadimitriou
263 a7dd0415 Kostas Papadimitriou
                // Return the newly-formed element set
264 a7dd0415 Kostas Papadimitriou
                return ret;
265 a7dd0415 Kostas Papadimitriou
        },
266 a7dd0415 Kostas Papadimitriou
267 a7dd0415 Kostas Papadimitriou
        // Execute a callback for every element in the matched set.
268 a7dd0415 Kostas Papadimitriou
        // (You can seed the arguments with an array of args, but this is
269 a7dd0415 Kostas Papadimitriou
        // only used internally.)
270 a7dd0415 Kostas Papadimitriou
        each: function( callback, args ) {
271 a7dd0415 Kostas Papadimitriou
                return jQuery.each( this, callback, args );
272 a7dd0415 Kostas Papadimitriou
        },
273 a7dd0415 Kostas Papadimitriou
274 a7dd0415 Kostas Papadimitriou
        ready: function( fn ) {
275 a7dd0415 Kostas Papadimitriou
                // Attach the listeners
276 a7dd0415 Kostas Papadimitriou
                jQuery.bindReady();
277 a7dd0415 Kostas Papadimitriou
278 a7dd0415 Kostas Papadimitriou
                // Add the callback
279 a7dd0415 Kostas Papadimitriou
                readyList.add( fn );
280 a7dd0415 Kostas Papadimitriou
281 a7dd0415 Kostas Papadimitriou
                return this;
282 a7dd0415 Kostas Papadimitriou
        },
283 a7dd0415 Kostas Papadimitriou
284 a7dd0415 Kostas Papadimitriou
        eq: function( i ) {
285 a7dd0415 Kostas Papadimitriou
                i = +i;
286 a7dd0415 Kostas Papadimitriou
                return i === -1 ?
287 a7dd0415 Kostas Papadimitriou
                        this.slice( i ) :
288 a7dd0415 Kostas Papadimitriou
                        this.slice( i, i + 1 );
289 a7dd0415 Kostas Papadimitriou
        },
290 a7dd0415 Kostas Papadimitriou
291 a7dd0415 Kostas Papadimitriou
        first: function() {
292 a7dd0415 Kostas Papadimitriou
                return this.eq( 0 );
293 a7dd0415 Kostas Papadimitriou
        },
294 a7dd0415 Kostas Papadimitriou
295 a7dd0415 Kostas Papadimitriou
        last: function() {
296 a7dd0415 Kostas Papadimitriou
                return this.eq( -1 );
297 a7dd0415 Kostas Papadimitriou
        },
298 a7dd0415 Kostas Papadimitriou
299 a7dd0415 Kostas Papadimitriou
        slice: function() {
300 a7dd0415 Kostas Papadimitriou
                return this.pushStack( slice.apply( this, arguments ),
301 a7dd0415 Kostas Papadimitriou
                        "slice", slice.call(arguments).join(",") );
302 a7dd0415 Kostas Papadimitriou
        },
303 a7dd0415 Kostas Papadimitriou
304 a7dd0415 Kostas Papadimitriou
        map: function( callback ) {
305 a7dd0415 Kostas Papadimitriou
                return this.pushStack( jQuery.map(this, function( elem, i ) {
306 a7dd0415 Kostas Papadimitriou
                        return callback.call( elem, i, elem );
307 a7dd0415 Kostas Papadimitriou
                }));
308 a7dd0415 Kostas Papadimitriou
        },
309 a7dd0415 Kostas Papadimitriou
310 a7dd0415 Kostas Papadimitriou
        end: function() {
311 a7dd0415 Kostas Papadimitriou
                return this.prevObject || this.constructor(null);
312 a7dd0415 Kostas Papadimitriou
        },
313 a7dd0415 Kostas Papadimitriou
314 a7dd0415 Kostas Papadimitriou
        // For internal use only.
315 a7dd0415 Kostas Papadimitriou
        // Behaves like an Array's method, not like a jQuery method.
316 a7dd0415 Kostas Papadimitriou
        push: push,
317 a7dd0415 Kostas Papadimitriou
        sort: [].sort,
318 a7dd0415 Kostas Papadimitriou
        splice: [].splice
319 a7dd0415 Kostas Papadimitriou
};
320 a7dd0415 Kostas Papadimitriou
321 a7dd0415 Kostas Papadimitriou
// Give the init function the jQuery prototype for later instantiation
322 a7dd0415 Kostas Papadimitriou
jQuery.fn.init.prototype = jQuery.fn;
323 a7dd0415 Kostas Papadimitriou
324 a7dd0415 Kostas Papadimitriou
jQuery.extend = jQuery.fn.extend = function() {
325 a7dd0415 Kostas Papadimitriou
        var options, name, src, copy, copyIsArray, clone,
326 a7dd0415 Kostas Papadimitriou
                target = arguments[0] || {},
327 a7dd0415 Kostas Papadimitriou
                i = 1,
328 a7dd0415 Kostas Papadimitriou
                length = arguments.length,
329 a7dd0415 Kostas Papadimitriou
                deep = false;
330 a7dd0415 Kostas Papadimitriou
331 a7dd0415 Kostas Papadimitriou
        // Handle a deep copy situation
332 a7dd0415 Kostas Papadimitriou
        if ( typeof target === "boolean" ) {
333 a7dd0415 Kostas Papadimitriou
                deep = target;
334 a7dd0415 Kostas Papadimitriou
                target = arguments[1] || {};
335 a7dd0415 Kostas Papadimitriou
                // skip the boolean and the target
336 a7dd0415 Kostas Papadimitriou
                i = 2;
337 a7dd0415 Kostas Papadimitriou
        }
338 a7dd0415 Kostas Papadimitriou
339 a7dd0415 Kostas Papadimitriou
        // Handle case when target is a string or something (possible in deep copy)
340 a7dd0415 Kostas Papadimitriou
        if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
341 a7dd0415 Kostas Papadimitriou
                target = {};
342 a7dd0415 Kostas Papadimitriou
        }
343 a7dd0415 Kostas Papadimitriou
344 a7dd0415 Kostas Papadimitriou
        // extend jQuery itself if only one argument is passed
345 a7dd0415 Kostas Papadimitriou
        if ( length === i ) {
346 a7dd0415 Kostas Papadimitriou
                target = this;
347 a7dd0415 Kostas Papadimitriou
                --i;
348 a7dd0415 Kostas Papadimitriou
        }
349 a7dd0415 Kostas Papadimitriou
350 a7dd0415 Kostas Papadimitriou
        for ( ; i < length; i++ ) {
351 a7dd0415 Kostas Papadimitriou
                // Only deal with non-null/undefined values
352 a7dd0415 Kostas Papadimitriou
                if ( (options = arguments[ i ]) != null ) {
353 a7dd0415 Kostas Papadimitriou
                        // Extend the base object
354 a7dd0415 Kostas Papadimitriou
                        for ( name in options ) {
355 a7dd0415 Kostas Papadimitriou
                                src = target[ name ];
356 a7dd0415 Kostas Papadimitriou
                                copy = options[ name ];
357 a7dd0415 Kostas Papadimitriou
358 a7dd0415 Kostas Papadimitriou
                                // Prevent never-ending loop
359 a7dd0415 Kostas Papadimitriou
                                if ( target === copy ) {
360 a7dd0415 Kostas Papadimitriou
                                        continue;
361 a7dd0415 Kostas Papadimitriou
                                }
362 a7dd0415 Kostas Papadimitriou
363 a7dd0415 Kostas Papadimitriou
                                // Recurse if we're merging plain objects or arrays
364 a7dd0415 Kostas Papadimitriou
                                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
365 a7dd0415 Kostas Papadimitriou
                                        if ( copyIsArray ) {
366 a7dd0415 Kostas Papadimitriou
                                                copyIsArray = false;
367 a7dd0415 Kostas Papadimitriou
                                                clone = src && jQuery.isArray(src) ? src : [];
368 a7dd0415 Kostas Papadimitriou
369 a7dd0415 Kostas Papadimitriou
                                        } else {
370 a7dd0415 Kostas Papadimitriou
                                                clone = src && jQuery.isPlainObject(src) ? src : {};
371 a7dd0415 Kostas Papadimitriou
                                        }
372 a7dd0415 Kostas Papadimitriou
373 a7dd0415 Kostas Papadimitriou
                                        // Never move original objects, clone them
374 a7dd0415 Kostas Papadimitriou
                                        target[ name ] = jQuery.extend( deep, clone, copy );
375 a7dd0415 Kostas Papadimitriou
376 a7dd0415 Kostas Papadimitriou
                                // Don't bring in undefined values
377 a7dd0415 Kostas Papadimitriou
                                } else if ( copy !== undefined ) {
378 a7dd0415 Kostas Papadimitriou
                                        target[ name ] = copy;
379 a7dd0415 Kostas Papadimitriou
                                }
380 a7dd0415 Kostas Papadimitriou
                        }
381 a7dd0415 Kostas Papadimitriou
                }
382 a7dd0415 Kostas Papadimitriou
        }
383 a7dd0415 Kostas Papadimitriou
384 a7dd0415 Kostas Papadimitriou
        // Return the modified object
385 a7dd0415 Kostas Papadimitriou
        return target;
386 a7dd0415 Kostas Papadimitriou
};
387 a7dd0415 Kostas Papadimitriou
388 a7dd0415 Kostas Papadimitriou
jQuery.extend({
389 a7dd0415 Kostas Papadimitriou
        noConflict: function( deep ) {
390 a7dd0415 Kostas Papadimitriou
                if ( window.$ === jQuery ) {
391 a7dd0415 Kostas Papadimitriou
                        window.$ = _$;
392 a7dd0415 Kostas Papadimitriou
                }
393 a7dd0415 Kostas Papadimitriou
394 a7dd0415 Kostas Papadimitriou
                if ( deep && window.jQuery === jQuery ) {
395 a7dd0415 Kostas Papadimitriou
                        window.jQuery = _jQuery;
396 a7dd0415 Kostas Papadimitriou
                }
397 a7dd0415 Kostas Papadimitriou
398 a7dd0415 Kostas Papadimitriou
                return jQuery;
399 a7dd0415 Kostas Papadimitriou
        },
400 a7dd0415 Kostas Papadimitriou
401 a7dd0415 Kostas Papadimitriou
        // Is the DOM ready to be used? Set to true once it occurs.
402 a7dd0415 Kostas Papadimitriou
        isReady: false,
403 a7dd0415 Kostas Papadimitriou
404 a7dd0415 Kostas Papadimitriou
        // A counter to track how many items to wait for before
405 a7dd0415 Kostas Papadimitriou
        // the ready event fires. See #6781
406 a7dd0415 Kostas Papadimitriou
        readyWait: 1,
407 a7dd0415 Kostas Papadimitriou
408 a7dd0415 Kostas Papadimitriou
        // Hold (or release) the ready event
409 a7dd0415 Kostas Papadimitriou
        holdReady: function( hold ) {
410 a7dd0415 Kostas Papadimitriou
                if ( hold ) {
411 a7dd0415 Kostas Papadimitriou
                        jQuery.readyWait++;
412 a7dd0415 Kostas Papadimitriou
                } else {
413 a7dd0415 Kostas Papadimitriou
                        jQuery.ready( true );
414 a7dd0415 Kostas Papadimitriou
                }
415 a7dd0415 Kostas Papadimitriou
        },
416 a7dd0415 Kostas Papadimitriou
417 a7dd0415 Kostas Papadimitriou
        // Handle when the DOM is ready
418 a7dd0415 Kostas Papadimitriou
        ready: function( wait ) {
419 a7dd0415 Kostas Papadimitriou
                // Either a released hold or an DOMready/load event and not yet ready
420 a7dd0415 Kostas Papadimitriou
                if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
421 a7dd0415 Kostas Papadimitriou
                        // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
422 a7dd0415 Kostas Papadimitriou
                        if ( !document.body ) {
423 a7dd0415 Kostas Papadimitriou
                                return setTimeout( jQuery.ready, 1 );
424 a7dd0415 Kostas Papadimitriou
                        }
425 a7dd0415 Kostas Papadimitriou
426 a7dd0415 Kostas Papadimitriou
                        // Remember that the DOM is ready
427 a7dd0415 Kostas Papadimitriou
                        jQuery.isReady = true;
428 a7dd0415 Kostas Papadimitriou
429 a7dd0415 Kostas Papadimitriou
                        // If a normal DOM Ready event fired, decrement, and wait if need be
430 a7dd0415 Kostas Papadimitriou
                        if ( wait !== true && --jQuery.readyWait > 0 ) {
431 a7dd0415 Kostas Papadimitriou
                                return;
432 a7dd0415 Kostas Papadimitriou
                        }
433 a7dd0415 Kostas Papadimitriou
434 a7dd0415 Kostas Papadimitriou
                        // If there are functions bound, to execute
435 a7dd0415 Kostas Papadimitriou
                        readyList.fireWith( document, [ jQuery ] );
436 a7dd0415 Kostas Papadimitriou
437 a7dd0415 Kostas Papadimitriou
                        // Trigger any bound ready events
438 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.fn.trigger ) {
439 a7dd0415 Kostas Papadimitriou
                                jQuery( document ).trigger( "ready" ).off( "ready" );
440 a7dd0415 Kostas Papadimitriou
                        }
441 a7dd0415 Kostas Papadimitriou
                }
442 a7dd0415 Kostas Papadimitriou
        },
443 a7dd0415 Kostas Papadimitriou
444 a7dd0415 Kostas Papadimitriou
        bindReady: function() {
445 a7dd0415 Kostas Papadimitriou
                if ( readyList ) {
446 a7dd0415 Kostas Papadimitriou
                        return;
447 a7dd0415 Kostas Papadimitriou
                }
448 a7dd0415 Kostas Papadimitriou
449 a7dd0415 Kostas Papadimitriou
                readyList = jQuery.Callbacks( "once memory" );
450 a7dd0415 Kostas Papadimitriou
451 a7dd0415 Kostas Papadimitriou
                // Catch cases where $(document).ready() is called after the
452 a7dd0415 Kostas Papadimitriou
                // browser event has already occurred.
453 a7dd0415 Kostas Papadimitriou
                if ( document.readyState === "complete" ) {
454 a7dd0415 Kostas Papadimitriou
                        // Handle it asynchronously to allow scripts the opportunity to delay ready
455 a7dd0415 Kostas Papadimitriou
                        return setTimeout( jQuery.ready, 1 );
456 a7dd0415 Kostas Papadimitriou
                }
457 a7dd0415 Kostas Papadimitriou
458 a7dd0415 Kostas Papadimitriou
                // Mozilla, Opera and webkit nightlies currently support this event
459 a7dd0415 Kostas Papadimitriou
                if ( document.addEventListener ) {
460 a7dd0415 Kostas Papadimitriou
                        // Use the handy event callback
461 a7dd0415 Kostas Papadimitriou
                        document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
462 a7dd0415 Kostas Papadimitriou
463 a7dd0415 Kostas Papadimitriou
                        // A fallback to window.onload, that will always work
464 a7dd0415 Kostas Papadimitriou
                        window.addEventListener( "load", jQuery.ready, false );
465 a7dd0415 Kostas Papadimitriou
466 a7dd0415 Kostas Papadimitriou
                // If IE event model is used
467 a7dd0415 Kostas Papadimitriou
                } else if ( document.attachEvent ) {
468 a7dd0415 Kostas Papadimitriou
                        // ensure firing before onload,
469 a7dd0415 Kostas Papadimitriou
                        // maybe late but safe also for iframes
470 a7dd0415 Kostas Papadimitriou
                        document.attachEvent( "onreadystatechange", DOMContentLoaded );
471 a7dd0415 Kostas Papadimitriou
472 a7dd0415 Kostas Papadimitriou
                        // A fallback to window.onload, that will always work
473 a7dd0415 Kostas Papadimitriou
                        window.attachEvent( "onload", jQuery.ready );
474 a7dd0415 Kostas Papadimitriou
475 a7dd0415 Kostas Papadimitriou
                        // If IE and not a frame
476 a7dd0415 Kostas Papadimitriou
                        // continually check to see if the document is ready
477 a7dd0415 Kostas Papadimitriou
                        var toplevel = false;
478 a7dd0415 Kostas Papadimitriou
479 a7dd0415 Kostas Papadimitriou
                        try {
480 a7dd0415 Kostas Papadimitriou
                                toplevel = window.frameElement == null;
481 a7dd0415 Kostas Papadimitriou
                        } catch(e) {}
482 a7dd0415 Kostas Papadimitriou
483 a7dd0415 Kostas Papadimitriou
                        if ( document.documentElement.doScroll && toplevel ) {
484 a7dd0415 Kostas Papadimitriou
                                doScrollCheck();
485 a7dd0415 Kostas Papadimitriou
                        }
486 a7dd0415 Kostas Papadimitriou
                }
487 a7dd0415 Kostas Papadimitriou
        },
488 a7dd0415 Kostas Papadimitriou
489 a7dd0415 Kostas Papadimitriou
        // See test/unit/core.js for details concerning isFunction.
490 a7dd0415 Kostas Papadimitriou
        // Since version 1.3, DOM methods and functions like alert
491 a7dd0415 Kostas Papadimitriou
        // aren't supported. They return false on IE (#2968).
492 a7dd0415 Kostas Papadimitriou
        isFunction: function( obj ) {
493 a7dd0415 Kostas Papadimitriou
                return jQuery.type(obj) === "function";
494 a7dd0415 Kostas Papadimitriou
        },
495 a7dd0415 Kostas Papadimitriou
496 a7dd0415 Kostas Papadimitriou
        isArray: Array.isArray || function( obj ) {
497 a7dd0415 Kostas Papadimitriou
                return jQuery.type(obj) === "array";
498 a7dd0415 Kostas Papadimitriou
        },
499 a7dd0415 Kostas Papadimitriou
500 a7dd0415 Kostas Papadimitriou
        // A crude way of determining if an object is a window
501 a7dd0415 Kostas Papadimitriou
        isWindow: function( obj ) {
502 a7dd0415 Kostas Papadimitriou
                return obj && typeof obj === "object" && "setInterval" in obj;
503 a7dd0415 Kostas Papadimitriou
        },
504 a7dd0415 Kostas Papadimitriou
505 a7dd0415 Kostas Papadimitriou
        isNumeric: function( obj ) {
506 a7dd0415 Kostas Papadimitriou
                return !isNaN( parseFloat(obj) ) && isFinite( obj );
507 a7dd0415 Kostas Papadimitriou
        },
508 a7dd0415 Kostas Papadimitriou
509 a7dd0415 Kostas Papadimitriou
        type: function( obj ) {
510 a7dd0415 Kostas Papadimitriou
                return obj == null ?
511 a7dd0415 Kostas Papadimitriou
                        String( obj ) :
512 a7dd0415 Kostas Papadimitriou
                        class2type[ toString.call(obj) ] || "object";
513 a7dd0415 Kostas Papadimitriou
        },
514 a7dd0415 Kostas Papadimitriou
515 a7dd0415 Kostas Papadimitriou
        isPlainObject: function( obj ) {
516 a7dd0415 Kostas Papadimitriou
                // Must be an Object.
517 a7dd0415 Kostas Papadimitriou
                // Because of IE, we also have to check the presence of the constructor property.
518 a7dd0415 Kostas Papadimitriou
                // Make sure that DOM nodes and window objects don't pass through, as well
519 a7dd0415 Kostas Papadimitriou
                if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
520 a7dd0415 Kostas Papadimitriou
                        return false;
521 a7dd0415 Kostas Papadimitriou
                }
522 a7dd0415 Kostas Papadimitriou
523 a7dd0415 Kostas Papadimitriou
                try {
524 a7dd0415 Kostas Papadimitriou
                        // Not own constructor property must be Object
525 a7dd0415 Kostas Papadimitriou
                        if ( obj.constructor &&
526 a7dd0415 Kostas Papadimitriou
                                !hasOwn.call(obj, "constructor") &&
527 a7dd0415 Kostas Papadimitriou
                                !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
528 a7dd0415 Kostas Papadimitriou
                                return false;
529 a7dd0415 Kostas Papadimitriou
                        }
530 a7dd0415 Kostas Papadimitriou
                } catch ( e ) {
531 a7dd0415 Kostas Papadimitriou
                        // IE8,9 Will throw exceptions on certain host objects #9897
532 a7dd0415 Kostas Papadimitriou
                        return false;
533 a7dd0415 Kostas Papadimitriou
                }
534 a7dd0415 Kostas Papadimitriou
535 a7dd0415 Kostas Papadimitriou
                // Own properties are enumerated firstly, so to speed up,
536 a7dd0415 Kostas Papadimitriou
                // if last one is own, then all properties are own.
537 a7dd0415 Kostas Papadimitriou
538 a7dd0415 Kostas Papadimitriou
                var key;
539 a7dd0415 Kostas Papadimitriou
                for ( key in obj ) {}
540 a7dd0415 Kostas Papadimitriou
541 a7dd0415 Kostas Papadimitriou
                return key === undefined || hasOwn.call( obj, key );
542 a7dd0415 Kostas Papadimitriou
        },
543 a7dd0415 Kostas Papadimitriou
544 a7dd0415 Kostas Papadimitriou
        isEmptyObject: function( obj ) {
545 a7dd0415 Kostas Papadimitriou
                for ( var name in obj ) {
546 a7dd0415 Kostas Papadimitriou
                        return false;
547 a7dd0415 Kostas Papadimitriou
                }
548 a7dd0415 Kostas Papadimitriou
                return true;
549 a7dd0415 Kostas Papadimitriou
        },
550 a7dd0415 Kostas Papadimitriou
551 a7dd0415 Kostas Papadimitriou
        error: function( msg ) {
552 a7dd0415 Kostas Papadimitriou
                throw new Error( msg );
553 a7dd0415 Kostas Papadimitriou
        },
554 a7dd0415 Kostas Papadimitriou
555 a7dd0415 Kostas Papadimitriou
        parseJSON: function( data ) {
556 a7dd0415 Kostas Papadimitriou
                if ( typeof data !== "string" || !data ) {
557 a7dd0415 Kostas Papadimitriou
                        return null;
558 a7dd0415 Kostas Papadimitriou
                }
559 a7dd0415 Kostas Papadimitriou
560 a7dd0415 Kostas Papadimitriou
                // Make sure leading/trailing whitespace is removed (IE can't handle it)
561 a7dd0415 Kostas Papadimitriou
                data = jQuery.trim( data );
562 a7dd0415 Kostas Papadimitriou
563 a7dd0415 Kostas Papadimitriou
                // Attempt to parse using the native JSON parser first
564 a7dd0415 Kostas Papadimitriou
                if ( window.JSON && window.JSON.parse ) {
565 a7dd0415 Kostas Papadimitriou
                        return window.JSON.parse( data );
566 a7dd0415 Kostas Papadimitriou
                }
567 a7dd0415 Kostas Papadimitriou
568 a7dd0415 Kostas Papadimitriou
                // Make sure the incoming data is actual JSON
569 a7dd0415 Kostas Papadimitriou
                // Logic borrowed from http://json.org/json2.js
570 a7dd0415 Kostas Papadimitriou
                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
571 a7dd0415 Kostas Papadimitriou
                        .replace( rvalidtokens, "]" )
572 a7dd0415 Kostas Papadimitriou
                        .replace( rvalidbraces, "")) ) {
573 a7dd0415 Kostas Papadimitriou
574 a7dd0415 Kostas Papadimitriou
                        return ( new Function( "return " + data ) )();
575 a7dd0415 Kostas Papadimitriou
576 a7dd0415 Kostas Papadimitriou
                }
577 a7dd0415 Kostas Papadimitriou
                jQuery.error( "Invalid JSON: " + data );
578 a7dd0415 Kostas Papadimitriou
        },
579 a7dd0415 Kostas Papadimitriou
580 a7dd0415 Kostas Papadimitriou
        // Cross-browser xml parsing
581 a7dd0415 Kostas Papadimitriou
        parseXML: function( data ) {
582 a7dd0415 Kostas Papadimitriou
                var xml, tmp;
583 a7dd0415 Kostas Papadimitriou
                try {
584 a7dd0415 Kostas Papadimitriou
                        if ( window.DOMParser ) { // Standard
585 a7dd0415 Kostas Papadimitriou
                                tmp = new DOMParser();
586 a7dd0415 Kostas Papadimitriou
                                xml = tmp.parseFromString( data , "text/xml" );
587 a7dd0415 Kostas Papadimitriou
                        } else { // IE
588 a7dd0415 Kostas Papadimitriou
                                xml = new ActiveXObject( "Microsoft.XMLDOM" );
589 a7dd0415 Kostas Papadimitriou
                                xml.async = "false";
590 a7dd0415 Kostas Papadimitriou
                                xml.loadXML( data );
591 a7dd0415 Kostas Papadimitriou
                        }
592 a7dd0415 Kostas Papadimitriou
                } catch( e ) {
593 a7dd0415 Kostas Papadimitriou
                        xml = undefined;
594 a7dd0415 Kostas Papadimitriou
                }
595 a7dd0415 Kostas Papadimitriou
                if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
596 a7dd0415 Kostas Papadimitriou
                        jQuery.error( "Invalid XML: " + data );
597 a7dd0415 Kostas Papadimitriou
                }
598 a7dd0415 Kostas Papadimitriou
                return xml;
599 a7dd0415 Kostas Papadimitriou
        },
600 a7dd0415 Kostas Papadimitriou
601 a7dd0415 Kostas Papadimitriou
        noop: function() {},
602 a7dd0415 Kostas Papadimitriou
603 a7dd0415 Kostas Papadimitriou
        // Evaluates a script in a global context
604 a7dd0415 Kostas Papadimitriou
        // Workarounds based on findings by Jim Driscoll
605 a7dd0415 Kostas Papadimitriou
        // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
606 a7dd0415 Kostas Papadimitriou
        globalEval: function( data ) {
607 a7dd0415 Kostas Papadimitriou
                if ( data && rnotwhite.test( data ) ) {
608 a7dd0415 Kostas Papadimitriou
                        // We use execScript on Internet Explorer
609 a7dd0415 Kostas Papadimitriou
                        // We use an anonymous function so that context is window
610 a7dd0415 Kostas Papadimitriou
                        // rather than jQuery in Firefox
611 a7dd0415 Kostas Papadimitriou
                        ( window.execScript || function( data ) {
612 a7dd0415 Kostas Papadimitriou
                                window[ "eval" ].call( window, data );
613 a7dd0415 Kostas Papadimitriou
                        } )( data );
614 a7dd0415 Kostas Papadimitriou
                }
615 a7dd0415 Kostas Papadimitriou
        },
616 a7dd0415 Kostas Papadimitriou
617 a7dd0415 Kostas Papadimitriou
        // Convert dashed to camelCase; used by the css and data modules
618 a7dd0415 Kostas Papadimitriou
        // Microsoft forgot to hump their vendor prefix (#9572)
619 a7dd0415 Kostas Papadimitriou
        camelCase: function( string ) {
620 a7dd0415 Kostas Papadimitriou
                return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
621 a7dd0415 Kostas Papadimitriou
        },
622 a7dd0415 Kostas Papadimitriou
623 a7dd0415 Kostas Papadimitriou
        nodeName: function( elem, name ) {
624 a7dd0415 Kostas Papadimitriou
                return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
625 a7dd0415 Kostas Papadimitriou
        },
626 a7dd0415 Kostas Papadimitriou
627 a7dd0415 Kostas Papadimitriou
        // args is for internal usage only
628 a7dd0415 Kostas Papadimitriou
        each: function( object, callback, args ) {
629 a7dd0415 Kostas Papadimitriou
                var name, i = 0,
630 a7dd0415 Kostas Papadimitriou
                        length = object.length,
631 a7dd0415 Kostas Papadimitriou
                        isObj = length === undefined || jQuery.isFunction( object );
632 a7dd0415 Kostas Papadimitriou
633 a7dd0415 Kostas Papadimitriou
                if ( args ) {
634 a7dd0415 Kostas Papadimitriou
                        if ( isObj ) {
635 a7dd0415 Kostas Papadimitriou
                                for ( name in object ) {
636 a7dd0415 Kostas Papadimitriou
                                        if ( callback.apply( object[ name ], args ) === false ) {
637 a7dd0415 Kostas Papadimitriou
                                                break;
638 a7dd0415 Kostas Papadimitriou
                                        }
639 a7dd0415 Kostas Papadimitriou
                                }
640 a7dd0415 Kostas Papadimitriou
                        } else {
641 a7dd0415 Kostas Papadimitriou
                                for ( ; i < length; ) {
642 a7dd0415 Kostas Papadimitriou
                                        if ( callback.apply( object[ i++ ], args ) === false ) {
643 a7dd0415 Kostas Papadimitriou
                                                break;
644 a7dd0415 Kostas Papadimitriou
                                        }
645 a7dd0415 Kostas Papadimitriou
                                }
646 a7dd0415 Kostas Papadimitriou
                        }
647 a7dd0415 Kostas Papadimitriou
648 a7dd0415 Kostas Papadimitriou
                // A special, fast, case for the most common use of each
649 a7dd0415 Kostas Papadimitriou
                } else {
650 a7dd0415 Kostas Papadimitriou
                        if ( isObj ) {
651 a7dd0415 Kostas Papadimitriou
                                for ( name in object ) {
652 a7dd0415 Kostas Papadimitriou
                                        if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
653 a7dd0415 Kostas Papadimitriou
                                                break;
654 a7dd0415 Kostas Papadimitriou
                                        }
655 a7dd0415 Kostas Papadimitriou
                                }
656 a7dd0415 Kostas Papadimitriou
                        } else {
657 a7dd0415 Kostas Papadimitriou
                                for ( ; i < length; ) {
658 a7dd0415 Kostas Papadimitriou
                                        if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
659 a7dd0415 Kostas Papadimitriou
                                                break;
660 a7dd0415 Kostas Papadimitriou
                                        }
661 a7dd0415 Kostas Papadimitriou
                                }
662 a7dd0415 Kostas Papadimitriou
                        }
663 a7dd0415 Kostas Papadimitriou
                }
664 a7dd0415 Kostas Papadimitriou
665 a7dd0415 Kostas Papadimitriou
                return object;
666 a7dd0415 Kostas Papadimitriou
        },
667 a7dd0415 Kostas Papadimitriou
668 a7dd0415 Kostas Papadimitriou
        // Use native String.trim function wherever possible
669 a7dd0415 Kostas Papadimitriou
        trim: trim ?
670 a7dd0415 Kostas Papadimitriou
                function( text ) {
671 a7dd0415 Kostas Papadimitriou
                        return text == null ?
672 a7dd0415 Kostas Papadimitriou
                                "" :
673 a7dd0415 Kostas Papadimitriou
                                trim.call( text );
674 a7dd0415 Kostas Papadimitriou
                } :
675 a7dd0415 Kostas Papadimitriou
676 a7dd0415 Kostas Papadimitriou
                // Otherwise use our own trimming functionality
677 a7dd0415 Kostas Papadimitriou
                function( text ) {
678 a7dd0415 Kostas Papadimitriou
                        return text == null ?
679 a7dd0415 Kostas Papadimitriou
                                "" :
680 a7dd0415 Kostas Papadimitriou
                                text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
681 a7dd0415 Kostas Papadimitriou
                },
682 a7dd0415 Kostas Papadimitriou
683 a7dd0415 Kostas Papadimitriou
        // results is for internal usage only
684 a7dd0415 Kostas Papadimitriou
        makeArray: function( array, results ) {
685 a7dd0415 Kostas Papadimitriou
                var ret = results || [];
686 a7dd0415 Kostas Papadimitriou
687 a7dd0415 Kostas Papadimitriou
                if ( array != null ) {
688 a7dd0415 Kostas Papadimitriou
                        // The window, strings (and functions) also have 'length'
689 a7dd0415 Kostas Papadimitriou
                        // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
690 a7dd0415 Kostas Papadimitriou
                        var type = jQuery.type( array );
691 a7dd0415 Kostas Papadimitriou
692 a7dd0415 Kostas Papadimitriou
                        if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
693 a7dd0415 Kostas Papadimitriou
                                push.call( ret, array );
694 a7dd0415 Kostas Papadimitriou
                        } else {
695 a7dd0415 Kostas Papadimitriou
                                jQuery.merge( ret, array );
696 a7dd0415 Kostas Papadimitriou
                        }
697 a7dd0415 Kostas Papadimitriou
                }
698 a7dd0415 Kostas Papadimitriou
699 a7dd0415 Kostas Papadimitriou
                return ret;
700 a7dd0415 Kostas Papadimitriou
        },
701 a7dd0415 Kostas Papadimitriou
702 a7dd0415 Kostas Papadimitriou
        inArray: function( elem, array, i ) {
703 a7dd0415 Kostas Papadimitriou
                var len;
704 a7dd0415 Kostas Papadimitriou
705 a7dd0415 Kostas Papadimitriou
                if ( array ) {
706 a7dd0415 Kostas Papadimitriou
                        if ( indexOf ) {
707 a7dd0415 Kostas Papadimitriou
                                return indexOf.call( array, elem, i );
708 a7dd0415 Kostas Papadimitriou
                        }
709 a7dd0415 Kostas Papadimitriou
710 a7dd0415 Kostas Papadimitriou
                        len = array.length;
711 a7dd0415 Kostas Papadimitriou
                        i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
712 a7dd0415 Kostas Papadimitriou
713 a7dd0415 Kostas Papadimitriou
                        for ( ; i < len; i++ ) {
714 a7dd0415 Kostas Papadimitriou
                                // Skip accessing in sparse arrays
715 a7dd0415 Kostas Papadimitriou
                                if ( i in array && array[ i ] === elem ) {
716 a7dd0415 Kostas Papadimitriou
                                        return i;
717 a7dd0415 Kostas Papadimitriou
                                }
718 a7dd0415 Kostas Papadimitriou
                        }
719 a7dd0415 Kostas Papadimitriou
                }
720 a7dd0415 Kostas Papadimitriou
721 a7dd0415 Kostas Papadimitriou
                return -1;
722 a7dd0415 Kostas Papadimitriou
        },
723 a7dd0415 Kostas Papadimitriou
724 a7dd0415 Kostas Papadimitriou
        merge: function( first, second ) {
725 a7dd0415 Kostas Papadimitriou
                var i = first.length,
726 a7dd0415 Kostas Papadimitriou
                        j = 0;
727 a7dd0415 Kostas Papadimitriou
728 a7dd0415 Kostas Papadimitriou
                if ( typeof second.length === "number" ) {
729 a7dd0415 Kostas Papadimitriou
                        for ( var l = second.length; j < l; j++ ) {
730 a7dd0415 Kostas Papadimitriou
                                first[ i++ ] = second[ j ];
731 a7dd0415 Kostas Papadimitriou
                        }
732 a7dd0415 Kostas Papadimitriou
733 a7dd0415 Kostas Papadimitriou
                } else {
734 a7dd0415 Kostas Papadimitriou
                        while ( second[j] !== undefined ) {
735 a7dd0415 Kostas Papadimitriou
                                first[ i++ ] = second[ j++ ];
736 a7dd0415 Kostas Papadimitriou
                        }
737 a7dd0415 Kostas Papadimitriou
                }
738 a7dd0415 Kostas Papadimitriou
739 a7dd0415 Kostas Papadimitriou
                first.length = i;
740 a7dd0415 Kostas Papadimitriou
741 a7dd0415 Kostas Papadimitriou
                return first;
742 a7dd0415 Kostas Papadimitriou
        },
743 a7dd0415 Kostas Papadimitriou
744 a7dd0415 Kostas Papadimitriou
        grep: function( elems, callback, inv ) {
745 a7dd0415 Kostas Papadimitriou
                var ret = [], retVal;
746 a7dd0415 Kostas Papadimitriou
                inv = !!inv;
747 a7dd0415 Kostas Papadimitriou
748 a7dd0415 Kostas Papadimitriou
                // Go through the array, only saving the items
749 a7dd0415 Kostas Papadimitriou
                // that pass the validator function
750 a7dd0415 Kostas Papadimitriou
                for ( var i = 0, length = elems.length; i < length; i++ ) {
751 a7dd0415 Kostas Papadimitriou
                        retVal = !!callback( elems[ i ], i );
752 a7dd0415 Kostas Papadimitriou
                        if ( inv !== retVal ) {
753 a7dd0415 Kostas Papadimitriou
                                ret.push( elems[ i ] );
754 a7dd0415 Kostas Papadimitriou
                        }
755 a7dd0415 Kostas Papadimitriou
                }
756 a7dd0415 Kostas Papadimitriou
757 a7dd0415 Kostas Papadimitriou
                return ret;
758 a7dd0415 Kostas Papadimitriou
        },
759 a7dd0415 Kostas Papadimitriou
760 a7dd0415 Kostas Papadimitriou
        // arg is for internal usage only
761 a7dd0415 Kostas Papadimitriou
        map: function( elems, callback, arg ) {
762 a7dd0415 Kostas Papadimitriou
                var value, key, ret = [],
763 a7dd0415 Kostas Papadimitriou
                        i = 0,
764 a7dd0415 Kostas Papadimitriou
                        length = elems.length,
765 a7dd0415 Kostas Papadimitriou
                        // jquery objects are treated as arrays
766 a7dd0415 Kostas Papadimitriou
                        isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
767 a7dd0415 Kostas Papadimitriou
768 a7dd0415 Kostas Papadimitriou
                // Go through the array, translating each of the items to their
769 a7dd0415 Kostas Papadimitriou
                if ( isArray ) {
770 a7dd0415 Kostas Papadimitriou
                        for ( ; i < length; i++ ) {
771 a7dd0415 Kostas Papadimitriou
                                value = callback( elems[ i ], i, arg );
772 a7dd0415 Kostas Papadimitriou
773 a7dd0415 Kostas Papadimitriou
                                if ( value != null ) {
774 a7dd0415 Kostas Papadimitriou
                                        ret[ ret.length ] = value;
775 a7dd0415 Kostas Papadimitriou
                                }
776 a7dd0415 Kostas Papadimitriou
                        }
777 a7dd0415 Kostas Papadimitriou
778 a7dd0415 Kostas Papadimitriou
                // Go through every key on the object,
779 a7dd0415 Kostas Papadimitriou
                } else {
780 a7dd0415 Kostas Papadimitriou
                        for ( key in elems ) {
781 a7dd0415 Kostas Papadimitriou
                                value = callback( elems[ key ], key, arg );
782 a7dd0415 Kostas Papadimitriou
783 a7dd0415 Kostas Papadimitriou
                                if ( value != null ) {
784 a7dd0415 Kostas Papadimitriou
                                        ret[ ret.length ] = value;
785 a7dd0415 Kostas Papadimitriou
                                }
786 a7dd0415 Kostas Papadimitriou
                        }
787 a7dd0415 Kostas Papadimitriou
                }
788 a7dd0415 Kostas Papadimitriou
789 a7dd0415 Kostas Papadimitriou
                // Flatten any nested arrays
790 a7dd0415 Kostas Papadimitriou
                return ret.concat.apply( [], ret );
791 a7dd0415 Kostas Papadimitriou
        },
792 a7dd0415 Kostas Papadimitriou
793 a7dd0415 Kostas Papadimitriou
        // A global GUID counter for objects
794 a7dd0415 Kostas Papadimitriou
        guid: 1,
795 a7dd0415 Kostas Papadimitriou
796 a7dd0415 Kostas Papadimitriou
        // Bind a function to a context, optionally partially applying any
797 a7dd0415 Kostas Papadimitriou
        // arguments.
798 a7dd0415 Kostas Papadimitriou
        proxy: function( fn, context ) {
799 a7dd0415 Kostas Papadimitriou
                if ( typeof context === "string" ) {
800 a7dd0415 Kostas Papadimitriou
                        var tmp = fn[ context ];
801 a7dd0415 Kostas Papadimitriou
                        context = fn;
802 a7dd0415 Kostas Papadimitriou
                        fn = tmp;
803 a7dd0415 Kostas Papadimitriou
                }
804 a7dd0415 Kostas Papadimitriou
805 a7dd0415 Kostas Papadimitriou
                // Quick check to determine if target is callable, in the spec
806 a7dd0415 Kostas Papadimitriou
                // this throws a TypeError, but we will just return undefined.
807 a7dd0415 Kostas Papadimitriou
                if ( !jQuery.isFunction( fn ) ) {
808 a7dd0415 Kostas Papadimitriou
                        return undefined;
809 a7dd0415 Kostas Papadimitriou
                }
810 a7dd0415 Kostas Papadimitriou
811 a7dd0415 Kostas Papadimitriou
                // Simulated bind
812 a7dd0415 Kostas Papadimitriou
                var args = slice.call( arguments, 2 ),
813 a7dd0415 Kostas Papadimitriou
                        proxy = function() {
814 a7dd0415 Kostas Papadimitriou
                                return fn.apply( context, args.concat( slice.call( arguments ) ) );
815 a7dd0415 Kostas Papadimitriou
                        };
816 a7dd0415 Kostas Papadimitriou
817 a7dd0415 Kostas Papadimitriou
                // Set the guid of unique handler to the same of original handler, so it can be removed
818 a7dd0415 Kostas Papadimitriou
                proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
819 a7dd0415 Kostas Papadimitriou
820 a7dd0415 Kostas Papadimitriou
                return proxy;
821 a7dd0415 Kostas Papadimitriou
        },
822 a7dd0415 Kostas Papadimitriou
823 a7dd0415 Kostas Papadimitriou
        // Mutifunctional method to get and set values to a collection
824 a7dd0415 Kostas Papadimitriou
        // The value/s can optionally be executed if it's a function
825 a7dd0415 Kostas Papadimitriou
        access: function( elems, key, value, exec, fn, pass ) {
826 a7dd0415 Kostas Papadimitriou
                var length = elems.length;
827 a7dd0415 Kostas Papadimitriou
828 a7dd0415 Kostas Papadimitriou
                // Setting many attributes
829 a7dd0415 Kostas Papadimitriou
                if ( typeof key === "object" ) {
830 a7dd0415 Kostas Papadimitriou
                        for ( var k in key ) {
831 a7dd0415 Kostas Papadimitriou
                                jQuery.access( elems, k, key[k], exec, fn, value );
832 a7dd0415 Kostas Papadimitriou
                        }
833 a7dd0415 Kostas Papadimitriou
                        return elems;
834 a7dd0415 Kostas Papadimitriou
                }
835 a7dd0415 Kostas Papadimitriou
836 a7dd0415 Kostas Papadimitriou
                // Setting one attribute
837 a7dd0415 Kostas Papadimitriou
                if ( value !== undefined ) {
838 a7dd0415 Kostas Papadimitriou
                        // Optionally, function values get executed if exec is true
839 a7dd0415 Kostas Papadimitriou
                        exec = !pass && exec && jQuery.isFunction(value);
840 a7dd0415 Kostas Papadimitriou
841 a7dd0415 Kostas Papadimitriou
                        for ( var i = 0; i < length; i++ ) {
842 a7dd0415 Kostas Papadimitriou
                                fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
843 a7dd0415 Kostas Papadimitriou
                        }
844 a7dd0415 Kostas Papadimitriou
845 a7dd0415 Kostas Papadimitriou
                        return elems;
846 a7dd0415 Kostas Papadimitriou
                }
847 a7dd0415 Kostas Papadimitriou
848 a7dd0415 Kostas Papadimitriou
                // Getting an attribute
849 a7dd0415 Kostas Papadimitriou
                return length ? fn( elems[0], key ) : undefined;
850 a7dd0415 Kostas Papadimitriou
        },
851 a7dd0415 Kostas Papadimitriou
852 a7dd0415 Kostas Papadimitriou
        now: function() {
853 a7dd0415 Kostas Papadimitriou
                return ( new Date() ).getTime();
854 a7dd0415 Kostas Papadimitriou
        },
855 a7dd0415 Kostas Papadimitriou
856 a7dd0415 Kostas Papadimitriou
        // Use of jQuery.browser is frowned upon.
857 a7dd0415 Kostas Papadimitriou
        // More details: http://docs.jquery.com/Utilities/jQuery.browser
858 a7dd0415 Kostas Papadimitriou
        uaMatch: function( ua ) {
859 a7dd0415 Kostas Papadimitriou
                ua = ua.toLowerCase();
860 a7dd0415 Kostas Papadimitriou
861 a7dd0415 Kostas Papadimitriou
                var match = rwebkit.exec( ua ) ||
862 a7dd0415 Kostas Papadimitriou
                        ropera.exec( ua ) ||
863 a7dd0415 Kostas Papadimitriou
                        rmsie.exec( ua ) ||
864 a7dd0415 Kostas Papadimitriou
                        ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
865 a7dd0415 Kostas Papadimitriou
                        [];
866 a7dd0415 Kostas Papadimitriou
867 a7dd0415 Kostas Papadimitriou
                return { browser: match[1] || "", version: match[2] || "0" };
868 a7dd0415 Kostas Papadimitriou
        },
869 a7dd0415 Kostas Papadimitriou
870 a7dd0415 Kostas Papadimitriou
        sub: function() {
871 a7dd0415 Kostas Papadimitriou
                function jQuerySub( selector, context ) {
872 a7dd0415 Kostas Papadimitriou
                        return new jQuerySub.fn.init( selector, context );
873 a7dd0415 Kostas Papadimitriou
                }
874 a7dd0415 Kostas Papadimitriou
                jQuery.extend( true, jQuerySub, this );
875 a7dd0415 Kostas Papadimitriou
                jQuerySub.superclass = this;
876 a7dd0415 Kostas Papadimitriou
                jQuerySub.fn = jQuerySub.prototype = this();
877 a7dd0415 Kostas Papadimitriou
                jQuerySub.fn.constructor = jQuerySub;
878 a7dd0415 Kostas Papadimitriou
                jQuerySub.sub = this.sub;
879 a7dd0415 Kostas Papadimitriou
                jQuerySub.fn.init = function init( selector, context ) {
880 a7dd0415 Kostas Papadimitriou
                        if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
881 a7dd0415 Kostas Papadimitriou
                                context = jQuerySub( context );
882 a7dd0415 Kostas Papadimitriou
                        }
883 a7dd0415 Kostas Papadimitriou
884 a7dd0415 Kostas Papadimitriou
                        return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
885 a7dd0415 Kostas Papadimitriou
                };
886 a7dd0415 Kostas Papadimitriou
                jQuerySub.fn.init.prototype = jQuerySub.fn;
887 a7dd0415 Kostas Papadimitriou
                var rootjQuerySub = jQuerySub(document);
888 a7dd0415 Kostas Papadimitriou
                return jQuerySub;
889 a7dd0415 Kostas Papadimitriou
        },
890 a7dd0415 Kostas Papadimitriou
891 a7dd0415 Kostas Papadimitriou
        browser: {}
892 a7dd0415 Kostas Papadimitriou
});
893 a7dd0415 Kostas Papadimitriou
894 a7dd0415 Kostas Papadimitriou
// Populate the class2type map
895 a7dd0415 Kostas Papadimitriou
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
896 a7dd0415 Kostas Papadimitriou
        class2type[ "[object " + name + "]" ] = name.toLowerCase();
897 a7dd0415 Kostas Papadimitriou
});
898 a7dd0415 Kostas Papadimitriou
899 a7dd0415 Kostas Papadimitriou
browserMatch = jQuery.uaMatch( userAgent );
900 a7dd0415 Kostas Papadimitriou
if ( browserMatch.browser ) {
901 a7dd0415 Kostas Papadimitriou
        jQuery.browser[ browserMatch.browser ] = true;
902 a7dd0415 Kostas Papadimitriou
        jQuery.browser.version = browserMatch.version;
903 a7dd0415 Kostas Papadimitriou
}
904 a7dd0415 Kostas Papadimitriou
905 a7dd0415 Kostas Papadimitriou
// Deprecated, use jQuery.browser.webkit instead
906 a7dd0415 Kostas Papadimitriou
if ( jQuery.browser.webkit ) {
907 a7dd0415 Kostas Papadimitriou
        jQuery.browser.safari = true;
908 a7dd0415 Kostas Papadimitriou
}
909 a7dd0415 Kostas Papadimitriou
910 a7dd0415 Kostas Papadimitriou
// IE doesn't match non-breaking spaces with \s
911 a7dd0415 Kostas Papadimitriou
if ( rnotwhite.test( "\xA0" ) ) {
912 a7dd0415 Kostas Papadimitriou
        trimLeft = /^[\s\xA0]+/;
913 a7dd0415 Kostas Papadimitriou
        trimRight = /[\s\xA0]+$/;
914 a7dd0415 Kostas Papadimitriou
}
915 a7dd0415 Kostas Papadimitriou
916 a7dd0415 Kostas Papadimitriou
// All jQuery objects should point back to these
917 a7dd0415 Kostas Papadimitriou
rootjQuery = jQuery(document);
918 a7dd0415 Kostas Papadimitriou
919 a7dd0415 Kostas Papadimitriou
// Cleanup functions for the document ready method
920 a7dd0415 Kostas Papadimitriou
if ( document.addEventListener ) {
921 a7dd0415 Kostas Papadimitriou
        DOMContentLoaded = function() {
922 a7dd0415 Kostas Papadimitriou
                document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
923 a7dd0415 Kostas Papadimitriou
                jQuery.ready();
924 a7dd0415 Kostas Papadimitriou
        };
925 a7dd0415 Kostas Papadimitriou
926 a7dd0415 Kostas Papadimitriou
} else if ( document.attachEvent ) {
927 a7dd0415 Kostas Papadimitriou
        DOMContentLoaded = function() {
928 a7dd0415 Kostas Papadimitriou
                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
929 a7dd0415 Kostas Papadimitriou
                if ( document.readyState === "complete" ) {
930 a7dd0415 Kostas Papadimitriou
                        document.detachEvent( "onreadystatechange", DOMContentLoaded );
931 a7dd0415 Kostas Papadimitriou
                        jQuery.ready();
932 a7dd0415 Kostas Papadimitriou
                }
933 a7dd0415 Kostas Papadimitriou
        };
934 a7dd0415 Kostas Papadimitriou
}
935 a7dd0415 Kostas Papadimitriou
936 a7dd0415 Kostas Papadimitriou
// The DOM ready check for Internet Explorer
937 a7dd0415 Kostas Papadimitriou
function doScrollCheck() {
938 a7dd0415 Kostas Papadimitriou
        if ( jQuery.isReady ) {
939 a7dd0415 Kostas Papadimitriou
                return;
940 a7dd0415 Kostas Papadimitriou
        }
941 a7dd0415 Kostas Papadimitriou
942 a7dd0415 Kostas Papadimitriou
        try {
943 a7dd0415 Kostas Papadimitriou
                // If IE is used, use the trick by Diego Perini
944 a7dd0415 Kostas Papadimitriou
                // http://javascript.nwbox.com/IEContentLoaded/
945 a7dd0415 Kostas Papadimitriou
                document.documentElement.doScroll("left");
946 a7dd0415 Kostas Papadimitriou
        } catch(e) {
947 a7dd0415 Kostas Papadimitriou
                setTimeout( doScrollCheck, 1 );
948 a7dd0415 Kostas Papadimitriou
                return;
949 a7dd0415 Kostas Papadimitriou
        }
950 a7dd0415 Kostas Papadimitriou
951 a7dd0415 Kostas Papadimitriou
        // and execute any waiting functions
952 a7dd0415 Kostas Papadimitriou
        jQuery.ready();
953 a7dd0415 Kostas Papadimitriou
}
954 a7dd0415 Kostas Papadimitriou
955 a7dd0415 Kostas Papadimitriou
return jQuery;
956 a7dd0415 Kostas Papadimitriou
957 a7dd0415 Kostas Papadimitriou
})();
958 a7dd0415 Kostas Papadimitriou
959 a7dd0415 Kostas Papadimitriou
960 a7dd0415 Kostas Papadimitriou
// String to Object flags format cache
961 a7dd0415 Kostas Papadimitriou
var flagsCache = {};
962 a7dd0415 Kostas Papadimitriou
963 a7dd0415 Kostas Papadimitriou
// Convert String-formatted flags into Object-formatted ones and store in cache
964 a7dd0415 Kostas Papadimitriou
function createFlags( flags ) {
965 a7dd0415 Kostas Papadimitriou
        var object = flagsCache[ flags ] = {},
966 a7dd0415 Kostas Papadimitriou
                i, length;
967 a7dd0415 Kostas Papadimitriou
        flags = flags.split( /\s+/ );
968 a7dd0415 Kostas Papadimitriou
        for ( i = 0, length = flags.length; i < length; i++ ) {
969 a7dd0415 Kostas Papadimitriou
                object[ flags[i] ] = true;
970 a7dd0415 Kostas Papadimitriou
        }
971 a7dd0415 Kostas Papadimitriou
        return object;
972 a7dd0415 Kostas Papadimitriou
}
973 a7dd0415 Kostas Papadimitriou
974 a7dd0415 Kostas Papadimitriou
/*
975 a7dd0415 Kostas Papadimitriou
 * Create a callback list using the following parameters:
976 a7dd0415 Kostas Papadimitriou
 *
977 a7dd0415 Kostas Papadimitriou
 *        flags:        an optional list of space-separated flags that will change how
978 a7dd0415 Kostas Papadimitriou
 *                        the callback list behaves
979 a7dd0415 Kostas Papadimitriou
 *
980 a7dd0415 Kostas Papadimitriou
 * By default a callback list will act like an event callback list and can be
981 a7dd0415 Kostas Papadimitriou
 * "fired" multiple times.
982 a7dd0415 Kostas Papadimitriou
 *
983 a7dd0415 Kostas Papadimitriou
 * Possible flags:
984 a7dd0415 Kostas Papadimitriou
 *
985 a7dd0415 Kostas Papadimitriou
 *        once:                        will ensure the callback list can only be fired once (like a Deferred)
986 a7dd0415 Kostas Papadimitriou
 *
987 a7dd0415 Kostas Papadimitriou
 *        memory:                        will keep track of previous values and will call any callback added
988 a7dd0415 Kostas Papadimitriou
 *                                        after the list has been fired right away with the latest "memorized"
989 a7dd0415 Kostas Papadimitriou
 *                                        values (like a Deferred)
990 a7dd0415 Kostas Papadimitriou
 *
991 a7dd0415 Kostas Papadimitriou
 *        unique:                        will ensure a callback can only be added once (no duplicate in the list)
992 a7dd0415 Kostas Papadimitriou
 *
993 a7dd0415 Kostas Papadimitriou
 *        stopOnFalse:        interrupt callings when a callback returns false
994 a7dd0415 Kostas Papadimitriou
 *
995 a7dd0415 Kostas Papadimitriou
 */
996 a7dd0415 Kostas Papadimitriou
jQuery.Callbacks = function( flags ) {
997 a7dd0415 Kostas Papadimitriou
998 a7dd0415 Kostas Papadimitriou
        // Convert flags from String-formatted to Object-formatted
999 a7dd0415 Kostas Papadimitriou
        // (we check in cache first)
1000 a7dd0415 Kostas Papadimitriou
        flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
1001 a7dd0415 Kostas Papadimitriou
1002 a7dd0415 Kostas Papadimitriou
        var // Actual callback list
1003 a7dd0415 Kostas Papadimitriou
                list = [],
1004 a7dd0415 Kostas Papadimitriou
                // Stack of fire calls for repeatable lists
1005 a7dd0415 Kostas Papadimitriou
                stack = [],
1006 a7dd0415 Kostas Papadimitriou
                // Last fire value (for non-forgettable lists)
1007 a7dd0415 Kostas Papadimitriou
                memory,
1008 a7dd0415 Kostas Papadimitriou
                // Flag to know if list is currently firing
1009 a7dd0415 Kostas Papadimitriou
                firing,
1010 a7dd0415 Kostas Papadimitriou
                // First callback to fire (used internally by add and fireWith)
1011 a7dd0415 Kostas Papadimitriou
                firingStart,
1012 a7dd0415 Kostas Papadimitriou
                // End of the loop when firing
1013 a7dd0415 Kostas Papadimitriou
                firingLength,
1014 a7dd0415 Kostas Papadimitriou
                // Index of currently firing callback (modified by remove if needed)
1015 a7dd0415 Kostas Papadimitriou
                firingIndex,
1016 a7dd0415 Kostas Papadimitriou
                // Add one or several callbacks to the list
1017 a7dd0415 Kostas Papadimitriou
                add = function( args ) {
1018 a7dd0415 Kostas Papadimitriou
                        var i,
1019 a7dd0415 Kostas Papadimitriou
                                length,
1020 a7dd0415 Kostas Papadimitriou
                                elem,
1021 a7dd0415 Kostas Papadimitriou
                                type,
1022 a7dd0415 Kostas Papadimitriou
                                actual;
1023 a7dd0415 Kostas Papadimitriou
                        for ( i = 0, length = args.length; i < length; i++ ) {
1024 a7dd0415 Kostas Papadimitriou
                                elem = args[ i ];
1025 a7dd0415 Kostas Papadimitriou
                                type = jQuery.type( elem );
1026 a7dd0415 Kostas Papadimitriou
                                if ( type === "array" ) {
1027 a7dd0415 Kostas Papadimitriou
                                        // Inspect recursively
1028 a7dd0415 Kostas Papadimitriou
                                        add( elem );
1029 a7dd0415 Kostas Papadimitriou
                                } else if ( type === "function" ) {
1030 a7dd0415 Kostas Papadimitriou
                                        // Add if not in unique mode and callback is not in
1031 a7dd0415 Kostas Papadimitriou
                                        if ( !flags.unique || !self.has( elem ) ) {
1032 a7dd0415 Kostas Papadimitriou
                                                list.push( elem );
1033 a7dd0415 Kostas Papadimitriou
                                        }
1034 a7dd0415 Kostas Papadimitriou
                                }
1035 a7dd0415 Kostas Papadimitriou
                        }
1036 a7dd0415 Kostas Papadimitriou
                },
1037 a7dd0415 Kostas Papadimitriou
                // Fire callbacks
1038 a7dd0415 Kostas Papadimitriou
                fire = function( context, args ) {
1039 a7dd0415 Kostas Papadimitriou
                        args = args || [];
1040 a7dd0415 Kostas Papadimitriou
                        memory = !flags.memory || [ context, args ];
1041 a7dd0415 Kostas Papadimitriou
                        firing = true;
1042 a7dd0415 Kostas Papadimitriou
                        firingIndex = firingStart || 0;
1043 a7dd0415 Kostas Papadimitriou
                        firingStart = 0;
1044 a7dd0415 Kostas Papadimitriou
                        firingLength = list.length;
1045 a7dd0415 Kostas Papadimitriou
                        for ( ; list && firingIndex < firingLength; firingIndex++ ) {
1046 a7dd0415 Kostas Papadimitriou
                                if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
1047 a7dd0415 Kostas Papadimitriou
                                        memory = true; // Mark as halted
1048 a7dd0415 Kostas Papadimitriou
                                        break;
1049 a7dd0415 Kostas Papadimitriou
                                }
1050 a7dd0415 Kostas Papadimitriou
                        }
1051 a7dd0415 Kostas Papadimitriou
                        firing = false;
1052 a7dd0415 Kostas Papadimitriou
                        if ( list ) {
1053 a7dd0415 Kostas Papadimitriou
                                if ( !flags.once ) {
1054 a7dd0415 Kostas Papadimitriou
                                        if ( stack && stack.length ) {
1055 a7dd0415 Kostas Papadimitriou
                                                memory = stack.shift();
1056 a7dd0415 Kostas Papadimitriou
                                                self.fireWith( memory[ 0 ], memory[ 1 ] );
1057 a7dd0415 Kostas Papadimitriou
                                        }
1058 a7dd0415 Kostas Papadimitriou
                                } else if ( memory === true ) {
1059 a7dd0415 Kostas Papadimitriou
                                        self.disable();
1060 a7dd0415 Kostas Papadimitriou
                                } else {
1061 a7dd0415 Kostas Papadimitriou
                                        list = [];
1062 a7dd0415 Kostas Papadimitriou
                                }
1063 a7dd0415 Kostas Papadimitriou
                        }
1064 a7dd0415 Kostas Papadimitriou
                },
1065 a7dd0415 Kostas Papadimitriou
                // Actual Callbacks object
1066 a7dd0415 Kostas Papadimitriou
                self = {
1067 a7dd0415 Kostas Papadimitriou
                        // Add a callback or a collection of callbacks to the list
1068 a7dd0415 Kostas Papadimitriou
                        add: function() {
1069 a7dd0415 Kostas Papadimitriou
                                if ( list ) {
1070 a7dd0415 Kostas Papadimitriou
                                        var length = list.length;
1071 a7dd0415 Kostas Papadimitriou
                                        add( arguments );
1072 a7dd0415 Kostas Papadimitriou
                                        // Do we need to add the callbacks to the
1073 a7dd0415 Kostas Papadimitriou
                                        // current firing batch?
1074 a7dd0415 Kostas Papadimitriou
                                        if ( firing ) {
1075 a7dd0415 Kostas Papadimitriou
                                                firingLength = list.length;
1076 a7dd0415 Kostas Papadimitriou
                                        // With memory, if we're not firing then
1077 a7dd0415 Kostas Papadimitriou
                                        // we should call right away, unless previous
1078 a7dd0415 Kostas Papadimitriou
                                        // firing was halted (stopOnFalse)
1079 a7dd0415 Kostas Papadimitriou
                                        } else if ( memory && memory !== true ) {
1080 a7dd0415 Kostas Papadimitriou
                                                firingStart = length;
1081 a7dd0415 Kostas Papadimitriou
                                                fire( memory[ 0 ], memory[ 1 ] );
1082 a7dd0415 Kostas Papadimitriou
                                        }
1083 a7dd0415 Kostas Papadimitriou
                                }
1084 a7dd0415 Kostas Papadimitriou
                                return this;
1085 a7dd0415 Kostas Papadimitriou
                        },
1086 a7dd0415 Kostas Papadimitriou
                        // Remove a callback from the list
1087 a7dd0415 Kostas Papadimitriou
                        remove: function() {
1088 a7dd0415 Kostas Papadimitriou
                                if ( list ) {
1089 a7dd0415 Kostas Papadimitriou
                                        var args = arguments,
1090 a7dd0415 Kostas Papadimitriou
                                                argIndex = 0,
1091 a7dd0415 Kostas Papadimitriou
                                                argLength = args.length;
1092 a7dd0415 Kostas Papadimitriou
                                        for ( ; argIndex < argLength ; argIndex++ ) {
1093 a7dd0415 Kostas Papadimitriou
                                                for ( var i = 0; i < list.length; i++ ) {
1094 a7dd0415 Kostas Papadimitriou
                                                        if ( args[ argIndex ] === list[ i ] ) {
1095 a7dd0415 Kostas Papadimitriou
                                                                // Handle firingIndex and firingLength
1096 a7dd0415 Kostas Papadimitriou
                                                                if ( firing ) {
1097 a7dd0415 Kostas Papadimitriou
                                                                        if ( i <= firingLength ) {
1098 a7dd0415 Kostas Papadimitriou
                                                                                firingLength--;
1099 a7dd0415 Kostas Papadimitriou
                                                                                if ( i <= firingIndex ) {
1100 a7dd0415 Kostas Papadimitriou
                                                                                        firingIndex--;
1101 a7dd0415 Kostas Papadimitriou
                                                                                }
1102 a7dd0415 Kostas Papadimitriou
                                                                        }
1103 a7dd0415 Kostas Papadimitriou
                                                                }
1104 a7dd0415 Kostas Papadimitriou
                                                                // Remove the element
1105 a7dd0415 Kostas Papadimitriou
                                                                list.splice( i--, 1 );
1106 a7dd0415 Kostas Papadimitriou
                                                                // If we have some unicity property then
1107 a7dd0415 Kostas Papadimitriou
                                                                // we only need to do this once
1108 a7dd0415 Kostas Papadimitriou
                                                                if ( flags.unique ) {
1109 a7dd0415 Kostas Papadimitriou
                                                                        break;
1110 a7dd0415 Kostas Papadimitriou
                                                                }
1111 a7dd0415 Kostas Papadimitriou
                                                        }
1112 a7dd0415 Kostas Papadimitriou
                                                }
1113 a7dd0415 Kostas Papadimitriou
                                        }
1114 a7dd0415 Kostas Papadimitriou
                                }
1115 a7dd0415 Kostas Papadimitriou
                                return this;
1116 a7dd0415 Kostas Papadimitriou
                        },
1117 a7dd0415 Kostas Papadimitriou
                        // Control if a given callback is in the list
1118 a7dd0415 Kostas Papadimitriou
                        has: function( fn ) {
1119 a7dd0415 Kostas Papadimitriou
                                if ( list ) {
1120 a7dd0415 Kostas Papadimitriou
                                        var i = 0,
1121 a7dd0415 Kostas Papadimitriou
                                                length = list.length;
1122 a7dd0415 Kostas Papadimitriou
                                        for ( ; i < length; i++ ) {
1123 a7dd0415 Kostas Papadimitriou
                                                if ( fn === list[ i ] ) {
1124 a7dd0415 Kostas Papadimitriou
                                                        return true;
1125 a7dd0415 Kostas Papadimitriou
                                                }
1126 a7dd0415 Kostas Papadimitriou
                                        }
1127 a7dd0415 Kostas Papadimitriou
                                }
1128 a7dd0415 Kostas Papadimitriou
                                return false;
1129 a7dd0415 Kostas Papadimitriou
                        },
1130 a7dd0415 Kostas Papadimitriou
                        // Remove all callbacks from the list
1131 a7dd0415 Kostas Papadimitriou
                        empty: function() {
1132 a7dd0415 Kostas Papadimitriou
                                list = [];
1133 a7dd0415 Kostas Papadimitriou
                                return this;
1134 a7dd0415 Kostas Papadimitriou
                        },
1135 a7dd0415 Kostas Papadimitriou
                        // Have the list do nothing anymore
1136 a7dd0415 Kostas Papadimitriou
                        disable: function() {
1137 a7dd0415 Kostas Papadimitriou
                                list = stack = memory = undefined;
1138 a7dd0415 Kostas Papadimitriou
                                return this;
1139 a7dd0415 Kostas Papadimitriou
                        },
1140 a7dd0415 Kostas Papadimitriou
                        // Is it disabled?
1141 a7dd0415 Kostas Papadimitriou
                        disabled: function() {
1142 a7dd0415 Kostas Papadimitriou
                                return !list;
1143 a7dd0415 Kostas Papadimitriou
                        },
1144 a7dd0415 Kostas Papadimitriou
                        // Lock the list in its current state
1145 a7dd0415 Kostas Papadimitriou
                        lock: function() {
1146 a7dd0415 Kostas Papadimitriou
                                stack = undefined;
1147 a7dd0415 Kostas Papadimitriou
                                if ( !memory || memory === true ) {
1148 a7dd0415 Kostas Papadimitriou
                                        self.disable();
1149 a7dd0415 Kostas Papadimitriou
                                }
1150 a7dd0415 Kostas Papadimitriou
                                return this;
1151 a7dd0415 Kostas Papadimitriou
                        },
1152 a7dd0415 Kostas Papadimitriou
                        // Is it locked?
1153 a7dd0415 Kostas Papadimitriou
                        locked: function() {
1154 a7dd0415 Kostas Papadimitriou
                                return !stack;
1155 a7dd0415 Kostas Papadimitriou
                        },
1156 a7dd0415 Kostas Papadimitriou
                        // Call all callbacks with the given context and arguments
1157 a7dd0415 Kostas Papadimitriou
                        fireWith: function( context, args ) {
1158 a7dd0415 Kostas Papadimitriou
                                if ( stack ) {
1159 a7dd0415 Kostas Papadimitriou
                                        if ( firing ) {
1160 a7dd0415 Kostas Papadimitriou
                                                if ( !flags.once ) {
1161 a7dd0415 Kostas Papadimitriou
                                                        stack.push( [ context, args ] );
1162 a7dd0415 Kostas Papadimitriou
                                                }
1163 a7dd0415 Kostas Papadimitriou
                                        } else if ( !( flags.once && memory ) ) {
1164 a7dd0415 Kostas Papadimitriou
                                                fire( context, args );
1165 a7dd0415 Kostas Papadimitriou
                                        }
1166 a7dd0415 Kostas Papadimitriou
                                }
1167 a7dd0415 Kostas Papadimitriou
                                return this;
1168 a7dd0415 Kostas Papadimitriou
                        },
1169 a7dd0415 Kostas Papadimitriou
                        // Call all the callbacks with the given arguments
1170 a7dd0415 Kostas Papadimitriou
                        fire: function() {
1171 a7dd0415 Kostas Papadimitriou
                                self.fireWith( this, arguments );
1172 a7dd0415 Kostas Papadimitriou
                                return this;
1173 a7dd0415 Kostas Papadimitriou
                        },
1174 a7dd0415 Kostas Papadimitriou
                        // To know if the callbacks have already been called at least once
1175 a7dd0415 Kostas Papadimitriou
                        fired: function() {
1176 a7dd0415 Kostas Papadimitriou
                                return !!memory;
1177 a7dd0415 Kostas Papadimitriou
                        }
1178 a7dd0415 Kostas Papadimitriou
                };
1179 a7dd0415 Kostas Papadimitriou
1180 a7dd0415 Kostas Papadimitriou
        return self;
1181 a7dd0415 Kostas Papadimitriou
};
1182 a7dd0415 Kostas Papadimitriou
1183 a7dd0415 Kostas Papadimitriou
1184 a7dd0415 Kostas Papadimitriou
1185 a7dd0415 Kostas Papadimitriou
1186 a7dd0415 Kostas Papadimitriou
var // Static reference to slice
1187 a7dd0415 Kostas Papadimitriou
        sliceDeferred = [].slice;
1188 a7dd0415 Kostas Papadimitriou
1189 a7dd0415 Kostas Papadimitriou
jQuery.extend({
1190 a7dd0415 Kostas Papadimitriou
1191 a7dd0415 Kostas Papadimitriou
        Deferred: function( func ) {
1192 a7dd0415 Kostas Papadimitriou
                var doneList = jQuery.Callbacks( "once memory" ),
1193 a7dd0415 Kostas Papadimitriou
                        failList = jQuery.Callbacks( "once memory" ),
1194 a7dd0415 Kostas Papadimitriou
                        progressList = jQuery.Callbacks( "memory" ),
1195 a7dd0415 Kostas Papadimitriou
                        state = "pending",
1196 a7dd0415 Kostas Papadimitriou
                        lists = {
1197 a7dd0415 Kostas Papadimitriou
                                resolve: doneList,
1198 a7dd0415 Kostas Papadimitriou
                                reject: failList,
1199 a7dd0415 Kostas Papadimitriou
                                notify: progressList
1200 a7dd0415 Kostas Papadimitriou
                        },
1201 a7dd0415 Kostas Papadimitriou
                        promise = {
1202 a7dd0415 Kostas Papadimitriou
                                done: doneList.add,
1203 a7dd0415 Kostas Papadimitriou
                                fail: failList.add,
1204 a7dd0415 Kostas Papadimitriou
                                progress: progressList.add,
1205 a7dd0415 Kostas Papadimitriou
1206 a7dd0415 Kostas Papadimitriou
                                state: function() {
1207 a7dd0415 Kostas Papadimitriou
                                        return state;
1208 a7dd0415 Kostas Papadimitriou
                                },
1209 a7dd0415 Kostas Papadimitriou
1210 a7dd0415 Kostas Papadimitriou
                                // Deprecated
1211 a7dd0415 Kostas Papadimitriou
                                isResolved: doneList.fired,
1212 a7dd0415 Kostas Papadimitriou
                                isRejected: failList.fired,
1213 a7dd0415 Kostas Papadimitriou
1214 a7dd0415 Kostas Papadimitriou
                                then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
1215 a7dd0415 Kostas Papadimitriou
                                        deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
1216 a7dd0415 Kostas Papadimitriou
                                        return this;
1217 a7dd0415 Kostas Papadimitriou
                                },
1218 a7dd0415 Kostas Papadimitriou
                                always: function() {
1219 a7dd0415 Kostas Papadimitriou
                                        deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
1220 a7dd0415 Kostas Papadimitriou
                                        return this;
1221 a7dd0415 Kostas Papadimitriou
                                },
1222 a7dd0415 Kostas Papadimitriou
                                pipe: function( fnDone, fnFail, fnProgress ) {
1223 a7dd0415 Kostas Papadimitriou
                                        return jQuery.Deferred(function( newDefer ) {
1224 a7dd0415 Kostas Papadimitriou
                                                jQuery.each( {
1225 a7dd0415 Kostas Papadimitriou
                                                        done: [ fnDone, "resolve" ],
1226 a7dd0415 Kostas Papadimitriou
                                                        fail: [ fnFail, "reject" ],
1227 a7dd0415 Kostas Papadimitriou
                                                        progress: [ fnProgress, "notify" ]
1228 a7dd0415 Kostas Papadimitriou
                                                }, function( handler, data ) {
1229 a7dd0415 Kostas Papadimitriou
                                                        var fn = data[ 0 ],
1230 a7dd0415 Kostas Papadimitriou
                                                                action = data[ 1 ],
1231 a7dd0415 Kostas Papadimitriou
                                                                returned;
1232 a7dd0415 Kostas Papadimitriou
                                                        if ( jQuery.isFunction( fn ) ) {
1233 a7dd0415 Kostas Papadimitriou
                                                                deferred[ handler ](function() {
1234 a7dd0415 Kostas Papadimitriou
                                                                        returned = fn.apply( this, arguments );
1235 a7dd0415 Kostas Papadimitriou
                                                                        if ( returned && jQuery.isFunction( returned.promise ) ) {
1236 a7dd0415 Kostas Papadimitriou
                                                                                returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
1237 a7dd0415 Kostas Papadimitriou
                                                                        } else {
1238 a7dd0415 Kostas Papadimitriou
                                                                                newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
1239 a7dd0415 Kostas Papadimitriou
                                                                        }
1240 a7dd0415 Kostas Papadimitriou
                                                                });
1241 a7dd0415 Kostas Papadimitriou
                                                        } else {
1242 a7dd0415 Kostas Papadimitriou
                                                                deferred[ handler ]( newDefer[ action ] );
1243 a7dd0415 Kostas Papadimitriou
                                                        }
1244 a7dd0415 Kostas Papadimitriou
                                                });
1245 a7dd0415 Kostas Papadimitriou
                                        }).promise();
1246 a7dd0415 Kostas Papadimitriou
                                },
1247 a7dd0415 Kostas Papadimitriou
                                // Get a promise for this deferred
1248 a7dd0415 Kostas Papadimitriou
                                // If obj is provided, the promise aspect is added to the object
1249 a7dd0415 Kostas Papadimitriou
                                promise: function( obj ) {
1250 a7dd0415 Kostas Papadimitriou
                                        if ( obj == null ) {
1251 a7dd0415 Kostas Papadimitriou
                                                obj = promise;
1252 a7dd0415 Kostas Papadimitriou
                                        } else {
1253 a7dd0415 Kostas Papadimitriou
                                                for ( var key in promise ) {
1254 a7dd0415 Kostas Papadimitriou
                                                        obj[ key ] = promise[ key ];
1255 a7dd0415 Kostas Papadimitriou
                                                }
1256 a7dd0415 Kostas Papadimitriou
                                        }
1257 a7dd0415 Kostas Papadimitriou
                                        return obj;
1258 a7dd0415 Kostas Papadimitriou
                                }
1259 a7dd0415 Kostas Papadimitriou
                        },
1260 a7dd0415 Kostas Papadimitriou
                        deferred = promise.promise({}),
1261 a7dd0415 Kostas Papadimitriou
                        key;
1262 a7dd0415 Kostas Papadimitriou
1263 a7dd0415 Kostas Papadimitriou
                for ( key in lists ) {
1264 a7dd0415 Kostas Papadimitriou
                        deferred[ key ] = lists[ key ].fire;
1265 a7dd0415 Kostas Papadimitriou
                        deferred[ key + "With" ] = lists[ key ].fireWith;
1266 a7dd0415 Kostas Papadimitriou
                }
1267 a7dd0415 Kostas Papadimitriou
1268 a7dd0415 Kostas Papadimitriou
                // Handle state
1269 a7dd0415 Kostas Papadimitriou
                deferred.done( function() {
1270 a7dd0415 Kostas Papadimitriou
                        state = "resolved";
1271 a7dd0415 Kostas Papadimitriou
                }, failList.disable, progressList.lock ).fail( function() {
1272 a7dd0415 Kostas Papadimitriou
                        state = "rejected";
1273 a7dd0415 Kostas Papadimitriou
                }, doneList.disable, progressList.lock );
1274 a7dd0415 Kostas Papadimitriou
1275 a7dd0415 Kostas Papadimitriou
                // Call given func if any
1276 a7dd0415 Kostas Papadimitriou
                if ( func ) {
1277 a7dd0415 Kostas Papadimitriou
                        func.call( deferred, deferred );
1278 a7dd0415 Kostas Papadimitriou
                }
1279 a7dd0415 Kostas Papadimitriou
1280 a7dd0415 Kostas Papadimitriou
                // All done!
1281 a7dd0415 Kostas Papadimitriou
                return deferred;
1282 a7dd0415 Kostas Papadimitriou
        },
1283 a7dd0415 Kostas Papadimitriou
1284 a7dd0415 Kostas Papadimitriou
        // Deferred helper
1285 a7dd0415 Kostas Papadimitriou
        when: function( firstParam ) {
1286 a7dd0415 Kostas Papadimitriou
                var args = sliceDeferred.call( arguments, 0 ),
1287 a7dd0415 Kostas Papadimitriou
                        i = 0,
1288 a7dd0415 Kostas Papadimitriou
                        length = args.length,
1289 a7dd0415 Kostas Papadimitriou
                        pValues = new Array( length ),
1290 a7dd0415 Kostas Papadimitriou
                        count = length,
1291 a7dd0415 Kostas Papadimitriou
                        pCount = length,
1292 a7dd0415 Kostas Papadimitriou
                        deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1293 a7dd0415 Kostas Papadimitriou
                                firstParam :
1294 a7dd0415 Kostas Papadimitriou
                                jQuery.Deferred(),
1295 a7dd0415 Kostas Papadimitriou
                        promise = deferred.promise();
1296 a7dd0415 Kostas Papadimitriou
                function resolveFunc( i ) {
1297 a7dd0415 Kostas Papadimitriou
                        return function( value ) {
1298 a7dd0415 Kostas Papadimitriou
                                args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1299 a7dd0415 Kostas Papadimitriou
                                if ( !( --count ) ) {
1300 a7dd0415 Kostas Papadimitriou
                                        deferred.resolveWith( deferred, args );
1301 a7dd0415 Kostas Papadimitriou
                                }
1302 a7dd0415 Kostas Papadimitriou
                        };
1303 a7dd0415 Kostas Papadimitriou
                }
1304 a7dd0415 Kostas Papadimitriou
                function progressFunc( i ) {
1305 a7dd0415 Kostas Papadimitriou
                        return function( value ) {
1306 a7dd0415 Kostas Papadimitriou
                                pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1307 a7dd0415 Kostas Papadimitriou
                                deferred.notifyWith( promise, pValues );
1308 a7dd0415 Kostas Papadimitriou
                        };
1309 a7dd0415 Kostas Papadimitriou
                }
1310 a7dd0415 Kostas Papadimitriou
                if ( length > 1 ) {
1311 a7dd0415 Kostas Papadimitriou
                        for ( ; i < length; i++ ) {
1312 a7dd0415 Kostas Papadimitriou
                                if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
1313 a7dd0415 Kostas Papadimitriou
                                        args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
1314 a7dd0415 Kostas Papadimitriou
                                } else {
1315 a7dd0415 Kostas Papadimitriou
                                        --count;
1316 a7dd0415 Kostas Papadimitriou
                                }
1317 a7dd0415 Kostas Papadimitriou
                        }
1318 a7dd0415 Kostas Papadimitriou
                        if ( !count ) {
1319 a7dd0415 Kostas Papadimitriou
                                deferred.resolveWith( deferred, args );
1320 a7dd0415 Kostas Papadimitriou
                        }
1321 a7dd0415 Kostas Papadimitriou
                } else if ( deferred !== firstParam ) {
1322 a7dd0415 Kostas Papadimitriou
                        deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1323 a7dd0415 Kostas Papadimitriou
                }
1324 a7dd0415 Kostas Papadimitriou
                return promise;
1325 a7dd0415 Kostas Papadimitriou
        }
1326 a7dd0415 Kostas Papadimitriou
});
1327 a7dd0415 Kostas Papadimitriou
1328 a7dd0415 Kostas Papadimitriou
1329 a7dd0415 Kostas Papadimitriou
1330 a7dd0415 Kostas Papadimitriou
1331 a7dd0415 Kostas Papadimitriou
jQuery.support = (function() {
1332 a7dd0415 Kostas Papadimitriou
1333 a7dd0415 Kostas Papadimitriou
        var support,
1334 a7dd0415 Kostas Papadimitriou
                all,
1335 a7dd0415 Kostas Papadimitriou
                a,
1336 a7dd0415 Kostas Papadimitriou
                select,
1337 a7dd0415 Kostas Papadimitriou
                opt,
1338 a7dd0415 Kostas Papadimitriou
                input,
1339 a7dd0415 Kostas Papadimitriou
                marginDiv,
1340 a7dd0415 Kostas Papadimitriou
                fragment,
1341 a7dd0415 Kostas Papadimitriou
                tds,
1342 a7dd0415 Kostas Papadimitriou
                events,
1343 a7dd0415 Kostas Papadimitriou
                eventName,
1344 a7dd0415 Kostas Papadimitriou
                i,
1345 a7dd0415 Kostas Papadimitriou
                isSupported,
1346 a7dd0415 Kostas Papadimitriou
                div = document.createElement( "div" ),
1347 a7dd0415 Kostas Papadimitriou
                documentElement = document.documentElement;
1348 a7dd0415 Kostas Papadimitriou
1349 a7dd0415 Kostas Papadimitriou
        // Preliminary tests
1350 a7dd0415 Kostas Papadimitriou
        div.setAttribute("className", "t");
1351 a7dd0415 Kostas Papadimitriou
        div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1352 a7dd0415 Kostas Papadimitriou
1353 a7dd0415 Kostas Papadimitriou
        all = div.getElementsByTagName( "*" );
1354 a7dd0415 Kostas Papadimitriou
        a = div.getElementsByTagName( "a" )[ 0 ];
1355 a7dd0415 Kostas Papadimitriou
1356 a7dd0415 Kostas Papadimitriou
        // Can't get basic test support
1357 a7dd0415 Kostas Papadimitriou
        if ( !all || !all.length || !a ) {
1358 a7dd0415 Kostas Papadimitriou
                return {};
1359 a7dd0415 Kostas Papadimitriou
        }
1360 a7dd0415 Kostas Papadimitriou
1361 a7dd0415 Kostas Papadimitriou
        // First batch of supports tests
1362 a7dd0415 Kostas Papadimitriou
        select = document.createElement( "select" );
1363 a7dd0415 Kostas Papadimitriou
        opt = select.appendChild( document.createElement("option") );
1364 a7dd0415 Kostas Papadimitriou
        input = div.getElementsByTagName( "input" )[ 0 ];
1365 a7dd0415 Kostas Papadimitriou
1366 a7dd0415 Kostas Papadimitriou
        support = {
1367 a7dd0415 Kostas Papadimitriou
                // IE strips leading whitespace when .innerHTML is used
1368 a7dd0415 Kostas Papadimitriou
                leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1369 a7dd0415 Kostas Papadimitriou
1370 a7dd0415 Kostas Papadimitriou
                // Make sure that tbody elements aren't automatically inserted
1371 a7dd0415 Kostas Papadimitriou
                // IE will insert them into empty tables
1372 a7dd0415 Kostas Papadimitriou
                tbody: !div.getElementsByTagName("tbody").length,
1373 a7dd0415 Kostas Papadimitriou
1374 a7dd0415 Kostas Papadimitriou
                // Make sure that link elements get serialized correctly by innerHTML
1375 a7dd0415 Kostas Papadimitriou
                // This requires a wrapper element in IE
1376 a7dd0415 Kostas Papadimitriou
                htmlSerialize: !!div.getElementsByTagName("link").length,
1377 a7dd0415 Kostas Papadimitriou
1378 a7dd0415 Kostas Papadimitriou
                // Get the style information from getAttribute
1379 a7dd0415 Kostas Papadimitriou
                // (IE uses .cssText instead)
1380 a7dd0415 Kostas Papadimitriou
                style: /top/.test( a.getAttribute("style") ),
1381 a7dd0415 Kostas Papadimitriou
1382 a7dd0415 Kostas Papadimitriou
                // Make sure that URLs aren't manipulated
1383 a7dd0415 Kostas Papadimitriou
                // (IE normalizes it by default)
1384 a7dd0415 Kostas Papadimitriou
                hrefNormalized: ( a.getAttribute("href") === "/a" ),
1385 a7dd0415 Kostas Papadimitriou
1386 a7dd0415 Kostas Papadimitriou
                // Make sure that element opacity exists
1387 a7dd0415 Kostas Papadimitriou
                // (IE uses filter instead)
1388 a7dd0415 Kostas Papadimitriou
                // Use a regex to work around a WebKit issue. See #5145
1389 a7dd0415 Kostas Papadimitriou
                opacity: /^0.55/.test( a.style.opacity ),
1390 a7dd0415 Kostas Papadimitriou
1391 a7dd0415 Kostas Papadimitriou
                // Verify style float existence
1392 a7dd0415 Kostas Papadimitriou
                // (IE uses styleFloat instead of cssFloat)
1393 a7dd0415 Kostas Papadimitriou
                cssFloat: !!a.style.cssFloat,
1394 a7dd0415 Kostas Papadimitriou
1395 a7dd0415 Kostas Papadimitriou
                // Make sure that if no value is specified for a checkbox
1396 a7dd0415 Kostas Papadimitriou
                // that it defaults to "on".
1397 a7dd0415 Kostas Papadimitriou
                // (WebKit defaults to "" instead)
1398 a7dd0415 Kostas Papadimitriou
                checkOn: ( input.value === "on" ),
1399 a7dd0415 Kostas Papadimitriou
1400 a7dd0415 Kostas Papadimitriou
                // Make sure that a selected-by-default option has a working selected property.
1401 a7dd0415 Kostas Papadimitriou
                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1402 a7dd0415 Kostas Papadimitriou
                optSelected: opt.selected,
1403 a7dd0415 Kostas Papadimitriou
1404 a7dd0415 Kostas Papadimitriou
                // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1405 a7dd0415 Kostas Papadimitriou
                getSetAttribute: div.className !== "t",
1406 a7dd0415 Kostas Papadimitriou
1407 a7dd0415 Kostas Papadimitriou
                // Tests for enctype support on a form(#6743)
1408 a7dd0415 Kostas Papadimitriou
                enctype: !!document.createElement("form").enctype,
1409 a7dd0415 Kostas Papadimitriou
1410 a7dd0415 Kostas Papadimitriou
                // Makes sure cloning an html5 element does not cause problems
1411 a7dd0415 Kostas Papadimitriou
                // Where outerHTML is undefined, this still works
1412 a7dd0415 Kostas Papadimitriou
                html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
1413 a7dd0415 Kostas Papadimitriou
1414 a7dd0415 Kostas Papadimitriou
                // Will be defined later
1415 a7dd0415 Kostas Papadimitriou
                submitBubbles: true,
1416 a7dd0415 Kostas Papadimitriou
                changeBubbles: true,
1417 a7dd0415 Kostas Papadimitriou
                focusinBubbles: false,
1418 a7dd0415 Kostas Papadimitriou
                deleteExpando: true,
1419 a7dd0415 Kostas Papadimitriou
                noCloneEvent: true,
1420 a7dd0415 Kostas Papadimitriou
                inlineBlockNeedsLayout: false,
1421 a7dd0415 Kostas Papadimitriou
                shrinkWrapBlocks: false,
1422 a7dd0415 Kostas Papadimitriou
                reliableMarginRight: true
1423 a7dd0415 Kostas Papadimitriou
        };
1424 a7dd0415 Kostas Papadimitriou
1425 a7dd0415 Kostas Papadimitriou
        // Make sure checked status is properly cloned
1426 a7dd0415 Kostas Papadimitriou
        input.checked = true;
1427 a7dd0415 Kostas Papadimitriou
        support.noCloneChecked = input.cloneNode( true ).checked;
1428 a7dd0415 Kostas Papadimitriou
1429 a7dd0415 Kostas Papadimitriou
        // Make sure that the options inside disabled selects aren't marked as disabled
1430 a7dd0415 Kostas Papadimitriou
        // (WebKit marks them as disabled)
1431 a7dd0415 Kostas Papadimitriou
        select.disabled = true;
1432 a7dd0415 Kostas Papadimitriou
        support.optDisabled = !opt.disabled;
1433 a7dd0415 Kostas Papadimitriou
1434 a7dd0415 Kostas Papadimitriou
        // Test to see if it's possible to delete an expando from an element
1435 a7dd0415 Kostas Papadimitriou
        // Fails in Internet Explorer
1436 a7dd0415 Kostas Papadimitriou
        try {
1437 a7dd0415 Kostas Papadimitriou
                delete div.test;
1438 a7dd0415 Kostas Papadimitriou
        } catch( e ) {
1439 a7dd0415 Kostas Papadimitriou
                support.deleteExpando = false;
1440 a7dd0415 Kostas Papadimitriou
        }
1441 a7dd0415 Kostas Papadimitriou
1442 a7dd0415 Kostas Papadimitriou
        if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1443 a7dd0415 Kostas Papadimitriou
                div.attachEvent( "onclick", function() {
1444 a7dd0415 Kostas Papadimitriou
                        // Cloning a node shouldn't copy over any
1445 a7dd0415 Kostas Papadimitriou
                        // bound event handlers (IE does this)
1446 a7dd0415 Kostas Papadimitriou
                        support.noCloneEvent = false;
1447 a7dd0415 Kostas Papadimitriou
                });
1448 a7dd0415 Kostas Papadimitriou
                div.cloneNode( true ).fireEvent( "onclick" );
1449 a7dd0415 Kostas Papadimitriou
        }
1450 a7dd0415 Kostas Papadimitriou
1451 a7dd0415 Kostas Papadimitriou
        // Check if a radio maintains its value
1452 a7dd0415 Kostas Papadimitriou
        // after being appended to the DOM
1453 a7dd0415 Kostas Papadimitriou
        input = document.createElement("input");
1454 a7dd0415 Kostas Papadimitriou
        input.value = "t";
1455 a7dd0415 Kostas Papadimitriou
        input.setAttribute("type", "radio");
1456 a7dd0415 Kostas Papadimitriou
        support.radioValue = input.value === "t";
1457 a7dd0415 Kostas Papadimitriou
1458 a7dd0415 Kostas Papadimitriou
        input.setAttribute("checked", "checked");
1459 a7dd0415 Kostas Papadimitriou
        div.appendChild( input );
1460 a7dd0415 Kostas Papadimitriou
        fragment = document.createDocumentFragment();
1461 a7dd0415 Kostas Papadimitriou
        fragment.appendChild( div.lastChild );
1462 a7dd0415 Kostas Papadimitriou
1463 a7dd0415 Kostas Papadimitriou
        // WebKit doesn't clone checked state correctly in fragments
1464 a7dd0415 Kostas Papadimitriou
        support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1465 a7dd0415 Kostas Papadimitriou
1466 a7dd0415 Kostas Papadimitriou
        // Check if a disconnected checkbox will retain its checked
1467 a7dd0415 Kostas Papadimitriou
        // value of true after appended to the DOM (IE6/7)
1468 a7dd0415 Kostas Papadimitriou
        support.appendChecked = input.checked;
1469 a7dd0415 Kostas Papadimitriou
1470 a7dd0415 Kostas Papadimitriou
        fragment.removeChild( input );
1471 a7dd0415 Kostas Papadimitriou
        fragment.appendChild( div );
1472 a7dd0415 Kostas Papadimitriou
1473 a7dd0415 Kostas Papadimitriou
        div.innerHTML = "";
1474 a7dd0415 Kostas Papadimitriou
1475 a7dd0415 Kostas Papadimitriou
        // Check if div with explicit width and no margin-right incorrectly
1476 a7dd0415 Kostas Papadimitriou
        // gets computed margin-right based on width of container. For more
1477 a7dd0415 Kostas Papadimitriou
        // info see bug #3333
1478 a7dd0415 Kostas Papadimitriou
        // Fails in WebKit before Feb 2011 nightlies
1479 a7dd0415 Kostas Papadimitriou
        // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1480 a7dd0415 Kostas Papadimitriou
        if ( window.getComputedStyle ) {
1481 a7dd0415 Kostas Papadimitriou
                marginDiv = document.createElement( "div" );
1482 a7dd0415 Kostas Papadimitriou
                marginDiv.style.width = "0";
1483 a7dd0415 Kostas Papadimitriou
                marginDiv.style.marginRight = "0";
1484 a7dd0415 Kostas Papadimitriou
                div.style.width = "2px";
1485 a7dd0415 Kostas Papadimitriou
                div.appendChild( marginDiv );
1486 a7dd0415 Kostas Papadimitriou
                support.reliableMarginRight =
1487 a7dd0415 Kostas Papadimitriou
                        ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
1488 a7dd0415 Kostas Papadimitriou
        }
1489 a7dd0415 Kostas Papadimitriou
1490 a7dd0415 Kostas Papadimitriou
        // Technique from Juriy Zaytsev
1491 a7dd0415 Kostas Papadimitriou
        // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
1492 a7dd0415 Kostas Papadimitriou
        // We only care about the case where non-standard event systems
1493 a7dd0415 Kostas Papadimitriou
        // are used, namely in IE. Short-circuiting here helps us to
1494 a7dd0415 Kostas Papadimitriou
        // avoid an eval call (in setAttribute) which can cause CSP
1495 a7dd0415 Kostas Papadimitriou
        // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1496 a7dd0415 Kostas Papadimitriou
        if ( div.attachEvent ) {
1497 a7dd0415 Kostas Papadimitriou
                for( i in {
1498 a7dd0415 Kostas Papadimitriou
                        submit: 1,
1499 a7dd0415 Kostas Papadimitriou
                        change: 1,
1500 a7dd0415 Kostas Papadimitriou
                        focusin: 1
1501 a7dd0415 Kostas Papadimitriou
                }) {
1502 a7dd0415 Kostas Papadimitriou
                        eventName = "on" + i;
1503 a7dd0415 Kostas Papadimitriou
                        isSupported = ( eventName in div );
1504 a7dd0415 Kostas Papadimitriou
                        if ( !isSupported ) {
1505 a7dd0415 Kostas Papadimitriou
                                div.setAttribute( eventName, "return;" );
1506 a7dd0415 Kostas Papadimitriou
                                isSupported = ( typeof div[ eventName ] === "function" );
1507 a7dd0415 Kostas Papadimitriou
                        }
1508 a7dd0415 Kostas Papadimitriou
                        support[ i + "Bubbles" ] = isSupported;
1509 a7dd0415 Kostas Papadimitriou
                }
1510 a7dd0415 Kostas Papadimitriou
        }
1511 a7dd0415 Kostas Papadimitriou
1512 a7dd0415 Kostas Papadimitriou
        fragment.removeChild( div );
1513 a7dd0415 Kostas Papadimitriou
1514 a7dd0415 Kostas Papadimitriou
        // Null elements to avoid leaks in IE
1515 a7dd0415 Kostas Papadimitriou
        fragment = select = opt = marginDiv = div = input = null;
1516 a7dd0415 Kostas Papadimitriou
1517 a7dd0415 Kostas Papadimitriou
        // Run tests that need a body at doc ready
1518 a7dd0415 Kostas Papadimitriou
        jQuery(function() {
1519 a7dd0415 Kostas Papadimitriou
                var container, outer, inner, table, td, offsetSupport,
1520 a7dd0415 Kostas Papadimitriou
                        conMarginTop, ptlm, vb, style, html,
1521 a7dd0415 Kostas Papadimitriou
                        body = document.getElementsByTagName("body")[0];
1522 a7dd0415 Kostas Papadimitriou
1523 a7dd0415 Kostas Papadimitriou
                if ( !body ) {
1524 a7dd0415 Kostas Papadimitriou
                        // Return for frameset docs that don't have a body
1525 a7dd0415 Kostas Papadimitriou
                        return;
1526 a7dd0415 Kostas Papadimitriou
                }
1527 a7dd0415 Kostas Papadimitriou
1528 a7dd0415 Kostas Papadimitriou
                conMarginTop = 1;
1529 a7dd0415 Kostas Papadimitriou
                ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
1530 a7dd0415 Kostas Papadimitriou
                vb = "visibility:hidden;border:0;";
1531 a7dd0415 Kostas Papadimitriou
                style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
1532 a7dd0415 Kostas Papadimitriou
                html = "<div " + style + "><div></div></div>" +
1533 a7dd0415 Kostas Papadimitriou
                        "<table " + style + " cellpadding='0' cellspacing='0'>" +
1534 a7dd0415 Kostas Papadimitriou
                        "<tr><td></td></tr></table>";
1535 a7dd0415 Kostas Papadimitriou
1536 a7dd0415 Kostas Papadimitriou
                container = document.createElement("div");
1537 a7dd0415 Kostas Papadimitriou
                container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
1538 a7dd0415 Kostas Papadimitriou
                body.insertBefore( container, body.firstChild );
1539 a7dd0415 Kostas Papadimitriou
1540 a7dd0415 Kostas Papadimitriou
                // Construct the test element
1541 a7dd0415 Kostas Papadimitriou
                div = document.createElement("div");
1542 a7dd0415 Kostas Papadimitriou
                container.appendChild( div );
1543 a7dd0415 Kostas Papadimitriou
1544 a7dd0415 Kostas Papadimitriou
                // Check if table cells still have offsetWidth/Height when they are set
1545 a7dd0415 Kostas Papadimitriou
                // to display:none and there are still other visible table cells in a
1546 a7dd0415 Kostas Papadimitriou
                // table row; if so, offsetWidth/Height are not reliable for use when
1547 a7dd0415 Kostas Papadimitriou
                // determining if an element has been hidden directly using
1548 a7dd0415 Kostas Papadimitriou
                // display:none (it is still safe to use offsets if a parent element is
1549 a7dd0415 Kostas Papadimitriou
                // hidden; don safety goggles and see bug #4512 for more information).
1550 a7dd0415 Kostas Papadimitriou
                // (only IE 8 fails this test)
1551 a7dd0415 Kostas Papadimitriou
                div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1552 a7dd0415 Kostas Papadimitriou
                tds = div.getElementsByTagName( "td" );
1553 a7dd0415 Kostas Papadimitriou
                isSupported = ( tds[ 0 ].offsetHeight === 0 );
1554 a7dd0415 Kostas Papadimitriou
1555 a7dd0415 Kostas Papadimitriou
                tds[ 0 ].style.display = "";
1556 a7dd0415 Kostas Papadimitriou
                tds[ 1 ].style.display = "none";
1557 a7dd0415 Kostas Papadimitriou
1558 a7dd0415 Kostas Papadimitriou
                // Check if empty table cells still have offsetWidth/Height
1559 a7dd0415 Kostas Papadimitriou
                // (IE <= 8 fail this test)
1560 a7dd0415 Kostas Papadimitriou
                support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1561 a7dd0415 Kostas Papadimitriou
1562 a7dd0415 Kostas Papadimitriou
                // Figure out if the W3C box model works as expected
1563 a7dd0415 Kostas Papadimitriou
                div.innerHTML = "";
1564 a7dd0415 Kostas Papadimitriou
                div.style.width = div.style.paddingLeft = "1px";
1565 a7dd0415 Kostas Papadimitriou
                jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
1566 a7dd0415 Kostas Papadimitriou
1567 a7dd0415 Kostas Papadimitriou
                if ( typeof div.style.zoom !== "undefined" ) {
1568 a7dd0415 Kostas Papadimitriou
                        // Check if natively block-level elements act like inline-block
1569 a7dd0415 Kostas Papadimitriou
                        // elements when setting their display to 'inline' and giving
1570 a7dd0415 Kostas Papadimitriou
                        // them layout
1571 a7dd0415 Kostas Papadimitriou
                        // (IE < 8 does this)
1572 a7dd0415 Kostas Papadimitriou
                        div.style.display = "inline";
1573 a7dd0415 Kostas Papadimitriou
                        div.style.zoom = 1;
1574 a7dd0415 Kostas Papadimitriou
                        support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
1575 a7dd0415 Kostas Papadimitriou
1576 a7dd0415 Kostas Papadimitriou
                        // Check if elements with layout shrink-wrap their children
1577 a7dd0415 Kostas Papadimitriou
                        // (IE 6 does this)
1578 a7dd0415 Kostas Papadimitriou
                        div.style.display = "";
1579 a7dd0415 Kostas Papadimitriou
                        div.innerHTML = "<div style='width:4px;'></div>";
1580 a7dd0415 Kostas Papadimitriou
                        support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
1581 a7dd0415 Kostas Papadimitriou
                }
1582 a7dd0415 Kostas Papadimitriou
1583 a7dd0415 Kostas Papadimitriou
                div.style.cssText = ptlm + vb;
1584 a7dd0415 Kostas Papadimitriou
                div.innerHTML = html;
1585 a7dd0415 Kostas Papadimitriou
1586 a7dd0415 Kostas Papadimitriou
                outer = div.firstChild;
1587 a7dd0415 Kostas Papadimitriou
                inner = outer.firstChild;
1588 a7dd0415 Kostas Papadimitriou
                td = outer.nextSibling.firstChild.firstChild;
1589 a7dd0415 Kostas Papadimitriou
1590 a7dd0415 Kostas Papadimitriou
                offsetSupport = {
1591 a7dd0415 Kostas Papadimitriou
                        doesNotAddBorder: ( inner.offsetTop !== 5 ),
1592 a7dd0415 Kostas Papadimitriou
                        doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
1593 a7dd0415 Kostas Papadimitriou
                };
1594 a7dd0415 Kostas Papadimitriou
1595 a7dd0415 Kostas Papadimitriou
                inner.style.position = "fixed";
1596 a7dd0415 Kostas Papadimitriou
                inner.style.top = "20px";
1597 a7dd0415 Kostas Papadimitriou
1598 a7dd0415 Kostas Papadimitriou
                // safari subtracts parent border width here which is 5px
1599 a7dd0415 Kostas Papadimitriou
                offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
1600 a7dd0415 Kostas Papadimitriou
                inner.style.position = inner.style.top = "";
1601 a7dd0415 Kostas Papadimitriou
1602 a7dd0415 Kostas Papadimitriou
                outer.style.overflow = "hidden";
1603 a7dd0415 Kostas Papadimitriou
                outer.style.position = "relative";
1604 a7dd0415 Kostas Papadimitriou
1605 a7dd0415 Kostas Papadimitriou
                offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
1606 a7dd0415 Kostas Papadimitriou
                offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
1607 a7dd0415 Kostas Papadimitriou
1608 a7dd0415 Kostas Papadimitriou
                body.removeChild( container );
1609 a7dd0415 Kostas Papadimitriou
                div  = container = null;
1610 a7dd0415 Kostas Papadimitriou
1611 a7dd0415 Kostas Papadimitriou
                jQuery.extend( support, offsetSupport );
1612 a7dd0415 Kostas Papadimitriou
        });
1613 a7dd0415 Kostas Papadimitriou
1614 a7dd0415 Kostas Papadimitriou
        return support;
1615 a7dd0415 Kostas Papadimitriou
})();
1616 a7dd0415 Kostas Papadimitriou
1617 a7dd0415 Kostas Papadimitriou
1618 a7dd0415 Kostas Papadimitriou
1619 a7dd0415 Kostas Papadimitriou
1620 a7dd0415 Kostas Papadimitriou
var rbrace = /^(?:\{.*\}|\[.*\])$/,
1621 a7dd0415 Kostas Papadimitriou
        rmultiDash = /([A-Z])/g;
1622 a7dd0415 Kostas Papadimitriou
1623 a7dd0415 Kostas Papadimitriou
jQuery.extend({
1624 a7dd0415 Kostas Papadimitriou
        cache: {},
1625 a7dd0415 Kostas Papadimitriou
1626 a7dd0415 Kostas Papadimitriou
        // Please use with caution
1627 a7dd0415 Kostas Papadimitriou
        uuid: 0,
1628 a7dd0415 Kostas Papadimitriou
1629 a7dd0415 Kostas Papadimitriou
        // Unique for each copy of jQuery on the page
1630 a7dd0415 Kostas Papadimitriou
        // Non-digits removed to match rinlinejQuery
1631 a7dd0415 Kostas Papadimitriou
        expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1632 a7dd0415 Kostas Papadimitriou
1633 a7dd0415 Kostas Papadimitriou
        // The following elements throw uncatchable exceptions if you
1634 a7dd0415 Kostas Papadimitriou
        // attempt to add expando properties to them.
1635 a7dd0415 Kostas Papadimitriou
        noData: {
1636 a7dd0415 Kostas Papadimitriou
                "embed": true,
1637 a7dd0415 Kostas Papadimitriou
                // Ban all objects except for Flash (which handle expandos)
1638 a7dd0415 Kostas Papadimitriou
                "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1639 a7dd0415 Kostas Papadimitriou
                "applet": true
1640 a7dd0415 Kostas Papadimitriou
        },
1641 a7dd0415 Kostas Papadimitriou
1642 a7dd0415 Kostas Papadimitriou
        hasData: function( elem ) {
1643 a7dd0415 Kostas Papadimitriou
                elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1644 a7dd0415 Kostas Papadimitriou
                return !!elem && !isEmptyDataObject( elem );
1645 a7dd0415 Kostas Papadimitriou
        },
1646 a7dd0415 Kostas Papadimitriou
1647 a7dd0415 Kostas Papadimitriou
        data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1648 a7dd0415 Kostas Papadimitriou
                if ( !jQuery.acceptData( elem ) ) {
1649 a7dd0415 Kostas Papadimitriou
                        return;
1650 a7dd0415 Kostas Papadimitriou
                }
1651 a7dd0415 Kostas Papadimitriou
1652 a7dd0415 Kostas Papadimitriou
                var privateCache, thisCache, ret,
1653 a7dd0415 Kostas Papadimitriou
                        internalKey = jQuery.expando,
1654 a7dd0415 Kostas Papadimitriou
                        getByName = typeof name === "string",
1655 a7dd0415 Kostas Papadimitriou
1656 a7dd0415 Kostas Papadimitriou
                        // We have to handle DOM nodes and JS objects differently because IE6-7
1657 a7dd0415 Kostas Papadimitriou
                        // can't GC object references properly across the DOM-JS boundary
1658 a7dd0415 Kostas Papadimitriou
                        isNode = elem.nodeType,
1659 a7dd0415 Kostas Papadimitriou
1660 a7dd0415 Kostas Papadimitriou
                        // Only DOM nodes need the global jQuery cache; JS object data is
1661 a7dd0415 Kostas Papadimitriou
                        // attached directly to the object so GC can occur automatically
1662 a7dd0415 Kostas Papadimitriou
                        cache = isNode ? jQuery.cache : elem,
1663 a7dd0415 Kostas Papadimitriou
1664 a7dd0415 Kostas Papadimitriou
                        // Only defining an ID for JS objects if its cache already exists allows
1665 a7dd0415 Kostas Papadimitriou
                        // the code to shortcut on the same path as a DOM node with no cache
1666 a7dd0415 Kostas Papadimitriou
                        id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
1667 a7dd0415 Kostas Papadimitriou
                        isEvents = name === "events";
1668 a7dd0415 Kostas Papadimitriou
1669 a7dd0415 Kostas Papadimitriou
                // Avoid doing any more work than we need to when trying to get data on an
1670 a7dd0415 Kostas Papadimitriou
                // object that has no data at all
1671 a7dd0415 Kostas Papadimitriou
                if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
1672 a7dd0415 Kostas Papadimitriou
                        return;
1673 a7dd0415 Kostas Papadimitriou
                }
1674 a7dd0415 Kostas Papadimitriou
1675 a7dd0415 Kostas Papadimitriou
                if ( !id ) {
1676 a7dd0415 Kostas Papadimitriou
                        // Only DOM nodes need a new unique ID for each element since their data
1677 a7dd0415 Kostas Papadimitriou
                        // ends up in the global cache
1678 a7dd0415 Kostas Papadimitriou
                        if ( isNode ) {
1679 a7dd0415 Kostas Papadimitriou
                                elem[ internalKey ] = id = ++jQuery.uuid;
1680 a7dd0415 Kostas Papadimitriou
                        } else {
1681 a7dd0415 Kostas Papadimitriou
                                id = internalKey;
1682 a7dd0415 Kostas Papadimitriou
                        }
1683 a7dd0415 Kostas Papadimitriou
                }
1684 a7dd0415 Kostas Papadimitriou
1685 a7dd0415 Kostas Papadimitriou
                if ( !cache[ id ] ) {
1686 a7dd0415 Kostas Papadimitriou
                        cache[ id ] = {};
1687 a7dd0415 Kostas Papadimitriou
1688 a7dd0415 Kostas Papadimitriou
                        // Avoids exposing jQuery metadata on plain JS objects when the object
1689 a7dd0415 Kostas Papadimitriou
                        // is serialized using JSON.stringify
1690 a7dd0415 Kostas Papadimitriou
                        if ( !isNode ) {
1691 a7dd0415 Kostas Papadimitriou
                                cache[ id ].toJSON = jQuery.noop;
1692 a7dd0415 Kostas Papadimitriou
                        }
1693 a7dd0415 Kostas Papadimitriou
                }
1694 a7dd0415 Kostas Papadimitriou
1695 a7dd0415 Kostas Papadimitriou
                // An object can be passed to jQuery.data instead of a key/value pair; this gets
1696 a7dd0415 Kostas Papadimitriou
                // shallow copied over onto the existing cache
1697 a7dd0415 Kostas Papadimitriou
                if ( typeof name === "object" || typeof name === "function" ) {
1698 a7dd0415 Kostas Papadimitriou
                        if ( pvt ) {
1699 a7dd0415 Kostas Papadimitriou
                                cache[ id ] = jQuery.extend( cache[ id ], name );
1700 a7dd0415 Kostas Papadimitriou
                        } else {
1701 a7dd0415 Kostas Papadimitriou
                                cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1702 a7dd0415 Kostas Papadimitriou
                        }
1703 a7dd0415 Kostas Papadimitriou
                }
1704 a7dd0415 Kostas Papadimitriou
1705 a7dd0415 Kostas Papadimitriou
                privateCache = thisCache = cache[ id ];
1706 a7dd0415 Kostas Papadimitriou
1707 a7dd0415 Kostas Papadimitriou
                // jQuery data() is stored in a separate object inside the object's internal data
1708 a7dd0415 Kostas Papadimitriou
                // cache in order to avoid key collisions between internal data and user-defined
1709 a7dd0415 Kostas Papadimitriou
                // data.
1710 a7dd0415 Kostas Papadimitriou
                if ( !pvt ) {
1711 a7dd0415 Kostas Papadimitriou
                        if ( !thisCache.data ) {
1712 a7dd0415 Kostas Papadimitriou
                                thisCache.data = {};
1713 a7dd0415 Kostas Papadimitriou
                        }
1714 a7dd0415 Kostas Papadimitriou
1715 a7dd0415 Kostas Papadimitriou
                        thisCache = thisCache.data;
1716 a7dd0415 Kostas Papadimitriou
                }
1717 a7dd0415 Kostas Papadimitriou
1718 a7dd0415 Kostas Papadimitriou
                if ( data !== undefined ) {
1719 a7dd0415 Kostas Papadimitriou
                        thisCache[ jQuery.camelCase( name ) ] = data;
1720 a7dd0415 Kostas Papadimitriou
                }
1721 a7dd0415 Kostas Papadimitriou
1722 a7dd0415 Kostas Papadimitriou
                // Users should not attempt to inspect the internal events object using jQuery.data,
1723 a7dd0415 Kostas Papadimitriou
                // it is undocumented and subject to change. But does anyone listen? No.
1724 a7dd0415 Kostas Papadimitriou
                if ( isEvents && !thisCache[ name ] ) {
1725 a7dd0415 Kostas Papadimitriou
                        return privateCache.events;
1726 a7dd0415 Kostas Papadimitriou
                }
1727 a7dd0415 Kostas Papadimitriou
1728 a7dd0415 Kostas Papadimitriou
                // Check for both converted-to-camel and non-converted data property names
1729 a7dd0415 Kostas Papadimitriou
                // If a data property was specified
1730 a7dd0415 Kostas Papadimitriou
                if ( getByName ) {
1731 a7dd0415 Kostas Papadimitriou
1732 a7dd0415 Kostas Papadimitriou
                        // First Try to find as-is property data
1733 a7dd0415 Kostas Papadimitriou
                        ret = thisCache[ name ];
1734 a7dd0415 Kostas Papadimitriou
1735 a7dd0415 Kostas Papadimitriou
                        // Test for null|undefined property data
1736 a7dd0415 Kostas Papadimitriou
                        if ( ret == null ) {
1737 a7dd0415 Kostas Papadimitriou
1738 a7dd0415 Kostas Papadimitriou
                                // Try to find the camelCased property
1739 a7dd0415 Kostas Papadimitriou
                                ret = thisCache[ jQuery.camelCase( name ) ];
1740 a7dd0415 Kostas Papadimitriou
                        }
1741 a7dd0415 Kostas Papadimitriou
                } else {
1742 a7dd0415 Kostas Papadimitriou
                        ret = thisCache;
1743 a7dd0415 Kostas Papadimitriou
                }
1744 a7dd0415 Kostas Papadimitriou
1745 a7dd0415 Kostas Papadimitriou
                return ret;
1746 a7dd0415 Kostas Papadimitriou
        },
1747 a7dd0415 Kostas Papadimitriou
1748 a7dd0415 Kostas Papadimitriou
        removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1749 a7dd0415 Kostas Papadimitriou
                if ( !jQuery.acceptData( elem ) ) {
1750 a7dd0415 Kostas Papadimitriou
                        return;
1751 a7dd0415 Kostas Papadimitriou
                }
1752 a7dd0415 Kostas Papadimitriou
1753 a7dd0415 Kostas Papadimitriou
                var thisCache, i, l,
1754 a7dd0415 Kostas Papadimitriou
1755 a7dd0415 Kostas Papadimitriou
                        // Reference to internal data cache key
1756 a7dd0415 Kostas Papadimitriou
                        internalKey = jQuery.expando,
1757 a7dd0415 Kostas Papadimitriou
1758 a7dd0415 Kostas Papadimitriou
                        isNode = elem.nodeType,
1759 a7dd0415 Kostas Papadimitriou
1760 a7dd0415 Kostas Papadimitriou
                        // See jQuery.data for more information
1761 a7dd0415 Kostas Papadimitriou
                        cache = isNode ? jQuery.cache : elem,
1762 a7dd0415 Kostas Papadimitriou
1763 a7dd0415 Kostas Papadimitriou
                        // See jQuery.data for more information
1764 a7dd0415 Kostas Papadimitriou
                        id = isNode ? elem[ internalKey ] : internalKey;
1765 a7dd0415 Kostas Papadimitriou
1766 a7dd0415 Kostas Papadimitriou
                // If there is already no cache entry for this object, there is no
1767 a7dd0415 Kostas Papadimitriou
                // purpose in continuing
1768 a7dd0415 Kostas Papadimitriou
                if ( !cache[ id ] ) {
1769 a7dd0415 Kostas Papadimitriou
                        return;
1770 a7dd0415 Kostas Papadimitriou
                }
1771 a7dd0415 Kostas Papadimitriou
1772 a7dd0415 Kostas Papadimitriou
                if ( name ) {
1773 a7dd0415 Kostas Papadimitriou
1774 a7dd0415 Kostas Papadimitriou
                        thisCache = pvt ? cache[ id ] : cache[ id ].data;
1775 a7dd0415 Kostas Papadimitriou
1776 a7dd0415 Kostas Papadimitriou
                        if ( thisCache ) {
1777 a7dd0415 Kostas Papadimitriou
1778 a7dd0415 Kostas Papadimitriou
                                // Support array or space separated string names for data keys
1779 a7dd0415 Kostas Papadimitriou
                                if ( !jQuery.isArray( name ) ) {
1780 a7dd0415 Kostas Papadimitriou
1781 a7dd0415 Kostas Papadimitriou
                                        // try the string as a key before any manipulation
1782 a7dd0415 Kostas Papadimitriou
                                        if ( name in thisCache ) {
1783 a7dd0415 Kostas Papadimitriou
                                                name = [ name ];
1784 a7dd0415 Kostas Papadimitriou
                                        } else {
1785 a7dd0415 Kostas Papadimitriou
1786 a7dd0415 Kostas Papadimitriou
                                                // split the camel cased version by spaces unless a key with the spaces exists
1787 a7dd0415 Kostas Papadimitriou
                                                name = jQuery.camelCase( name );
1788 a7dd0415 Kostas Papadimitriou
                                                if ( name in thisCache ) {
1789 a7dd0415 Kostas Papadimitriou
                                                        name = [ name ];
1790 a7dd0415 Kostas Papadimitriou
                                                } else {
1791 a7dd0415 Kostas Papadimitriou
                                                        name = name.split( " " );
1792 a7dd0415 Kostas Papadimitriou
                                                }
1793 a7dd0415 Kostas Papadimitriou
                                        }
1794 a7dd0415 Kostas Papadimitriou
                                }
1795 a7dd0415 Kostas Papadimitriou
1796 a7dd0415 Kostas Papadimitriou
                                for ( i = 0, l = name.length; i < l; i++ ) {
1797 a7dd0415 Kostas Papadimitriou
                                        delete thisCache[ name[i] ];
1798 a7dd0415 Kostas Papadimitriou
                                }
1799 a7dd0415 Kostas Papadimitriou
1800 a7dd0415 Kostas Papadimitriou
                                // If there is no data left in the cache, we want to continue
1801 a7dd0415 Kostas Papadimitriou
                                // and let the cache object itself get destroyed
1802 a7dd0415 Kostas Papadimitriou
                                if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1803 a7dd0415 Kostas Papadimitriou
                                        return;
1804 a7dd0415 Kostas Papadimitriou
                                }
1805 a7dd0415 Kostas Papadimitriou
                        }
1806 a7dd0415 Kostas Papadimitriou
                }
1807 a7dd0415 Kostas Papadimitriou
1808 a7dd0415 Kostas Papadimitriou
                // See jQuery.data for more information
1809 a7dd0415 Kostas Papadimitriou
                if ( !pvt ) {
1810 a7dd0415 Kostas Papadimitriou
                        delete cache[ id ].data;
1811 a7dd0415 Kostas Papadimitriou
1812 a7dd0415 Kostas Papadimitriou
                        // Don't destroy the parent cache unless the internal data object
1813 a7dd0415 Kostas Papadimitriou
                        // had been the only thing left in it
1814 a7dd0415 Kostas Papadimitriou
                        if ( !isEmptyDataObject(cache[ id ]) ) {
1815 a7dd0415 Kostas Papadimitriou
                                return;
1816 a7dd0415 Kostas Papadimitriou
                        }
1817 a7dd0415 Kostas Papadimitriou
                }
1818 a7dd0415 Kostas Papadimitriou
1819 a7dd0415 Kostas Papadimitriou
                // Browsers that fail expando deletion also refuse to delete expandos on
1820 a7dd0415 Kostas Papadimitriou
                // the window, but it will allow it on all other JS objects; other browsers
1821 a7dd0415 Kostas Papadimitriou
                // don't care
1822 a7dd0415 Kostas Papadimitriou
                // Ensure that `cache` is not a window object #10080
1823 a7dd0415 Kostas Papadimitriou
                if ( jQuery.support.deleteExpando || !cache.setInterval ) {
1824 a7dd0415 Kostas Papadimitriou
                        delete cache[ id ];
1825 a7dd0415 Kostas Papadimitriou
                } else {
1826 a7dd0415 Kostas Papadimitriou
                        cache[ id ] = null;
1827 a7dd0415 Kostas Papadimitriou
                }
1828 a7dd0415 Kostas Papadimitriou
1829 a7dd0415 Kostas Papadimitriou
                // We destroyed the cache and need to eliminate the expando on the node to avoid
1830 a7dd0415 Kostas Papadimitriou
                // false lookups in the cache for entries that no longer exist
1831 a7dd0415 Kostas Papadimitriou
                if ( isNode ) {
1832 a7dd0415 Kostas Papadimitriou
                        // IE does not allow us to delete expando properties from nodes,
1833 a7dd0415 Kostas Papadimitriou
                        // nor does it have a removeAttribute function on Document nodes;
1834 a7dd0415 Kostas Papadimitriou
                        // we must handle all of these cases
1835 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.support.deleteExpando ) {
1836 a7dd0415 Kostas Papadimitriou
                                delete elem[ internalKey ];
1837 a7dd0415 Kostas Papadimitriou
                        } else if ( elem.removeAttribute ) {
1838 a7dd0415 Kostas Papadimitriou
                                elem.removeAttribute( internalKey );
1839 a7dd0415 Kostas Papadimitriou
                        } else {
1840 a7dd0415 Kostas Papadimitriou
                                elem[ internalKey ] = null;
1841 a7dd0415 Kostas Papadimitriou
                        }
1842 a7dd0415 Kostas Papadimitriou
                }
1843 a7dd0415 Kostas Papadimitriou
        },
1844 a7dd0415 Kostas Papadimitriou
1845 a7dd0415 Kostas Papadimitriou
        // For internal use only.
1846 a7dd0415 Kostas Papadimitriou
        _data: function( elem, name, data ) {
1847 a7dd0415 Kostas Papadimitriou
                return jQuery.data( elem, name, data, true );
1848 a7dd0415 Kostas Papadimitriou
        },
1849 a7dd0415 Kostas Papadimitriou
1850 a7dd0415 Kostas Papadimitriou
        // A method for determining if a DOM node can handle the data expando
1851 a7dd0415 Kostas Papadimitriou
        acceptData: function( elem ) {
1852 a7dd0415 Kostas Papadimitriou
                if ( elem.nodeName ) {
1853 a7dd0415 Kostas Papadimitriou
                        var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1854 a7dd0415 Kostas Papadimitriou
1855 a7dd0415 Kostas Papadimitriou
                        if ( match ) {
1856 a7dd0415 Kostas Papadimitriou
                                return !(match === true || elem.getAttribute("classid") !== match);
1857 a7dd0415 Kostas Papadimitriou
                        }
1858 a7dd0415 Kostas Papadimitriou
                }
1859 a7dd0415 Kostas Papadimitriou
1860 a7dd0415 Kostas Papadimitriou
                return true;
1861 a7dd0415 Kostas Papadimitriou
        }
1862 a7dd0415 Kostas Papadimitriou
});
1863 a7dd0415 Kostas Papadimitriou
1864 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
1865 a7dd0415 Kostas Papadimitriou
        data: function( key, value ) {
1866 a7dd0415 Kostas Papadimitriou
                var parts, attr, name,
1867 a7dd0415 Kostas Papadimitriou
                        data = null;
1868 a7dd0415 Kostas Papadimitriou
1869 a7dd0415 Kostas Papadimitriou
                if ( typeof key === "undefined" ) {
1870 a7dd0415 Kostas Papadimitriou
                        if ( this.length ) {
1871 a7dd0415 Kostas Papadimitriou
                                data = jQuery.data( this[0] );
1872 a7dd0415 Kostas Papadimitriou
1873 a7dd0415 Kostas Papadimitriou
                                if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
1874 a7dd0415 Kostas Papadimitriou
                                        attr = this[0].attributes;
1875 a7dd0415 Kostas Papadimitriou
                                        for ( var i = 0, l = attr.length; i < l; i++ ) {
1876 a7dd0415 Kostas Papadimitriou
                                                name = attr[i].name;
1877 a7dd0415 Kostas Papadimitriou
1878 a7dd0415 Kostas Papadimitriou
                                                if ( name.indexOf( "data-" ) === 0 ) {
1879 a7dd0415 Kostas Papadimitriou
                                                        name = jQuery.camelCase( name.substring(5) );
1880 a7dd0415 Kostas Papadimitriou
1881 a7dd0415 Kostas Papadimitriou
                                                        dataAttr( this[0], name, data[ name ] );
1882 a7dd0415 Kostas Papadimitriou
                                                }
1883 a7dd0415 Kostas Papadimitriou
                                        }
1884 a7dd0415 Kostas Papadimitriou
                                        jQuery._data( this[0], "parsedAttrs", true );
1885 a7dd0415 Kostas Papadimitriou
                                }
1886 a7dd0415 Kostas Papadimitriou
                        }
1887 a7dd0415 Kostas Papadimitriou
1888 a7dd0415 Kostas Papadimitriou
                        return data;
1889 a7dd0415 Kostas Papadimitriou
1890 a7dd0415 Kostas Papadimitriou
                } else if ( typeof key === "object" ) {
1891 a7dd0415 Kostas Papadimitriou
                        return this.each(function() {
1892 a7dd0415 Kostas Papadimitriou
                                jQuery.data( this, key );
1893 a7dd0415 Kostas Papadimitriou
                        });
1894 a7dd0415 Kostas Papadimitriou
                }
1895 a7dd0415 Kostas Papadimitriou
1896 a7dd0415 Kostas Papadimitriou
                parts = key.split(".");
1897 a7dd0415 Kostas Papadimitriou
                parts[1] = parts[1] ? "." + parts[1] : "";
1898 a7dd0415 Kostas Papadimitriou
1899 a7dd0415 Kostas Papadimitriou
                if ( value === undefined ) {
1900 a7dd0415 Kostas Papadimitriou
                        data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1901 a7dd0415 Kostas Papadimitriou
1902 a7dd0415 Kostas Papadimitriou
                        // Try to fetch any internally stored data first
1903 a7dd0415 Kostas Papadimitriou
                        if ( data === undefined && this.length ) {
1904 a7dd0415 Kostas Papadimitriou
                                data = jQuery.data( this[0], key );
1905 a7dd0415 Kostas Papadimitriou
                                data = dataAttr( this[0], key, data );
1906 a7dd0415 Kostas Papadimitriou
                        }
1907 a7dd0415 Kostas Papadimitriou
1908 a7dd0415 Kostas Papadimitriou
                        return data === undefined && parts[1] ?
1909 a7dd0415 Kostas Papadimitriou
                                this.data( parts[0] ) :
1910 a7dd0415 Kostas Papadimitriou
                                data;
1911 a7dd0415 Kostas Papadimitriou
1912 a7dd0415 Kostas Papadimitriou
                } else {
1913 a7dd0415 Kostas Papadimitriou
                        return this.each(function() {
1914 a7dd0415 Kostas Papadimitriou
                                var self = jQuery( this ),
1915 a7dd0415 Kostas Papadimitriou
                                        args = [ parts[0], value ];
1916 a7dd0415 Kostas Papadimitriou
1917 a7dd0415 Kostas Papadimitriou
                                self.triggerHandler( "setData" + parts[1] + "!", args );
1918 a7dd0415 Kostas Papadimitriou
                                jQuery.data( this, key, value );
1919 a7dd0415 Kostas Papadimitriou
                                self.triggerHandler( "changeData" + parts[1] + "!", args );
1920 a7dd0415 Kostas Papadimitriou
                        });
1921 a7dd0415 Kostas Papadimitriou
                }
1922 a7dd0415 Kostas Papadimitriou
        },
1923 a7dd0415 Kostas Papadimitriou
1924 a7dd0415 Kostas Papadimitriou
        removeData: function( key ) {
1925 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
1926 a7dd0415 Kostas Papadimitriou
                        jQuery.removeData( this, key );
1927 a7dd0415 Kostas Papadimitriou
                });
1928 a7dd0415 Kostas Papadimitriou
        }
1929 a7dd0415 Kostas Papadimitriou
});
1930 a7dd0415 Kostas Papadimitriou
1931 a7dd0415 Kostas Papadimitriou
function dataAttr( elem, key, data ) {
1932 a7dd0415 Kostas Papadimitriou
        // If nothing was found internally, try to fetch any
1933 a7dd0415 Kostas Papadimitriou
        // data from the HTML5 data-* attribute
1934 a7dd0415 Kostas Papadimitriou
        if ( data === undefined && elem.nodeType === 1 ) {
1935 a7dd0415 Kostas Papadimitriou
1936 a7dd0415 Kostas Papadimitriou
                var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1937 a7dd0415 Kostas Papadimitriou
1938 a7dd0415 Kostas Papadimitriou
                data = elem.getAttribute( name );
1939 a7dd0415 Kostas Papadimitriou
1940 a7dd0415 Kostas Papadimitriou
                if ( typeof data === "string" ) {
1941 a7dd0415 Kostas Papadimitriou
                        try {
1942 a7dd0415 Kostas Papadimitriou
                                data = data === "true" ? true :
1943 a7dd0415 Kostas Papadimitriou
                                data === "false" ? false :
1944 a7dd0415 Kostas Papadimitriou
                                data === "null" ? null :
1945 a7dd0415 Kostas Papadimitriou
                                jQuery.isNumeric( data ) ? parseFloat( data ) :
1946 a7dd0415 Kostas Papadimitriou
                                        rbrace.test( data ) ? jQuery.parseJSON( data ) :
1947 a7dd0415 Kostas Papadimitriou
                                        data;
1948 a7dd0415 Kostas Papadimitriou
                        } catch( e ) {}
1949 a7dd0415 Kostas Papadimitriou
1950 a7dd0415 Kostas Papadimitriou
                        // Make sure we set the data so it isn't changed later
1951 a7dd0415 Kostas Papadimitriou
                        jQuery.data( elem, key, data );
1952 a7dd0415 Kostas Papadimitriou
1953 a7dd0415 Kostas Papadimitriou
                } else {
1954 a7dd0415 Kostas Papadimitriou
                        data = undefined;
1955 a7dd0415 Kostas Papadimitriou
                }
1956 a7dd0415 Kostas Papadimitriou
        }
1957 a7dd0415 Kostas Papadimitriou
1958 a7dd0415 Kostas Papadimitriou
        return data;
1959 a7dd0415 Kostas Papadimitriou
}
1960 a7dd0415 Kostas Papadimitriou
1961 a7dd0415 Kostas Papadimitriou
// checks a cache object for emptiness
1962 a7dd0415 Kostas Papadimitriou
function isEmptyDataObject( obj ) {
1963 a7dd0415 Kostas Papadimitriou
        for ( var name in obj ) {
1964 a7dd0415 Kostas Papadimitriou
1965 a7dd0415 Kostas Papadimitriou
                // if the public data object is empty, the private is still empty
1966 a7dd0415 Kostas Papadimitriou
                if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
1967 a7dd0415 Kostas Papadimitriou
                        continue;
1968 a7dd0415 Kostas Papadimitriou
                }
1969 a7dd0415 Kostas Papadimitriou
                if ( name !== "toJSON" ) {
1970 a7dd0415 Kostas Papadimitriou
                        return false;
1971 a7dd0415 Kostas Papadimitriou
                }
1972 a7dd0415 Kostas Papadimitriou
        }
1973 a7dd0415 Kostas Papadimitriou
1974 a7dd0415 Kostas Papadimitriou
        return true;
1975 a7dd0415 Kostas Papadimitriou
}
1976 a7dd0415 Kostas Papadimitriou
1977 a7dd0415 Kostas Papadimitriou
1978 a7dd0415 Kostas Papadimitriou
1979 a7dd0415 Kostas Papadimitriou
1980 a7dd0415 Kostas Papadimitriou
function handleQueueMarkDefer( elem, type, src ) {
1981 a7dd0415 Kostas Papadimitriou
        var deferDataKey = type + "defer",
1982 a7dd0415 Kostas Papadimitriou
                queueDataKey = type + "queue",
1983 a7dd0415 Kostas Papadimitriou
                markDataKey = type + "mark",
1984 a7dd0415 Kostas Papadimitriou
                defer = jQuery._data( elem, deferDataKey );
1985 a7dd0415 Kostas Papadimitriou
        if ( defer &&
1986 a7dd0415 Kostas Papadimitriou
                ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
1987 a7dd0415 Kostas Papadimitriou
                ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
1988 a7dd0415 Kostas Papadimitriou
                // Give room for hard-coded callbacks to fire first
1989 a7dd0415 Kostas Papadimitriou
                // and eventually mark/queue something else on the element
1990 a7dd0415 Kostas Papadimitriou
                setTimeout( function() {
1991 a7dd0415 Kostas Papadimitriou
                        if ( !jQuery._data( elem, queueDataKey ) &&
1992 a7dd0415 Kostas Papadimitriou
                                !jQuery._data( elem, markDataKey ) ) {
1993 a7dd0415 Kostas Papadimitriou
                                jQuery.removeData( elem, deferDataKey, true );
1994 a7dd0415 Kostas Papadimitriou
                                defer.fire();
1995 a7dd0415 Kostas Papadimitriou
                        }
1996 a7dd0415 Kostas Papadimitriou
                }, 0 );
1997 a7dd0415 Kostas Papadimitriou
        }
1998 a7dd0415 Kostas Papadimitriou
}
1999 a7dd0415 Kostas Papadimitriou
2000 a7dd0415 Kostas Papadimitriou
jQuery.extend({
2001 a7dd0415 Kostas Papadimitriou
2002 a7dd0415 Kostas Papadimitriou
        _mark: function( elem, type ) {
2003 a7dd0415 Kostas Papadimitriou
                if ( elem ) {
2004 a7dd0415 Kostas Papadimitriou
                        type = ( type || "fx" ) + "mark";
2005 a7dd0415 Kostas Papadimitriou
                        jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
2006 a7dd0415 Kostas Papadimitriou
                }
2007 a7dd0415 Kostas Papadimitriou
        },
2008 a7dd0415 Kostas Papadimitriou
2009 a7dd0415 Kostas Papadimitriou
        _unmark: function( force, elem, type ) {
2010 a7dd0415 Kostas Papadimitriou
                if ( force !== true ) {
2011 a7dd0415 Kostas Papadimitriou
                        type = elem;
2012 a7dd0415 Kostas Papadimitriou
                        elem = force;
2013 a7dd0415 Kostas Papadimitriou
                        force = false;
2014 a7dd0415 Kostas Papadimitriou
                }
2015 a7dd0415 Kostas Papadimitriou
                if ( elem ) {
2016 a7dd0415 Kostas Papadimitriou
                        type = type || "fx";
2017 a7dd0415 Kostas Papadimitriou
                        var key = type + "mark",
2018 a7dd0415 Kostas Papadimitriou
                                count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
2019 a7dd0415 Kostas Papadimitriou
                        if ( count ) {
2020 a7dd0415 Kostas Papadimitriou
                                jQuery._data( elem, key, count );
2021 a7dd0415 Kostas Papadimitriou
                        } else {
2022 a7dd0415 Kostas Papadimitriou
                                jQuery.removeData( elem, key, true );
2023 a7dd0415 Kostas Papadimitriou
                                handleQueueMarkDefer( elem, type, "mark" );
2024 a7dd0415 Kostas Papadimitriou
                        }
2025 a7dd0415 Kostas Papadimitriou
                }
2026 a7dd0415 Kostas Papadimitriou
        },
2027 a7dd0415 Kostas Papadimitriou
2028 a7dd0415 Kostas Papadimitriou
        queue: function( elem, type, data ) {
2029 a7dd0415 Kostas Papadimitriou
                var q;
2030 a7dd0415 Kostas Papadimitriou
                if ( elem ) {
2031 a7dd0415 Kostas Papadimitriou
                        type = ( type || "fx" ) + "queue";
2032 a7dd0415 Kostas Papadimitriou
                        q = jQuery._data( elem, type );
2033 a7dd0415 Kostas Papadimitriou
2034 a7dd0415 Kostas Papadimitriou
                        // Speed up dequeue by getting out quickly if this is just a lookup
2035 a7dd0415 Kostas Papadimitriou
                        if ( data ) {
2036 a7dd0415 Kostas Papadimitriou
                                if ( !q || jQuery.isArray(data) ) {
2037 a7dd0415 Kostas Papadimitriou
                                        q = jQuery._data( elem, type, jQuery.makeArray(data) );
2038 a7dd0415 Kostas Papadimitriou
                                } else {
2039 a7dd0415 Kostas Papadimitriou
                                        q.push( data );
2040 a7dd0415 Kostas Papadimitriou
                                }
2041 a7dd0415 Kostas Papadimitriou
                        }
2042 a7dd0415 Kostas Papadimitriou
                        return q || [];
2043 a7dd0415 Kostas Papadimitriou
                }
2044 a7dd0415 Kostas Papadimitriou
        },
2045 a7dd0415 Kostas Papadimitriou
2046 a7dd0415 Kostas Papadimitriou
        dequeue: function( elem, type ) {
2047 a7dd0415 Kostas Papadimitriou
                type = type || "fx";
2048 a7dd0415 Kostas Papadimitriou
2049 a7dd0415 Kostas Papadimitriou
                var queue = jQuery.queue( elem, type ),
2050 a7dd0415 Kostas Papadimitriou
                        fn = queue.shift(),
2051 a7dd0415 Kostas Papadimitriou
                        hooks = {};
2052 a7dd0415 Kostas Papadimitriou
2053 a7dd0415 Kostas Papadimitriou
                // If the fx queue is dequeued, always remove the progress sentinel
2054 a7dd0415 Kostas Papadimitriou
                if ( fn === "inprogress" ) {
2055 a7dd0415 Kostas Papadimitriou
                        fn = queue.shift();
2056 a7dd0415 Kostas Papadimitriou
                }
2057 a7dd0415 Kostas Papadimitriou
2058 a7dd0415 Kostas Papadimitriou
                if ( fn ) {
2059 a7dd0415 Kostas Papadimitriou
                        // Add a progress sentinel to prevent the fx queue from being
2060 a7dd0415 Kostas Papadimitriou
                        // automatically dequeued
2061 a7dd0415 Kostas Papadimitriou
                        if ( type === "fx" ) {
2062 a7dd0415 Kostas Papadimitriou
                                queue.unshift( "inprogress" );
2063 a7dd0415 Kostas Papadimitriou
                        }
2064 a7dd0415 Kostas Papadimitriou
2065 a7dd0415 Kostas Papadimitriou
                        jQuery._data( elem, type + ".run", hooks );
2066 a7dd0415 Kostas Papadimitriou
                        fn.call( elem, function() {
2067 a7dd0415 Kostas Papadimitriou
                                jQuery.dequeue( elem, type );
2068 a7dd0415 Kostas Papadimitriou
                        }, hooks );
2069 a7dd0415 Kostas Papadimitriou
                }
2070 a7dd0415 Kostas Papadimitriou
2071 a7dd0415 Kostas Papadimitriou
                if ( !queue.length ) {
2072 a7dd0415 Kostas Papadimitriou
                        jQuery.removeData( elem, type + "queue " + type + ".run", true );
2073 a7dd0415 Kostas Papadimitriou
                        handleQueueMarkDefer( elem, type, "queue" );
2074 a7dd0415 Kostas Papadimitriou
                }
2075 a7dd0415 Kostas Papadimitriou
        }
2076 a7dd0415 Kostas Papadimitriou
});
2077 a7dd0415 Kostas Papadimitriou
2078 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
2079 a7dd0415 Kostas Papadimitriou
        queue: function( type, data ) {
2080 a7dd0415 Kostas Papadimitriou
                if ( typeof type !== "string" ) {
2081 a7dd0415 Kostas Papadimitriou
                        data = type;
2082 a7dd0415 Kostas Papadimitriou
                        type = "fx";
2083 a7dd0415 Kostas Papadimitriou
                }
2084 a7dd0415 Kostas Papadimitriou
2085 a7dd0415 Kostas Papadimitriou
                if ( data === undefined ) {
2086 a7dd0415 Kostas Papadimitriou
                        return jQuery.queue( this[0], type );
2087 a7dd0415 Kostas Papadimitriou
                }
2088 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
2089 a7dd0415 Kostas Papadimitriou
                        var queue = jQuery.queue( this, type, data );
2090 a7dd0415 Kostas Papadimitriou
2091 a7dd0415 Kostas Papadimitriou
                        if ( type === "fx" && queue[0] !== "inprogress" ) {
2092 a7dd0415 Kostas Papadimitriou
                                jQuery.dequeue( this, type );
2093 a7dd0415 Kostas Papadimitriou
                        }
2094 a7dd0415 Kostas Papadimitriou
                });
2095 a7dd0415 Kostas Papadimitriou
        },
2096 a7dd0415 Kostas Papadimitriou
        dequeue: function( type ) {
2097 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
2098 a7dd0415 Kostas Papadimitriou
                        jQuery.dequeue( this, type );
2099 a7dd0415 Kostas Papadimitriou
                });
2100 a7dd0415 Kostas Papadimitriou
        },
2101 a7dd0415 Kostas Papadimitriou
        // Based off of the plugin by Clint Helfers, with permission.
2102 a7dd0415 Kostas Papadimitriou
        // http://blindsignals.com/index.php/2009/07/jquery-delay/
2103 a7dd0415 Kostas Papadimitriou
        delay: function( time, type ) {
2104 a7dd0415 Kostas Papadimitriou
                time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
2105 a7dd0415 Kostas Papadimitriou
                type = type || "fx";
2106 a7dd0415 Kostas Papadimitriou
2107 a7dd0415 Kostas Papadimitriou
                return this.queue( type, function( next, hooks ) {
2108 a7dd0415 Kostas Papadimitriou
                        var timeout = setTimeout( next, time );
2109 a7dd0415 Kostas Papadimitriou
                        hooks.stop = function() {
2110 a7dd0415 Kostas Papadimitriou
                                clearTimeout( timeout );
2111 a7dd0415 Kostas Papadimitriou
                        };
2112 a7dd0415 Kostas Papadimitriou
                });
2113 a7dd0415 Kostas Papadimitriou
        },
2114 a7dd0415 Kostas Papadimitriou
        clearQueue: function( type ) {
2115 a7dd0415 Kostas Papadimitriou
                return this.queue( type || "fx", [] );
2116 a7dd0415 Kostas Papadimitriou
        },
2117 a7dd0415 Kostas Papadimitriou
        // Get a promise resolved when queues of a certain type
2118 a7dd0415 Kostas Papadimitriou
        // are emptied (fx is the type by default)
2119 a7dd0415 Kostas Papadimitriou
        promise: function( type, object ) {
2120 a7dd0415 Kostas Papadimitriou
                if ( typeof type !== "string" ) {
2121 a7dd0415 Kostas Papadimitriou
                        object = type;
2122 a7dd0415 Kostas Papadimitriou
                        type = undefined;
2123 a7dd0415 Kostas Papadimitriou
                }
2124 a7dd0415 Kostas Papadimitriou
                type = type || "fx";
2125 a7dd0415 Kostas Papadimitriou
                var defer = jQuery.Deferred(),
2126 a7dd0415 Kostas Papadimitriou
                        elements = this,
2127 a7dd0415 Kostas Papadimitriou
                        i = elements.length,
2128 a7dd0415 Kostas Papadimitriou
                        count = 1,
2129 a7dd0415 Kostas Papadimitriou
                        deferDataKey = type + "defer",
2130 a7dd0415 Kostas Papadimitriou
                        queueDataKey = type + "queue",
2131 a7dd0415 Kostas Papadimitriou
                        markDataKey = type + "mark",
2132 a7dd0415 Kostas Papadimitriou
                        tmp;
2133 a7dd0415 Kostas Papadimitriou
                function resolve() {
2134 a7dd0415 Kostas Papadimitriou
                        if ( !( --count ) ) {
2135 a7dd0415 Kostas Papadimitriou
                                defer.resolveWith( elements, [ elements ] );
2136 a7dd0415 Kostas Papadimitriou
                        }
2137 a7dd0415 Kostas Papadimitriou
                }
2138 a7dd0415 Kostas Papadimitriou
                while( i-- ) {
2139 a7dd0415 Kostas Papadimitriou
                        if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
2140 a7dd0415 Kostas Papadimitriou
                                        ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
2141 a7dd0415 Kostas Papadimitriou
                                                jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
2142 a7dd0415 Kostas Papadimitriou
                                        jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
2143 a7dd0415 Kostas Papadimitriou
                                count++;
2144 a7dd0415 Kostas Papadimitriou
                                tmp.add( resolve );
2145 a7dd0415 Kostas Papadimitriou
                        }
2146 a7dd0415 Kostas Papadimitriou
                }
2147 a7dd0415 Kostas Papadimitriou
                resolve();
2148 a7dd0415 Kostas Papadimitriou
                return defer.promise();
2149 a7dd0415 Kostas Papadimitriou
        }
2150 a7dd0415 Kostas Papadimitriou
});
2151 a7dd0415 Kostas Papadimitriou
2152 a7dd0415 Kostas Papadimitriou
2153 a7dd0415 Kostas Papadimitriou
2154 a7dd0415 Kostas Papadimitriou
2155 a7dd0415 Kostas Papadimitriou
var rclass = /[\n\t\r]/g,
2156 a7dd0415 Kostas Papadimitriou
        rspace = /\s+/,
2157 a7dd0415 Kostas Papadimitriou
        rreturn = /\r/g,
2158 a7dd0415 Kostas Papadimitriou
        rtype = /^(?:button|input)$/i,
2159 a7dd0415 Kostas Papadimitriou
        rfocusable = /^(?:button|input|object|select|textarea)$/i,
2160 a7dd0415 Kostas Papadimitriou
        rclickable = /^a(?:rea)?$/i,
2161 a7dd0415 Kostas Papadimitriou
        rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
2162 a7dd0415 Kostas Papadimitriou
        getSetAttribute = jQuery.support.getSetAttribute,
2163 a7dd0415 Kostas Papadimitriou
        nodeHook, boolHook, fixSpecified;
2164 a7dd0415 Kostas Papadimitriou
2165 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
2166 a7dd0415 Kostas Papadimitriou
        attr: function( name, value ) {
2167 a7dd0415 Kostas Papadimitriou
                return jQuery.access( this, name, value, true, jQuery.attr );
2168 a7dd0415 Kostas Papadimitriou
        },
2169 a7dd0415 Kostas Papadimitriou
2170 a7dd0415 Kostas Papadimitriou
        removeAttr: function( name ) {
2171 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
2172 a7dd0415 Kostas Papadimitriou
                        jQuery.removeAttr( this, name );
2173 a7dd0415 Kostas Papadimitriou
                });
2174 a7dd0415 Kostas Papadimitriou
        },
2175 a7dd0415 Kostas Papadimitriou
2176 a7dd0415 Kostas Papadimitriou
        prop: function( name, value ) {
2177 a7dd0415 Kostas Papadimitriou
                return jQuery.access( this, name, value, true, jQuery.prop );
2178 a7dd0415 Kostas Papadimitriou
        },
2179 a7dd0415 Kostas Papadimitriou
2180 a7dd0415 Kostas Papadimitriou
        removeProp: function( name ) {
2181 a7dd0415 Kostas Papadimitriou
                name = jQuery.propFix[ name ] || name;
2182 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
2183 a7dd0415 Kostas Papadimitriou
                        // try/catch handles cases where IE balks (such as removing a property on window)
2184 a7dd0415 Kostas Papadimitriou
                        try {
2185 a7dd0415 Kostas Papadimitriou
                                this[ name ] = undefined;
2186 a7dd0415 Kostas Papadimitriou
                                delete this[ name ];
2187 a7dd0415 Kostas Papadimitriou
                        } catch( e ) {}
2188 a7dd0415 Kostas Papadimitriou
                });
2189 a7dd0415 Kostas Papadimitriou
        },
2190 a7dd0415 Kostas Papadimitriou
2191 a7dd0415 Kostas Papadimitriou
        addClass: function( value ) {
2192 a7dd0415 Kostas Papadimitriou
                var classNames, i, l, elem,
2193 a7dd0415 Kostas Papadimitriou
                        setClass, c, cl;
2194 a7dd0415 Kostas Papadimitriou
2195 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( value ) ) {
2196 a7dd0415 Kostas Papadimitriou
                        return this.each(function( j ) {
2197 a7dd0415 Kostas Papadimitriou
                                jQuery( this ).addClass( value.call(this, j, this.className) );
2198 a7dd0415 Kostas Papadimitriou
                        });
2199 a7dd0415 Kostas Papadimitriou
                }
2200 a7dd0415 Kostas Papadimitriou
2201 a7dd0415 Kostas Papadimitriou
                if ( value && typeof value === "string" ) {
2202 a7dd0415 Kostas Papadimitriou
                        classNames = value.split( rspace );
2203 a7dd0415 Kostas Papadimitriou
2204 a7dd0415 Kostas Papadimitriou
                        for ( i = 0, l = this.length; i < l; i++ ) {
2205 a7dd0415 Kostas Papadimitriou
                                elem = this[ i ];
2206 a7dd0415 Kostas Papadimitriou
2207 a7dd0415 Kostas Papadimitriou
                                if ( elem.nodeType === 1 ) {
2208 a7dd0415 Kostas Papadimitriou
                                        if ( !elem.className && classNames.length === 1 ) {
2209 a7dd0415 Kostas Papadimitriou
                                                elem.className = value;
2210 a7dd0415 Kostas Papadimitriou
2211 a7dd0415 Kostas Papadimitriou
                                        } else {
2212 a7dd0415 Kostas Papadimitriou
                                                setClass = " " + elem.className + " ";
2213 a7dd0415 Kostas Papadimitriou
2214 a7dd0415 Kostas Papadimitriou
                                                for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2215 a7dd0415 Kostas Papadimitriou
                                                        if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
2216 a7dd0415 Kostas Papadimitriou
                                                                setClass += classNames[ c ] + " ";
2217 a7dd0415 Kostas Papadimitriou
                                                        }
2218 a7dd0415 Kostas Papadimitriou
                                                }
2219 a7dd0415 Kostas Papadimitriou
                                                elem.className = jQuery.trim( setClass );
2220 a7dd0415 Kostas Papadimitriou
                                        }
2221 a7dd0415 Kostas Papadimitriou
                                }
2222 a7dd0415 Kostas Papadimitriou
                        }
2223 a7dd0415 Kostas Papadimitriou
                }
2224 a7dd0415 Kostas Papadimitriou
2225 a7dd0415 Kostas Papadimitriou
                return this;
2226 a7dd0415 Kostas Papadimitriou
        },
2227 a7dd0415 Kostas Papadimitriou
2228 a7dd0415 Kostas Papadimitriou
        removeClass: function( value ) {
2229 a7dd0415 Kostas Papadimitriou
                var classNames, i, l, elem, className, c, cl;
2230 a7dd0415 Kostas Papadimitriou
2231 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( value ) ) {
2232 a7dd0415 Kostas Papadimitriou
                        return this.each(function( j ) {
2233 a7dd0415 Kostas Papadimitriou
                                jQuery( this ).removeClass( value.call(this, j, this.className) );
2234 a7dd0415 Kostas Papadimitriou
                        });
2235 a7dd0415 Kostas Papadimitriou
                }
2236 a7dd0415 Kostas Papadimitriou
2237 a7dd0415 Kostas Papadimitriou
                if ( (value && typeof value === "string") || value === undefined ) {
2238 a7dd0415 Kostas Papadimitriou
                        classNames = ( value || "" ).split( rspace );
2239 a7dd0415 Kostas Papadimitriou
2240 a7dd0415 Kostas Papadimitriou
                        for ( i = 0, l = this.length; i < l; i++ ) {
2241 a7dd0415 Kostas Papadimitriou
                                elem = this[ i ];
2242 a7dd0415 Kostas Papadimitriou
2243 a7dd0415 Kostas Papadimitriou
                                if ( elem.nodeType === 1 && elem.className ) {
2244 a7dd0415 Kostas Papadimitriou
                                        if ( value ) {
2245 a7dd0415 Kostas Papadimitriou
                                                className = (" " + elem.className + " ").replace( rclass, " " );
2246 a7dd0415 Kostas Papadimitriou
                                                for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2247 a7dd0415 Kostas Papadimitriou
                                                        className = className.replace(" " + classNames[ c ] + " ", " ");
2248 a7dd0415 Kostas Papadimitriou
                                                }
2249 a7dd0415 Kostas Papadimitriou
                                                elem.className = jQuery.trim( className );
2250 a7dd0415 Kostas Papadimitriou
2251 a7dd0415 Kostas Papadimitriou
                                        } else {
2252 a7dd0415 Kostas Papadimitriou
                                                elem.className = "";
2253 a7dd0415 Kostas Papadimitriou
                                        }
2254 a7dd0415 Kostas Papadimitriou
                                }
2255 a7dd0415 Kostas Papadimitriou
                        }
2256 a7dd0415 Kostas Papadimitriou
                }
2257 a7dd0415 Kostas Papadimitriou
2258 a7dd0415 Kostas Papadimitriou
                return this;
2259 a7dd0415 Kostas Papadimitriou
        },
2260 a7dd0415 Kostas Papadimitriou
2261 a7dd0415 Kostas Papadimitriou
        toggleClass: function( value, stateVal ) {
2262 a7dd0415 Kostas Papadimitriou
                var type = typeof value,
2263 a7dd0415 Kostas Papadimitriou
                        isBool = typeof stateVal === "boolean";
2264 a7dd0415 Kostas Papadimitriou
2265 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( value ) ) {
2266 a7dd0415 Kostas Papadimitriou
                        return this.each(function( i ) {
2267 a7dd0415 Kostas Papadimitriou
                                jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2268 a7dd0415 Kostas Papadimitriou
                        });
2269 a7dd0415 Kostas Papadimitriou
                }
2270 a7dd0415 Kostas Papadimitriou
2271 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
2272 a7dd0415 Kostas Papadimitriou
                        if ( type === "string" ) {
2273 a7dd0415 Kostas Papadimitriou
                                // toggle individual class names
2274 a7dd0415 Kostas Papadimitriou
                                var className,
2275 a7dd0415 Kostas Papadimitriou
                                        i = 0,
2276 a7dd0415 Kostas Papadimitriou
                                        self = jQuery( this ),
2277 a7dd0415 Kostas Papadimitriou
                                        state = stateVal,
2278 a7dd0415 Kostas Papadimitriou
                                        classNames = value.split( rspace );
2279 a7dd0415 Kostas Papadimitriou
2280 a7dd0415 Kostas Papadimitriou
                                while ( (className = classNames[ i++ ]) ) {
2281 a7dd0415 Kostas Papadimitriou
                                        // check each className given, space seperated list
2282 a7dd0415 Kostas Papadimitriou
                                        state = isBool ? state : !self.hasClass( className );
2283 a7dd0415 Kostas Papadimitriou
                                        self[ state ? "addClass" : "removeClass" ]( className );
2284 a7dd0415 Kostas Papadimitriou
                                }
2285 a7dd0415 Kostas Papadimitriou
2286 a7dd0415 Kostas Papadimitriou
                        } else if ( type === "undefined" || type === "boolean" ) {
2287 a7dd0415 Kostas Papadimitriou
                                if ( this.className ) {
2288 a7dd0415 Kostas Papadimitriou
                                        // store className if set
2289 a7dd0415 Kostas Papadimitriou
                                        jQuery._data( this, "__className__", this.className );
2290 a7dd0415 Kostas Papadimitriou
                                }
2291 a7dd0415 Kostas Papadimitriou
2292 a7dd0415 Kostas Papadimitriou
                                // toggle whole className
2293 a7dd0415 Kostas Papadimitriou
                                this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2294 a7dd0415 Kostas Papadimitriou
                        }
2295 a7dd0415 Kostas Papadimitriou
                });
2296 a7dd0415 Kostas Papadimitriou
        },
2297 a7dd0415 Kostas Papadimitriou
2298 a7dd0415 Kostas Papadimitriou
        hasClass: function( selector ) {
2299 a7dd0415 Kostas Papadimitriou
                var className = " " + selector + " ",
2300 a7dd0415 Kostas Papadimitriou
                        i = 0,
2301 a7dd0415 Kostas Papadimitriou
                        l = this.length;
2302 a7dd0415 Kostas Papadimitriou
                for ( ; i < l; i++ ) {
2303 a7dd0415 Kostas Papadimitriou
                        if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2304 a7dd0415 Kostas Papadimitriou
                                return true;
2305 a7dd0415 Kostas Papadimitriou
                        }
2306 a7dd0415 Kostas Papadimitriou
                }
2307 a7dd0415 Kostas Papadimitriou
2308 a7dd0415 Kostas Papadimitriou
                return false;
2309 a7dd0415 Kostas Papadimitriou
        },
2310 a7dd0415 Kostas Papadimitriou
2311 a7dd0415 Kostas Papadimitriou
        val: function( value ) {
2312 a7dd0415 Kostas Papadimitriou
                var hooks, ret, isFunction,
2313 a7dd0415 Kostas Papadimitriou
                        elem = this[0];
2314 a7dd0415 Kostas Papadimitriou
2315 a7dd0415 Kostas Papadimitriou
                if ( !arguments.length ) {
2316 a7dd0415 Kostas Papadimitriou
                        if ( elem ) {
2317 a7dd0415 Kostas Papadimitriou
                                hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
2318 a7dd0415 Kostas Papadimitriou
2319 a7dd0415 Kostas Papadimitriou
                                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2320 a7dd0415 Kostas Papadimitriou
                                        return ret;
2321 a7dd0415 Kostas Papadimitriou
                                }
2322 a7dd0415 Kostas Papadimitriou
2323 a7dd0415 Kostas Papadimitriou
                                ret = elem.value;
2324 a7dd0415 Kostas Papadimitriou
2325 a7dd0415 Kostas Papadimitriou
                                return typeof ret === "string" ?
2326 a7dd0415 Kostas Papadimitriou
                                        // handle most common string cases
2327 a7dd0415 Kostas Papadimitriou
                                        ret.replace(rreturn, "") :
2328 a7dd0415 Kostas Papadimitriou
                                        // handle cases where value is null/undef or number
2329 a7dd0415 Kostas Papadimitriou
                                        ret == null ? "" : ret;
2330 a7dd0415 Kostas Papadimitriou
                        }
2331 a7dd0415 Kostas Papadimitriou
2332 a7dd0415 Kostas Papadimitriou
                        return;
2333 a7dd0415 Kostas Papadimitriou
                }
2334 a7dd0415 Kostas Papadimitriou
2335 a7dd0415 Kostas Papadimitriou
                isFunction = jQuery.isFunction( value );
2336 a7dd0415 Kostas Papadimitriou
2337 a7dd0415 Kostas Papadimitriou
                return this.each(function( i ) {
2338 a7dd0415 Kostas Papadimitriou
                        var self = jQuery(this), val;
2339 a7dd0415 Kostas Papadimitriou
2340 a7dd0415 Kostas Papadimitriou
                        if ( this.nodeType !== 1 ) {
2341 a7dd0415 Kostas Papadimitriou
                                return;
2342 a7dd0415 Kostas Papadimitriou
                        }
2343 a7dd0415 Kostas Papadimitriou
2344 a7dd0415 Kostas Papadimitriou
                        if ( isFunction ) {
2345 a7dd0415 Kostas Papadimitriou
                                val = value.call( this, i, self.val() );
2346 a7dd0415 Kostas Papadimitriou
                        } else {
2347 a7dd0415 Kostas Papadimitriou
                                val = value;
2348 a7dd0415 Kostas Papadimitriou
                        }
2349 a7dd0415 Kostas Papadimitriou
2350 a7dd0415 Kostas Papadimitriou
                        // Treat null/undefined as ""; convert numbers to string
2351 a7dd0415 Kostas Papadimitriou
                        if ( val == null ) {
2352 a7dd0415 Kostas Papadimitriou
                                val = "";
2353 a7dd0415 Kostas Papadimitriou
                        } else if ( typeof val === "number" ) {
2354 a7dd0415 Kostas Papadimitriou
                                val += "";
2355 a7dd0415 Kostas Papadimitriou
                        } else if ( jQuery.isArray( val ) ) {
2356 a7dd0415 Kostas Papadimitriou
                                val = jQuery.map(val, function ( value ) {
2357 a7dd0415 Kostas Papadimitriou
                                        return value == null ? "" : value + "";
2358 a7dd0415 Kostas Papadimitriou
                                });
2359 a7dd0415 Kostas Papadimitriou
                        }
2360 a7dd0415 Kostas Papadimitriou
2361 a7dd0415 Kostas Papadimitriou
                        hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
2362 a7dd0415 Kostas Papadimitriou
2363 a7dd0415 Kostas Papadimitriou
                        // If set returns undefined, fall back to normal setting
2364 a7dd0415 Kostas Papadimitriou
                        if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2365 a7dd0415 Kostas Papadimitriou
                                this.value = val;
2366 a7dd0415 Kostas Papadimitriou
                        }
2367 a7dd0415 Kostas Papadimitriou
                });
2368 a7dd0415 Kostas Papadimitriou
        }
2369 a7dd0415 Kostas Papadimitriou
});
2370 a7dd0415 Kostas Papadimitriou
2371 a7dd0415 Kostas Papadimitriou
jQuery.extend({
2372 a7dd0415 Kostas Papadimitriou
        valHooks: {
2373 a7dd0415 Kostas Papadimitriou
                option: {
2374 a7dd0415 Kostas Papadimitriou
                        get: function( elem ) {
2375 a7dd0415 Kostas Papadimitriou
                                // attributes.value is undefined in Blackberry 4.7 but
2376 a7dd0415 Kostas Papadimitriou
                                // uses .value. See #6932
2377 a7dd0415 Kostas Papadimitriou
                                var val = elem.attributes.value;
2378 a7dd0415 Kostas Papadimitriou
                                return !val || val.specified ? elem.value : elem.text;
2379 a7dd0415 Kostas Papadimitriou
                        }
2380 a7dd0415 Kostas Papadimitriou
                },
2381 a7dd0415 Kostas Papadimitriou
                select: {
2382 a7dd0415 Kostas Papadimitriou
                        get: function( elem ) {
2383 a7dd0415 Kostas Papadimitriou
                                var value, i, max, option,
2384 a7dd0415 Kostas Papadimitriou
                                        index = elem.selectedIndex,
2385 a7dd0415 Kostas Papadimitriou
                                        values = [],
2386 a7dd0415 Kostas Papadimitriou
                                        options = elem.options,
2387 a7dd0415 Kostas Papadimitriou
                                        one = elem.type === "select-one";
2388 a7dd0415 Kostas Papadimitriou
2389 a7dd0415 Kostas Papadimitriou
                                // Nothing was selected
2390 a7dd0415 Kostas Papadimitriou
                                if ( index < 0 ) {
2391 a7dd0415 Kostas Papadimitriou
                                        return null;
2392 a7dd0415 Kostas Papadimitriou
                                }
2393 a7dd0415 Kostas Papadimitriou
2394 a7dd0415 Kostas Papadimitriou
                                // Loop through all the selected options
2395 a7dd0415 Kostas Papadimitriou
                                i = one ? index : 0;
2396 a7dd0415 Kostas Papadimitriou
                                max = one ? index + 1 : options.length;
2397 a7dd0415 Kostas Papadimitriou
                                for ( ; i < max; i++ ) {
2398 a7dd0415 Kostas Papadimitriou
                                        option = options[ i ];
2399 a7dd0415 Kostas Papadimitriou
2400 a7dd0415 Kostas Papadimitriou
                                        // Don't return options that are disabled or in a disabled optgroup
2401 a7dd0415 Kostas Papadimitriou
                                        if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2402 a7dd0415 Kostas Papadimitriou
                                                        (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2403 a7dd0415 Kostas Papadimitriou
2404 a7dd0415 Kostas Papadimitriou
                                                // Get the specific value for the option
2405 a7dd0415 Kostas Papadimitriou
                                                value = jQuery( option ).val();
2406 a7dd0415 Kostas Papadimitriou
2407 a7dd0415 Kostas Papadimitriou
                                                // We don't need an array for one selects
2408 a7dd0415 Kostas Papadimitriou
                                                if ( one ) {
2409 a7dd0415 Kostas Papadimitriou
                                                        return value;
2410 a7dd0415 Kostas Papadimitriou
                                                }
2411 a7dd0415 Kostas Papadimitriou
2412 a7dd0415 Kostas Papadimitriou
                                                // Multi-Selects return an array
2413 a7dd0415 Kostas Papadimitriou
                                                values.push( value );
2414 a7dd0415 Kostas Papadimitriou
                                        }
2415 a7dd0415 Kostas Papadimitriou
                                }
2416 a7dd0415 Kostas Papadimitriou
2417 a7dd0415 Kostas Papadimitriou
                                // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2418 a7dd0415 Kostas Papadimitriou
                                if ( one && !values.length && options.length ) {
2419 a7dd0415 Kostas Papadimitriou
                                        return jQuery( options[ index ] ).val();
2420 a7dd0415 Kostas Papadimitriou
                                }
2421 a7dd0415 Kostas Papadimitriou
2422 a7dd0415 Kostas Papadimitriou
                                return values;
2423 a7dd0415 Kostas Papadimitriou
                        },
2424 a7dd0415 Kostas Papadimitriou
2425 a7dd0415 Kostas Papadimitriou
                        set: function( elem, value ) {
2426 a7dd0415 Kostas Papadimitriou
                                var values = jQuery.makeArray( value );
2427 a7dd0415 Kostas Papadimitriou
2428 a7dd0415 Kostas Papadimitriou
                                jQuery(elem).find("option").each(function() {
2429 a7dd0415 Kostas Papadimitriou
                                        this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2430 a7dd0415 Kostas Papadimitriou
                                });
2431 a7dd0415 Kostas Papadimitriou
2432 a7dd0415 Kostas Papadimitriou
                                if ( !values.length ) {
2433 a7dd0415 Kostas Papadimitriou
                                        elem.selectedIndex = -1;
2434 a7dd0415 Kostas Papadimitriou
                                }
2435 a7dd0415 Kostas Papadimitriou
                                return values;
2436 a7dd0415 Kostas Papadimitriou
                        }
2437 a7dd0415 Kostas Papadimitriou
                }
2438 a7dd0415 Kostas Papadimitriou
        },
2439 a7dd0415 Kostas Papadimitriou
2440 a7dd0415 Kostas Papadimitriou
        attrFn: {
2441 a7dd0415 Kostas Papadimitriou
                val: true,
2442 a7dd0415 Kostas Papadimitriou
                css: true,
2443 a7dd0415 Kostas Papadimitriou
                html: true,
2444 a7dd0415 Kostas Papadimitriou
                text: true,
2445 a7dd0415 Kostas Papadimitriou
                data: true,
2446 a7dd0415 Kostas Papadimitriou
                width: true,
2447 a7dd0415 Kostas Papadimitriou
                height: true,
2448 a7dd0415 Kostas Papadimitriou
                offset: true
2449 a7dd0415 Kostas Papadimitriou
        },
2450 a7dd0415 Kostas Papadimitriou
2451 a7dd0415 Kostas Papadimitriou
        attr: function( elem, name, value, pass ) {
2452 a7dd0415 Kostas Papadimitriou
                var ret, hooks, notxml,
2453 a7dd0415 Kostas Papadimitriou
                        nType = elem.nodeType;
2454 a7dd0415 Kostas Papadimitriou
2455 a7dd0415 Kostas Papadimitriou
                // don't get/set attributes on text, comment and attribute nodes
2456 a7dd0415 Kostas Papadimitriou
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2457 a7dd0415 Kostas Papadimitriou
                        return;
2458 a7dd0415 Kostas Papadimitriou
                }
2459 a7dd0415 Kostas Papadimitriou
2460 a7dd0415 Kostas Papadimitriou
                if ( pass && name in jQuery.attrFn ) {
2461 a7dd0415 Kostas Papadimitriou
                        return jQuery( elem )[ name ]( value );
2462 a7dd0415 Kostas Papadimitriou
                }
2463 a7dd0415 Kostas Papadimitriou
2464 a7dd0415 Kostas Papadimitriou
                // Fallback to prop when attributes are not supported
2465 a7dd0415 Kostas Papadimitriou
                if ( typeof elem.getAttribute === "undefined" ) {
2466 a7dd0415 Kostas Papadimitriou
                        return jQuery.prop( elem, name, value );
2467 a7dd0415 Kostas Papadimitriou
                }
2468 a7dd0415 Kostas Papadimitriou
2469 a7dd0415 Kostas Papadimitriou
                notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2470 a7dd0415 Kostas Papadimitriou
2471 a7dd0415 Kostas Papadimitriou
                // All attributes are lowercase
2472 a7dd0415 Kostas Papadimitriou
                // Grab necessary hook if one is defined
2473 a7dd0415 Kostas Papadimitriou
                if ( notxml ) {
2474 a7dd0415 Kostas Papadimitriou
                        name = name.toLowerCase();
2475 a7dd0415 Kostas Papadimitriou
                        hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2476 a7dd0415 Kostas Papadimitriou
                }
2477 a7dd0415 Kostas Papadimitriou
2478 a7dd0415 Kostas Papadimitriou
                if ( value !== undefined ) {
2479 a7dd0415 Kostas Papadimitriou
2480 a7dd0415 Kostas Papadimitriou
                        if ( value === null ) {
2481 a7dd0415 Kostas Papadimitriou
                                jQuery.removeAttr( elem, name );
2482 a7dd0415 Kostas Papadimitriou
                                return;
2483 a7dd0415 Kostas Papadimitriou
2484 a7dd0415 Kostas Papadimitriou
                        } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2485 a7dd0415 Kostas Papadimitriou
                                return ret;
2486 a7dd0415 Kostas Papadimitriou
2487 a7dd0415 Kostas Papadimitriou
                        } else {
2488 a7dd0415 Kostas Papadimitriou
                                elem.setAttribute( name, "" + value );
2489 a7dd0415 Kostas Papadimitriou
                                return value;
2490 a7dd0415 Kostas Papadimitriou
                        }
2491 a7dd0415 Kostas Papadimitriou
2492 a7dd0415 Kostas Papadimitriou
                } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
2493 a7dd0415 Kostas Papadimitriou
                        return ret;
2494 a7dd0415 Kostas Papadimitriou
2495 a7dd0415 Kostas Papadimitriou
                } else {
2496 a7dd0415 Kostas Papadimitriou
2497 a7dd0415 Kostas Papadimitriou
                        ret = elem.getAttribute( name );
2498 a7dd0415 Kostas Papadimitriou
2499 a7dd0415 Kostas Papadimitriou
                        // Non-existent attributes return null, we normalize to undefined
2500 a7dd0415 Kostas Papadimitriou
                        return ret === null ?
2501 a7dd0415 Kostas Papadimitriou
                                undefined :
2502 a7dd0415 Kostas Papadimitriou
                                ret;
2503 a7dd0415 Kostas Papadimitriou
                }
2504 a7dd0415 Kostas Papadimitriou
        },
2505 a7dd0415 Kostas Papadimitriou
2506 a7dd0415 Kostas Papadimitriou
        removeAttr: function( elem, value ) {
2507 a7dd0415 Kostas Papadimitriou
                var propName, attrNames, name, l,
2508 a7dd0415 Kostas Papadimitriou
                        i = 0;
2509 a7dd0415 Kostas Papadimitriou
2510 a7dd0415 Kostas Papadimitriou
                if ( value && elem.nodeType === 1 ) {
2511 a7dd0415 Kostas Papadimitriou
                        attrNames = value.toLowerCase().split( rspace );
2512 a7dd0415 Kostas Papadimitriou
                        l = attrNames.length;
2513 a7dd0415 Kostas Papadimitriou
2514 a7dd0415 Kostas Papadimitriou
                        for ( ; i < l; i++ ) {
2515 a7dd0415 Kostas Papadimitriou
                                name = attrNames[ i ];
2516 a7dd0415 Kostas Papadimitriou
2517 a7dd0415 Kostas Papadimitriou
                                if ( name ) {
2518 a7dd0415 Kostas Papadimitriou
                                        propName = jQuery.propFix[ name ] || name;
2519 a7dd0415 Kostas Papadimitriou
2520 a7dd0415 Kostas Papadimitriou
                                        // See #9699 for explanation of this approach (setting first, then removal)
2521 a7dd0415 Kostas Papadimitriou
                                        jQuery.attr( elem, name, "" );
2522 a7dd0415 Kostas Papadimitriou
                                        elem.removeAttribute( getSetAttribute ? name : propName );
2523 a7dd0415 Kostas Papadimitriou
2524 a7dd0415 Kostas Papadimitriou
                                        // Set corresponding property to false for boolean attributes
2525 a7dd0415 Kostas Papadimitriou
                                        if ( rboolean.test( name ) && propName in elem ) {
2526 a7dd0415 Kostas Papadimitriou
                                                elem[ propName ] = false;
2527 a7dd0415 Kostas Papadimitriou
                                        }
2528 a7dd0415 Kostas Papadimitriou
                                }
2529 a7dd0415 Kostas Papadimitriou
                        }
2530 a7dd0415 Kostas Papadimitriou
                }
2531 a7dd0415 Kostas Papadimitriou
        },
2532 a7dd0415 Kostas Papadimitriou
2533 a7dd0415 Kostas Papadimitriou
        attrHooks: {
2534 a7dd0415 Kostas Papadimitriou
                type: {
2535 a7dd0415 Kostas Papadimitriou
                        set: function( elem, value ) {
2536 a7dd0415 Kostas Papadimitriou
                                // We can't allow the type property to be changed (since it causes problems in IE)
2537 a7dd0415 Kostas Papadimitriou
                                if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2538 a7dd0415 Kostas Papadimitriou
                                        jQuery.error( "type property can't be changed" );
2539 a7dd0415 Kostas Papadimitriou
                                } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2540 a7dd0415 Kostas Papadimitriou
                                        // Setting the type on a radio button after the value resets the value in IE6-9
2541 a7dd0415 Kostas Papadimitriou
                                        // Reset value to it's default in case type is set after value
2542 a7dd0415 Kostas Papadimitriou
                                        // This is for element creation
2543 a7dd0415 Kostas Papadimitriou
                                        var val = elem.value;
2544 a7dd0415 Kostas Papadimitriou
                                        elem.setAttribute( "type", value );
2545 a7dd0415 Kostas Papadimitriou
                                        if ( val ) {
2546 a7dd0415 Kostas Papadimitriou
                                                elem.value = val;
2547 a7dd0415 Kostas Papadimitriou
                                        }
2548 a7dd0415 Kostas Papadimitriou
                                        return value;
2549 a7dd0415 Kostas Papadimitriou
                                }
2550 a7dd0415 Kostas Papadimitriou
                        }
2551 a7dd0415 Kostas Papadimitriou
                },
2552 a7dd0415 Kostas Papadimitriou
                // Use the value property for back compat
2553 a7dd0415 Kostas Papadimitriou
                // Use the nodeHook for button elements in IE6/7 (#1954)
2554 a7dd0415 Kostas Papadimitriou
                value: {
2555 a7dd0415 Kostas Papadimitriou
                        get: function( elem, name ) {
2556 a7dd0415 Kostas Papadimitriou
                                if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2557 a7dd0415 Kostas Papadimitriou
                                        return nodeHook.get( elem, name );
2558 a7dd0415 Kostas Papadimitriou
                                }
2559 a7dd0415 Kostas Papadimitriou
                                return name in elem ?
2560 a7dd0415 Kostas Papadimitriou
                                        elem.value :
2561 a7dd0415 Kostas Papadimitriou
                                        null;
2562 a7dd0415 Kostas Papadimitriou
                        },
2563 a7dd0415 Kostas Papadimitriou
                        set: function( elem, value, name ) {
2564 a7dd0415 Kostas Papadimitriou
                                if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2565 a7dd0415 Kostas Papadimitriou
                                        return nodeHook.set( elem, value, name );
2566 a7dd0415 Kostas Papadimitriou
                                }
2567 a7dd0415 Kostas Papadimitriou
                                // Does not return so that setAttribute is also used
2568 a7dd0415 Kostas Papadimitriou
                                elem.value = value;
2569 a7dd0415 Kostas Papadimitriou
                        }
2570 a7dd0415 Kostas Papadimitriou
                }
2571 a7dd0415 Kostas Papadimitriou
        },
2572 a7dd0415 Kostas Papadimitriou
2573 a7dd0415 Kostas Papadimitriou
        propFix: {
2574 a7dd0415 Kostas Papadimitriou
                tabindex: "tabIndex",
2575 a7dd0415 Kostas Papadimitriou
                readonly: "readOnly",
2576 a7dd0415 Kostas Papadimitriou
                "for": "htmlFor",
2577 a7dd0415 Kostas Papadimitriou
                "class": "className",
2578 a7dd0415 Kostas Papadimitriou
                maxlength: "maxLength",
2579 a7dd0415 Kostas Papadimitriou
                cellspacing: "cellSpacing",
2580 a7dd0415 Kostas Papadimitriou
                cellpadding: "cellPadding",
2581 a7dd0415 Kostas Papadimitriou
                rowspan: "rowSpan",
2582 a7dd0415 Kostas Papadimitriou
                colspan: "colSpan",
2583 a7dd0415 Kostas Papadimitriou
                usemap: "useMap",
2584 a7dd0415 Kostas Papadimitriou
                frameborder: "frameBorder",
2585 a7dd0415 Kostas Papadimitriou
                contenteditable: "contentEditable"
2586 a7dd0415 Kostas Papadimitriou
        },
2587 a7dd0415 Kostas Papadimitriou
2588 a7dd0415 Kostas Papadimitriou
        prop: function( elem, name, value ) {
2589 a7dd0415 Kostas Papadimitriou
                var ret, hooks, notxml,
2590 a7dd0415 Kostas Papadimitriou
                        nType = elem.nodeType;
2591 a7dd0415 Kostas Papadimitriou
2592 a7dd0415 Kostas Papadimitriou
                // don't get/set properties on text, comment and attribute nodes
2593 a7dd0415 Kostas Papadimitriou
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2594 a7dd0415 Kostas Papadimitriou
                        return;
2595 a7dd0415 Kostas Papadimitriou
                }
2596 a7dd0415 Kostas Papadimitriou
2597 a7dd0415 Kostas Papadimitriou
                notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2598 a7dd0415 Kostas Papadimitriou
2599 a7dd0415 Kostas Papadimitriou
                if ( notxml ) {
2600 a7dd0415 Kostas Papadimitriou
                        // Fix name and attach hooks
2601 a7dd0415 Kostas Papadimitriou
                        name = jQuery.propFix[ name ] || name;
2602 a7dd0415 Kostas Papadimitriou
                        hooks = jQuery.propHooks[ name ];
2603 a7dd0415 Kostas Papadimitriou
                }
2604 a7dd0415 Kostas Papadimitriou
2605 a7dd0415 Kostas Papadimitriou
                if ( value !== undefined ) {
2606 a7dd0415 Kostas Papadimitriou
                        if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2607 a7dd0415 Kostas Papadimitriou
                                return ret;
2608 a7dd0415 Kostas Papadimitriou
2609 a7dd0415 Kostas Papadimitriou
                        } else {
2610 a7dd0415 Kostas Papadimitriou
                                return ( elem[ name ] = value );
2611 a7dd0415 Kostas Papadimitriou
                        }
2612 a7dd0415 Kostas Papadimitriou
2613 a7dd0415 Kostas Papadimitriou
                } else {
2614 a7dd0415 Kostas Papadimitriou
                        if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2615 a7dd0415 Kostas Papadimitriou
                                return ret;
2616 a7dd0415 Kostas Papadimitriou
2617 a7dd0415 Kostas Papadimitriou
                        } else {
2618 a7dd0415 Kostas Papadimitriou
                                return elem[ name ];
2619 a7dd0415 Kostas Papadimitriou
                        }
2620 a7dd0415 Kostas Papadimitriou
                }
2621 a7dd0415 Kostas Papadimitriou
        },
2622 a7dd0415 Kostas Papadimitriou
2623 a7dd0415 Kostas Papadimitriou
        propHooks: {
2624 a7dd0415 Kostas Papadimitriou
                tabIndex: {
2625 a7dd0415 Kostas Papadimitriou
                        get: function( elem ) {
2626 a7dd0415 Kostas Papadimitriou
                                // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2627 a7dd0415 Kostas Papadimitriou
                                // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2628 a7dd0415 Kostas Papadimitriou
                                var attributeNode = elem.getAttributeNode("tabindex");
2629 a7dd0415 Kostas Papadimitriou
2630 a7dd0415 Kostas Papadimitriou
                                return attributeNode && attributeNode.specified ?
2631 a7dd0415 Kostas Papadimitriou
                                        parseInt( attributeNode.value, 10 ) :
2632 a7dd0415 Kostas Papadimitriou
                                        rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2633 a7dd0415 Kostas Papadimitriou
                                                0 :
2634 a7dd0415 Kostas Papadimitriou
                                                undefined;
2635 a7dd0415 Kostas Papadimitriou
                        }
2636 a7dd0415 Kostas Papadimitriou
                }
2637 a7dd0415 Kostas Papadimitriou
        }
2638 a7dd0415 Kostas Papadimitriou
});
2639 a7dd0415 Kostas Papadimitriou
2640 a7dd0415 Kostas Papadimitriou
// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
2641 a7dd0415 Kostas Papadimitriou
jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
2642 a7dd0415 Kostas Papadimitriou
2643 a7dd0415 Kostas Papadimitriou
// Hook for boolean attributes
2644 a7dd0415 Kostas Papadimitriou
boolHook = {
2645 a7dd0415 Kostas Papadimitriou
        get: function( elem, name ) {
2646 a7dd0415 Kostas Papadimitriou
                // Align boolean attributes with corresponding properties
2647 a7dd0415 Kostas Papadimitriou
                // Fall back to attribute presence where some booleans are not supported
2648 a7dd0415 Kostas Papadimitriou
                var attrNode,
2649 a7dd0415 Kostas Papadimitriou
                        property = jQuery.prop( elem, name );
2650 a7dd0415 Kostas Papadimitriou
                return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
2651 a7dd0415 Kostas Papadimitriou
                        name.toLowerCase() :
2652 a7dd0415 Kostas Papadimitriou
                        undefined;
2653 a7dd0415 Kostas Papadimitriou
        },
2654 a7dd0415 Kostas Papadimitriou
        set: function( elem, value, name ) {
2655 a7dd0415 Kostas Papadimitriou
                var propName;
2656 a7dd0415 Kostas Papadimitriou
                if ( value === false ) {
2657 a7dd0415 Kostas Papadimitriou
                        // Remove boolean attributes when set to false
2658 a7dd0415 Kostas Papadimitriou
                        jQuery.removeAttr( elem, name );
2659 a7dd0415 Kostas Papadimitriou
                } else {
2660 a7dd0415 Kostas Papadimitriou
                        // value is true since we know at this point it's type boolean and not false
2661 a7dd0415 Kostas Papadimitriou
                        // Set boolean attributes to the same name and set the DOM property
2662 a7dd0415 Kostas Papadimitriou
                        propName = jQuery.propFix[ name ] || name;
2663 a7dd0415 Kostas Papadimitriou
                        if ( propName in elem ) {
2664 a7dd0415 Kostas Papadimitriou
                                // Only set the IDL specifically if it already exists on the element
2665 a7dd0415 Kostas Papadimitriou
                                elem[ propName ] = true;
2666 a7dd0415 Kostas Papadimitriou
                        }
2667 a7dd0415 Kostas Papadimitriou
2668 a7dd0415 Kostas Papadimitriou
                        elem.setAttribute( name, name.toLowerCase() );
2669 a7dd0415 Kostas Papadimitriou
                }
2670 a7dd0415 Kostas Papadimitriou
                return name;
2671 a7dd0415 Kostas Papadimitriou
        }
2672 a7dd0415 Kostas Papadimitriou
};
2673 a7dd0415 Kostas Papadimitriou
2674 a7dd0415 Kostas Papadimitriou
// IE6/7 do not support getting/setting some attributes with get/setAttribute
2675 a7dd0415 Kostas Papadimitriou
if ( !getSetAttribute ) {
2676 a7dd0415 Kostas Papadimitriou
2677 a7dd0415 Kostas Papadimitriou
        fixSpecified = {
2678 a7dd0415 Kostas Papadimitriou
                name: true,
2679 a7dd0415 Kostas Papadimitriou
                id: true
2680 a7dd0415 Kostas Papadimitriou
        };
2681 a7dd0415 Kostas Papadimitriou
2682 a7dd0415 Kostas Papadimitriou
        // Use this for any attribute in IE6/7
2683 a7dd0415 Kostas Papadimitriou
        // This fixes almost every IE6/7 issue
2684 a7dd0415 Kostas Papadimitriou
        nodeHook = jQuery.valHooks.button = {
2685 a7dd0415 Kostas Papadimitriou
                get: function( elem, name ) {
2686 a7dd0415 Kostas Papadimitriou
                        var ret;
2687 a7dd0415 Kostas Papadimitriou
                        ret = elem.getAttributeNode( name );
2688 a7dd0415 Kostas Papadimitriou
                        return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
2689 a7dd0415 Kostas Papadimitriou
                                ret.nodeValue :
2690 a7dd0415 Kostas Papadimitriou
                                undefined;
2691 a7dd0415 Kostas Papadimitriou
                },
2692 a7dd0415 Kostas Papadimitriou
                set: function( elem, value, name ) {
2693 a7dd0415 Kostas Papadimitriou
                        // Set the existing or create a new attribute node
2694 a7dd0415 Kostas Papadimitriou
                        var ret = elem.getAttributeNode( name );
2695 a7dd0415 Kostas Papadimitriou
                        if ( !ret ) {
2696 a7dd0415 Kostas Papadimitriou
                                ret = document.createAttribute( name );
2697 a7dd0415 Kostas Papadimitriou
                                elem.setAttributeNode( ret );
2698 a7dd0415 Kostas Papadimitriou
                        }
2699 a7dd0415 Kostas Papadimitriou
                        return ( ret.nodeValue = value + "" );
2700 a7dd0415 Kostas Papadimitriou
                }
2701 a7dd0415 Kostas Papadimitriou
        };
2702 a7dd0415 Kostas Papadimitriou
2703 a7dd0415 Kostas Papadimitriou
        // Apply the nodeHook to tabindex
2704 a7dd0415 Kostas Papadimitriou
        jQuery.attrHooks.tabindex.set = nodeHook.set;
2705 a7dd0415 Kostas Papadimitriou
2706 a7dd0415 Kostas Papadimitriou
        // Set width and height to auto instead of 0 on empty string( Bug #8150 )
2707 a7dd0415 Kostas Papadimitriou
        // This is for removals
2708 a7dd0415 Kostas Papadimitriou
        jQuery.each([ "width", "height" ], function( i, name ) {
2709 a7dd0415 Kostas Papadimitriou
                jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2710 a7dd0415 Kostas Papadimitriou
                        set: function( elem, value ) {
2711 a7dd0415 Kostas Papadimitriou
                                if ( value === "" ) {
2712 a7dd0415 Kostas Papadimitriou
                                        elem.setAttribute( name, "auto" );
2713 a7dd0415 Kostas Papadimitriou
                                        return value;
2714 a7dd0415 Kostas Papadimitriou
                                }
2715 a7dd0415 Kostas Papadimitriou
                        }
2716 a7dd0415 Kostas Papadimitriou
                });
2717 a7dd0415 Kostas Papadimitriou
        });
2718 a7dd0415 Kostas Papadimitriou
2719 a7dd0415 Kostas Papadimitriou
        // Set contenteditable to false on removals(#10429)
2720 a7dd0415 Kostas Papadimitriou
        // Setting to empty string throws an error as an invalid value
2721 a7dd0415 Kostas Papadimitriou
        jQuery.attrHooks.contenteditable = {
2722 a7dd0415 Kostas Papadimitriou
                get: nodeHook.get,
2723 a7dd0415 Kostas Papadimitriou
                set: function( elem, value, name ) {
2724 a7dd0415 Kostas Papadimitriou
                        if ( value === "" ) {
2725 a7dd0415 Kostas Papadimitriou
                                value = "false";
2726 a7dd0415 Kostas Papadimitriou
                        }
2727 a7dd0415 Kostas Papadimitriou
                        nodeHook.set( elem, value, name );
2728 a7dd0415 Kostas Papadimitriou
                }
2729 a7dd0415 Kostas Papadimitriou
        };
2730 a7dd0415 Kostas Papadimitriou
}
2731 a7dd0415 Kostas Papadimitriou
2732 a7dd0415 Kostas Papadimitriou
2733 a7dd0415 Kostas Papadimitriou
// Some attributes require a special call on IE
2734 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.hrefNormalized ) {
2735 a7dd0415 Kostas Papadimitriou
        jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2736 a7dd0415 Kostas Papadimitriou
                jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2737 a7dd0415 Kostas Papadimitriou
                        get: function( elem ) {
2738 a7dd0415 Kostas Papadimitriou
                                var ret = elem.getAttribute( name, 2 );
2739 a7dd0415 Kostas Papadimitriou
                                return ret === null ? undefined : ret;
2740 a7dd0415 Kostas Papadimitriou
                        }
2741 a7dd0415 Kostas Papadimitriou
                });
2742 a7dd0415 Kostas Papadimitriou
        });
2743 a7dd0415 Kostas Papadimitriou
}
2744 a7dd0415 Kostas Papadimitriou
2745 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.style ) {
2746 a7dd0415 Kostas Papadimitriou
        jQuery.attrHooks.style = {
2747 a7dd0415 Kostas Papadimitriou
                get: function( elem ) {
2748 a7dd0415 Kostas Papadimitriou
                        // Return undefined in the case of empty string
2749 a7dd0415 Kostas Papadimitriou
                        // Normalize to lowercase since IE uppercases css property names
2750 a7dd0415 Kostas Papadimitriou
                        return elem.style.cssText.toLowerCase() || undefined;
2751 a7dd0415 Kostas Papadimitriou
                },
2752 a7dd0415 Kostas Papadimitriou
                set: function( elem, value ) {
2753 a7dd0415 Kostas Papadimitriou
                        return ( elem.style.cssText = "" + value );
2754 a7dd0415 Kostas Papadimitriou
                }
2755 a7dd0415 Kostas Papadimitriou
        };
2756 a7dd0415 Kostas Papadimitriou
}
2757 a7dd0415 Kostas Papadimitriou
2758 a7dd0415 Kostas Papadimitriou
// Safari mis-reports the default selected property of an option
2759 a7dd0415 Kostas Papadimitriou
// Accessing the parent's selectedIndex property fixes it
2760 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.optSelected ) {
2761 a7dd0415 Kostas Papadimitriou
        jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2762 a7dd0415 Kostas Papadimitriou
                get: function( elem ) {
2763 a7dd0415 Kostas Papadimitriou
                        var parent = elem.parentNode;
2764 a7dd0415 Kostas Papadimitriou
2765 a7dd0415 Kostas Papadimitriou
                        if ( parent ) {
2766 a7dd0415 Kostas Papadimitriou
                                parent.selectedIndex;
2767 a7dd0415 Kostas Papadimitriou
2768 a7dd0415 Kostas Papadimitriou
                                // Make sure that it also works with optgroups, see #5701
2769 a7dd0415 Kostas Papadimitriou
                                if ( parent.parentNode ) {
2770 a7dd0415 Kostas Papadimitriou
                                        parent.parentNode.selectedIndex;
2771 a7dd0415 Kostas Papadimitriou
                                }
2772 a7dd0415 Kostas Papadimitriou
                        }
2773 a7dd0415 Kostas Papadimitriou
                        return null;
2774 a7dd0415 Kostas Papadimitriou
                }
2775 a7dd0415 Kostas Papadimitriou
        });
2776 a7dd0415 Kostas Papadimitriou
}
2777 a7dd0415 Kostas Papadimitriou
2778 a7dd0415 Kostas Papadimitriou
// IE6/7 call enctype encoding
2779 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.enctype ) {
2780 a7dd0415 Kostas Papadimitriou
        jQuery.propFix.enctype = "encoding";
2781 a7dd0415 Kostas Papadimitriou
}
2782 a7dd0415 Kostas Papadimitriou
2783 a7dd0415 Kostas Papadimitriou
// Radios and checkboxes getter/setter
2784 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.checkOn ) {
2785 a7dd0415 Kostas Papadimitriou
        jQuery.each([ "radio", "checkbox" ], function() {
2786 a7dd0415 Kostas Papadimitriou
                jQuery.valHooks[ this ] = {
2787 a7dd0415 Kostas Papadimitriou
                        get: function( elem ) {
2788 a7dd0415 Kostas Papadimitriou
                                // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2789 a7dd0415 Kostas Papadimitriou
                                return elem.getAttribute("value") === null ? "on" : elem.value;
2790 a7dd0415 Kostas Papadimitriou
                        }
2791 a7dd0415 Kostas Papadimitriou
                };
2792 a7dd0415 Kostas Papadimitriou
        });
2793 a7dd0415 Kostas Papadimitriou
}
2794 a7dd0415 Kostas Papadimitriou
jQuery.each([ "radio", "checkbox" ], function() {
2795 a7dd0415 Kostas Papadimitriou
        jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2796 a7dd0415 Kostas Papadimitriou
                set: function( elem, value ) {
2797 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.isArray( value ) ) {
2798 a7dd0415 Kostas Papadimitriou
                                return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2799 a7dd0415 Kostas Papadimitriou
                        }
2800 a7dd0415 Kostas Papadimitriou
                }
2801 a7dd0415 Kostas Papadimitriou
        });
2802 a7dd0415 Kostas Papadimitriou
});
2803 a7dd0415 Kostas Papadimitriou
2804 a7dd0415 Kostas Papadimitriou
2805 a7dd0415 Kostas Papadimitriou
2806 a7dd0415 Kostas Papadimitriou
2807 a7dd0415 Kostas Papadimitriou
var rformElems = /^(?:textarea|input|select)$/i,
2808 a7dd0415 Kostas Papadimitriou
        rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
2809 a7dd0415 Kostas Papadimitriou
        rhoverHack = /\bhover(\.\S+)?\b/,
2810 a7dd0415 Kostas Papadimitriou
        rkeyEvent = /^key/,
2811 a7dd0415 Kostas Papadimitriou
        rmouseEvent = /^(?:mouse|contextmenu)|click/,
2812 a7dd0415 Kostas Papadimitriou
        rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
2813 a7dd0415 Kostas Papadimitriou
        rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
2814 a7dd0415 Kostas Papadimitriou
        quickParse = function( selector ) {
2815 a7dd0415 Kostas Papadimitriou
                var quick = rquickIs.exec( selector );
2816 a7dd0415 Kostas Papadimitriou
                if ( quick ) {
2817 a7dd0415 Kostas Papadimitriou
                        //   0  1    2   3
2818 a7dd0415 Kostas Papadimitriou
                        // [ _, tag, id, class ]
2819 a7dd0415 Kostas Papadimitriou
                        quick[1] = ( quick[1] || "" ).toLowerCase();
2820 a7dd0415 Kostas Papadimitriou
                        quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
2821 a7dd0415 Kostas Papadimitriou
                }
2822 a7dd0415 Kostas Papadimitriou
                return quick;
2823 a7dd0415 Kostas Papadimitriou
        },
2824 a7dd0415 Kostas Papadimitriou
        quickIs = function( elem, m ) {
2825 a7dd0415 Kostas Papadimitriou
                var attrs = elem.attributes || {};
2826 a7dd0415 Kostas Papadimitriou
                return (
2827 a7dd0415 Kostas Papadimitriou
                        (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
2828 a7dd0415 Kostas Papadimitriou
                        (!m[2] || (attrs.id || {}).value === m[2]) &&
2829 a7dd0415 Kostas Papadimitriou
                        (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
2830 a7dd0415 Kostas Papadimitriou
                );
2831 a7dd0415 Kostas Papadimitriou
        },
2832 a7dd0415 Kostas Papadimitriou
        hoverHack = function( events ) {
2833 a7dd0415 Kostas Papadimitriou
                return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
2834 a7dd0415 Kostas Papadimitriou
        };
2835 a7dd0415 Kostas Papadimitriou
2836 a7dd0415 Kostas Papadimitriou
/*
2837 a7dd0415 Kostas Papadimitriou
 * Helper functions for managing events -- not part of the public interface.
2838 a7dd0415 Kostas Papadimitriou
 * Props to Dean Edwards' addEvent library for many of the ideas.
2839 a7dd0415 Kostas Papadimitriou
 */
2840 a7dd0415 Kostas Papadimitriou
jQuery.event = {
2841 a7dd0415 Kostas Papadimitriou
2842 a7dd0415 Kostas Papadimitriou
        add: function( elem, types, handler, data, selector ) {
2843 a7dd0415 Kostas Papadimitriou
2844 a7dd0415 Kostas Papadimitriou
                var elemData, eventHandle, events,
2845 a7dd0415 Kostas Papadimitriou
                        t, tns, type, namespaces, handleObj,
2846 a7dd0415 Kostas Papadimitriou
                        handleObjIn, quick, handlers, special;
2847 a7dd0415 Kostas Papadimitriou
2848 a7dd0415 Kostas Papadimitriou
                // Don't attach events to noData or text/comment nodes (allow plain objects tho)
2849 a7dd0415 Kostas Papadimitriou
                if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
2850 a7dd0415 Kostas Papadimitriou
                        return;
2851 a7dd0415 Kostas Papadimitriou
                }
2852 a7dd0415 Kostas Papadimitriou
2853 a7dd0415 Kostas Papadimitriou
                // Caller can pass in an object of custom data in lieu of the handler
2854 a7dd0415 Kostas Papadimitriou
                if ( handler.handler ) {
2855 a7dd0415 Kostas Papadimitriou
                        handleObjIn = handler;
2856 a7dd0415 Kostas Papadimitriou
                        handler = handleObjIn.handler;
2857 a7dd0415 Kostas Papadimitriou
                }
2858 a7dd0415 Kostas Papadimitriou
2859 a7dd0415 Kostas Papadimitriou
                // Make sure that the handler has a unique ID, used to find/remove it later
2860 a7dd0415 Kostas Papadimitriou
                if ( !handler.guid ) {
2861 a7dd0415 Kostas Papadimitriou
                        handler.guid = jQuery.guid++;
2862 a7dd0415 Kostas Papadimitriou
                }
2863 a7dd0415 Kostas Papadimitriou
2864 a7dd0415 Kostas Papadimitriou
                // Init the element's event structure and main handler, if this is the first
2865 a7dd0415 Kostas Papadimitriou
                events = elemData.events;
2866 a7dd0415 Kostas Papadimitriou
                if ( !events ) {
2867 a7dd0415 Kostas Papadimitriou
                        elemData.events = events = {};
2868 a7dd0415 Kostas Papadimitriou
                }
2869 a7dd0415 Kostas Papadimitriou
                eventHandle = elemData.handle;
2870 a7dd0415 Kostas Papadimitriou
                if ( !eventHandle ) {
2871 a7dd0415 Kostas Papadimitriou
                        elemData.handle = eventHandle = function( e ) {
2872 a7dd0415 Kostas Papadimitriou
                                // Discard the second event of a jQuery.event.trigger() and
2873 a7dd0415 Kostas Papadimitriou
                                // when an event is called after a page has unloaded
2874 a7dd0415 Kostas Papadimitriou
                                return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2875 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2876 a7dd0415 Kostas Papadimitriou
                                        undefined;
2877 a7dd0415 Kostas Papadimitriou
                        };
2878 a7dd0415 Kostas Papadimitriou
                        // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2879 a7dd0415 Kostas Papadimitriou
                        eventHandle.elem = elem;
2880 a7dd0415 Kostas Papadimitriou
                }
2881 a7dd0415 Kostas Papadimitriou
2882 a7dd0415 Kostas Papadimitriou
                // Handle multiple events separated by a space
2883 a7dd0415 Kostas Papadimitriou
                // jQuery(...).bind("mouseover mouseout", fn);
2884 a7dd0415 Kostas Papadimitriou
                types = jQuery.trim( hoverHack(types) ).split( " " );
2885 a7dd0415 Kostas Papadimitriou
                for ( t = 0; t < types.length; t++ ) {
2886 a7dd0415 Kostas Papadimitriou
2887 a7dd0415 Kostas Papadimitriou
                        tns = rtypenamespace.exec( types[t] ) || [];
2888 a7dd0415 Kostas Papadimitriou
                        type = tns[1];
2889 a7dd0415 Kostas Papadimitriou
                        namespaces = ( tns[2] || "" ).split( "." ).sort();
2890 a7dd0415 Kostas Papadimitriou
2891 a7dd0415 Kostas Papadimitriou
                        // If event changes its type, use the special event handlers for the changed type
2892 a7dd0415 Kostas Papadimitriou
                        special = jQuery.event.special[ type ] || {};
2893 a7dd0415 Kostas Papadimitriou
2894 a7dd0415 Kostas Papadimitriou
                        // If selector defined, determine special event api type, otherwise given type
2895 a7dd0415 Kostas Papadimitriou
                        type = ( selector ? special.delegateType : special.bindType ) || type;
2896 a7dd0415 Kostas Papadimitriou
2897 a7dd0415 Kostas Papadimitriou
                        // Update special based on newly reset type
2898 a7dd0415 Kostas Papadimitriou
                        special = jQuery.event.special[ type ] || {};
2899 a7dd0415 Kostas Papadimitriou
2900 a7dd0415 Kostas Papadimitriou
                        // handleObj is passed to all event handlers
2901 a7dd0415 Kostas Papadimitriou
                        handleObj = jQuery.extend({
2902 a7dd0415 Kostas Papadimitriou
                                type: type,
2903 a7dd0415 Kostas Papadimitriou
                                origType: tns[1],
2904 a7dd0415 Kostas Papadimitriou
                                data: data,
2905 a7dd0415 Kostas Papadimitriou
                                handler: handler,
2906 a7dd0415 Kostas Papadimitriou
                                guid: handler.guid,
2907 a7dd0415 Kostas Papadimitriou
                                selector: selector,
2908 a7dd0415 Kostas Papadimitriou
                                quick: quickParse( selector ),
2909 a7dd0415 Kostas Papadimitriou
                                namespace: namespaces.join(".")
2910 a7dd0415 Kostas Papadimitriou
                        }, handleObjIn );
2911 a7dd0415 Kostas Papadimitriou
2912 a7dd0415 Kostas Papadimitriou
                        // Init the event handler queue if we're the first
2913 a7dd0415 Kostas Papadimitriou
                        handlers = events[ type ];
2914 a7dd0415 Kostas Papadimitriou
                        if ( !handlers ) {
2915 a7dd0415 Kostas Papadimitriou
                                handlers = events[ type ] = [];
2916 a7dd0415 Kostas Papadimitriou
                                handlers.delegateCount = 0;
2917 a7dd0415 Kostas Papadimitriou
2918 a7dd0415 Kostas Papadimitriou
                                // Only use addEventListener/attachEvent if the special events handler returns false
2919 a7dd0415 Kostas Papadimitriou
                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2920 a7dd0415 Kostas Papadimitriou
                                        // Bind the global event handler to the element
2921 a7dd0415 Kostas Papadimitriou
                                        if ( elem.addEventListener ) {
2922 a7dd0415 Kostas Papadimitriou
                                                elem.addEventListener( type, eventHandle, false );
2923 a7dd0415 Kostas Papadimitriou
2924 a7dd0415 Kostas Papadimitriou
                                        } else if ( elem.attachEvent ) {
2925 a7dd0415 Kostas Papadimitriou
                                                elem.attachEvent( "on" + type, eventHandle );
2926 a7dd0415 Kostas Papadimitriou
                                        }
2927 a7dd0415 Kostas Papadimitriou
                                }
2928 a7dd0415 Kostas Papadimitriou
                        }
2929 a7dd0415 Kostas Papadimitriou
2930 a7dd0415 Kostas Papadimitriou
                        if ( special.add ) {
2931 a7dd0415 Kostas Papadimitriou
                                special.add.call( elem, handleObj );
2932 a7dd0415 Kostas Papadimitriou
2933 a7dd0415 Kostas Papadimitriou
                                if ( !handleObj.handler.guid ) {
2934 a7dd0415 Kostas Papadimitriou
                                        handleObj.handler.guid = handler.guid;
2935 a7dd0415 Kostas Papadimitriou
                                }
2936 a7dd0415 Kostas Papadimitriou
                        }
2937 a7dd0415 Kostas Papadimitriou
2938 a7dd0415 Kostas Papadimitriou
                        // Add to the element's handler list, delegates in front
2939 a7dd0415 Kostas Papadimitriou
                        if ( selector ) {
2940 a7dd0415 Kostas Papadimitriou
                                handlers.splice( handlers.delegateCount++, 0, handleObj );
2941 a7dd0415 Kostas Papadimitriou
                        } else {
2942 a7dd0415 Kostas Papadimitriou
                                handlers.push( handleObj );
2943 a7dd0415 Kostas Papadimitriou
                        }
2944 a7dd0415 Kostas Papadimitriou
2945 a7dd0415 Kostas Papadimitriou
                        // Keep track of which events have ever been used, for event optimization
2946 a7dd0415 Kostas Papadimitriou
                        jQuery.event.global[ type ] = true;
2947 a7dd0415 Kostas Papadimitriou
                }
2948 a7dd0415 Kostas Papadimitriou
2949 a7dd0415 Kostas Papadimitriou
                // Nullify elem to prevent memory leaks in IE
2950 a7dd0415 Kostas Papadimitriou
                elem = null;
2951 a7dd0415 Kostas Papadimitriou
        },
2952 a7dd0415 Kostas Papadimitriou
2953 a7dd0415 Kostas Papadimitriou
        global: {},
2954 a7dd0415 Kostas Papadimitriou
2955 a7dd0415 Kostas Papadimitriou
        // Detach an event or set of events from an element
2956 a7dd0415 Kostas Papadimitriou
        remove: function( elem, types, handler, selector, mappedTypes ) {
2957 a7dd0415 Kostas Papadimitriou
2958 a7dd0415 Kostas Papadimitriou
                var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2959 a7dd0415 Kostas Papadimitriou
                        t, tns, type, origType, namespaces, origCount,
2960 a7dd0415 Kostas Papadimitriou
                        j, events, special, handle, eventType, handleObj;
2961 a7dd0415 Kostas Papadimitriou
2962 a7dd0415 Kostas Papadimitriou
                if ( !elemData || !(events = elemData.events) ) {
2963 a7dd0415 Kostas Papadimitriou
                        return;
2964 a7dd0415 Kostas Papadimitriou
                }
2965 a7dd0415 Kostas Papadimitriou
2966 a7dd0415 Kostas Papadimitriou
                // Once for each type.namespace in types; type may be omitted
2967 a7dd0415 Kostas Papadimitriou
                types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
2968 a7dd0415 Kostas Papadimitriou
                for ( t = 0; t < types.length; t++ ) {
2969 a7dd0415 Kostas Papadimitriou
                        tns = rtypenamespace.exec( types[t] ) || [];
2970 a7dd0415 Kostas Papadimitriou
                        type = origType = tns[1];
2971 a7dd0415 Kostas Papadimitriou
                        namespaces = tns[2];
2972 a7dd0415 Kostas Papadimitriou
2973 a7dd0415 Kostas Papadimitriou
                        // Unbind all events (on this namespace, if provided) for the element
2974 a7dd0415 Kostas Papadimitriou
                        if ( !type ) {
2975 a7dd0415 Kostas Papadimitriou
                                for ( type in events ) {
2976 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
2977 a7dd0415 Kostas Papadimitriou
                                }
2978 a7dd0415 Kostas Papadimitriou
                                continue;
2979 a7dd0415 Kostas Papadimitriou
                        }
2980 a7dd0415 Kostas Papadimitriou
2981 a7dd0415 Kostas Papadimitriou
                        special = jQuery.event.special[ type ] || {};
2982 a7dd0415 Kostas Papadimitriou
                        type = ( selector? special.delegateType : special.bindType ) || type;
2983 a7dd0415 Kostas Papadimitriou
                        eventType = events[ type ] || [];
2984 a7dd0415 Kostas Papadimitriou
                        origCount = eventType.length;
2985 a7dd0415 Kostas Papadimitriou
                        namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
2986 a7dd0415 Kostas Papadimitriou
2987 a7dd0415 Kostas Papadimitriou
                        // Remove matching events
2988 a7dd0415 Kostas Papadimitriou
                        for ( j = 0; j < eventType.length; j++ ) {
2989 a7dd0415 Kostas Papadimitriou
                                handleObj = eventType[ j ];
2990 a7dd0415 Kostas Papadimitriou
2991 a7dd0415 Kostas Papadimitriou
                                if ( ( mappedTypes || origType === handleObj.origType ) &&
2992 a7dd0415 Kostas Papadimitriou
                                         ( !handler || handler.guid === handleObj.guid ) &&
2993 a7dd0415 Kostas Papadimitriou
                                         ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
2994 a7dd0415 Kostas Papadimitriou
                                         ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
2995 a7dd0415 Kostas Papadimitriou
                                        eventType.splice( j--, 1 );
2996 a7dd0415 Kostas Papadimitriou
2997 a7dd0415 Kostas Papadimitriou
                                        if ( handleObj.selector ) {
2998 a7dd0415 Kostas Papadimitriou
                                                eventType.delegateCount--;
2999 a7dd0415 Kostas Papadimitriou
                                        }
3000 a7dd0415 Kostas Papadimitriou
                                        if ( special.remove ) {
3001 a7dd0415 Kostas Papadimitriou
                                                special.remove.call( elem, handleObj );
3002 a7dd0415 Kostas Papadimitriou
                                        }
3003 a7dd0415 Kostas Papadimitriou
                                }
3004 a7dd0415 Kostas Papadimitriou
                        }
3005 a7dd0415 Kostas Papadimitriou
3006 a7dd0415 Kostas Papadimitriou
                        // Remove generic event handler if we removed something and no more handlers exist
3007 a7dd0415 Kostas Papadimitriou
                        // (avoids potential for endless recursion during removal of special event handlers)
3008 a7dd0415 Kostas Papadimitriou
                        if ( eventType.length === 0 && origCount !== eventType.length ) {
3009 a7dd0415 Kostas Papadimitriou
                                if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
3010 a7dd0415 Kostas Papadimitriou
                                        jQuery.removeEvent( elem, type, elemData.handle );
3011 a7dd0415 Kostas Papadimitriou
                                }
3012 a7dd0415 Kostas Papadimitriou
3013 a7dd0415 Kostas Papadimitriou
                                delete events[ type ];
3014 a7dd0415 Kostas Papadimitriou
                        }
3015 a7dd0415 Kostas Papadimitriou
                }
3016 a7dd0415 Kostas Papadimitriou
3017 a7dd0415 Kostas Papadimitriou
                // Remove the expando if it's no longer used
3018 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isEmptyObject( events ) ) {
3019 a7dd0415 Kostas Papadimitriou
                        handle = elemData.handle;
3020 a7dd0415 Kostas Papadimitriou
                        if ( handle ) {
3021 a7dd0415 Kostas Papadimitriou
                                handle.elem = null;
3022 a7dd0415 Kostas Papadimitriou
                        }
3023 a7dd0415 Kostas Papadimitriou
3024 a7dd0415 Kostas Papadimitriou
                        // removeData also checks for emptiness and clears the expando if empty
3025 a7dd0415 Kostas Papadimitriou
                        // so use it instead of delete
3026 a7dd0415 Kostas Papadimitriou
                        jQuery.removeData( elem, [ "events", "handle" ], true );
3027 a7dd0415 Kostas Papadimitriou
                }
3028 a7dd0415 Kostas Papadimitriou
        },
3029 a7dd0415 Kostas Papadimitriou
3030 a7dd0415 Kostas Papadimitriou
        // Events that are safe to short-circuit if no handlers are attached.
3031 a7dd0415 Kostas Papadimitriou
        // Native DOM events should not be added, they may have inline handlers.
3032 a7dd0415 Kostas Papadimitriou
        customEvent: {
3033 a7dd0415 Kostas Papadimitriou
                "getData": true,
3034 a7dd0415 Kostas Papadimitriou
                "setData": true,
3035 a7dd0415 Kostas Papadimitriou
                "changeData": true
3036 a7dd0415 Kostas Papadimitriou
        },
3037 a7dd0415 Kostas Papadimitriou
3038 a7dd0415 Kostas Papadimitriou
        trigger: function( event, data, elem, onlyHandlers ) {
3039 a7dd0415 Kostas Papadimitriou
                // Don't do events on text and comment nodes
3040 a7dd0415 Kostas Papadimitriou
                if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
3041 a7dd0415 Kostas Papadimitriou
                        return;
3042 a7dd0415 Kostas Papadimitriou
                }
3043 a7dd0415 Kostas Papadimitriou
3044 a7dd0415 Kostas Papadimitriou
                // Event object or event type
3045 a7dd0415 Kostas Papadimitriou
                var type = event.type || event,
3046 a7dd0415 Kostas Papadimitriou
                        namespaces = [],
3047 a7dd0415 Kostas Papadimitriou
                        cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
3048 a7dd0415 Kostas Papadimitriou
3049 a7dd0415 Kostas Papadimitriou
                // focus/blur morphs to focusin/out; ensure we're not firing them right now
3050 a7dd0415 Kostas Papadimitriou
                if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
3051 a7dd0415 Kostas Papadimitriou
                        return;
3052 a7dd0415 Kostas Papadimitriou
                }
3053 a7dd0415 Kostas Papadimitriou
3054 a7dd0415 Kostas Papadimitriou
                if ( type.indexOf( "!" ) >= 0 ) {
3055 a7dd0415 Kostas Papadimitriou
                        // Exclusive events trigger only for the exact event (no namespaces)
3056 a7dd0415 Kostas Papadimitriou
                        type = type.slice(0, -1);
3057 a7dd0415 Kostas Papadimitriou
                        exclusive = true;
3058 a7dd0415 Kostas Papadimitriou
                }
3059 a7dd0415 Kostas Papadimitriou
3060 a7dd0415 Kostas Papadimitriou
                if ( type.indexOf( "." ) >= 0 ) {
3061 a7dd0415 Kostas Papadimitriou
                        // Namespaced trigger; create a regexp to match event type in handle()
3062 a7dd0415 Kostas Papadimitriou
                        namespaces = type.split(".");
3063 a7dd0415 Kostas Papadimitriou
                        type = namespaces.shift();
3064 a7dd0415 Kostas Papadimitriou
                        namespaces.sort();
3065 a7dd0415 Kostas Papadimitriou
                }
3066 a7dd0415 Kostas Papadimitriou
3067 a7dd0415 Kostas Papadimitriou
                if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
3068 a7dd0415 Kostas Papadimitriou
                        // No jQuery handlers for this event type, and it can't have inline handlers
3069 a7dd0415 Kostas Papadimitriou
                        return;
3070 a7dd0415 Kostas Papadimitriou
                }
3071 a7dd0415 Kostas Papadimitriou
3072 a7dd0415 Kostas Papadimitriou
                // Caller can pass in an Event, Object, or just an event type string
3073 a7dd0415 Kostas Papadimitriou
                event = typeof event === "object" ?
3074 a7dd0415 Kostas Papadimitriou
                        // jQuery.Event object
3075 a7dd0415 Kostas Papadimitriou
                        event[ jQuery.expando ] ? event :
3076 a7dd0415 Kostas Papadimitriou
                        // Object literal
3077 a7dd0415 Kostas Papadimitriou
                        new jQuery.Event( type, event ) :
3078 a7dd0415 Kostas Papadimitriou
                        // Just the event type (string)
3079 a7dd0415 Kostas Papadimitriou
                        new jQuery.Event( type );
3080 a7dd0415 Kostas Papadimitriou
3081 a7dd0415 Kostas Papadimitriou
                event.type = type;
3082 a7dd0415 Kostas Papadimitriou
                event.isTrigger = true;
3083 a7dd0415 Kostas Papadimitriou
                event.exclusive = exclusive;
3084 a7dd0415 Kostas Papadimitriou
                event.namespace = namespaces.join( "." );
3085 a7dd0415 Kostas Papadimitriou
                event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
3086 a7dd0415 Kostas Papadimitriou
                ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
3087 a7dd0415 Kostas Papadimitriou
3088 a7dd0415 Kostas Papadimitriou
                // Handle a global trigger
3089 a7dd0415 Kostas Papadimitriou
                if ( !elem ) {
3090 a7dd0415 Kostas Papadimitriou
3091 a7dd0415 Kostas Papadimitriou
                        // TODO: Stop taunting the data cache; remove global events and always attach to document
3092 a7dd0415 Kostas Papadimitriou
                        cache = jQuery.cache;
3093 a7dd0415 Kostas Papadimitriou
                        for ( i in cache ) {
3094 a7dd0415 Kostas Papadimitriou
                                if ( cache[ i ].events && cache[ i ].events[ type ] ) {
3095 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
3096 a7dd0415 Kostas Papadimitriou
                                }
3097 a7dd0415 Kostas Papadimitriou
                        }
3098 a7dd0415 Kostas Papadimitriou
                        return;
3099 a7dd0415 Kostas Papadimitriou
                }
3100 a7dd0415 Kostas Papadimitriou
3101 a7dd0415 Kostas Papadimitriou
                // Clean up the event in case it is being reused
3102 a7dd0415 Kostas Papadimitriou
                event.result = undefined;
3103 a7dd0415 Kostas Papadimitriou
                if ( !event.target ) {
3104 a7dd0415 Kostas Papadimitriou
                        event.target = elem;
3105 a7dd0415 Kostas Papadimitriou
                }
3106 a7dd0415 Kostas Papadimitriou
3107 a7dd0415 Kostas Papadimitriou
                // Clone any incoming data and prepend the event, creating the handler arg list
3108 a7dd0415 Kostas Papadimitriou
                data = data != null ? jQuery.makeArray( data ) : [];
3109 a7dd0415 Kostas Papadimitriou
                data.unshift( event );
3110 a7dd0415 Kostas Papadimitriou
3111 a7dd0415 Kostas Papadimitriou
                // Allow special events to draw outside the lines
3112 a7dd0415 Kostas Papadimitriou
                special = jQuery.event.special[ type ] || {};
3113 a7dd0415 Kostas Papadimitriou
                if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
3114 a7dd0415 Kostas Papadimitriou
                        return;
3115 a7dd0415 Kostas Papadimitriou
                }
3116 a7dd0415 Kostas Papadimitriou
3117 a7dd0415 Kostas Papadimitriou
                // Determine event propagation path in advance, per W3C events spec (#9951)
3118 a7dd0415 Kostas Papadimitriou
                // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
3119 a7dd0415 Kostas Papadimitriou
                eventPath = [[ elem, special.bindType || type ]];
3120 a7dd0415 Kostas Papadimitriou
                if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
3121 a7dd0415 Kostas Papadimitriou
3122 a7dd0415 Kostas Papadimitriou
                        bubbleType = special.delegateType || type;
3123 a7dd0415 Kostas Papadimitriou
                        cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
3124 a7dd0415 Kostas Papadimitriou
                        old = null;
3125 a7dd0415 Kostas Papadimitriou
                        for ( ; cur; cur = cur.parentNode ) {
3126 a7dd0415 Kostas Papadimitriou
                                eventPath.push([ cur, bubbleType ]);
3127 a7dd0415 Kostas Papadimitriou
                                old = cur;
3128 a7dd0415 Kostas Papadimitriou
                        }
3129 a7dd0415 Kostas Papadimitriou
3130 a7dd0415 Kostas Papadimitriou
                        // Only add window if we got to document (e.g., not plain obj or detached DOM)
3131 a7dd0415 Kostas Papadimitriou
                        if ( old && old === elem.ownerDocument ) {
3132 a7dd0415 Kostas Papadimitriou
                                eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
3133 a7dd0415 Kostas Papadimitriou
                        }
3134 a7dd0415 Kostas Papadimitriou
                }
3135 a7dd0415 Kostas Papadimitriou
3136 a7dd0415 Kostas Papadimitriou
                // Fire handlers on the event path
3137 a7dd0415 Kostas Papadimitriou
                for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
3138 a7dd0415 Kostas Papadimitriou
3139 a7dd0415 Kostas Papadimitriou
                        cur = eventPath[i][0];
3140 a7dd0415 Kostas Papadimitriou
                        event.type = eventPath[i][1];
3141 a7dd0415 Kostas Papadimitriou
3142 a7dd0415 Kostas Papadimitriou
                        handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
3143 a7dd0415 Kostas Papadimitriou
                        if ( handle ) {
3144 a7dd0415 Kostas Papadimitriou
                                handle.apply( cur, data );
3145 a7dd0415 Kostas Papadimitriou
                        }
3146 a7dd0415 Kostas Papadimitriou
                        // Note that this is a bare JS function and not a jQuery handler
3147 a7dd0415 Kostas Papadimitriou
                        handle = ontype && cur[ ontype ];
3148 a7dd0415 Kostas Papadimitriou
                        if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
3149 a7dd0415 Kostas Papadimitriou
                                event.preventDefault();
3150 a7dd0415 Kostas Papadimitriou
                        }
3151 a7dd0415 Kostas Papadimitriou
                }
3152 a7dd0415 Kostas Papadimitriou
                event.type = type;
3153 a7dd0415 Kostas Papadimitriou
3154 a7dd0415 Kostas Papadimitriou
                // If nobody prevented the default action, do it now
3155 a7dd0415 Kostas Papadimitriou
                if ( !onlyHandlers && !event.isDefaultPrevented() ) {
3156 a7dd0415 Kostas Papadimitriou
3157 a7dd0415 Kostas Papadimitriou
                        if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3158 a7dd0415 Kostas Papadimitriou
                                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3159 a7dd0415 Kostas Papadimitriou
3160 a7dd0415 Kostas Papadimitriou
                                // Call a native DOM method on the target with the same name name as the event.
3161 a7dd0415 Kostas Papadimitriou
                                // Can't use an .isFunction() check here because IE6/7 fails that test.
3162 a7dd0415 Kostas Papadimitriou
                                // Don't do default actions on window, that's where global variables be (#6170)
3163 a7dd0415 Kostas Papadimitriou
                                // IE<9 dies on focus/blur to hidden element (#1486)
3164 a7dd0415 Kostas Papadimitriou
                                if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
3165 a7dd0415 Kostas Papadimitriou
3166 a7dd0415 Kostas Papadimitriou
                                        // Don't re-trigger an onFOO event when we call its FOO() method
3167 a7dd0415 Kostas Papadimitriou
                                        old = elem[ ontype ];
3168 a7dd0415 Kostas Papadimitriou
3169 a7dd0415 Kostas Papadimitriou
                                        if ( old ) {
3170 a7dd0415 Kostas Papadimitriou
                                                elem[ ontype ] = null;
3171 a7dd0415 Kostas Papadimitriou
                                        }
3172 a7dd0415 Kostas Papadimitriou
3173 a7dd0415 Kostas Papadimitriou
                                        // Prevent re-triggering of the same event, since we already bubbled it above
3174 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.triggered = type;
3175 a7dd0415 Kostas Papadimitriou
                                        elem[ type ]();
3176 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.triggered = undefined;
3177 a7dd0415 Kostas Papadimitriou
3178 a7dd0415 Kostas Papadimitriou
                                        if ( old ) {
3179 a7dd0415 Kostas Papadimitriou
                                                elem[ ontype ] = old;
3180 a7dd0415 Kostas Papadimitriou
                                        }
3181 a7dd0415 Kostas Papadimitriou
                                }
3182 a7dd0415 Kostas Papadimitriou
                        }
3183 a7dd0415 Kostas Papadimitriou
                }
3184 a7dd0415 Kostas Papadimitriou
3185 a7dd0415 Kostas Papadimitriou
                return event.result;
3186 a7dd0415 Kostas Papadimitriou
        },
3187 a7dd0415 Kostas Papadimitriou
3188 a7dd0415 Kostas Papadimitriou
        dispatch: function( event ) {
3189 a7dd0415 Kostas Papadimitriou
3190 a7dd0415 Kostas Papadimitriou
                // Make a writable jQuery.Event from the native event object
3191 a7dd0415 Kostas Papadimitriou
                event = jQuery.event.fix( event || window.event );
3192 a7dd0415 Kostas Papadimitriou
3193 a7dd0415 Kostas Papadimitriou
                var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
3194 a7dd0415 Kostas Papadimitriou
                        delegateCount = handlers.delegateCount,
3195 a7dd0415 Kostas Papadimitriou
                        args = [].slice.call( arguments, 0 ),
3196 a7dd0415 Kostas Papadimitriou
                        run_all = !event.exclusive && !event.namespace,
3197 a7dd0415 Kostas Papadimitriou
                        handlerQueue = [],
3198 a7dd0415 Kostas Papadimitriou
                        i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
3199 a7dd0415 Kostas Papadimitriou
3200 a7dd0415 Kostas Papadimitriou
                // Use the fix-ed jQuery.Event rather than the (read-only) native event
3201 a7dd0415 Kostas Papadimitriou
                args[0] = event;
3202 a7dd0415 Kostas Papadimitriou
                event.delegateTarget = this;
3203 a7dd0415 Kostas Papadimitriou
3204 a7dd0415 Kostas Papadimitriou
                // Determine handlers that should run if there are delegated events
3205 a7dd0415 Kostas Papadimitriou
                // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
3206 a7dd0415 Kostas Papadimitriou
                if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
3207 a7dd0415 Kostas Papadimitriou
3208 a7dd0415 Kostas Papadimitriou
                        // Pregenerate a single jQuery object for reuse with .is()
3209 a7dd0415 Kostas Papadimitriou
                        jqcur = jQuery(this);
3210 a7dd0415 Kostas Papadimitriou
                        jqcur.context = this.ownerDocument || this;
3211 a7dd0415 Kostas Papadimitriou
3212 a7dd0415 Kostas Papadimitriou
                        for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
3213 a7dd0415 Kostas Papadimitriou
                                selMatch = {};
3214 a7dd0415 Kostas Papadimitriou
                                matches = [];
3215 a7dd0415 Kostas Papadimitriou
                                jqcur[0] = cur;
3216 a7dd0415 Kostas Papadimitriou
                                for ( i = 0; i < delegateCount; i++ ) {
3217 a7dd0415 Kostas Papadimitriou
                                        handleObj = handlers[ i ];
3218 a7dd0415 Kostas Papadimitriou
                                        sel = handleObj.selector;
3219 a7dd0415 Kostas Papadimitriou
3220 a7dd0415 Kostas Papadimitriou
                                        if ( selMatch[ sel ] === undefined ) {
3221 a7dd0415 Kostas Papadimitriou
                                                selMatch[ sel ] = (
3222 a7dd0415 Kostas Papadimitriou
                                                        handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
3223 a7dd0415 Kostas Papadimitriou
                                                );
3224 a7dd0415 Kostas Papadimitriou
                                        }
3225 a7dd0415 Kostas Papadimitriou
                                        if ( selMatch[ sel ] ) {
3226 a7dd0415 Kostas Papadimitriou
                                                matches.push( handleObj );
3227 a7dd0415 Kostas Papadimitriou
                                        }
3228 a7dd0415 Kostas Papadimitriou
                                }
3229 a7dd0415 Kostas Papadimitriou
                                if ( matches.length ) {
3230 a7dd0415 Kostas Papadimitriou
                                        handlerQueue.push({ elem: cur, matches: matches });
3231 a7dd0415 Kostas Papadimitriou
                                }
3232 a7dd0415 Kostas Papadimitriou
                        }
3233 a7dd0415 Kostas Papadimitriou
                }
3234 a7dd0415 Kostas Papadimitriou
3235 a7dd0415 Kostas Papadimitriou
                // Add the remaining (directly-bound) handlers
3236 a7dd0415 Kostas Papadimitriou
                if ( handlers.length > delegateCount ) {
3237 a7dd0415 Kostas Papadimitriou
                        handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
3238 a7dd0415 Kostas Papadimitriou
                }
3239 a7dd0415 Kostas Papadimitriou
3240 a7dd0415 Kostas Papadimitriou
                // Run delegates first; they may want to stop propagation beneath us
3241 a7dd0415 Kostas Papadimitriou
                for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
3242 a7dd0415 Kostas Papadimitriou
                        matched = handlerQueue[ i ];
3243 a7dd0415 Kostas Papadimitriou
                        event.currentTarget = matched.elem;
3244 a7dd0415 Kostas Papadimitriou
3245 a7dd0415 Kostas Papadimitriou
                        for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
3246 a7dd0415 Kostas Papadimitriou
                                handleObj = matched.matches[ j ];
3247 a7dd0415 Kostas Papadimitriou
3248 a7dd0415 Kostas Papadimitriou
                                // Triggered event must either 1) be non-exclusive and have no namespace, or
3249 a7dd0415 Kostas Papadimitriou
                                // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3250 a7dd0415 Kostas Papadimitriou
                                if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
3251 a7dd0415 Kostas Papadimitriou
3252 a7dd0415 Kostas Papadimitriou
                                        event.data = handleObj.data;
3253 a7dd0415 Kostas Papadimitriou
                                        event.handleObj = handleObj;
3254 a7dd0415 Kostas Papadimitriou
3255 a7dd0415 Kostas Papadimitriou
                                        ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
3256 a7dd0415 Kostas Papadimitriou
                                                        .apply( matched.elem, args );
3257 a7dd0415 Kostas Papadimitriou
3258 a7dd0415 Kostas Papadimitriou
                                        if ( ret !== undefined ) {
3259 a7dd0415 Kostas Papadimitriou
                                                event.result = ret;
3260 a7dd0415 Kostas Papadimitriou
                                                if ( ret === false ) {
3261 a7dd0415 Kostas Papadimitriou
                                                        event.preventDefault();
3262 a7dd0415 Kostas Papadimitriou
                                                        event.stopPropagation();
3263 a7dd0415 Kostas Papadimitriou
                                                }
3264 a7dd0415 Kostas Papadimitriou
                                        }
3265 a7dd0415 Kostas Papadimitriou
                                }
3266 a7dd0415 Kostas Papadimitriou
                        }
3267 a7dd0415 Kostas Papadimitriou
                }
3268 a7dd0415 Kostas Papadimitriou
3269 a7dd0415 Kostas Papadimitriou
                return event.result;
3270 a7dd0415 Kostas Papadimitriou
        },
3271 a7dd0415 Kostas Papadimitriou
3272 a7dd0415 Kostas Papadimitriou
        // Includes some event props shared by KeyEvent and MouseEvent
3273 a7dd0415 Kostas Papadimitriou
        // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
3274 a7dd0415 Kostas Papadimitriou
        props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
3275 a7dd0415 Kostas Papadimitriou
3276 a7dd0415 Kostas Papadimitriou
        fixHooks: {},
3277 a7dd0415 Kostas Papadimitriou
3278 a7dd0415 Kostas Papadimitriou
        keyHooks: {
3279 a7dd0415 Kostas Papadimitriou
                props: "char charCode key keyCode".split(" "),
3280 a7dd0415 Kostas Papadimitriou
                filter: function( event, original ) {
3281 a7dd0415 Kostas Papadimitriou
3282 a7dd0415 Kostas Papadimitriou
                        // Add which for key events
3283 a7dd0415 Kostas Papadimitriou
                        if ( event.which == null ) {
3284 a7dd0415 Kostas Papadimitriou
                                event.which = original.charCode != null ? original.charCode : original.keyCode;
3285 a7dd0415 Kostas Papadimitriou
                        }
3286 a7dd0415 Kostas Papadimitriou
3287 a7dd0415 Kostas Papadimitriou
                        return event;
3288 a7dd0415 Kostas Papadimitriou
                }
3289 a7dd0415 Kostas Papadimitriou
        },
3290 a7dd0415 Kostas Papadimitriou
3291 a7dd0415 Kostas Papadimitriou
        mouseHooks: {
3292 a7dd0415 Kostas Papadimitriou
                props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3293 a7dd0415 Kostas Papadimitriou
                filter: function( event, original ) {
3294 a7dd0415 Kostas Papadimitriou
                        var eventDoc, doc, body,
3295 a7dd0415 Kostas Papadimitriou
                                button = original.button,
3296 a7dd0415 Kostas Papadimitriou
                                fromElement = original.fromElement;
3297 a7dd0415 Kostas Papadimitriou
3298 a7dd0415 Kostas Papadimitriou
                        // Calculate pageX/Y if missing and clientX/Y available
3299 a7dd0415 Kostas Papadimitriou
                        if ( event.pageX == null && original.clientX != null ) {
3300 a7dd0415 Kostas Papadimitriou
                                eventDoc = event.target.ownerDocument || document;
3301 a7dd0415 Kostas Papadimitriou
                                doc = eventDoc.documentElement;
3302 a7dd0415 Kostas Papadimitriou
                                body = eventDoc.body;
3303 a7dd0415 Kostas Papadimitriou
3304 a7dd0415 Kostas Papadimitriou
                                event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3305 a7dd0415 Kostas Papadimitriou
                                event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
3306 a7dd0415 Kostas Papadimitriou
                        }
3307 a7dd0415 Kostas Papadimitriou
3308 a7dd0415 Kostas Papadimitriou
                        // Add relatedTarget, if necessary
3309 a7dd0415 Kostas Papadimitriou
                        if ( !event.relatedTarget && fromElement ) {
3310 a7dd0415 Kostas Papadimitriou
                                event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3311 a7dd0415 Kostas Papadimitriou
                        }
3312 a7dd0415 Kostas Papadimitriou
3313 a7dd0415 Kostas Papadimitriou
                        // Add which for click: 1 === left; 2 === middle; 3 === right
3314 a7dd0415 Kostas Papadimitriou
                        // Note: button is not normalized, so don't use it
3315 a7dd0415 Kostas Papadimitriou
                        if ( !event.which && button !== undefined ) {
3316 a7dd0415 Kostas Papadimitriou
                                event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
3317 a7dd0415 Kostas Papadimitriou
                        }
3318 a7dd0415 Kostas Papadimitriou
3319 a7dd0415 Kostas Papadimitriou
                        return event;
3320 a7dd0415 Kostas Papadimitriou
                }
3321 a7dd0415 Kostas Papadimitriou
        },
3322 a7dd0415 Kostas Papadimitriou
3323 a7dd0415 Kostas Papadimitriou
        fix: function( event ) {
3324 a7dd0415 Kostas Papadimitriou
                if ( event[ jQuery.expando ] ) {
3325 a7dd0415 Kostas Papadimitriou
                        return event;
3326 a7dd0415 Kostas Papadimitriou
                }
3327 a7dd0415 Kostas Papadimitriou
3328 a7dd0415 Kostas Papadimitriou
                // Create a writable copy of the event object and normalize some properties
3329 a7dd0415 Kostas Papadimitriou
                var i, prop,
3330 a7dd0415 Kostas Papadimitriou
                        originalEvent = event,
3331 a7dd0415 Kostas Papadimitriou
                        fixHook = jQuery.event.fixHooks[ event.type ] || {},
3332 a7dd0415 Kostas Papadimitriou
                        copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3333 a7dd0415 Kostas Papadimitriou
3334 a7dd0415 Kostas Papadimitriou
                event = jQuery.Event( originalEvent );
3335 a7dd0415 Kostas Papadimitriou
3336 a7dd0415 Kostas Papadimitriou
                for ( i = copy.length; i; ) {
3337 a7dd0415 Kostas Papadimitriou
                        prop = copy[ --i ];
3338 a7dd0415 Kostas Papadimitriou
                        event[ prop ] = originalEvent[ prop ];
3339 a7dd0415 Kostas Papadimitriou
                }
3340 a7dd0415 Kostas Papadimitriou
3341 a7dd0415 Kostas Papadimitriou
                // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
3342 a7dd0415 Kostas Papadimitriou
                if ( !event.target ) {
3343 a7dd0415 Kostas Papadimitriou
                        event.target = originalEvent.srcElement || document;
3344 a7dd0415 Kostas Papadimitriou
                }
3345 a7dd0415 Kostas Papadimitriou
3346 a7dd0415 Kostas Papadimitriou
                // Target should not be a text node (#504, Safari)
3347 a7dd0415 Kostas Papadimitriou
                if ( event.target.nodeType === 3 ) {
3348 a7dd0415 Kostas Papadimitriou
                        event.target = event.target.parentNode;
3349 a7dd0415 Kostas Papadimitriou
                }
3350 a7dd0415 Kostas Papadimitriou
3351 a7dd0415 Kostas Papadimitriou
                // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
3352 a7dd0415 Kostas Papadimitriou
                if ( event.metaKey === undefined ) {
3353 a7dd0415 Kostas Papadimitriou
                        event.metaKey = event.ctrlKey;
3354 a7dd0415 Kostas Papadimitriou
                }
3355 a7dd0415 Kostas Papadimitriou
3356 a7dd0415 Kostas Papadimitriou
                return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
3357 a7dd0415 Kostas Papadimitriou
        },
3358 a7dd0415 Kostas Papadimitriou
3359 a7dd0415 Kostas Papadimitriou
        special: {
3360 a7dd0415 Kostas Papadimitriou
                ready: {
3361 a7dd0415 Kostas Papadimitriou
                        // Make sure the ready event is setup
3362 a7dd0415 Kostas Papadimitriou
                        setup: jQuery.bindReady
3363 a7dd0415 Kostas Papadimitriou
                },
3364 a7dd0415 Kostas Papadimitriou
3365 a7dd0415 Kostas Papadimitriou
                load: {
3366 a7dd0415 Kostas Papadimitriou
                        // Prevent triggered image.load events from bubbling to window.load
3367 a7dd0415 Kostas Papadimitriou
                        noBubble: true
3368 a7dd0415 Kostas Papadimitriou
                },
3369 a7dd0415 Kostas Papadimitriou
3370 a7dd0415 Kostas Papadimitriou
                focus: {
3371 a7dd0415 Kostas Papadimitriou
                        delegateType: "focusin"
3372 a7dd0415 Kostas Papadimitriou
                },
3373 a7dd0415 Kostas Papadimitriou
                blur: {
3374 a7dd0415 Kostas Papadimitriou
                        delegateType: "focusout"
3375 a7dd0415 Kostas Papadimitriou
                },
3376 a7dd0415 Kostas Papadimitriou
3377 a7dd0415 Kostas Papadimitriou
                beforeunload: {
3378 a7dd0415 Kostas Papadimitriou
                        setup: function( data, namespaces, eventHandle ) {
3379 a7dd0415 Kostas Papadimitriou
                                // We only want to do this special case on windows
3380 a7dd0415 Kostas Papadimitriou
                                if ( jQuery.isWindow( this ) ) {
3381 a7dd0415 Kostas Papadimitriou
                                        this.onbeforeunload = eventHandle;
3382 a7dd0415 Kostas Papadimitriou
                                }
3383 a7dd0415 Kostas Papadimitriou
                        },
3384 a7dd0415 Kostas Papadimitriou
3385 a7dd0415 Kostas Papadimitriou
                        teardown: function( namespaces, eventHandle ) {
3386 a7dd0415 Kostas Papadimitriou
                                if ( this.onbeforeunload === eventHandle ) {
3387 a7dd0415 Kostas Papadimitriou
                                        this.onbeforeunload = null;
3388 a7dd0415 Kostas Papadimitriou
                                }
3389 a7dd0415 Kostas Papadimitriou
                        }
3390 a7dd0415 Kostas Papadimitriou
                }
3391 a7dd0415 Kostas Papadimitriou
        },
3392 a7dd0415 Kostas Papadimitriou
3393 a7dd0415 Kostas Papadimitriou
        simulate: function( type, elem, event, bubble ) {
3394 a7dd0415 Kostas Papadimitriou
                // Piggyback on a donor event to simulate a different one.
3395 a7dd0415 Kostas Papadimitriou
                // Fake originalEvent to avoid donor's stopPropagation, but if the
3396 a7dd0415 Kostas Papadimitriou
                // simulated event prevents default then we do the same on the donor.
3397 a7dd0415 Kostas Papadimitriou
                var e = jQuery.extend(
3398 a7dd0415 Kostas Papadimitriou
                        new jQuery.Event(),
3399 a7dd0415 Kostas Papadimitriou
                        event,
3400 a7dd0415 Kostas Papadimitriou
                        { type: type,
3401 a7dd0415 Kostas Papadimitriou
                                isSimulated: true,
3402 a7dd0415 Kostas Papadimitriou
                                originalEvent: {}
3403 a7dd0415 Kostas Papadimitriou
                        }
3404 a7dd0415 Kostas Papadimitriou
                );
3405 a7dd0415 Kostas Papadimitriou
                if ( bubble ) {
3406 a7dd0415 Kostas Papadimitriou
                        jQuery.event.trigger( e, null, elem );
3407 a7dd0415 Kostas Papadimitriou
                } else {
3408 a7dd0415 Kostas Papadimitriou
                        jQuery.event.dispatch.call( elem, e );
3409 a7dd0415 Kostas Papadimitriou
                }
3410 a7dd0415 Kostas Papadimitriou
                if ( e.isDefaultPrevented() ) {
3411 a7dd0415 Kostas Papadimitriou
                        event.preventDefault();
3412 a7dd0415 Kostas Papadimitriou
                }
3413 a7dd0415 Kostas Papadimitriou
        }
3414 a7dd0415 Kostas Papadimitriou
};
3415 a7dd0415 Kostas Papadimitriou
3416 a7dd0415 Kostas Papadimitriou
// Some plugins are using, but it's undocumented/deprecated and will be removed.
3417 a7dd0415 Kostas Papadimitriou
// The 1.7 special event interface should provide all the hooks needed now.
3418 a7dd0415 Kostas Papadimitriou
jQuery.event.handle = jQuery.event.dispatch;
3419 a7dd0415 Kostas Papadimitriou
3420 a7dd0415 Kostas Papadimitriou
jQuery.removeEvent = document.removeEventListener ?
3421 a7dd0415 Kostas Papadimitriou
        function( elem, type, handle ) {
3422 a7dd0415 Kostas Papadimitriou
                if ( elem.removeEventListener ) {
3423 a7dd0415 Kostas Papadimitriou
                        elem.removeEventListener( type, handle, false );
3424 a7dd0415 Kostas Papadimitriou
                }
3425 a7dd0415 Kostas Papadimitriou
        } :
3426 a7dd0415 Kostas Papadimitriou
        function( elem, type, handle ) {
3427 a7dd0415 Kostas Papadimitriou
                if ( elem.detachEvent ) {
3428 a7dd0415 Kostas Papadimitriou
                        elem.detachEvent( "on" + type, handle );
3429 a7dd0415 Kostas Papadimitriou
                }
3430 a7dd0415 Kostas Papadimitriou
        };
3431 a7dd0415 Kostas Papadimitriou
3432 a7dd0415 Kostas Papadimitriou
jQuery.Event = function( src, props ) {
3433 a7dd0415 Kostas Papadimitriou
        // Allow instantiation without the 'new' keyword
3434 a7dd0415 Kostas Papadimitriou
        if ( !(this instanceof jQuery.Event) ) {
3435 a7dd0415 Kostas Papadimitriou
                return new jQuery.Event( src, props );
3436 a7dd0415 Kostas Papadimitriou
        }
3437 a7dd0415 Kostas Papadimitriou
3438 a7dd0415 Kostas Papadimitriou
        // Event object
3439 a7dd0415 Kostas Papadimitriou
        if ( src && src.type ) {
3440 a7dd0415 Kostas Papadimitriou
                this.originalEvent = src;
3441 a7dd0415 Kostas Papadimitriou
                this.type = src.type;
3442 a7dd0415 Kostas Papadimitriou
3443 a7dd0415 Kostas Papadimitriou
                // Events bubbling up the document may have been marked as prevented
3444 a7dd0415 Kostas Papadimitriou
                // by a handler lower down the tree; reflect the correct value.
3445 a7dd0415 Kostas Papadimitriou
                this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3446 a7dd0415 Kostas Papadimitriou
                        src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
3447 a7dd0415 Kostas Papadimitriou
3448 a7dd0415 Kostas Papadimitriou
        // Event type
3449 a7dd0415 Kostas Papadimitriou
        } else {
3450 a7dd0415 Kostas Papadimitriou
                this.type = src;
3451 a7dd0415 Kostas Papadimitriou
        }
3452 a7dd0415 Kostas Papadimitriou
3453 a7dd0415 Kostas Papadimitriou
        // Put explicitly provided properties onto the event object
3454 a7dd0415 Kostas Papadimitriou
        if ( props ) {
3455 a7dd0415 Kostas Papadimitriou
                jQuery.extend( this, props );
3456 a7dd0415 Kostas Papadimitriou
        }
3457 a7dd0415 Kostas Papadimitriou
3458 a7dd0415 Kostas Papadimitriou
        // Create a timestamp if incoming event doesn't have one
3459 a7dd0415 Kostas Papadimitriou
        this.timeStamp = src && src.timeStamp || jQuery.now();
3460 a7dd0415 Kostas Papadimitriou
3461 a7dd0415 Kostas Papadimitriou
        // Mark it as fixed
3462 a7dd0415 Kostas Papadimitriou
        this[ jQuery.expando ] = true;
3463 a7dd0415 Kostas Papadimitriou
};
3464 a7dd0415 Kostas Papadimitriou
3465 a7dd0415 Kostas Papadimitriou
function returnFalse() {
3466 a7dd0415 Kostas Papadimitriou
        return false;
3467 a7dd0415 Kostas Papadimitriou
}
3468 a7dd0415 Kostas Papadimitriou
function returnTrue() {
3469 a7dd0415 Kostas Papadimitriou
        return true;
3470 a7dd0415 Kostas Papadimitriou
}
3471 a7dd0415 Kostas Papadimitriou
3472 a7dd0415 Kostas Papadimitriou
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3473 a7dd0415 Kostas Papadimitriou
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3474 a7dd0415 Kostas Papadimitriou
jQuery.Event.prototype = {
3475 a7dd0415 Kostas Papadimitriou
        preventDefault: function() {
3476 a7dd0415 Kostas Papadimitriou
                this.isDefaultPrevented = returnTrue;
3477 a7dd0415 Kostas Papadimitriou
3478 a7dd0415 Kostas Papadimitriou
                var e = this.originalEvent;
3479 a7dd0415 Kostas Papadimitriou
                if ( !e ) {
3480 a7dd0415 Kostas Papadimitriou
                        return;
3481 a7dd0415 Kostas Papadimitriou
                }
3482 a7dd0415 Kostas Papadimitriou
3483 a7dd0415 Kostas Papadimitriou
                // if preventDefault exists run it on the original event
3484 a7dd0415 Kostas Papadimitriou
                if ( e.preventDefault ) {
3485 a7dd0415 Kostas Papadimitriou
                        e.preventDefault();
3486 a7dd0415 Kostas Papadimitriou
3487 a7dd0415 Kostas Papadimitriou
                // otherwise set the returnValue property of the original event to false (IE)
3488 a7dd0415 Kostas Papadimitriou
                } else {
3489 a7dd0415 Kostas Papadimitriou
                        e.returnValue = false;
3490 a7dd0415 Kostas Papadimitriou
                }
3491 a7dd0415 Kostas Papadimitriou
        },
3492 a7dd0415 Kostas Papadimitriou
        stopPropagation: function() {
3493 a7dd0415 Kostas Papadimitriou
                this.isPropagationStopped = returnTrue;
3494 a7dd0415 Kostas Papadimitriou
3495 a7dd0415 Kostas Papadimitriou
                var e = this.originalEvent;
3496 a7dd0415 Kostas Papadimitriou
                if ( !e ) {
3497 a7dd0415 Kostas Papadimitriou
                        return;
3498 a7dd0415 Kostas Papadimitriou
                }
3499 a7dd0415 Kostas Papadimitriou
                // if stopPropagation exists run it on the original event
3500 a7dd0415 Kostas Papadimitriou
                if ( e.stopPropagation ) {
3501 a7dd0415 Kostas Papadimitriou
                        e.stopPropagation();
3502 a7dd0415 Kostas Papadimitriou
                }
3503 a7dd0415 Kostas Papadimitriou
                // otherwise set the cancelBubble property of the original event to true (IE)
3504 a7dd0415 Kostas Papadimitriou
                e.cancelBubble = true;
3505 a7dd0415 Kostas Papadimitriou
        },
3506 a7dd0415 Kostas Papadimitriou
        stopImmediatePropagation: function() {
3507 a7dd0415 Kostas Papadimitriou
                this.isImmediatePropagationStopped = returnTrue;
3508 a7dd0415 Kostas Papadimitriou
                this.stopPropagation();
3509 a7dd0415 Kostas Papadimitriou
        },
3510 a7dd0415 Kostas Papadimitriou
        isDefaultPrevented: returnFalse,
3511 a7dd0415 Kostas Papadimitriou
        isPropagationStopped: returnFalse,
3512 a7dd0415 Kostas Papadimitriou
        isImmediatePropagationStopped: returnFalse
3513 a7dd0415 Kostas Papadimitriou
};
3514 a7dd0415 Kostas Papadimitriou
3515 a7dd0415 Kostas Papadimitriou
// Create mouseenter/leave events using mouseover/out and event-time checks
3516 a7dd0415 Kostas Papadimitriou
jQuery.each({
3517 a7dd0415 Kostas Papadimitriou
        mouseenter: "mouseover",
3518 a7dd0415 Kostas Papadimitriou
        mouseleave: "mouseout"
3519 a7dd0415 Kostas Papadimitriou
}, function( orig, fix ) {
3520 a7dd0415 Kostas Papadimitriou
        jQuery.event.special[ orig ] = {
3521 a7dd0415 Kostas Papadimitriou
                delegateType: fix,
3522 a7dd0415 Kostas Papadimitriou
                bindType: fix,
3523 a7dd0415 Kostas Papadimitriou
3524 a7dd0415 Kostas Papadimitriou
                handle: function( event ) {
3525 a7dd0415 Kostas Papadimitriou
                        var target = this,
3526 a7dd0415 Kostas Papadimitriou
                                related = event.relatedTarget,
3527 a7dd0415 Kostas Papadimitriou
                                handleObj = event.handleObj,
3528 a7dd0415 Kostas Papadimitriou
                                selector = handleObj.selector,
3529 a7dd0415 Kostas Papadimitriou
                                ret;
3530 a7dd0415 Kostas Papadimitriou
3531 a7dd0415 Kostas Papadimitriou
                        // For mousenter/leave call the handler if related is outside the target.
3532 a7dd0415 Kostas Papadimitriou
                        // NB: No relatedTarget if the mouse left/entered the browser window
3533 a7dd0415 Kostas Papadimitriou
                        if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
3534 a7dd0415 Kostas Papadimitriou
                                event.type = handleObj.origType;
3535 a7dd0415 Kostas Papadimitriou
                                ret = handleObj.handler.apply( this, arguments );
3536 a7dd0415 Kostas Papadimitriou
                                event.type = fix;
3537 a7dd0415 Kostas Papadimitriou
                        }
3538 a7dd0415 Kostas Papadimitriou
                        return ret;
3539 a7dd0415 Kostas Papadimitriou
                }
3540 a7dd0415 Kostas Papadimitriou
        };
3541 a7dd0415 Kostas Papadimitriou
});
3542 a7dd0415 Kostas Papadimitriou
3543 a7dd0415 Kostas Papadimitriou
// IE submit delegation
3544 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.submitBubbles ) {
3545 a7dd0415 Kostas Papadimitriou
3546 a7dd0415 Kostas Papadimitriou
        jQuery.event.special.submit = {
3547 a7dd0415 Kostas Papadimitriou
                setup: function() {
3548 a7dd0415 Kostas Papadimitriou
                        // Only need this for delegated form submit events
3549 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.nodeName( this, "form" ) ) {
3550 a7dd0415 Kostas Papadimitriou
                                return false;
3551 a7dd0415 Kostas Papadimitriou
                        }
3552 a7dd0415 Kostas Papadimitriou
3553 a7dd0415 Kostas Papadimitriou
                        // Lazy-add a submit handler when a descendant form may potentially be submitted
3554 a7dd0415 Kostas Papadimitriou
                        jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3555 a7dd0415 Kostas Papadimitriou
                                // Node name check avoids a VML-related crash in IE (#9807)
3556 a7dd0415 Kostas Papadimitriou
                                var elem = e.target,
3557 a7dd0415 Kostas Papadimitriou
                                        form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3558 a7dd0415 Kostas Papadimitriou
                                if ( form && !form._submit_attached ) {
3559 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.add( form, "submit._submit", function( event ) {
3560 a7dd0415 Kostas Papadimitriou
                                                // If form was submitted by the user, bubble the event up the tree
3561 a7dd0415 Kostas Papadimitriou
                                                if ( this.parentNode && !event.isTrigger ) {
3562 a7dd0415 Kostas Papadimitriou
                                                        jQuery.event.simulate( "submit", this.parentNode, event, true );
3563 a7dd0415 Kostas Papadimitriou
                                                }
3564 a7dd0415 Kostas Papadimitriou
                                        });
3565 a7dd0415 Kostas Papadimitriou
                                        form._submit_attached = true;
3566 a7dd0415 Kostas Papadimitriou
                                }
3567 a7dd0415 Kostas Papadimitriou
                        });
3568 a7dd0415 Kostas Papadimitriou
                        // return undefined since we don't need an event listener
3569 a7dd0415 Kostas Papadimitriou
                },
3570 a7dd0415 Kostas Papadimitriou
3571 a7dd0415 Kostas Papadimitriou
                teardown: function() {
3572 a7dd0415 Kostas Papadimitriou
                        // Only need this for delegated form submit events
3573 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.nodeName( this, "form" ) ) {
3574 a7dd0415 Kostas Papadimitriou
                                return false;
3575 a7dd0415 Kostas Papadimitriou
                        }
3576 a7dd0415 Kostas Papadimitriou
3577 a7dd0415 Kostas Papadimitriou
                        // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3578 a7dd0415 Kostas Papadimitriou
                        jQuery.event.remove( this, "._submit" );
3579 a7dd0415 Kostas Papadimitriou
                }
3580 a7dd0415 Kostas Papadimitriou
        };
3581 a7dd0415 Kostas Papadimitriou
}
3582 a7dd0415 Kostas Papadimitriou
3583 a7dd0415 Kostas Papadimitriou
// IE change delegation and checkbox/radio fix
3584 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.changeBubbles ) {
3585 a7dd0415 Kostas Papadimitriou
3586 a7dd0415 Kostas Papadimitriou
        jQuery.event.special.change = {
3587 a7dd0415 Kostas Papadimitriou
3588 a7dd0415 Kostas Papadimitriou
                setup: function() {
3589 a7dd0415 Kostas Papadimitriou
3590 a7dd0415 Kostas Papadimitriou
                        if ( rformElems.test( this.nodeName ) ) {
3591 a7dd0415 Kostas Papadimitriou
                                // IE doesn't fire change on a check/radio until blur; trigger it on click
3592 a7dd0415 Kostas Papadimitriou
                                // after a propertychange. Eat the blur-change in special.change.handle.
3593 a7dd0415 Kostas Papadimitriou
                                // This still fires onchange a second time for check/radio after blur.
3594 a7dd0415 Kostas Papadimitriou
                                if ( this.type === "checkbox" || this.type === "radio" ) {
3595 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.add( this, "propertychange._change", function( event ) {
3596 a7dd0415 Kostas Papadimitriou
                                                if ( event.originalEvent.propertyName === "checked" ) {
3597 a7dd0415 Kostas Papadimitriou
                                                        this._just_changed = true;
3598 a7dd0415 Kostas Papadimitriou
                                                }
3599 a7dd0415 Kostas Papadimitriou
                                        });
3600 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.add( this, "click._change", function( event ) {
3601 a7dd0415 Kostas Papadimitriou
                                                if ( this._just_changed && !event.isTrigger ) {
3602 a7dd0415 Kostas Papadimitriou
                                                        this._just_changed = false;
3603 a7dd0415 Kostas Papadimitriou
                                                        jQuery.event.simulate( "change", this, event, true );
3604 a7dd0415 Kostas Papadimitriou
                                                }
3605 a7dd0415 Kostas Papadimitriou
                                        });
3606 a7dd0415 Kostas Papadimitriou
                                }
3607 a7dd0415 Kostas Papadimitriou
                                return false;
3608 a7dd0415 Kostas Papadimitriou
                        }
3609 a7dd0415 Kostas Papadimitriou
                        // Delegated event; lazy-add a change handler on descendant inputs
3610 a7dd0415 Kostas Papadimitriou
                        jQuery.event.add( this, "beforeactivate._change", function( e ) {
3611 a7dd0415 Kostas Papadimitriou
                                var elem = e.target;
3612 a7dd0415 Kostas Papadimitriou
3613 a7dd0415 Kostas Papadimitriou
                                if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
3614 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.add( elem, "change._change", function( event ) {
3615 a7dd0415 Kostas Papadimitriou
                                                if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
3616 a7dd0415 Kostas Papadimitriou
                                                        jQuery.event.simulate( "change", this.parentNode, event, true );
3617 a7dd0415 Kostas Papadimitriou
                                                }
3618 a7dd0415 Kostas Papadimitriou
                                        });
3619 a7dd0415 Kostas Papadimitriou
                                        elem._change_attached = true;
3620 a7dd0415 Kostas Papadimitriou
                                }
3621 a7dd0415 Kostas Papadimitriou
                        });
3622 a7dd0415 Kostas Papadimitriou
                },
3623 a7dd0415 Kostas Papadimitriou
3624 a7dd0415 Kostas Papadimitriou
                handle: function( event ) {
3625 a7dd0415 Kostas Papadimitriou
                        var elem = event.target;
3626 a7dd0415 Kostas Papadimitriou
3627 a7dd0415 Kostas Papadimitriou
                        // Swallow native change events from checkbox/radio, we already triggered them above
3628 a7dd0415 Kostas Papadimitriou
                        if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3629 a7dd0415 Kostas Papadimitriou
                                return event.handleObj.handler.apply( this, arguments );
3630 a7dd0415 Kostas Papadimitriou
                        }
3631 a7dd0415 Kostas Papadimitriou
                },
3632 a7dd0415 Kostas Papadimitriou
3633 a7dd0415 Kostas Papadimitriou
                teardown: function() {
3634 a7dd0415 Kostas Papadimitriou
                        jQuery.event.remove( this, "._change" );
3635 a7dd0415 Kostas Papadimitriou
3636 a7dd0415 Kostas Papadimitriou
                        return rformElems.test( this.nodeName );
3637 a7dd0415 Kostas Papadimitriou
                }
3638 a7dd0415 Kostas Papadimitriou
        };
3639 a7dd0415 Kostas Papadimitriou
}
3640 a7dd0415 Kostas Papadimitriou
3641 a7dd0415 Kostas Papadimitriou
// Create "bubbling" focus and blur events
3642 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.focusinBubbles ) {
3643 a7dd0415 Kostas Papadimitriou
        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3644 a7dd0415 Kostas Papadimitriou
3645 a7dd0415 Kostas Papadimitriou
                // Attach a single capturing handler while someone wants focusin/focusout
3646 a7dd0415 Kostas Papadimitriou
                var attaches = 0,
3647 a7dd0415 Kostas Papadimitriou
                        handler = function( event ) {
3648 a7dd0415 Kostas Papadimitriou
                                jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3649 a7dd0415 Kostas Papadimitriou
                        };
3650 a7dd0415 Kostas Papadimitriou
3651 a7dd0415 Kostas Papadimitriou
                jQuery.event.special[ fix ] = {
3652 a7dd0415 Kostas Papadimitriou
                        setup: function() {
3653 a7dd0415 Kostas Papadimitriou
                                if ( attaches++ === 0 ) {
3654 a7dd0415 Kostas Papadimitriou
                                        document.addEventListener( orig, handler, true );
3655 a7dd0415 Kostas Papadimitriou
                                }
3656 a7dd0415 Kostas Papadimitriou
                        },
3657 a7dd0415 Kostas Papadimitriou
                        teardown: function() {
3658 a7dd0415 Kostas Papadimitriou
                                if ( --attaches === 0 ) {
3659 a7dd0415 Kostas Papadimitriou
                                        document.removeEventListener( orig, handler, true );
3660 a7dd0415 Kostas Papadimitriou
                                }
3661 a7dd0415 Kostas Papadimitriou
                        }
3662 a7dd0415 Kostas Papadimitriou
                };
3663 a7dd0415 Kostas Papadimitriou
        });
3664 a7dd0415 Kostas Papadimitriou
}
3665 a7dd0415 Kostas Papadimitriou
3666 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
3667 a7dd0415 Kostas Papadimitriou
3668 a7dd0415 Kostas Papadimitriou
        on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3669 a7dd0415 Kostas Papadimitriou
                var origFn, type;
3670 a7dd0415 Kostas Papadimitriou
3671 a7dd0415 Kostas Papadimitriou
                // Types can be a map of types/handlers
3672 a7dd0415 Kostas Papadimitriou
                if ( typeof types === "object" ) {
3673 a7dd0415 Kostas Papadimitriou
                        // ( types-Object, selector, data )
3674 a7dd0415 Kostas Papadimitriou
                        if ( typeof selector !== "string" ) {
3675 a7dd0415 Kostas Papadimitriou
                                // ( types-Object, data )
3676 a7dd0415 Kostas Papadimitriou
                                data = selector;
3677 a7dd0415 Kostas Papadimitriou
                                selector = undefined;
3678 a7dd0415 Kostas Papadimitriou
                        }
3679 a7dd0415 Kostas Papadimitriou
                        for ( type in types ) {
3680 a7dd0415 Kostas Papadimitriou
                                this.on( type, selector, data, types[ type ], one );
3681 a7dd0415 Kostas Papadimitriou
                        }
3682 a7dd0415 Kostas Papadimitriou
                        return this;
3683 a7dd0415 Kostas Papadimitriou
                }
3684 a7dd0415 Kostas Papadimitriou
3685 a7dd0415 Kostas Papadimitriou
                if ( data == null && fn == null ) {
3686 a7dd0415 Kostas Papadimitriou
                        // ( types, fn )
3687 a7dd0415 Kostas Papadimitriou
                        fn = selector;
3688 a7dd0415 Kostas Papadimitriou
                        data = selector = undefined;
3689 a7dd0415 Kostas Papadimitriou
                } else if ( fn == null ) {
3690 a7dd0415 Kostas Papadimitriou
                        if ( typeof selector === "string" ) {
3691 a7dd0415 Kostas Papadimitriou
                                // ( types, selector, fn )
3692 a7dd0415 Kostas Papadimitriou
                                fn = data;
3693 a7dd0415 Kostas Papadimitriou
                                data = undefined;
3694 a7dd0415 Kostas Papadimitriou
                        } else {
3695 a7dd0415 Kostas Papadimitriou
                                // ( types, data, fn )
3696 a7dd0415 Kostas Papadimitriou
                                fn = data;
3697 a7dd0415 Kostas Papadimitriou
                                data = selector;
3698 a7dd0415 Kostas Papadimitriou
                                selector = undefined;
3699 a7dd0415 Kostas Papadimitriou
                        }
3700 a7dd0415 Kostas Papadimitriou
                }
3701 a7dd0415 Kostas Papadimitriou
                if ( fn === false ) {
3702 a7dd0415 Kostas Papadimitriou
                        fn = returnFalse;
3703 a7dd0415 Kostas Papadimitriou
                } else if ( !fn ) {
3704 a7dd0415 Kostas Papadimitriou
                        return this;
3705 a7dd0415 Kostas Papadimitriou
                }
3706 a7dd0415 Kostas Papadimitriou
3707 a7dd0415 Kostas Papadimitriou
                if ( one === 1 ) {
3708 a7dd0415 Kostas Papadimitriou
                        origFn = fn;
3709 a7dd0415 Kostas Papadimitriou
                        fn = function( event ) {
3710 a7dd0415 Kostas Papadimitriou
                                // Can use an empty set, since event contains the info
3711 a7dd0415 Kostas Papadimitriou
                                jQuery().off( event );
3712 a7dd0415 Kostas Papadimitriou
                                return origFn.apply( this, arguments );
3713 a7dd0415 Kostas Papadimitriou
                        };
3714 a7dd0415 Kostas Papadimitriou
                        // Use same guid so caller can remove using origFn
3715 a7dd0415 Kostas Papadimitriou
                        fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3716 a7dd0415 Kostas Papadimitriou
                }
3717 a7dd0415 Kostas Papadimitriou
                return this.each( function() {
3718 a7dd0415 Kostas Papadimitriou
                        jQuery.event.add( this, types, fn, data, selector );
3719 a7dd0415 Kostas Papadimitriou
                });
3720 a7dd0415 Kostas Papadimitriou
        },
3721 a7dd0415 Kostas Papadimitriou
        one: function( types, selector, data, fn ) {
3722 a7dd0415 Kostas Papadimitriou
                return this.on.call( this, types, selector, data, fn, 1 );
3723 a7dd0415 Kostas Papadimitriou
        },
3724 a7dd0415 Kostas Papadimitriou
        off: function( types, selector, fn ) {
3725 a7dd0415 Kostas Papadimitriou
                if ( types && types.preventDefault && types.handleObj ) {
3726 a7dd0415 Kostas Papadimitriou
                        // ( event )  dispatched jQuery.Event
3727 a7dd0415 Kostas Papadimitriou
                        var handleObj = types.handleObj;
3728 a7dd0415 Kostas Papadimitriou
                        jQuery( types.delegateTarget ).off(
3729 a7dd0415 Kostas Papadimitriou
                                handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
3730 a7dd0415 Kostas Papadimitriou
                                handleObj.selector,
3731 a7dd0415 Kostas Papadimitriou
                                handleObj.handler
3732 a7dd0415 Kostas Papadimitriou
                        );
3733 a7dd0415 Kostas Papadimitriou
                        return this;
3734 a7dd0415 Kostas Papadimitriou
                }
3735 a7dd0415 Kostas Papadimitriou
                if ( typeof types === "object" ) {
3736 a7dd0415 Kostas Papadimitriou
                        // ( types-object [, selector] )
3737 a7dd0415 Kostas Papadimitriou
                        for ( var type in types ) {
3738 a7dd0415 Kostas Papadimitriou
                                this.off( type, selector, types[ type ] );
3739 a7dd0415 Kostas Papadimitriou
                        }
3740 a7dd0415 Kostas Papadimitriou
                        return this;
3741 a7dd0415 Kostas Papadimitriou
                }
3742 a7dd0415 Kostas Papadimitriou
                if ( selector === false || typeof selector === "function" ) {
3743 a7dd0415 Kostas Papadimitriou
                        // ( types [, fn] )
3744 a7dd0415 Kostas Papadimitriou
                        fn = selector;
3745 a7dd0415 Kostas Papadimitriou
                        selector = undefined;
3746 a7dd0415 Kostas Papadimitriou
                }
3747 a7dd0415 Kostas Papadimitriou
                if ( fn === false ) {
3748 a7dd0415 Kostas Papadimitriou
                        fn = returnFalse;
3749 a7dd0415 Kostas Papadimitriou
                }
3750 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
3751 a7dd0415 Kostas Papadimitriou
                        jQuery.event.remove( this, types, fn, selector );
3752 a7dd0415 Kostas Papadimitriou
                });
3753 a7dd0415 Kostas Papadimitriou
        },
3754 a7dd0415 Kostas Papadimitriou
3755 a7dd0415 Kostas Papadimitriou
        bind: function( types, data, fn ) {
3756 a7dd0415 Kostas Papadimitriou
                return this.on( types, null, data, fn );
3757 a7dd0415 Kostas Papadimitriou
        },
3758 a7dd0415 Kostas Papadimitriou
        unbind: function( types, fn ) {
3759 a7dd0415 Kostas Papadimitriou
                return this.off( types, null, fn );
3760 a7dd0415 Kostas Papadimitriou
        },
3761 a7dd0415 Kostas Papadimitriou
3762 a7dd0415 Kostas Papadimitriou
        live: function( types, data, fn ) {
3763 a7dd0415 Kostas Papadimitriou
                jQuery( this.context ).on( types, this.selector, data, fn );
3764 a7dd0415 Kostas Papadimitriou
                return this;
3765 a7dd0415 Kostas Papadimitriou
        },
3766 a7dd0415 Kostas Papadimitriou
        die: function( types, fn ) {
3767 a7dd0415 Kostas Papadimitriou
                jQuery( this.context ).off( types, this.selector || "**", fn );
3768 a7dd0415 Kostas Papadimitriou
                return this;
3769 a7dd0415 Kostas Papadimitriou
        },
3770 a7dd0415 Kostas Papadimitriou
3771 a7dd0415 Kostas Papadimitriou
        delegate: function( selector, types, data, fn ) {
3772 a7dd0415 Kostas Papadimitriou
                return this.on( types, selector, data, fn );
3773 a7dd0415 Kostas Papadimitriou
        },
3774 a7dd0415 Kostas Papadimitriou
        undelegate: function( selector, types, fn ) {
3775 a7dd0415 Kostas Papadimitriou
                // ( namespace ) or ( selector, types [, fn] )
3776 a7dd0415 Kostas Papadimitriou
                return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
3777 a7dd0415 Kostas Papadimitriou
        },
3778 a7dd0415 Kostas Papadimitriou
3779 a7dd0415 Kostas Papadimitriou
        trigger: function( type, data ) {
3780 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
3781 a7dd0415 Kostas Papadimitriou
                        jQuery.event.trigger( type, data, this );
3782 a7dd0415 Kostas Papadimitriou
                });
3783 a7dd0415 Kostas Papadimitriou
        },
3784 a7dd0415 Kostas Papadimitriou
        triggerHandler: function( type, data ) {
3785 a7dd0415 Kostas Papadimitriou
                if ( this[0] ) {
3786 a7dd0415 Kostas Papadimitriou
                        return jQuery.event.trigger( type, data, this[0], true );
3787 a7dd0415 Kostas Papadimitriou
                }
3788 a7dd0415 Kostas Papadimitriou
        },
3789 a7dd0415 Kostas Papadimitriou
3790 a7dd0415 Kostas Papadimitriou
        toggle: function( fn ) {
3791 a7dd0415 Kostas Papadimitriou
                // Save reference to arguments for access in closure
3792 a7dd0415 Kostas Papadimitriou
                var args = arguments,
3793 a7dd0415 Kostas Papadimitriou
                        guid = fn.guid || jQuery.guid++,
3794 a7dd0415 Kostas Papadimitriou
                        i = 0,
3795 a7dd0415 Kostas Papadimitriou
                        toggler = function( event ) {
3796 a7dd0415 Kostas Papadimitriou
                                // Figure out which function to execute
3797 a7dd0415 Kostas Papadimitriou
                                var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3798 a7dd0415 Kostas Papadimitriou
                                jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3799 a7dd0415 Kostas Papadimitriou
3800 a7dd0415 Kostas Papadimitriou
                                // Make sure that clicks stop
3801 a7dd0415 Kostas Papadimitriou
                                event.preventDefault();
3802 a7dd0415 Kostas Papadimitriou
3803 a7dd0415 Kostas Papadimitriou
                                // and execute the function
3804 a7dd0415 Kostas Papadimitriou
                                return args[ lastToggle ].apply( this, arguments ) || false;
3805 a7dd0415 Kostas Papadimitriou
                        };
3806 a7dd0415 Kostas Papadimitriou
3807 a7dd0415 Kostas Papadimitriou
                // link all the functions, so any of them can unbind this click handler
3808 a7dd0415 Kostas Papadimitriou
                toggler.guid = guid;
3809 a7dd0415 Kostas Papadimitriou
                while ( i < args.length ) {
3810 a7dd0415 Kostas Papadimitriou
                        args[ i++ ].guid = guid;
3811 a7dd0415 Kostas Papadimitriou
                }
3812 a7dd0415 Kostas Papadimitriou
3813 a7dd0415 Kostas Papadimitriou
                return this.click( toggler );
3814 a7dd0415 Kostas Papadimitriou
        },
3815 a7dd0415 Kostas Papadimitriou
3816 a7dd0415 Kostas Papadimitriou
        hover: function( fnOver, fnOut ) {
3817 a7dd0415 Kostas Papadimitriou
                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3818 a7dd0415 Kostas Papadimitriou
        }
3819 a7dd0415 Kostas Papadimitriou
});
3820 a7dd0415 Kostas Papadimitriou
3821 a7dd0415 Kostas Papadimitriou
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3822 a7dd0415 Kostas Papadimitriou
        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3823 a7dd0415 Kostas Papadimitriou
        "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
3824 a7dd0415 Kostas Papadimitriou
3825 a7dd0415 Kostas Papadimitriou
        // Handle event binding
3826 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ name ] = function( data, fn ) {
3827 a7dd0415 Kostas Papadimitriou
                if ( fn == null ) {
3828 a7dd0415 Kostas Papadimitriou
                        fn = data;
3829 a7dd0415 Kostas Papadimitriou
                        data = null;
3830 a7dd0415 Kostas Papadimitriou
                }
3831 a7dd0415 Kostas Papadimitriou
3832 a7dd0415 Kostas Papadimitriou
                return arguments.length > 0 ?
3833 a7dd0415 Kostas Papadimitriou
                        this.on( name, null, data, fn ) :
3834 a7dd0415 Kostas Papadimitriou
                        this.trigger( name );
3835 a7dd0415 Kostas Papadimitriou
        };
3836 a7dd0415 Kostas Papadimitriou
3837 a7dd0415 Kostas Papadimitriou
        if ( jQuery.attrFn ) {
3838 a7dd0415 Kostas Papadimitriou
                jQuery.attrFn[ name ] = true;
3839 a7dd0415 Kostas Papadimitriou
        }
3840 a7dd0415 Kostas Papadimitriou
3841 a7dd0415 Kostas Papadimitriou
        if ( rkeyEvent.test( name ) ) {
3842 a7dd0415 Kostas Papadimitriou
                jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
3843 a7dd0415 Kostas Papadimitriou
        }
3844 a7dd0415 Kostas Papadimitriou
3845 a7dd0415 Kostas Papadimitriou
        if ( rmouseEvent.test( name ) ) {
3846 a7dd0415 Kostas Papadimitriou
                jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
3847 a7dd0415 Kostas Papadimitriou
        }
3848 a7dd0415 Kostas Papadimitriou
});
3849 a7dd0415 Kostas Papadimitriou
3850 a7dd0415 Kostas Papadimitriou
3851 a7dd0415 Kostas Papadimitriou
3852 a7dd0415 Kostas Papadimitriou
/*!
3853 a7dd0415 Kostas Papadimitriou
 * Sizzle CSS Selector Engine
3854 a7dd0415 Kostas Papadimitriou
 *  Copyright 2011, The Dojo Foundation
3855 a7dd0415 Kostas Papadimitriou
 *  Released under the MIT, BSD, and GPL Licenses.
3856 a7dd0415 Kostas Papadimitriou
 *  More information: http://sizzlejs.com/
3857 a7dd0415 Kostas Papadimitriou
 */
3858 a7dd0415 Kostas Papadimitriou
(function(){
3859 a7dd0415 Kostas Papadimitriou
3860 a7dd0415 Kostas Papadimitriou
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3861 a7dd0415 Kostas Papadimitriou
        expando = "sizcache" + (Math.random() + '').replace('.', ''),
3862 a7dd0415 Kostas Papadimitriou
        done = 0,
3863 a7dd0415 Kostas Papadimitriou
        toString = Object.prototype.toString,
3864 a7dd0415 Kostas Papadimitriou
        hasDuplicate = false,
3865 a7dd0415 Kostas Papadimitriou
        baseHasDuplicate = true,
3866 a7dd0415 Kostas Papadimitriou
        rBackslash = /\\/g,
3867 a7dd0415 Kostas Papadimitriou
        rReturn = /\r\n/g,
3868 a7dd0415 Kostas Papadimitriou
        rNonWord = /\W/;
3869 a7dd0415 Kostas Papadimitriou
3870 a7dd0415 Kostas Papadimitriou
// Here we check if the JavaScript engine is using some sort of
3871 a7dd0415 Kostas Papadimitriou
// optimization where it does not always call our comparision
3872 a7dd0415 Kostas Papadimitriou
// function. If that is the case, discard the hasDuplicate value.
3873 a7dd0415 Kostas Papadimitriou
//   Thus far that includes Google Chrome.
3874 a7dd0415 Kostas Papadimitriou
[0, 0].sort(function() {
3875 a7dd0415 Kostas Papadimitriou
        baseHasDuplicate = false;
3876 a7dd0415 Kostas Papadimitriou
        return 0;
3877 a7dd0415 Kostas Papadimitriou
});
3878 a7dd0415 Kostas Papadimitriou
3879 a7dd0415 Kostas Papadimitriou
var Sizzle = function( selector, context, results, seed ) {
3880 a7dd0415 Kostas Papadimitriou
        results = results || [];
3881 a7dd0415 Kostas Papadimitriou
        context = context || document;
3882 a7dd0415 Kostas Papadimitriou
3883 a7dd0415 Kostas Papadimitriou
        var origContext = context;
3884 a7dd0415 Kostas Papadimitriou
3885 a7dd0415 Kostas Papadimitriou
        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3886 a7dd0415 Kostas Papadimitriou
                return [];
3887 a7dd0415 Kostas Papadimitriou
        }
3888 a7dd0415 Kostas Papadimitriou
        
3889 a7dd0415 Kostas Papadimitriou
        if ( !selector || typeof selector !== "string" ) {
3890 a7dd0415 Kostas Papadimitriou
                return results;
3891 a7dd0415 Kostas Papadimitriou
        }
3892 a7dd0415 Kostas Papadimitriou
3893 a7dd0415 Kostas Papadimitriou
        var m, set, checkSet, extra, ret, cur, pop, i,
3894 a7dd0415 Kostas Papadimitriou
                prune = true,
3895 a7dd0415 Kostas Papadimitriou
                contextXML = Sizzle.isXML( context ),
3896 a7dd0415 Kostas Papadimitriou
                parts = [],
3897 a7dd0415 Kostas Papadimitriou
                soFar = selector;
3898 a7dd0415 Kostas Papadimitriou
        
3899 a7dd0415 Kostas Papadimitriou
        // Reset the position of the chunker regexp (start from head)
3900 a7dd0415 Kostas Papadimitriou
        do {
3901 a7dd0415 Kostas Papadimitriou
                chunker.exec( "" );
3902 a7dd0415 Kostas Papadimitriou
                m = chunker.exec( soFar );
3903 a7dd0415 Kostas Papadimitriou
3904 a7dd0415 Kostas Papadimitriou
                if ( m ) {
3905 a7dd0415 Kostas Papadimitriou
                        soFar = m[3];
3906 a7dd0415 Kostas Papadimitriou
                
3907 a7dd0415 Kostas Papadimitriou
                        parts.push( m[1] );
3908 a7dd0415 Kostas Papadimitriou
                
3909 a7dd0415 Kostas Papadimitriou
                        if ( m[2] ) {
3910 a7dd0415 Kostas Papadimitriou
                                extra = m[3];
3911 a7dd0415 Kostas Papadimitriou
                                break;
3912 a7dd0415 Kostas Papadimitriou
                        }
3913 a7dd0415 Kostas Papadimitriou
                }
3914 a7dd0415 Kostas Papadimitriou
        } while ( m );
3915 a7dd0415 Kostas Papadimitriou
3916 a7dd0415 Kostas Papadimitriou
        if ( parts.length > 1 && origPOS.exec( selector ) ) {
3917 a7dd0415 Kostas Papadimitriou
3918 a7dd0415 Kostas Papadimitriou
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3919 a7dd0415 Kostas Papadimitriou
                        set = posProcess( parts[0] + parts[1], context, seed );
3920 a7dd0415 Kostas Papadimitriou
3921 a7dd0415 Kostas Papadimitriou
                } else {
3922 a7dd0415 Kostas Papadimitriou
                        set = Expr.relative[ parts[0] ] ?
3923 a7dd0415 Kostas Papadimitriou
                                [ context ] :
3924 a7dd0415 Kostas Papadimitriou
                                Sizzle( parts.shift(), context );
3925 a7dd0415 Kostas Papadimitriou
3926 a7dd0415 Kostas Papadimitriou
                        while ( parts.length ) {
3927 a7dd0415 Kostas Papadimitriou
                                selector = parts.shift();
3928 a7dd0415 Kostas Papadimitriou
3929 a7dd0415 Kostas Papadimitriou
                                if ( Expr.relative[ selector ] ) {
3930 a7dd0415 Kostas Papadimitriou
                                        selector += parts.shift();
3931 a7dd0415 Kostas Papadimitriou
                                }
3932 a7dd0415 Kostas Papadimitriou
                                
3933 a7dd0415 Kostas Papadimitriou
                                set = posProcess( selector, set, seed );
3934 a7dd0415 Kostas Papadimitriou
                        }
3935 a7dd0415 Kostas Papadimitriou
                }
3936 a7dd0415 Kostas Papadimitriou
3937 a7dd0415 Kostas Papadimitriou
        } else {
3938 a7dd0415 Kostas Papadimitriou
                // Take a shortcut and set the context if the root selector is an ID
3939 a7dd0415 Kostas Papadimitriou
                // (but not if it'll be faster if the inner selector is an ID)
3940 a7dd0415 Kostas Papadimitriou
                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3941 a7dd0415 Kostas Papadimitriou
                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3942 a7dd0415 Kostas Papadimitriou
3943 a7dd0415 Kostas Papadimitriou
                        ret = Sizzle.find( parts.shift(), context, contextXML );
3944 a7dd0415 Kostas Papadimitriou
                        context = ret.expr ?
3945 a7dd0415 Kostas Papadimitriou
                                Sizzle.filter( ret.expr, ret.set )[0] :
3946 a7dd0415 Kostas Papadimitriou
                                ret.set[0];
3947 a7dd0415 Kostas Papadimitriou
                }
3948 a7dd0415 Kostas Papadimitriou
3949 a7dd0415 Kostas Papadimitriou
                if ( context ) {
3950 a7dd0415 Kostas Papadimitriou
                        ret = seed ?
3951 a7dd0415 Kostas Papadimitriou
                                { expr: parts.pop(), set: makeArray(seed) } :
3952 a7dd0415 Kostas Papadimitriou
                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3953 a7dd0415 Kostas Papadimitriou
3954 a7dd0415 Kostas Papadimitriou
                        set = ret.expr ?
3955 a7dd0415 Kostas Papadimitriou
                                Sizzle.filter( ret.expr, ret.set ) :
3956 a7dd0415 Kostas Papadimitriou
                                ret.set;
3957 a7dd0415 Kostas Papadimitriou
3958 a7dd0415 Kostas Papadimitriou
                        if ( parts.length > 0 ) {
3959 a7dd0415 Kostas Papadimitriou
                                checkSet = makeArray( set );
3960 a7dd0415 Kostas Papadimitriou
3961 a7dd0415 Kostas Papadimitriou
                        } else {
3962 a7dd0415 Kostas Papadimitriou
                                prune = false;
3963 a7dd0415 Kostas Papadimitriou
                        }
3964 a7dd0415 Kostas Papadimitriou
3965 a7dd0415 Kostas Papadimitriou
                        while ( parts.length ) {
3966 a7dd0415 Kostas Papadimitriou
                                cur = parts.pop();
3967 a7dd0415 Kostas Papadimitriou
                                pop = cur;
3968 a7dd0415 Kostas Papadimitriou
3969 a7dd0415 Kostas Papadimitriou
                                if ( !Expr.relative[ cur ] ) {
3970 a7dd0415 Kostas Papadimitriou
                                        cur = "";
3971 a7dd0415 Kostas Papadimitriou
                                } else {
3972 a7dd0415 Kostas Papadimitriou
                                        pop = parts.pop();
3973 a7dd0415 Kostas Papadimitriou
                                }
3974 a7dd0415 Kostas Papadimitriou
3975 a7dd0415 Kostas Papadimitriou
                                if ( pop == null ) {
3976 a7dd0415 Kostas Papadimitriou
                                        pop = context;
3977 a7dd0415 Kostas Papadimitriou
                                }
3978 a7dd0415 Kostas Papadimitriou
3979 a7dd0415 Kostas Papadimitriou
                                Expr.relative[ cur ]( checkSet, pop, contextXML );
3980 a7dd0415 Kostas Papadimitriou
                        }
3981 a7dd0415 Kostas Papadimitriou
3982 a7dd0415 Kostas Papadimitriou
                } else {
3983 a7dd0415 Kostas Papadimitriou
                        checkSet = parts = [];
3984 a7dd0415 Kostas Papadimitriou
                }
3985 a7dd0415 Kostas Papadimitriou
        }
3986 a7dd0415 Kostas Papadimitriou
3987 a7dd0415 Kostas Papadimitriou
        if ( !checkSet ) {
3988 a7dd0415 Kostas Papadimitriou
                checkSet = set;
3989 a7dd0415 Kostas Papadimitriou
        }
3990 a7dd0415 Kostas Papadimitriou
3991 a7dd0415 Kostas Papadimitriou
        if ( !checkSet ) {
3992 a7dd0415 Kostas Papadimitriou
                Sizzle.error( cur || selector );
3993 a7dd0415 Kostas Papadimitriou
        }
3994 a7dd0415 Kostas Papadimitriou
3995 a7dd0415 Kostas Papadimitriou
        if ( toString.call(checkSet) === "[object Array]" ) {
3996 a7dd0415 Kostas Papadimitriou
                if ( !prune ) {
3997 a7dd0415 Kostas Papadimitriou
                        results.push.apply( results, checkSet );
3998 a7dd0415 Kostas Papadimitriou
3999 a7dd0415 Kostas Papadimitriou
                } else if ( context && context.nodeType === 1 ) {
4000 a7dd0415 Kostas Papadimitriou
                        for ( i = 0; checkSet[i] != null; i++ ) {
4001 a7dd0415 Kostas Papadimitriou
                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
4002 a7dd0415 Kostas Papadimitriou
                                        results.push( set[i] );
4003 a7dd0415 Kostas Papadimitriou
                                }
4004 a7dd0415 Kostas Papadimitriou
                        }
4005 a7dd0415 Kostas Papadimitriou
4006 a7dd0415 Kostas Papadimitriou
                } else {
4007 a7dd0415 Kostas Papadimitriou
                        for ( i = 0; checkSet[i] != null; i++ ) {
4008 a7dd0415 Kostas Papadimitriou
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
4009 a7dd0415 Kostas Papadimitriou
                                        results.push( set[i] );
4010 a7dd0415 Kostas Papadimitriou
                                }
4011 a7dd0415 Kostas Papadimitriou
                        }
4012 a7dd0415 Kostas Papadimitriou
                }
4013 a7dd0415 Kostas Papadimitriou
4014 a7dd0415 Kostas Papadimitriou
        } else {
4015 a7dd0415 Kostas Papadimitriou
                makeArray( checkSet, results );
4016 a7dd0415 Kostas Papadimitriou
        }
4017 a7dd0415 Kostas Papadimitriou
4018 a7dd0415 Kostas Papadimitriou
        if ( extra ) {
4019 a7dd0415 Kostas Papadimitriou
                Sizzle( extra, origContext, results, seed );
4020 a7dd0415 Kostas Papadimitriou
                Sizzle.uniqueSort( results );
4021 a7dd0415 Kostas Papadimitriou
        }
4022 a7dd0415 Kostas Papadimitriou
4023 a7dd0415 Kostas Papadimitriou
        return results;
4024 a7dd0415 Kostas Papadimitriou
};
4025 a7dd0415 Kostas Papadimitriou
4026 a7dd0415 Kostas Papadimitriou
Sizzle.uniqueSort = function( results ) {
4027 a7dd0415 Kostas Papadimitriou
        if ( sortOrder ) {
4028 a7dd0415 Kostas Papadimitriou
                hasDuplicate = baseHasDuplicate;
4029 a7dd0415 Kostas Papadimitriou
                results.sort( sortOrder );
4030 a7dd0415 Kostas Papadimitriou
4031 a7dd0415 Kostas Papadimitriou
                if ( hasDuplicate ) {
4032 a7dd0415 Kostas Papadimitriou
                        for ( var i = 1; i < results.length; i++ ) {
4033 a7dd0415 Kostas Papadimitriou
                                if ( results[i] === results[ i - 1 ] ) {
4034 a7dd0415 Kostas Papadimitriou
                                        results.splice( i--, 1 );
4035 a7dd0415 Kostas Papadimitriou
                                }
4036 a7dd0415 Kostas Papadimitriou
                        }
4037 a7dd0415 Kostas Papadimitriou
                }
4038 a7dd0415 Kostas Papadimitriou
        }
4039 a7dd0415 Kostas Papadimitriou
4040 a7dd0415 Kostas Papadimitriou
        return results;
4041 a7dd0415 Kostas Papadimitriou
};
4042 a7dd0415 Kostas Papadimitriou
4043 a7dd0415 Kostas Papadimitriou
Sizzle.matches = function( expr, set ) {
4044 a7dd0415 Kostas Papadimitriou
        return Sizzle( expr, null, null, set );
4045 a7dd0415 Kostas Papadimitriou
};
4046 a7dd0415 Kostas Papadimitriou
4047 a7dd0415 Kostas Papadimitriou
Sizzle.matchesSelector = function( node, expr ) {
4048 a7dd0415 Kostas Papadimitriou
        return Sizzle( expr, null, null, [node] ).length > 0;
4049 a7dd0415 Kostas Papadimitriou
};
4050 a7dd0415 Kostas Papadimitriou
4051 a7dd0415 Kostas Papadimitriou
Sizzle.find = function( expr, context, isXML ) {
4052 a7dd0415 Kostas Papadimitriou
        var set, i, len, match, type, left;
4053 a7dd0415 Kostas Papadimitriou
4054 a7dd0415 Kostas Papadimitriou
        if ( !expr ) {
4055 a7dd0415 Kostas Papadimitriou
                return [];
4056 a7dd0415 Kostas Papadimitriou
        }
4057 a7dd0415 Kostas Papadimitriou
4058 a7dd0415 Kostas Papadimitriou
        for ( i = 0, len = Expr.order.length; i < len; i++ ) {
4059 a7dd0415 Kostas Papadimitriou
                type = Expr.order[i];
4060 a7dd0415 Kostas Papadimitriou
                
4061 a7dd0415 Kostas Papadimitriou
                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
4062 a7dd0415 Kostas Papadimitriou
                        left = match[1];
4063 a7dd0415 Kostas Papadimitriou
                        match.splice( 1, 1 );
4064 a7dd0415 Kostas Papadimitriou
4065 a7dd0415 Kostas Papadimitriou
                        if ( left.substr( left.length - 1 ) !== "\\" ) {
4066 a7dd0415 Kostas Papadimitriou
                                match[1] = (match[1] || "").replace( rBackslash, "" );
4067 a7dd0415 Kostas Papadimitriou
                                set = Expr.find[ type ]( match, context, isXML );
4068 a7dd0415 Kostas Papadimitriou
4069 a7dd0415 Kostas Papadimitriou
                                if ( set != null ) {
4070 a7dd0415 Kostas Papadimitriou
                                        expr = expr.replace( Expr.match[ type ], "" );
4071 a7dd0415 Kostas Papadimitriou
                                        break;
4072 a7dd0415 Kostas Papadimitriou
                                }
4073 a7dd0415 Kostas Papadimitriou
                        }
4074 a7dd0415 Kostas Papadimitriou
                }
4075 a7dd0415 Kostas Papadimitriou
        }
4076 a7dd0415 Kostas Papadimitriou
4077 a7dd0415 Kostas Papadimitriou
        if ( !set ) {
4078 a7dd0415 Kostas Papadimitriou
                set = typeof context.getElementsByTagName !== "undefined" ?
4079 a7dd0415 Kostas Papadimitriou
                        context.getElementsByTagName( "*" ) :
4080 a7dd0415 Kostas Papadimitriou
                        [];
4081 a7dd0415 Kostas Papadimitriou
        }
4082 a7dd0415 Kostas Papadimitriou
4083 a7dd0415 Kostas Papadimitriou
        return { set: set, expr: expr };
4084 a7dd0415 Kostas Papadimitriou
};
4085 a7dd0415 Kostas Papadimitriou
4086 a7dd0415 Kostas Papadimitriou
Sizzle.filter = function( expr, set, inplace, not ) {
4087 a7dd0415 Kostas Papadimitriou
        var match, anyFound,
4088 a7dd0415 Kostas Papadimitriou
                type, found, item, filter, left,
4089 a7dd0415 Kostas Papadimitriou
                i, pass,
4090 a7dd0415 Kostas Papadimitriou
                old = expr,
4091 a7dd0415 Kostas Papadimitriou
                result = [],
4092 a7dd0415 Kostas Papadimitriou
                curLoop = set,
4093 a7dd0415 Kostas Papadimitriou
                isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
4094 a7dd0415 Kostas Papadimitriou
4095 a7dd0415 Kostas Papadimitriou
        while ( expr && set.length ) {
4096 a7dd0415 Kostas Papadimitriou
                for ( type in Expr.filter ) {
4097 a7dd0415 Kostas Papadimitriou
                        if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
4098 a7dd0415 Kostas Papadimitriou
                                filter = Expr.filter[ type ];
4099 a7dd0415 Kostas Papadimitriou
                                left = match[1];
4100 a7dd0415 Kostas Papadimitriou
4101 a7dd0415 Kostas Papadimitriou
                                anyFound = false;
4102 a7dd0415 Kostas Papadimitriou
4103 a7dd0415 Kostas Papadimitriou
                                match.splice(1,1);
4104 a7dd0415 Kostas Papadimitriou
4105 a7dd0415 Kostas Papadimitriou
                                if ( left.substr( left.length - 1 ) === "\\" ) {
4106 a7dd0415 Kostas Papadimitriou
                                        continue;
4107 a7dd0415 Kostas Papadimitriou
                                }
4108 a7dd0415 Kostas Papadimitriou
4109 a7dd0415 Kostas Papadimitriou
                                if ( curLoop === result ) {
4110 a7dd0415 Kostas Papadimitriou
                                        result = [];
4111 a7dd0415 Kostas Papadimitriou
                                }
4112 a7dd0415 Kostas Papadimitriou
4113 a7dd0415 Kostas Papadimitriou
                                if ( Expr.preFilter[ type ] ) {
4114 a7dd0415 Kostas Papadimitriou
                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
4115 a7dd0415 Kostas Papadimitriou
4116 a7dd0415 Kostas Papadimitriou
                                        if ( !match ) {
4117 a7dd0415 Kostas Papadimitriou
                                                anyFound = found = true;
4118 a7dd0415 Kostas Papadimitriou
4119 a7dd0415 Kostas Papadimitriou
                                        } else if ( match === true ) {
4120 a7dd0415 Kostas Papadimitriou
                                                continue;
4121 a7dd0415 Kostas Papadimitriou
                                        }
4122 a7dd0415 Kostas Papadimitriou
                                }
4123 a7dd0415 Kostas Papadimitriou
4124 a7dd0415 Kostas Papadimitriou
                                if ( match ) {
4125 a7dd0415 Kostas Papadimitriou
                                        for ( i = 0; (item = curLoop[i]) != null; i++ ) {
4126 a7dd0415 Kostas Papadimitriou
                                                if ( item ) {
4127 a7dd0415 Kostas Papadimitriou
                                                        found = filter( item, match, i, curLoop );
4128 a7dd0415 Kostas Papadimitriou
                                                        pass = not ^ found;
4129 a7dd0415 Kostas Papadimitriou
4130 a7dd0415 Kostas Papadimitriou
                                                        if ( inplace && found != null ) {
4131 a7dd0415 Kostas Papadimitriou
                                                                if ( pass ) {
4132 a7dd0415 Kostas Papadimitriou
                                                                        anyFound = true;
4133 a7dd0415 Kostas Papadimitriou
4134 a7dd0415 Kostas Papadimitriou
                                                                } else {
4135 a7dd0415 Kostas Papadimitriou
                                                                        curLoop[i] = false;
4136 a7dd0415 Kostas Papadimitriou
                                                                }
4137 a7dd0415 Kostas Papadimitriou
4138 a7dd0415 Kostas Papadimitriou
                                                        } else if ( pass ) {
4139 a7dd0415 Kostas Papadimitriou
                                                                result.push( item );
4140 a7dd0415 Kostas Papadimitriou
                                                                anyFound = true;
4141 a7dd0415 Kostas Papadimitriou
                                                        }
4142 a7dd0415 Kostas Papadimitriou
                                                }
4143 a7dd0415 Kostas Papadimitriou
                                        }
4144 a7dd0415 Kostas Papadimitriou
                                }
4145 a7dd0415 Kostas Papadimitriou
4146 a7dd0415 Kostas Papadimitriou
                                if ( found !== undefined ) {
4147 a7dd0415 Kostas Papadimitriou
                                        if ( !inplace ) {
4148 a7dd0415 Kostas Papadimitriou
                                                curLoop = result;
4149 a7dd0415 Kostas Papadimitriou
                                        }
4150 a7dd0415 Kostas Papadimitriou
4151 a7dd0415 Kostas Papadimitriou
                                        expr = expr.replace( Expr.match[ type ], "" );
4152 a7dd0415 Kostas Papadimitriou
4153 a7dd0415 Kostas Papadimitriou
                                        if ( !anyFound ) {
4154 a7dd0415 Kostas Papadimitriou
                                                return [];
4155 a7dd0415 Kostas Papadimitriou
                                        }
4156 a7dd0415 Kostas Papadimitriou
4157 a7dd0415 Kostas Papadimitriou
                                        break;
4158 a7dd0415 Kostas Papadimitriou
                                }
4159 a7dd0415 Kostas Papadimitriou
                        }
4160 a7dd0415 Kostas Papadimitriou
                }
4161 a7dd0415 Kostas Papadimitriou
4162 a7dd0415 Kostas Papadimitriou
                // Improper expression
4163 a7dd0415 Kostas Papadimitriou
                if ( expr === old ) {
4164 a7dd0415 Kostas Papadimitriou
                        if ( anyFound == null ) {
4165 a7dd0415 Kostas Papadimitriou
                                Sizzle.error( expr );
4166 a7dd0415 Kostas Papadimitriou
4167 a7dd0415 Kostas Papadimitriou
                        } else {
4168 a7dd0415 Kostas Papadimitriou
                                break;
4169 a7dd0415 Kostas Papadimitriou
                        }
4170 a7dd0415 Kostas Papadimitriou
                }
4171 a7dd0415 Kostas Papadimitriou
4172 a7dd0415 Kostas Papadimitriou
                old = expr;
4173 a7dd0415 Kostas Papadimitriou
        }
4174 a7dd0415 Kostas Papadimitriou
4175 a7dd0415 Kostas Papadimitriou
        return curLoop;
4176 a7dd0415 Kostas Papadimitriou
};
4177 a7dd0415 Kostas Papadimitriou
4178 a7dd0415 Kostas Papadimitriou
Sizzle.error = function( msg ) {
4179 a7dd0415 Kostas Papadimitriou
        throw new Error( "Syntax error, unrecognized expression: " + msg );
4180 a7dd0415 Kostas Papadimitriou
};
4181 a7dd0415 Kostas Papadimitriou
4182 a7dd0415 Kostas Papadimitriou
/**
4183 a7dd0415 Kostas Papadimitriou
 * Utility function for retreiving the text value of an array of DOM nodes
4184 a7dd0415 Kostas Papadimitriou
 * @param {Array|Element} elem
4185 a7dd0415 Kostas Papadimitriou
 */
4186 a7dd0415 Kostas Papadimitriou
var getText = Sizzle.getText = function( elem ) {
4187 a7dd0415 Kostas Papadimitriou
    var i, node,
4188 a7dd0415 Kostas Papadimitriou
                nodeType = elem.nodeType,
4189 a7dd0415 Kostas Papadimitriou
                ret = "";
4190 a7dd0415 Kostas Papadimitriou
4191 a7dd0415 Kostas Papadimitriou
        if ( nodeType ) {
4192 a7dd0415 Kostas Papadimitriou
                if ( nodeType === 1 || nodeType === 9 ) {
4193 a7dd0415 Kostas Papadimitriou
                        // Use textContent || innerText for elements
4194 a7dd0415 Kostas Papadimitriou
                        if ( typeof elem.textContent === 'string' ) {
4195 a7dd0415 Kostas Papadimitriou
                                return elem.textContent;
4196 a7dd0415 Kostas Papadimitriou
                        } else if ( typeof elem.innerText === 'string' ) {
4197 a7dd0415 Kostas Papadimitriou
                                // Replace IE's carriage returns
4198 a7dd0415 Kostas Papadimitriou
                                return elem.innerText.replace( rReturn, '' );
4199 a7dd0415 Kostas Papadimitriou
                        } else {
4200 a7dd0415 Kostas Papadimitriou
                                // Traverse it's children
4201 a7dd0415 Kostas Papadimitriou
                                for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
4202 a7dd0415 Kostas Papadimitriou
                                        ret += getText( elem );
4203 a7dd0415 Kostas Papadimitriou
                                }
4204 a7dd0415 Kostas Papadimitriou
                        }
4205 a7dd0415 Kostas Papadimitriou
                } else if ( nodeType === 3 || nodeType === 4 ) {
4206 a7dd0415 Kostas Papadimitriou
                        return elem.nodeValue;
4207 a7dd0415 Kostas Papadimitriou
                }
4208 a7dd0415 Kostas Papadimitriou
        } else {
4209 a7dd0415 Kostas Papadimitriou
4210 a7dd0415 Kostas Papadimitriou
                // If no nodeType, this is expected to be an array
4211 a7dd0415 Kostas Papadimitriou
                for ( i = 0; (node = elem[i]); i++ ) {
4212 a7dd0415 Kostas Papadimitriou
                        // Do not traverse comment nodes
4213 a7dd0415 Kostas Papadimitriou
                        if ( node.nodeType !== 8 ) {
4214 a7dd0415 Kostas Papadimitriou
                                ret += getText( node );
4215 a7dd0415 Kostas Papadimitriou
                        }
4216 a7dd0415 Kostas Papadimitriou
                }
4217 a7dd0415 Kostas Papadimitriou
        }
4218 a7dd0415 Kostas Papadimitriou
        return ret;
4219 a7dd0415 Kostas Papadimitriou
};
4220 a7dd0415 Kostas Papadimitriou
4221 a7dd0415 Kostas Papadimitriou
var Expr = Sizzle.selectors = {
4222 a7dd0415 Kostas Papadimitriou
        order: [ "ID", "NAME", "TAG" ],
4223 a7dd0415 Kostas Papadimitriou
4224 a7dd0415 Kostas Papadimitriou
        match: {
4225 a7dd0415 Kostas Papadimitriou
                ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4226 a7dd0415 Kostas Papadimitriou
                CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4227 a7dd0415 Kostas Papadimitriou
                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4228 a7dd0415 Kostas Papadimitriou
                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4229 a7dd0415 Kostas Papadimitriou
                TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4230 a7dd0415 Kostas Papadimitriou
                CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4231 a7dd0415 Kostas Papadimitriou
                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4232 a7dd0415 Kostas Papadimitriou
                PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4233 a7dd0415 Kostas Papadimitriou
        },
4234 a7dd0415 Kostas Papadimitriou
4235 a7dd0415 Kostas Papadimitriou
        leftMatch: {},
4236 a7dd0415 Kostas Papadimitriou
4237 a7dd0415 Kostas Papadimitriou
        attrMap: {
4238 a7dd0415 Kostas Papadimitriou
                "class": "className",
4239 a7dd0415 Kostas Papadimitriou
                "for": "htmlFor"
4240 a7dd0415 Kostas Papadimitriou
        },
4241 a7dd0415 Kostas Papadimitriou
4242 a7dd0415 Kostas Papadimitriou
        attrHandle: {
4243 a7dd0415 Kostas Papadimitriou
                href: function( elem ) {
4244 a7dd0415 Kostas Papadimitriou
                        return elem.getAttribute( "href" );
4245 a7dd0415 Kostas Papadimitriou
                },
4246 a7dd0415 Kostas Papadimitriou
                type: function( elem ) {
4247 a7dd0415 Kostas Papadimitriou
                        return elem.getAttribute( "type" );
4248 a7dd0415 Kostas Papadimitriou
                }
4249 a7dd0415 Kostas Papadimitriou
        },
4250 a7dd0415 Kostas Papadimitriou
4251 a7dd0415 Kostas Papadimitriou
        relative: {
4252 a7dd0415 Kostas Papadimitriou
                "+": function(checkSet, part){
4253 a7dd0415 Kostas Papadimitriou
                        var isPartStr = typeof part === "string",
4254 a7dd0415 Kostas Papadimitriou
                                isTag = isPartStr && !rNonWord.test( part ),
4255 a7dd0415 Kostas Papadimitriou
                                isPartStrNotTag = isPartStr && !isTag;
4256 a7dd0415 Kostas Papadimitriou
4257 a7dd0415 Kostas Papadimitriou
                        if ( isTag ) {
4258 a7dd0415 Kostas Papadimitriou
                                part = part.toLowerCase();
4259 a7dd0415 Kostas Papadimitriou
                        }
4260 a7dd0415 Kostas Papadimitriou
4261 a7dd0415 Kostas Papadimitriou
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4262 a7dd0415 Kostas Papadimitriou
                                if ( (elem = checkSet[i]) ) {
4263 a7dd0415 Kostas Papadimitriou
                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4264 a7dd0415 Kostas Papadimitriou
4265 a7dd0415 Kostas Papadimitriou
                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4266 a7dd0415 Kostas Papadimitriou
                                                elem || false :
4267 a7dd0415 Kostas Papadimitriou
                                                elem === part;
4268 a7dd0415 Kostas Papadimitriou
                                }
4269 a7dd0415 Kostas Papadimitriou
                        }
4270 a7dd0415 Kostas Papadimitriou
4271 a7dd0415 Kostas Papadimitriou
                        if ( isPartStrNotTag ) {
4272 a7dd0415 Kostas Papadimitriou
                                Sizzle.filter( part, checkSet, true );
4273 a7dd0415 Kostas Papadimitriou
                        }
4274 a7dd0415 Kostas Papadimitriou
                },
4275 a7dd0415 Kostas Papadimitriou
4276 a7dd0415 Kostas Papadimitriou
                ">": function( checkSet, part ) {
4277 a7dd0415 Kostas Papadimitriou
                        var elem,
4278 a7dd0415 Kostas Papadimitriou
                                isPartStr = typeof part === "string",
4279 a7dd0415 Kostas Papadimitriou
                                i = 0,
4280 a7dd0415 Kostas Papadimitriou
                                l = checkSet.length;
4281 a7dd0415 Kostas Papadimitriou
4282 a7dd0415 Kostas Papadimitriou
                        if ( isPartStr && !rNonWord.test( part ) ) {
4283 a7dd0415 Kostas Papadimitriou
                                part = part.toLowerCase();
4284 a7dd0415 Kostas Papadimitriou
4285 a7dd0415 Kostas Papadimitriou
                                for ( ; i < l; i++ ) {
4286 a7dd0415 Kostas Papadimitriou
                                        elem = checkSet[i];
4287 a7dd0415 Kostas Papadimitriou
4288 a7dd0415 Kostas Papadimitriou
                                        if ( elem ) {
4289 a7dd0415 Kostas Papadimitriou
                                                var parent = elem.parentNode;
4290 a7dd0415 Kostas Papadimitriou
                                                checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4291 a7dd0415 Kostas Papadimitriou
                                        }
4292 a7dd0415 Kostas Papadimitriou
                                }
4293 a7dd0415 Kostas Papadimitriou
4294 a7dd0415 Kostas Papadimitriou
                        } else {
4295 a7dd0415 Kostas Papadimitriou
                                for ( ; i < l; i++ ) {
4296 a7dd0415 Kostas Papadimitriou
                                        elem = checkSet[i];
4297 a7dd0415 Kostas Papadimitriou
4298 a7dd0415 Kostas Papadimitriou
                                        if ( elem ) {
4299 a7dd0415 Kostas Papadimitriou
                                                checkSet[i] = isPartStr ?
4300 a7dd0415 Kostas Papadimitriou
                                                        elem.parentNode :
4301 a7dd0415 Kostas Papadimitriou
                                                        elem.parentNode === part;
4302 a7dd0415 Kostas Papadimitriou
                                        }
4303 a7dd0415 Kostas Papadimitriou
                                }
4304 a7dd0415 Kostas Papadimitriou
4305 a7dd0415 Kostas Papadimitriou
                                if ( isPartStr ) {
4306 a7dd0415 Kostas Papadimitriou
                                        Sizzle.filter( part, checkSet, true );
4307 a7dd0415 Kostas Papadimitriou
                                }
4308 a7dd0415 Kostas Papadimitriou
                        }
4309 a7dd0415 Kostas Papadimitriou
                },
4310 a7dd0415 Kostas Papadimitriou
4311 a7dd0415 Kostas Papadimitriou
                "": function(checkSet, part, isXML){
4312 a7dd0415 Kostas Papadimitriou
                        var nodeCheck,
4313 a7dd0415 Kostas Papadimitriou
                                doneName = done++,
4314 a7dd0415 Kostas Papadimitriou
                                checkFn = dirCheck;
4315 a7dd0415 Kostas Papadimitriou
4316 a7dd0415 Kostas Papadimitriou
                        if ( typeof part === "string" && !rNonWord.test( part ) ) {
4317 a7dd0415 Kostas Papadimitriou
                                part = part.toLowerCase();
4318 a7dd0415 Kostas Papadimitriou
                                nodeCheck = part;
4319 a7dd0415 Kostas Papadimitriou
                                checkFn = dirNodeCheck;
4320 a7dd0415 Kostas Papadimitriou
                        }
4321 a7dd0415 Kostas Papadimitriou
4322 a7dd0415 Kostas Papadimitriou
                        checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
4323 a7dd0415 Kostas Papadimitriou
                },
4324 a7dd0415 Kostas Papadimitriou
4325 a7dd0415 Kostas Papadimitriou
                "~": function( checkSet, part, isXML ) {
4326 a7dd0415 Kostas Papadimitriou
                        var nodeCheck,
4327 a7dd0415 Kostas Papadimitriou
                                doneName = done++,
4328 a7dd0415 Kostas Papadimitriou
                                checkFn = dirCheck;
4329 a7dd0415 Kostas Papadimitriou
4330 a7dd0415 Kostas Papadimitriou
                        if ( typeof part === "string" && !rNonWord.test( part ) ) {
4331 a7dd0415 Kostas Papadimitriou
                                part = part.toLowerCase();
4332 a7dd0415 Kostas Papadimitriou
                                nodeCheck = part;
4333 a7dd0415 Kostas Papadimitriou
                                checkFn = dirNodeCheck;
4334 a7dd0415 Kostas Papadimitriou
                        }
4335 a7dd0415 Kostas Papadimitriou
4336 a7dd0415 Kostas Papadimitriou
                        checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
4337 a7dd0415 Kostas Papadimitriou
                }
4338 a7dd0415 Kostas Papadimitriou
        },
4339 a7dd0415 Kostas Papadimitriou
4340 a7dd0415 Kostas Papadimitriou
        find: {
4341 a7dd0415 Kostas Papadimitriou
                ID: function( match, context, isXML ) {
4342 a7dd0415 Kostas Papadimitriou
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
4343 a7dd0415 Kostas Papadimitriou
                                var m = context.getElementById(match[1]);
4344 a7dd0415 Kostas Papadimitriou
                                // Check parentNode to catch when Blackberry 4.6 returns
4345 a7dd0415 Kostas Papadimitriou
                                // nodes that are no longer in the document #6963
4346 a7dd0415 Kostas Papadimitriou
                                return m && m.parentNode ? [m] : [];
4347 a7dd0415 Kostas Papadimitriou
                        }
4348 a7dd0415 Kostas Papadimitriou
                },
4349 a7dd0415 Kostas Papadimitriou
4350 a7dd0415 Kostas Papadimitriou
                NAME: function( match, context ) {
4351 a7dd0415 Kostas Papadimitriou
                        if ( typeof context.getElementsByName !== "undefined" ) {
4352 a7dd0415 Kostas Papadimitriou
                                var ret = [],
4353 a7dd0415 Kostas Papadimitriou
                                        results = context.getElementsByName( match[1] );
4354 a7dd0415 Kostas Papadimitriou
4355 a7dd0415 Kostas Papadimitriou
                                for ( var i = 0, l = results.length; i < l; i++ ) {
4356 a7dd0415 Kostas Papadimitriou
                                        if ( results[i].getAttribute("name") === match[1] ) {
4357 a7dd0415 Kostas Papadimitriou
                                                ret.push( results[i] );
4358 a7dd0415 Kostas Papadimitriou
                                        }
4359 a7dd0415 Kostas Papadimitriou
                                }
4360 a7dd0415 Kostas Papadimitriou
4361 a7dd0415 Kostas Papadimitriou
                                return ret.length === 0 ? null : ret;
4362 a7dd0415 Kostas Papadimitriou
                        }
4363 a7dd0415 Kostas Papadimitriou
                },
4364 a7dd0415 Kostas Papadimitriou
4365 a7dd0415 Kostas Papadimitriou
                TAG: function( match, context ) {
4366 a7dd0415 Kostas Papadimitriou
                        if ( typeof context.getElementsByTagName !== "undefined" ) {
4367 a7dd0415 Kostas Papadimitriou
                                return context.getElementsByTagName( match[1] );
4368 a7dd0415 Kostas Papadimitriou
                        }
4369 a7dd0415 Kostas Papadimitriou
                }
4370 a7dd0415 Kostas Papadimitriou
        },
4371 a7dd0415 Kostas Papadimitriou
        preFilter: {
4372 a7dd0415 Kostas Papadimitriou
                CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4373 a7dd0415 Kostas Papadimitriou
                        match = " " + match[1].replace( rBackslash, "" ) + " ";
4374 a7dd0415 Kostas Papadimitriou
4375 a7dd0415 Kostas Papadimitriou
                        if ( isXML ) {
4376 a7dd0415 Kostas Papadimitriou
                                return match;
4377 a7dd0415 Kostas Papadimitriou
                        }
4378 a7dd0415 Kostas Papadimitriou
4379 a7dd0415 Kostas Papadimitriou
                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4380 a7dd0415 Kostas Papadimitriou
                                if ( elem ) {
4381 a7dd0415 Kostas Papadimitriou
                                        if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4382 a7dd0415 Kostas Papadimitriou
                                                if ( !inplace ) {
4383 a7dd0415 Kostas Papadimitriou
                                                        result.push( elem );
4384 a7dd0415 Kostas Papadimitriou
                                                }
4385 a7dd0415 Kostas Papadimitriou
4386 a7dd0415 Kostas Papadimitriou
                                        } else if ( inplace ) {
4387 a7dd0415 Kostas Papadimitriou
                                                curLoop[i] = false;
4388 a7dd0415 Kostas Papadimitriou
                                        }
4389 a7dd0415 Kostas Papadimitriou
                                }
4390 a7dd0415 Kostas Papadimitriou
                        }
4391 a7dd0415 Kostas Papadimitriou
4392 a7dd0415 Kostas Papadimitriou
                        return false;
4393 a7dd0415 Kostas Papadimitriou
                },
4394 a7dd0415 Kostas Papadimitriou
4395 a7dd0415 Kostas Papadimitriou
                ID: function( match ) {
4396 a7dd0415 Kostas Papadimitriou
                        return match[1].replace( rBackslash, "" );
4397 a7dd0415 Kostas Papadimitriou
                },
4398 a7dd0415 Kostas Papadimitriou
4399 a7dd0415 Kostas Papadimitriou
                TAG: function( match, curLoop ) {
4400 a7dd0415 Kostas Papadimitriou
                        return match[1].replace( rBackslash, "" ).toLowerCase();
4401 a7dd0415 Kostas Papadimitriou
                },
4402 a7dd0415 Kostas Papadimitriou
4403 a7dd0415 Kostas Papadimitriou
                CHILD: function( match ) {
4404 a7dd0415 Kostas Papadimitriou
                        if ( match[1] === "nth" ) {
4405 a7dd0415 Kostas Papadimitriou
                                if ( !match[2] ) {
4406 a7dd0415 Kostas Papadimitriou
                                        Sizzle.error( match[0] );
4407 a7dd0415 Kostas Papadimitriou
                                }
4408 a7dd0415 Kostas Papadimitriou
4409 a7dd0415 Kostas Papadimitriou
                                match[2] = match[2].replace(/^\+|\s*/g, '');
4410 a7dd0415 Kostas Papadimitriou
4411 a7dd0415 Kostas Papadimitriou
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4412 a7dd0415 Kostas Papadimitriou
                                var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4413 a7dd0415 Kostas Papadimitriou
                                        match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4414 a7dd0415 Kostas Papadimitriou
                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4415 a7dd0415 Kostas Papadimitriou
4416 a7dd0415 Kostas Papadimitriou
                                // calculate the numbers (first)n+(last) including if they are negative
4417 a7dd0415 Kostas Papadimitriou
                                match[2] = (test[1] + (test[2] || 1)) - 0;
4418 a7dd0415 Kostas Papadimitriou
                                match[3] = test[3] - 0;
4419 a7dd0415 Kostas Papadimitriou
                        }
4420 a7dd0415 Kostas Papadimitriou
                        else if ( match[2] ) {
4421 a7dd0415 Kostas Papadimitriou
                                Sizzle.error( match[0] );
4422 a7dd0415 Kostas Papadimitriou
                        }
4423 a7dd0415 Kostas Papadimitriou
4424 a7dd0415 Kostas Papadimitriou
                        // TODO: Move to normal caching system
4425 a7dd0415 Kostas Papadimitriou
                        match[0] = done++;
4426 a7dd0415 Kostas Papadimitriou
4427 a7dd0415 Kostas Papadimitriou
                        return match;
4428 a7dd0415 Kostas Papadimitriou
                },
4429 a7dd0415 Kostas Papadimitriou
4430 a7dd0415 Kostas Papadimitriou
                ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4431 a7dd0415 Kostas Papadimitriou
                        var name = match[1] = match[1].replace( rBackslash, "" );
4432 a7dd0415 Kostas Papadimitriou
                        
4433 a7dd0415 Kostas Papadimitriou
                        if ( !isXML && Expr.attrMap[name] ) {
4434 a7dd0415 Kostas Papadimitriou
                                match[1] = Expr.attrMap[name];
4435 a7dd0415 Kostas Papadimitriou
                        }
4436 a7dd0415 Kostas Papadimitriou
4437 a7dd0415 Kostas Papadimitriou
                        // Handle if an un-quoted value was used
4438 a7dd0415 Kostas Papadimitriou
                        match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4439 a7dd0415 Kostas Papadimitriou
4440 a7dd0415 Kostas Papadimitriou
                        if ( match[2] === "~=" ) {
4441 a7dd0415 Kostas Papadimitriou
                                match[4] = " " + match[4] + " ";
4442 a7dd0415 Kostas Papadimitriou
                        }
4443 a7dd0415 Kostas Papadimitriou
4444 a7dd0415 Kostas Papadimitriou
                        return match;
4445 a7dd0415 Kostas Papadimitriou
                },
4446 a7dd0415 Kostas Papadimitriou
4447 a7dd0415 Kostas Papadimitriou
                PSEUDO: function( match, curLoop, inplace, result, not ) {
4448 a7dd0415 Kostas Papadimitriou
                        if ( match[1] === "not" ) {
4449 a7dd0415 Kostas Papadimitriou
                                // If we're dealing with a complex expression, or a simple one
4450 a7dd0415 Kostas Papadimitriou
                                if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4451 a7dd0415 Kostas Papadimitriou
                                        match[3] = Sizzle(match[3], null, null, curLoop);
4452 a7dd0415 Kostas Papadimitriou
4453 a7dd0415 Kostas Papadimitriou
                                } else {
4454 a7dd0415 Kostas Papadimitriou
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4455 a7dd0415 Kostas Papadimitriou
4456 a7dd0415 Kostas Papadimitriou
                                        if ( !inplace ) {
4457 a7dd0415 Kostas Papadimitriou
                                                result.push.apply( result, ret );
4458 a7dd0415 Kostas Papadimitriou
                                        }
4459 a7dd0415 Kostas Papadimitriou
4460 a7dd0415 Kostas Papadimitriou
                                        return false;
4461 a7dd0415 Kostas Papadimitriou
                                }
4462 a7dd0415 Kostas Papadimitriou
4463 a7dd0415 Kostas Papadimitriou
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4464 a7dd0415 Kostas Papadimitriou
                                return true;
4465 a7dd0415 Kostas Papadimitriou
                        }
4466 a7dd0415 Kostas Papadimitriou
                        
4467 a7dd0415 Kostas Papadimitriou
                        return match;
4468 a7dd0415 Kostas Papadimitriou
                },
4469 a7dd0415 Kostas Papadimitriou
4470 a7dd0415 Kostas Papadimitriou
                POS: function( match ) {
4471 a7dd0415 Kostas Papadimitriou
                        match.unshift( true );
4472 a7dd0415 Kostas Papadimitriou
4473 a7dd0415 Kostas Papadimitriou
                        return match;
4474 a7dd0415 Kostas Papadimitriou
                }
4475 a7dd0415 Kostas Papadimitriou
        },
4476 a7dd0415 Kostas Papadimitriou
        
4477 a7dd0415 Kostas Papadimitriou
        filters: {
4478 a7dd0415 Kostas Papadimitriou
                enabled: function( elem ) {
4479 a7dd0415 Kostas Papadimitriou
                        return elem.disabled === false && elem.type !== "hidden";
4480 a7dd0415 Kostas Papadimitriou
                },
4481 a7dd0415 Kostas Papadimitriou
4482 a7dd0415 Kostas Papadimitriou
                disabled: function( elem ) {
4483 a7dd0415 Kostas Papadimitriou
                        return elem.disabled === true;
4484 a7dd0415 Kostas Papadimitriou
                },
4485 a7dd0415 Kostas Papadimitriou
4486 a7dd0415 Kostas Papadimitriou
                checked: function( elem ) {
4487 a7dd0415 Kostas Papadimitriou
                        return elem.checked === true;
4488 a7dd0415 Kostas Papadimitriou
                },
4489 a7dd0415 Kostas Papadimitriou
                
4490 a7dd0415 Kostas Papadimitriou
                selected: function( elem ) {
4491 a7dd0415 Kostas Papadimitriou
                        // Accessing this property makes selected-by-default
4492 a7dd0415 Kostas Papadimitriou
                        // options in Safari work properly
4493 a7dd0415 Kostas Papadimitriou
                        if ( elem.parentNode ) {
4494 a7dd0415 Kostas Papadimitriou
                                elem.parentNode.selectedIndex;
4495 a7dd0415 Kostas Papadimitriou
                        }
4496 a7dd0415 Kostas Papadimitriou
                        
4497 a7dd0415 Kostas Papadimitriou
                        return elem.selected === true;
4498 a7dd0415 Kostas Papadimitriou
                },
4499 a7dd0415 Kostas Papadimitriou
4500 a7dd0415 Kostas Papadimitriou
                parent: function( elem ) {
4501 a7dd0415 Kostas Papadimitriou
                        return !!elem.firstChild;
4502 a7dd0415 Kostas Papadimitriou
                },
4503 a7dd0415 Kostas Papadimitriou
4504 a7dd0415 Kostas Papadimitriou
                empty: function( elem ) {
4505 a7dd0415 Kostas Papadimitriou
                        return !elem.firstChild;
4506 a7dd0415 Kostas Papadimitriou
                },
4507 a7dd0415 Kostas Papadimitriou
4508 a7dd0415 Kostas Papadimitriou
                has: function( elem, i, match ) {
4509 a7dd0415 Kostas Papadimitriou
                        return !!Sizzle( match[3], elem ).length;
4510 a7dd0415 Kostas Papadimitriou
                },
4511 a7dd0415 Kostas Papadimitriou
4512 a7dd0415 Kostas Papadimitriou
                header: function( elem ) {
4513 a7dd0415 Kostas Papadimitriou
                        return (/h\d/i).test( elem.nodeName );
4514 a7dd0415 Kostas Papadimitriou
                },
4515 a7dd0415 Kostas Papadimitriou
4516 a7dd0415 Kostas Papadimitriou
                text: function( elem ) {
4517 a7dd0415 Kostas Papadimitriou
                        var attr = elem.getAttribute( "type" ), type = elem.type;
4518 a7dd0415 Kostas Papadimitriou
                        // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
4519 a7dd0415 Kostas Papadimitriou
                        // use getAttribute instead to test this case
4520 a7dd0415 Kostas Papadimitriou
                        return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4521 a7dd0415 Kostas Papadimitriou
                },
4522 a7dd0415 Kostas Papadimitriou
4523 a7dd0415 Kostas Papadimitriou
                radio: function( elem ) {
4524 a7dd0415 Kostas Papadimitriou
                        return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4525 a7dd0415 Kostas Papadimitriou
                },
4526 a7dd0415 Kostas Papadimitriou
4527 a7dd0415 Kostas Papadimitriou
                checkbox: function( elem ) {
4528 a7dd0415 Kostas Papadimitriou
                        return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4529 a7dd0415 Kostas Papadimitriou
                },
4530 a7dd0415 Kostas Papadimitriou
4531 a7dd0415 Kostas Papadimitriou
                file: function( elem ) {
4532 a7dd0415 Kostas Papadimitriou
                        return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4533 a7dd0415 Kostas Papadimitriou
                },
4534 a7dd0415 Kostas Papadimitriou
4535 a7dd0415 Kostas Papadimitriou
                password: function( elem ) {
4536 a7dd0415 Kostas Papadimitriou
                        return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
4537 a7dd0415 Kostas Papadimitriou
                },
4538 a7dd0415 Kostas Papadimitriou
4539 a7dd0415 Kostas Papadimitriou
                submit: function( elem ) {
4540 a7dd0415 Kostas Papadimitriou
                        var name = elem.nodeName.toLowerCase();
4541 a7dd0415 Kostas Papadimitriou
                        return (name === "input" || name === "button") && "submit" === elem.type;
4542 a7dd0415 Kostas Papadimitriou
                },
4543 a7dd0415 Kostas Papadimitriou
4544 a7dd0415 Kostas Papadimitriou
                image: function( elem ) {
4545 a7dd0415 Kostas Papadimitriou
                        return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
4546 a7dd0415 Kostas Papadimitriou
                },
4547 a7dd0415 Kostas Papadimitriou
4548 a7dd0415 Kostas Papadimitriou
                reset: function( elem ) {
4549 a7dd0415 Kostas Papadimitriou
                        var name = elem.nodeName.toLowerCase();
4550 a7dd0415 Kostas Papadimitriou
                        return (name === "input" || name === "button") && "reset" === elem.type;
4551 a7dd0415 Kostas Papadimitriou
                },
4552 a7dd0415 Kostas Papadimitriou
4553 a7dd0415 Kostas Papadimitriou
                button: function( elem ) {
4554 a7dd0415 Kostas Papadimitriou
                        var name = elem.nodeName.toLowerCase();
4555 a7dd0415 Kostas Papadimitriou
                        return name === "input" && "button" === elem.type || name === "button";
4556 a7dd0415 Kostas Papadimitriou
                },
4557 a7dd0415 Kostas Papadimitriou
4558 a7dd0415 Kostas Papadimitriou
                input: function( elem ) {
4559 a7dd0415 Kostas Papadimitriou
                        return (/input|select|textarea|button/i).test( elem.nodeName );
4560 a7dd0415 Kostas Papadimitriou
                },
4561 a7dd0415 Kostas Papadimitriou
4562 a7dd0415 Kostas Papadimitriou
                focus: function( elem ) {
4563 a7dd0415 Kostas Papadimitriou
                        return elem === elem.ownerDocument.activeElement;
4564 a7dd0415 Kostas Papadimitriou
                }
4565 a7dd0415 Kostas Papadimitriou
        },
4566 a7dd0415 Kostas Papadimitriou
        setFilters: {
4567 a7dd0415 Kostas Papadimitriou
                first: function( elem, i ) {
4568 a7dd0415 Kostas Papadimitriou
                        return i === 0;
4569 a7dd0415 Kostas Papadimitriou
                },
4570 a7dd0415 Kostas Papadimitriou
4571 a7dd0415 Kostas Papadimitriou
                last: function( elem, i, match, array ) {
4572 a7dd0415 Kostas Papadimitriou
                        return i === array.length - 1;
4573 a7dd0415 Kostas Papadimitriou
                },
4574 a7dd0415 Kostas Papadimitriou
4575 a7dd0415 Kostas Papadimitriou
                even: function( elem, i ) {
4576 a7dd0415 Kostas Papadimitriou
                        return i % 2 === 0;
4577 a7dd0415 Kostas Papadimitriou
                },
4578 a7dd0415 Kostas Papadimitriou
4579 a7dd0415 Kostas Papadimitriou
                odd: function( elem, i ) {
4580 a7dd0415 Kostas Papadimitriou
                        return i % 2 === 1;
4581 a7dd0415 Kostas Papadimitriou
                },
4582 a7dd0415 Kostas Papadimitriou
4583 a7dd0415 Kostas Papadimitriou
                lt: function( elem, i, match ) {
4584 a7dd0415 Kostas Papadimitriou
                        return i < match[3] - 0;
4585 a7dd0415 Kostas Papadimitriou
                },
4586 a7dd0415 Kostas Papadimitriou
4587 a7dd0415 Kostas Papadimitriou
                gt: function( elem, i, match ) {
4588 a7dd0415 Kostas Papadimitriou
                        return i > match[3] - 0;
4589 a7dd0415 Kostas Papadimitriou
                },
4590 a7dd0415 Kostas Papadimitriou
4591 a7dd0415 Kostas Papadimitriou
                nth: function( elem, i, match ) {
4592 a7dd0415 Kostas Papadimitriou
                        return match[3] - 0 === i;
4593 a7dd0415 Kostas Papadimitriou
                },
4594 a7dd0415 Kostas Papadimitriou
4595 a7dd0415 Kostas Papadimitriou
                eq: function( elem, i, match ) {
4596 a7dd0415 Kostas Papadimitriou
                        return match[3] - 0 === i;
4597 a7dd0415 Kostas Papadimitriou
                }
4598 a7dd0415 Kostas Papadimitriou
        },
4599 a7dd0415 Kostas Papadimitriou
        filter: {
4600 a7dd0415 Kostas Papadimitriou
                PSEUDO: function( elem, match, i, array ) {
4601 a7dd0415 Kostas Papadimitriou
                        var name = match[1],
4602 a7dd0415 Kostas Papadimitriou
                                filter = Expr.filters[ name ];
4603 a7dd0415 Kostas Papadimitriou
4604 a7dd0415 Kostas Papadimitriou
                        if ( filter ) {
4605 a7dd0415 Kostas Papadimitriou
                                return filter( elem, i, match, array );
4606 a7dd0415 Kostas Papadimitriou
4607 a7dd0415 Kostas Papadimitriou
                        } else if ( name === "contains" ) {
4608 a7dd0415 Kostas Papadimitriou
                                return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
4609 a7dd0415 Kostas Papadimitriou
4610 a7dd0415 Kostas Papadimitriou
                        } else if ( name === "not" ) {
4611 a7dd0415 Kostas Papadimitriou
                                var not = match[3];
4612 a7dd0415 Kostas Papadimitriou
4613 a7dd0415 Kostas Papadimitriou
                                for ( var j = 0, l = not.length; j < l; j++ ) {
4614 a7dd0415 Kostas Papadimitriou
                                        if ( not[j] === elem ) {
4615 a7dd0415 Kostas Papadimitriou
                                                return false;
4616 a7dd0415 Kostas Papadimitriou
                                        }
4617 a7dd0415 Kostas Papadimitriou
                                }
4618 a7dd0415 Kostas Papadimitriou
4619 a7dd0415 Kostas Papadimitriou
                                return true;
4620 a7dd0415 Kostas Papadimitriou
4621 a7dd0415 Kostas Papadimitriou
                        } else {
4622 a7dd0415 Kostas Papadimitriou
                                Sizzle.error( name );
4623 a7dd0415 Kostas Papadimitriou
                        }
4624 a7dd0415 Kostas Papadimitriou
                },
4625 a7dd0415 Kostas Papadimitriou
4626 a7dd0415 Kostas Papadimitriou
                CHILD: function( elem, match ) {
4627 a7dd0415 Kostas Papadimitriou
                        var first, last,
4628 a7dd0415 Kostas Papadimitriou
                                doneName, parent, cache,
4629 a7dd0415 Kostas Papadimitriou
                                count, diff,
4630 a7dd0415 Kostas Papadimitriou
                                type = match[1],
4631 a7dd0415 Kostas Papadimitriou
                                node = elem;
4632 a7dd0415 Kostas Papadimitriou
4633 a7dd0415 Kostas Papadimitriou
                        switch ( type ) {
4634 a7dd0415 Kostas Papadimitriou
                                case "only":
4635 a7dd0415 Kostas Papadimitriou
                                case "first":
4636 a7dd0415 Kostas Papadimitriou
                                        while ( (node = node.previousSibling) )         {
4637 a7dd0415 Kostas Papadimitriou
                                                if ( node.nodeType === 1 ) { 
4638 a7dd0415 Kostas Papadimitriou
                                                        return false; 
4639 a7dd0415 Kostas Papadimitriou
                                                }
4640 a7dd0415 Kostas Papadimitriou
                                        }
4641 a7dd0415 Kostas Papadimitriou
4642 a7dd0415 Kostas Papadimitriou
                                        if ( type === "first" ) { 
4643 a7dd0415 Kostas Papadimitriou
                                                return true; 
4644 a7dd0415 Kostas Papadimitriou
                                        }
4645 a7dd0415 Kostas Papadimitriou
4646 a7dd0415 Kostas Papadimitriou
                                        node = elem;
4647 a7dd0415 Kostas Papadimitriou
4648 a7dd0415 Kostas Papadimitriou
                                case "last":
4649 a7dd0415 Kostas Papadimitriou
                                        while ( (node = node.nextSibling) )         {
4650 a7dd0415 Kostas Papadimitriou
                                                if ( node.nodeType === 1 ) { 
4651 a7dd0415 Kostas Papadimitriou
                                                        return false; 
4652 a7dd0415 Kostas Papadimitriou
                                                }
4653 a7dd0415 Kostas Papadimitriou
                                        }
4654 a7dd0415 Kostas Papadimitriou
4655 a7dd0415 Kostas Papadimitriou
                                        return true;
4656 a7dd0415 Kostas Papadimitriou
4657 a7dd0415 Kostas Papadimitriou
                                case "nth":
4658 a7dd0415 Kostas Papadimitriou
                                        first = match[2];
4659 a7dd0415 Kostas Papadimitriou
                                        last = match[3];
4660 a7dd0415 Kostas Papadimitriou
4661 a7dd0415 Kostas Papadimitriou
                                        if ( first === 1 && last === 0 ) {
4662 a7dd0415 Kostas Papadimitriou
                                                return true;
4663 a7dd0415 Kostas Papadimitriou
                                        }
4664 a7dd0415 Kostas Papadimitriou
                                        
4665 a7dd0415 Kostas Papadimitriou
                                        doneName = match[0];
4666 a7dd0415 Kostas Papadimitriou
                                        parent = elem.parentNode;
4667 a7dd0415 Kostas Papadimitriou
        
4668 a7dd0415 Kostas Papadimitriou
                                        if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
4669 a7dd0415 Kostas Papadimitriou
                                                count = 0;
4670 a7dd0415 Kostas Papadimitriou
                                                
4671 a7dd0415 Kostas Papadimitriou
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
4672 a7dd0415 Kostas Papadimitriou
                                                        if ( node.nodeType === 1 ) {
4673 a7dd0415 Kostas Papadimitriou
                                                                node.nodeIndex = ++count;
4674 a7dd0415 Kostas Papadimitriou
                                                        }
4675 a7dd0415 Kostas Papadimitriou
                                                } 
4676 a7dd0415 Kostas Papadimitriou
4677 a7dd0415 Kostas Papadimitriou
                                                parent[ expando ] = doneName;
4678 a7dd0415 Kostas Papadimitriou
                                        }
4679 a7dd0415 Kostas Papadimitriou
                                        
4680 a7dd0415 Kostas Papadimitriou
                                        diff = elem.nodeIndex - last;
4681 a7dd0415 Kostas Papadimitriou
4682 a7dd0415 Kostas Papadimitriou
                                        if ( first === 0 ) {
4683 a7dd0415 Kostas Papadimitriou
                                                return diff === 0;
4684 a7dd0415 Kostas Papadimitriou
4685 a7dd0415 Kostas Papadimitriou
                                        } else {
4686 a7dd0415 Kostas Papadimitriou
                                                return ( diff % first === 0 && diff / first >= 0 );
4687 a7dd0415 Kostas Papadimitriou
                                        }
4688 a7dd0415 Kostas Papadimitriou
                        }
4689 a7dd0415 Kostas Papadimitriou
                },
4690 a7dd0415 Kostas Papadimitriou
4691 a7dd0415 Kostas Papadimitriou
                ID: function( elem, match ) {
4692 a7dd0415 Kostas Papadimitriou
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
4693 a7dd0415 Kostas Papadimitriou
                },
4694 a7dd0415 Kostas Papadimitriou
4695 a7dd0415 Kostas Papadimitriou
                TAG: function( elem, match ) {
4696 a7dd0415 Kostas Papadimitriou
                        return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
4697 a7dd0415 Kostas Papadimitriou
                },
4698 a7dd0415 Kostas Papadimitriou
                
4699 a7dd0415 Kostas Papadimitriou
                CLASS: function( elem, match ) {
4700 a7dd0415 Kostas Papadimitriou
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
4701 a7dd0415 Kostas Papadimitriou
                                .indexOf( match ) > -1;
4702 a7dd0415 Kostas Papadimitriou
                },
4703 a7dd0415 Kostas Papadimitriou
4704 a7dd0415 Kostas Papadimitriou
                ATTR: function( elem, match ) {
4705 a7dd0415 Kostas Papadimitriou
                        var name = match[1],
4706 a7dd0415 Kostas Papadimitriou
                                result = Sizzle.attr ?
4707 a7dd0415 Kostas Papadimitriou
                                        Sizzle.attr( elem, name ) :
4708 a7dd0415 Kostas Papadimitriou
                                        Expr.attrHandle[ name ] ?
4709 a7dd0415 Kostas Papadimitriou
                                        Expr.attrHandle[ name ]( elem ) :
4710 a7dd0415 Kostas Papadimitriou
                                        elem[ name ] != null ?
4711 a7dd0415 Kostas Papadimitriou
                                                elem[ name ] :
4712 a7dd0415 Kostas Papadimitriou
                                                elem.getAttribute( name ),
4713 a7dd0415 Kostas Papadimitriou
                                value = result + "",
4714 a7dd0415 Kostas Papadimitriou
                                type = match[2],
4715 a7dd0415 Kostas Papadimitriou
                                check = match[4];
4716 a7dd0415 Kostas Papadimitriou
4717 a7dd0415 Kostas Papadimitriou
                        return result == null ?
4718 a7dd0415 Kostas Papadimitriou
                                type === "!=" :
4719 a7dd0415 Kostas Papadimitriou
                                !type && Sizzle.attr ?
4720 a7dd0415 Kostas Papadimitriou
                                result != null :
4721 a7dd0415 Kostas Papadimitriou
                                type === "=" ?
4722 a7dd0415 Kostas Papadimitriou
                                value === check :
4723 a7dd0415 Kostas Papadimitriou
                                type === "*=" ?
4724 a7dd0415 Kostas Papadimitriou
                                value.indexOf(check) >= 0 :
4725 a7dd0415 Kostas Papadimitriou
                                type === "~=" ?
4726 a7dd0415 Kostas Papadimitriou
                                (" " + value + " ").indexOf(check) >= 0 :
4727 a7dd0415 Kostas Papadimitriou
                                !check ?
4728 a7dd0415 Kostas Papadimitriou
                                value && result !== false :
4729 a7dd0415 Kostas Papadimitriou
                                type === "!=" ?
4730 a7dd0415 Kostas Papadimitriou
                                value !== check :
4731 a7dd0415 Kostas Papadimitriou
                                type === "^=" ?
4732 a7dd0415 Kostas Papadimitriou
                                value.indexOf(check) === 0 :
4733 a7dd0415 Kostas Papadimitriou
                                type === "$=" ?
4734 a7dd0415 Kostas Papadimitriou
                                value.substr(value.length - check.length) === check :
4735 a7dd0415 Kostas Papadimitriou
                                type === "|=" ?
4736 a7dd0415 Kostas Papadimitriou
                                value === check || value.substr(0, check.length + 1) === check + "-" :
4737 a7dd0415 Kostas Papadimitriou
                                false;
4738 a7dd0415 Kostas Papadimitriou
                },
4739 a7dd0415 Kostas Papadimitriou
4740 a7dd0415 Kostas Papadimitriou
                POS: function( elem, match, i, array ) {
4741 a7dd0415 Kostas Papadimitriou
                        var name = match[2],
4742 a7dd0415 Kostas Papadimitriou
                                filter = Expr.setFilters[ name ];
4743 a7dd0415 Kostas Papadimitriou
4744 a7dd0415 Kostas Papadimitriou
                        if ( filter ) {
4745 a7dd0415 Kostas Papadimitriou
                                return filter( elem, i, match, array );
4746 a7dd0415 Kostas Papadimitriou
                        }
4747 a7dd0415 Kostas Papadimitriou
                }
4748 a7dd0415 Kostas Papadimitriou
        }
4749 a7dd0415 Kostas Papadimitriou
};
4750 a7dd0415 Kostas Papadimitriou
4751 a7dd0415 Kostas Papadimitriou
var origPOS = Expr.match.POS,
4752 a7dd0415 Kostas Papadimitriou
        fescape = function(all, num){
4753 a7dd0415 Kostas Papadimitriou
                return "\\" + (num - 0 + 1);
4754 a7dd0415 Kostas Papadimitriou
        };
4755 a7dd0415 Kostas Papadimitriou
4756 a7dd0415 Kostas Papadimitriou
for ( var type in Expr.match ) {
4757 a7dd0415 Kostas Papadimitriou
        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4758 a7dd0415 Kostas Papadimitriou
        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4759 a7dd0415 Kostas Papadimitriou
}
4760 a7dd0415 Kostas Papadimitriou
4761 a7dd0415 Kostas Papadimitriou
var makeArray = function( array, results ) {
4762 a7dd0415 Kostas Papadimitriou
        array = Array.prototype.slice.call( array, 0 );
4763 a7dd0415 Kostas Papadimitriou
4764 a7dd0415 Kostas Papadimitriou
        if ( results ) {
4765 a7dd0415 Kostas Papadimitriou
                results.push.apply( results, array );
4766 a7dd0415 Kostas Papadimitriou
                return results;
4767 a7dd0415 Kostas Papadimitriou
        }
4768 a7dd0415 Kostas Papadimitriou
        
4769 a7dd0415 Kostas Papadimitriou
        return array;
4770 a7dd0415 Kostas Papadimitriou
};
4771 a7dd0415 Kostas Papadimitriou
4772 a7dd0415 Kostas Papadimitriou
// Perform a simple check to determine if the browser is capable of
4773 a7dd0415 Kostas Papadimitriou
// converting a NodeList to an array using builtin methods.
4774 a7dd0415 Kostas Papadimitriou
// Also verifies that the returned array holds DOM nodes
4775 a7dd0415 Kostas Papadimitriou
// (which is not the case in the Blackberry browser)
4776 a7dd0415 Kostas Papadimitriou
try {
4777 a7dd0415 Kostas Papadimitriou
        Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4778 a7dd0415 Kostas Papadimitriou
4779 a7dd0415 Kostas Papadimitriou
// Provide a fallback method if it does not work
4780 a7dd0415 Kostas Papadimitriou
} catch( e ) {
4781 a7dd0415 Kostas Papadimitriou
        makeArray = function( array, results ) {
4782 a7dd0415 Kostas Papadimitriou
                var i = 0,
4783 a7dd0415 Kostas Papadimitriou
                        ret = results || [];
4784 a7dd0415 Kostas Papadimitriou
4785 a7dd0415 Kostas Papadimitriou
                if ( toString.call(array) === "[object Array]" ) {
4786 a7dd0415 Kostas Papadimitriou
                        Array.prototype.push.apply( ret, array );
4787 a7dd0415 Kostas Papadimitriou
4788 a7dd0415 Kostas Papadimitriou
                } else {
4789 a7dd0415 Kostas Papadimitriou
                        if ( typeof array.length === "number" ) {
4790 a7dd0415 Kostas Papadimitriou
                                for ( var l = array.length; i < l; i++ ) {
4791 a7dd0415 Kostas Papadimitriou
                                        ret.push( array[i] );
4792 a7dd0415 Kostas Papadimitriou
                                }
4793 a7dd0415 Kostas Papadimitriou
4794 a7dd0415 Kostas Papadimitriou
                        } else {
4795 a7dd0415 Kostas Papadimitriou
                                for ( ; array[i]; i++ ) {
4796 a7dd0415 Kostas Papadimitriou
                                        ret.push( array[i] );
4797 a7dd0415 Kostas Papadimitriou
                                }
4798 a7dd0415 Kostas Papadimitriou
                        }
4799 a7dd0415 Kostas Papadimitriou
                }
4800 a7dd0415 Kostas Papadimitriou
4801 a7dd0415 Kostas Papadimitriou
                return ret;
4802 a7dd0415 Kostas Papadimitriou
        };
4803 a7dd0415 Kostas Papadimitriou
}
4804 a7dd0415 Kostas Papadimitriou
4805 a7dd0415 Kostas Papadimitriou
var sortOrder, siblingCheck;
4806 a7dd0415 Kostas Papadimitriou
4807 a7dd0415 Kostas Papadimitriou
if ( document.documentElement.compareDocumentPosition ) {
4808 a7dd0415 Kostas Papadimitriou
        sortOrder = function( a, b ) {
4809 a7dd0415 Kostas Papadimitriou
                if ( a === b ) {
4810 a7dd0415 Kostas Papadimitriou
                        hasDuplicate = true;
4811 a7dd0415 Kostas Papadimitriou
                        return 0;
4812 a7dd0415 Kostas Papadimitriou
                }
4813 a7dd0415 Kostas Papadimitriou
4814 a7dd0415 Kostas Papadimitriou
                if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4815 a7dd0415 Kostas Papadimitriou
                        return a.compareDocumentPosition ? -1 : 1;
4816 a7dd0415 Kostas Papadimitriou
                }
4817 a7dd0415 Kostas Papadimitriou
4818 a7dd0415 Kostas Papadimitriou
                return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4819 a7dd0415 Kostas Papadimitriou
        };
4820 a7dd0415 Kostas Papadimitriou
4821 a7dd0415 Kostas Papadimitriou
} else {
4822 a7dd0415 Kostas Papadimitriou
        sortOrder = function( a, b ) {
4823 a7dd0415 Kostas Papadimitriou
                // The nodes are identical, we can exit early
4824 a7dd0415 Kostas Papadimitriou
                if ( a === b ) {
4825 a7dd0415 Kostas Papadimitriou
                        hasDuplicate = true;
4826 a7dd0415 Kostas Papadimitriou
                        return 0;
4827 a7dd0415 Kostas Papadimitriou
4828 a7dd0415 Kostas Papadimitriou
                // Fallback to using sourceIndex (in IE) if it's available on both nodes
4829 a7dd0415 Kostas Papadimitriou
                } else if ( a.sourceIndex && b.sourceIndex ) {
4830 a7dd0415 Kostas Papadimitriou
                        return a.sourceIndex - b.sourceIndex;
4831 a7dd0415 Kostas Papadimitriou
                }
4832 a7dd0415 Kostas Papadimitriou
4833 a7dd0415 Kostas Papadimitriou
                var al, bl,
4834 a7dd0415 Kostas Papadimitriou
                        ap = [],
4835 a7dd0415 Kostas Papadimitriou
                        bp = [],
4836 a7dd0415 Kostas Papadimitriou
                        aup = a.parentNode,
4837 a7dd0415 Kostas Papadimitriou
                        bup = b.parentNode,
4838 a7dd0415 Kostas Papadimitriou
                        cur = aup;
4839 a7dd0415 Kostas Papadimitriou
4840 a7dd0415 Kostas Papadimitriou
                // If the nodes are siblings (or identical) we can do a quick check
4841 a7dd0415 Kostas Papadimitriou
                if ( aup === bup ) {
4842 a7dd0415 Kostas Papadimitriou
                        return siblingCheck( a, b );
4843 a7dd0415 Kostas Papadimitriou
4844 a7dd0415 Kostas Papadimitriou
                // If no parents were found then the nodes are disconnected
4845 a7dd0415 Kostas Papadimitriou
                } else if ( !aup ) {
4846 a7dd0415 Kostas Papadimitriou
                        return -1;
4847 a7dd0415 Kostas Papadimitriou
4848 a7dd0415 Kostas Papadimitriou
                } else if ( !bup ) {
4849 a7dd0415 Kostas Papadimitriou
                        return 1;
4850 a7dd0415 Kostas Papadimitriou
                }
4851 a7dd0415 Kostas Papadimitriou
4852 a7dd0415 Kostas Papadimitriou
                // Otherwise they're somewhere else in the tree so we need
4853 a7dd0415 Kostas Papadimitriou
                // to build up a full list of the parentNodes for comparison
4854 a7dd0415 Kostas Papadimitriou
                while ( cur ) {
4855 a7dd0415 Kostas Papadimitriou
                        ap.unshift( cur );
4856 a7dd0415 Kostas Papadimitriou
                        cur = cur.parentNode;
4857 a7dd0415 Kostas Papadimitriou
                }
4858 a7dd0415 Kostas Papadimitriou
4859 a7dd0415 Kostas Papadimitriou
                cur = bup;
4860 a7dd0415 Kostas Papadimitriou
4861 a7dd0415 Kostas Papadimitriou
                while ( cur ) {
4862 a7dd0415 Kostas Papadimitriou
                        bp.unshift( cur );
4863 a7dd0415 Kostas Papadimitriou
                        cur = cur.parentNode;
4864 a7dd0415 Kostas Papadimitriou
                }
4865 a7dd0415 Kostas Papadimitriou
4866 a7dd0415 Kostas Papadimitriou
                al = ap.length;
4867 a7dd0415 Kostas Papadimitriou
                bl = bp.length;
4868 a7dd0415 Kostas Papadimitriou
4869 a7dd0415 Kostas Papadimitriou
                // Start walking down the tree looking for a discrepancy
4870 a7dd0415 Kostas Papadimitriou
                for ( var i = 0; i < al && i < bl; i++ ) {
4871 a7dd0415 Kostas Papadimitriou
                        if ( ap[i] !== bp[i] ) {
4872 a7dd0415 Kostas Papadimitriou
                                return siblingCheck( ap[i], bp[i] );
4873 a7dd0415 Kostas Papadimitriou
                        }
4874 a7dd0415 Kostas Papadimitriou
                }
4875 a7dd0415 Kostas Papadimitriou
4876 a7dd0415 Kostas Papadimitriou
                // We ended someplace up the tree so do a sibling check
4877 a7dd0415 Kostas Papadimitriou
                return i === al ?
4878 a7dd0415 Kostas Papadimitriou
                        siblingCheck( a, bp[i], -1 ) :
4879 a7dd0415 Kostas Papadimitriou
                        siblingCheck( ap[i], b, 1 );
4880 a7dd0415 Kostas Papadimitriou
        };
4881 a7dd0415 Kostas Papadimitriou
4882 a7dd0415 Kostas Papadimitriou
        siblingCheck = function( a, b, ret ) {
4883 a7dd0415 Kostas Papadimitriou
                if ( a === b ) {
4884 a7dd0415 Kostas Papadimitriou
                        return ret;
4885 a7dd0415 Kostas Papadimitriou
                }
4886 a7dd0415 Kostas Papadimitriou
4887 a7dd0415 Kostas Papadimitriou
                var cur = a.nextSibling;
4888 a7dd0415 Kostas Papadimitriou
4889 a7dd0415 Kostas Papadimitriou
                while ( cur ) {
4890 a7dd0415 Kostas Papadimitriou
                        if ( cur === b ) {
4891 a7dd0415 Kostas Papadimitriou
                                return -1;
4892 a7dd0415 Kostas Papadimitriou
                        }
4893 a7dd0415 Kostas Papadimitriou
4894 a7dd0415 Kostas Papadimitriou
                        cur = cur.nextSibling;
4895 a7dd0415 Kostas Papadimitriou
                }
4896 a7dd0415 Kostas Papadimitriou
4897 a7dd0415 Kostas Papadimitriou
                return 1;
4898 a7dd0415 Kostas Papadimitriou
        };
4899 a7dd0415 Kostas Papadimitriou
}
4900 a7dd0415 Kostas Papadimitriou
4901 a7dd0415 Kostas Papadimitriou
// Check to see if the browser returns elements by name when
4902 a7dd0415 Kostas Papadimitriou
// querying by getElementById (and provide a workaround)
4903 a7dd0415 Kostas Papadimitriou
(function(){
4904 a7dd0415 Kostas Papadimitriou
        // We're going to inject a fake input element with a specified name
4905 a7dd0415 Kostas Papadimitriou
        var form = document.createElement("div"),
4906 a7dd0415 Kostas Papadimitriou
                id = "script" + (new Date()).getTime(),
4907 a7dd0415 Kostas Papadimitriou
                root = document.documentElement;
4908 a7dd0415 Kostas Papadimitriou
4909 a7dd0415 Kostas Papadimitriou
        form.innerHTML = "<a name='" + id + "'/>";
4910 a7dd0415 Kostas Papadimitriou
4911 a7dd0415 Kostas Papadimitriou
        // Inject it into the root element, check its status, and remove it quickly
4912 a7dd0415 Kostas Papadimitriou
        root.insertBefore( form, root.firstChild );
4913 a7dd0415 Kostas Papadimitriou
4914 a7dd0415 Kostas Papadimitriou
        // The workaround has to do additional checks after a getElementById
4915 a7dd0415 Kostas Papadimitriou
        // Which slows things down for other browsers (hence the branching)
4916 a7dd0415 Kostas Papadimitriou
        if ( document.getElementById( id ) ) {
4917 a7dd0415 Kostas Papadimitriou
                Expr.find.ID = function( match, context, isXML ) {
4918 a7dd0415 Kostas Papadimitriou
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
4919 a7dd0415 Kostas Papadimitriou
                                var m = context.getElementById(match[1]);
4920 a7dd0415 Kostas Papadimitriou
4921 a7dd0415 Kostas Papadimitriou
                                return m ?
4922 a7dd0415 Kostas Papadimitriou
                                        m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4923 a7dd0415 Kostas Papadimitriou
                                                [m] :
4924 a7dd0415 Kostas Papadimitriou
                                                undefined :
4925 a7dd0415 Kostas Papadimitriou
                                        [];
4926 a7dd0415 Kostas Papadimitriou
                        }
4927 a7dd0415 Kostas Papadimitriou
                };
4928 a7dd0415 Kostas Papadimitriou
4929 a7dd0415 Kostas Papadimitriou
                Expr.filter.ID = function( elem, match ) {
4930 a7dd0415 Kostas Papadimitriou
                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4931 a7dd0415 Kostas Papadimitriou
4932 a7dd0415 Kostas Papadimitriou
                        return elem.nodeType === 1 && node && node.nodeValue === match;
4933 a7dd0415 Kostas Papadimitriou
                };
4934 a7dd0415 Kostas Papadimitriou
        }
4935 a7dd0415 Kostas Papadimitriou
4936 a7dd0415 Kostas Papadimitriou
        root.removeChild( form );
4937 a7dd0415 Kostas Papadimitriou
4938 a7dd0415 Kostas Papadimitriou
        // release memory in IE
4939 a7dd0415 Kostas Papadimitriou
        root = form = null;
4940 a7dd0415 Kostas Papadimitriou
})();
4941 a7dd0415 Kostas Papadimitriou
4942 a7dd0415 Kostas Papadimitriou
(function(){
4943 a7dd0415 Kostas Papadimitriou
        // Check to see if the browser returns only elements
4944 a7dd0415 Kostas Papadimitriou
        // when doing getElementsByTagName("*")
4945 a7dd0415 Kostas Papadimitriou
4946 a7dd0415 Kostas Papadimitriou
        // Create a fake element
4947 a7dd0415 Kostas Papadimitriou
        var div = document.createElement("div");
4948 a7dd0415 Kostas Papadimitriou
        div.appendChild( document.createComment("") );
4949 a7dd0415 Kostas Papadimitriou
4950 a7dd0415 Kostas Papadimitriou
        // Make sure no comments are found
4951 a7dd0415 Kostas Papadimitriou
        if ( div.getElementsByTagName("*").length > 0 ) {
4952 a7dd0415 Kostas Papadimitriou
                Expr.find.TAG = function( match, context ) {
4953 a7dd0415 Kostas Papadimitriou
                        var results = context.getElementsByTagName( match[1] );
4954 a7dd0415 Kostas Papadimitriou
4955 a7dd0415 Kostas Papadimitriou
                        // Filter out possible comments
4956 a7dd0415 Kostas Papadimitriou
                        if ( match[1] === "*" ) {
4957 a7dd0415 Kostas Papadimitriou
                                var tmp = [];
4958 a7dd0415 Kostas Papadimitriou
4959 a7dd0415 Kostas Papadimitriou
                                for ( var i = 0; results[i]; i++ ) {
4960 a7dd0415 Kostas Papadimitriou
                                        if ( results[i].nodeType === 1 ) {
4961 a7dd0415 Kostas Papadimitriou
                                                tmp.push( results[i] );
4962 a7dd0415 Kostas Papadimitriou
                                        }
4963 a7dd0415 Kostas Papadimitriou
                                }
4964 a7dd0415 Kostas Papadimitriou
4965 a7dd0415 Kostas Papadimitriou
                                results = tmp;
4966 a7dd0415 Kostas Papadimitriou
                        }
4967 a7dd0415 Kostas Papadimitriou
4968 a7dd0415 Kostas Papadimitriou
                        return results;
4969 a7dd0415 Kostas Papadimitriou
                };
4970 a7dd0415 Kostas Papadimitriou
        }
4971 a7dd0415 Kostas Papadimitriou
4972 a7dd0415 Kostas Papadimitriou
        // Check to see if an attribute returns normalized href attributes
4973 a7dd0415 Kostas Papadimitriou
        div.innerHTML = "<a href='#'></a>";
4974 a7dd0415 Kostas Papadimitriou
4975 a7dd0415 Kostas Papadimitriou
        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4976 a7dd0415 Kostas Papadimitriou
                        div.firstChild.getAttribute("href") !== "#" ) {
4977 a7dd0415 Kostas Papadimitriou
4978 a7dd0415 Kostas Papadimitriou
                Expr.attrHandle.href = function( elem ) {
4979 a7dd0415 Kostas Papadimitriou
                        return elem.getAttribute( "href", 2 );
4980 a7dd0415 Kostas Papadimitriou
                };
4981 a7dd0415 Kostas Papadimitriou
        }
4982 a7dd0415 Kostas Papadimitriou
4983 a7dd0415 Kostas Papadimitriou
        // release memory in IE
4984 a7dd0415 Kostas Papadimitriou
        div = null;
4985 a7dd0415 Kostas Papadimitriou
})();
4986 a7dd0415 Kostas Papadimitriou
4987 a7dd0415 Kostas Papadimitriou
if ( document.querySelectorAll ) {
4988 a7dd0415 Kostas Papadimitriou
        (function(){
4989 a7dd0415 Kostas Papadimitriou
                var oldSizzle = Sizzle,
4990 a7dd0415 Kostas Papadimitriou
                        div = document.createElement("div"),
4991 a7dd0415 Kostas Papadimitriou
                        id = "__sizzle__";
4992 a7dd0415 Kostas Papadimitriou
4993 a7dd0415 Kostas Papadimitriou
                div.innerHTML = "<p class='TEST'></p>";
4994 a7dd0415 Kostas Papadimitriou
4995 a7dd0415 Kostas Papadimitriou
                // Safari can't handle uppercase or unicode characters when
4996 a7dd0415 Kostas Papadimitriou
                // in quirks mode.
4997 a7dd0415 Kostas Papadimitriou
                if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4998 a7dd0415 Kostas Papadimitriou
                        return;
4999 a7dd0415 Kostas Papadimitriou
                }
5000 a7dd0415 Kostas Papadimitriou
        
5001 a7dd0415 Kostas Papadimitriou
                Sizzle = function( query, context, extra, seed ) {
5002 a7dd0415 Kostas Papadimitriou
                        context = context || document;
5003 a7dd0415 Kostas Papadimitriou
5004 a7dd0415 Kostas Papadimitriou
                        // Only use querySelectorAll on non-XML documents
5005 a7dd0415 Kostas Papadimitriou
                        // (ID selectors don't work in non-HTML documents)
5006 a7dd0415 Kostas Papadimitriou
                        if ( !seed && !Sizzle.isXML(context) ) {
5007 a7dd0415 Kostas Papadimitriou
                                // See if we find a selector to speed up
5008 a7dd0415 Kostas Papadimitriou
                                var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
5009 a7dd0415 Kostas Papadimitriou
                                
5010 a7dd0415 Kostas Papadimitriou
                                if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
5011 a7dd0415 Kostas Papadimitriou
                                        // Speed-up: Sizzle("TAG")
5012 a7dd0415 Kostas Papadimitriou
                                        if ( match[1] ) {
5013 a7dd0415 Kostas Papadimitriou
                                                return makeArray( context.getElementsByTagName( query ), extra );
5014 a7dd0415 Kostas Papadimitriou
                                        
5015 a7dd0415 Kostas Papadimitriou
                                        // Speed-up: Sizzle(".CLASS")
5016 a7dd0415 Kostas Papadimitriou
                                        } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
5017 a7dd0415 Kostas Papadimitriou
                                                return makeArray( context.getElementsByClassName( match[2] ), extra );
5018 a7dd0415 Kostas Papadimitriou
                                        }
5019 a7dd0415 Kostas Papadimitriou
                                }
5020 a7dd0415 Kostas Papadimitriou
                                
5021 a7dd0415 Kostas Papadimitriou
                                if ( context.nodeType === 9 ) {
5022 a7dd0415 Kostas Papadimitriou
                                        // Speed-up: Sizzle("body")
5023 a7dd0415 Kostas Papadimitriou
                                        // The body element only exists once, optimize finding it
5024 a7dd0415 Kostas Papadimitriou
                                        if ( query === "body" && context.body ) {
5025 a7dd0415 Kostas Papadimitriou
                                                return makeArray( [ context.body ], extra );
5026 a7dd0415 Kostas Papadimitriou
                                                
5027 a7dd0415 Kostas Papadimitriou
                                        // Speed-up: Sizzle("#ID")
5028 a7dd0415 Kostas Papadimitriou
                                        } else if ( match && match[3] ) {
5029 a7dd0415 Kostas Papadimitriou
                                                var elem = context.getElementById( match[3] );
5030 a7dd0415 Kostas Papadimitriou
5031 a7dd0415 Kostas Papadimitriou
                                                // Check parentNode to catch when Blackberry 4.6 returns
5032 a7dd0415 Kostas Papadimitriou
                                                // nodes that are no longer in the document #6963
5033 a7dd0415 Kostas Papadimitriou
                                                if ( elem && elem.parentNode ) {
5034 a7dd0415 Kostas Papadimitriou
                                                        // Handle the case where IE and Opera return items
5035 a7dd0415 Kostas Papadimitriou
                                                        // by name instead of ID
5036 a7dd0415 Kostas Papadimitriou
                                                        if ( elem.id === match[3] ) {
5037 a7dd0415 Kostas Papadimitriou
                                                                return makeArray( [ elem ], extra );
5038 a7dd0415 Kostas Papadimitriou
                                                        }
5039 a7dd0415 Kostas Papadimitriou
                                                        
5040 a7dd0415 Kostas Papadimitriou
                                                } else {
5041 a7dd0415 Kostas Papadimitriou
                                                        return makeArray( [], extra );
5042 a7dd0415 Kostas Papadimitriou
                                                }
5043 a7dd0415 Kostas Papadimitriou
                                        }
5044 a7dd0415 Kostas Papadimitriou
                                        
5045 a7dd0415 Kostas Papadimitriou
                                        try {
5046 a7dd0415 Kostas Papadimitriou
                                                return makeArray( context.querySelectorAll(query), extra );
5047 a7dd0415 Kostas Papadimitriou
                                        } catch(qsaError) {}
5048 a7dd0415 Kostas Papadimitriou
5049 a7dd0415 Kostas Papadimitriou
                                // qSA works strangely on Element-rooted queries
5050 a7dd0415 Kostas Papadimitriou
                                // We can work around this by specifying an extra ID on the root
5051 a7dd0415 Kostas Papadimitriou
                                // and working up from there (Thanks to Andrew Dupont for the technique)
5052 a7dd0415 Kostas Papadimitriou
                                // IE 8 doesn't work on object elements
5053 a7dd0415 Kostas Papadimitriou
                                } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
5054 a7dd0415 Kostas Papadimitriou
                                        var oldContext = context,
5055 a7dd0415 Kostas Papadimitriou
                                                old = context.getAttribute( "id" ),
5056 a7dd0415 Kostas Papadimitriou
                                                nid = old || id,
5057 a7dd0415 Kostas Papadimitriou
                                                hasParent = context.parentNode,
5058 a7dd0415 Kostas Papadimitriou
                                                relativeHierarchySelector = /^\s*[+~]/.test( query );
5059 a7dd0415 Kostas Papadimitriou
5060 a7dd0415 Kostas Papadimitriou
                                        if ( !old ) {
5061 a7dd0415 Kostas Papadimitriou
                                                context.setAttribute( "id", nid );
5062 a7dd0415 Kostas Papadimitriou
                                        } else {
5063 a7dd0415 Kostas Papadimitriou
                                                nid = nid.replace( /'/g, "\\$&" );
5064 a7dd0415 Kostas Papadimitriou
                                        }
5065 a7dd0415 Kostas Papadimitriou
                                        if ( relativeHierarchySelector && hasParent ) {
5066 a7dd0415 Kostas Papadimitriou
                                                context = context.parentNode;
5067 a7dd0415 Kostas Papadimitriou
                                        }
5068 a7dd0415 Kostas Papadimitriou
5069 a7dd0415 Kostas Papadimitriou
                                        try {
5070 a7dd0415 Kostas Papadimitriou
                                                if ( !relativeHierarchySelector || hasParent ) {
5071 a7dd0415 Kostas Papadimitriou
                                                        return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
5072 a7dd0415 Kostas Papadimitriou
                                                }
5073 a7dd0415 Kostas Papadimitriou
5074 a7dd0415 Kostas Papadimitriou
                                        } catch(pseudoError) {
5075 a7dd0415 Kostas Papadimitriou
                                        } finally {
5076 a7dd0415 Kostas Papadimitriou
                                                if ( !old ) {
5077 a7dd0415 Kostas Papadimitriou
                                                        oldContext.removeAttribute( "id" );
5078 a7dd0415 Kostas Papadimitriou
                                                }
5079 a7dd0415 Kostas Papadimitriou
                                        }
5080 a7dd0415 Kostas Papadimitriou
                                }
5081 a7dd0415 Kostas Papadimitriou
                        }
5082 a7dd0415 Kostas Papadimitriou
                
5083 a7dd0415 Kostas Papadimitriou
                        return oldSizzle(query, context, extra, seed);
5084 a7dd0415 Kostas Papadimitriou
                };
5085 a7dd0415 Kostas Papadimitriou
5086 a7dd0415 Kostas Papadimitriou
                for ( var prop in oldSizzle ) {
5087 a7dd0415 Kostas Papadimitriou
                        Sizzle[ prop ] = oldSizzle[ prop ];
5088 a7dd0415 Kostas Papadimitriou
                }
5089 a7dd0415 Kostas Papadimitriou
5090 a7dd0415 Kostas Papadimitriou
                // release memory in IE
5091 a7dd0415 Kostas Papadimitriou
                div = null;
5092 a7dd0415 Kostas Papadimitriou
        })();
5093 a7dd0415 Kostas Papadimitriou
}
5094 a7dd0415 Kostas Papadimitriou
5095 a7dd0415 Kostas Papadimitriou
(function(){
5096 a7dd0415 Kostas Papadimitriou
        var html = document.documentElement,
5097 a7dd0415 Kostas Papadimitriou
                matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
5098 a7dd0415 Kostas Papadimitriou
5099 a7dd0415 Kostas Papadimitriou
        if ( matches ) {
5100 a7dd0415 Kostas Papadimitriou
                // Check to see if it's possible to do matchesSelector
5101 a7dd0415 Kostas Papadimitriou
                // on a disconnected node (IE 9 fails this)
5102 a7dd0415 Kostas Papadimitriou
                var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
5103 a7dd0415 Kostas Papadimitriou
                        pseudoWorks = false;
5104 a7dd0415 Kostas Papadimitriou
5105 a7dd0415 Kostas Papadimitriou
                try {
5106 a7dd0415 Kostas Papadimitriou
                        // This should fail with an exception
5107 a7dd0415 Kostas Papadimitriou
                        // Gecko does not error, returns false instead
5108 a7dd0415 Kostas Papadimitriou
                        matches.call( document.documentElement, "[test!='']:sizzle" );
5109 a7dd0415 Kostas Papadimitriou
        
5110 a7dd0415 Kostas Papadimitriou
                } catch( pseudoError ) {
5111 a7dd0415 Kostas Papadimitriou
                        pseudoWorks = true;
5112 a7dd0415 Kostas Papadimitriou
                }
5113 a7dd0415 Kostas Papadimitriou
5114 a7dd0415 Kostas Papadimitriou
                Sizzle.matchesSelector = function( node, expr ) {
5115 a7dd0415 Kostas Papadimitriou
                        // Make sure that attribute selectors are quoted
5116 a7dd0415 Kostas Papadimitriou
                        expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
5117 a7dd0415 Kostas Papadimitriou
5118 a7dd0415 Kostas Papadimitriou
                        if ( !Sizzle.isXML( node ) ) {
5119 a7dd0415 Kostas Papadimitriou
                                try { 
5120 a7dd0415 Kostas Papadimitriou
                                        if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
5121 a7dd0415 Kostas Papadimitriou
                                                var ret = matches.call( node, expr );
5122 a7dd0415 Kostas Papadimitriou
5123 a7dd0415 Kostas Papadimitriou
                                                // IE 9's matchesSelector returns false on disconnected nodes
5124 a7dd0415 Kostas Papadimitriou
                                                if ( ret || !disconnectedMatch ||
5125 a7dd0415 Kostas Papadimitriou
                                                                // As well, disconnected nodes are said to be in a document
5126 a7dd0415 Kostas Papadimitriou
                                                                // fragment in IE 9, so check for that
5127 a7dd0415 Kostas Papadimitriou
                                                                node.document && node.document.nodeType !== 11 ) {
5128 a7dd0415 Kostas Papadimitriou
                                                        return ret;
5129 a7dd0415 Kostas Papadimitriou
                                                }
5130 a7dd0415 Kostas Papadimitriou
                                        }
5131 a7dd0415 Kostas Papadimitriou
                                } catch(e) {}
5132 a7dd0415 Kostas Papadimitriou
                        }
5133 a7dd0415 Kostas Papadimitriou
5134 a7dd0415 Kostas Papadimitriou
                        return Sizzle(expr, null, null, [node]).length > 0;
5135 a7dd0415 Kostas Papadimitriou
                };
5136 a7dd0415 Kostas Papadimitriou
        }
5137 a7dd0415 Kostas Papadimitriou
})();
5138 a7dd0415 Kostas Papadimitriou
5139 a7dd0415 Kostas Papadimitriou
(function(){
5140 a7dd0415 Kostas Papadimitriou
        var div = document.createElement("div");
5141 a7dd0415 Kostas Papadimitriou
5142 a7dd0415 Kostas Papadimitriou
        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
5143 a7dd0415 Kostas Papadimitriou
5144 a7dd0415 Kostas Papadimitriou
        // Opera can't find a second classname (in 9.6)
5145 a7dd0415 Kostas Papadimitriou
        // Also, make sure that getElementsByClassName actually exists
5146 a7dd0415 Kostas Papadimitriou
        if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
5147 a7dd0415 Kostas Papadimitriou
                return;
5148 a7dd0415 Kostas Papadimitriou
        }
5149 a7dd0415 Kostas Papadimitriou
5150 a7dd0415 Kostas Papadimitriou
        // Safari caches class attributes, doesn't catch changes (in 3.2)
5151 a7dd0415 Kostas Papadimitriou
        div.lastChild.className = "e";
5152 a7dd0415 Kostas Papadimitriou
5153 a7dd0415 Kostas Papadimitriou
        if ( div.getElementsByClassName("e").length === 1 ) {
5154 a7dd0415 Kostas Papadimitriou
                return;
5155 a7dd0415 Kostas Papadimitriou
        }
5156 a7dd0415 Kostas Papadimitriou
        
5157 a7dd0415 Kostas Papadimitriou
        Expr.order.splice(1, 0, "CLASS");
5158 a7dd0415 Kostas Papadimitriou
        Expr.find.CLASS = function( match, context, isXML ) {
5159 a7dd0415 Kostas Papadimitriou
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
5160 a7dd0415 Kostas Papadimitriou
                        return context.getElementsByClassName(match[1]);
5161 a7dd0415 Kostas Papadimitriou
                }
5162 a7dd0415 Kostas Papadimitriou
        };
5163 a7dd0415 Kostas Papadimitriou
5164 a7dd0415 Kostas Papadimitriou
        // release memory in IE
5165 a7dd0415 Kostas Papadimitriou
        div = null;
5166 a7dd0415 Kostas Papadimitriou
})();
5167 a7dd0415 Kostas Papadimitriou
5168 a7dd0415 Kostas Papadimitriou
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5169 a7dd0415 Kostas Papadimitriou
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5170 a7dd0415 Kostas Papadimitriou
                var elem = checkSet[i];
5171 a7dd0415 Kostas Papadimitriou
5172 a7dd0415 Kostas Papadimitriou
                if ( elem ) {
5173 a7dd0415 Kostas Papadimitriou
                        var match = false;
5174 a7dd0415 Kostas Papadimitriou
5175 a7dd0415 Kostas Papadimitriou
                        elem = elem[dir];
5176 a7dd0415 Kostas Papadimitriou
5177 a7dd0415 Kostas Papadimitriou
                        while ( elem ) {
5178 a7dd0415 Kostas Papadimitriou
                                if ( elem[ expando ] === doneName ) {
5179 a7dd0415 Kostas Papadimitriou
                                        match = checkSet[elem.sizset];
5180 a7dd0415 Kostas Papadimitriou
                                        break;
5181 a7dd0415 Kostas Papadimitriou
                                }
5182 a7dd0415 Kostas Papadimitriou
5183 a7dd0415 Kostas Papadimitriou
                                if ( elem.nodeType === 1 && !isXML ){
5184 a7dd0415 Kostas Papadimitriou
                                        elem[ expando ] = doneName;
5185 a7dd0415 Kostas Papadimitriou
                                        elem.sizset = i;
5186 a7dd0415 Kostas Papadimitriou
                                }
5187 a7dd0415 Kostas Papadimitriou
5188 a7dd0415 Kostas Papadimitriou
                                if ( elem.nodeName.toLowerCase() === cur ) {
5189 a7dd0415 Kostas Papadimitriou
                                        match = elem;
5190 a7dd0415 Kostas Papadimitriou
                                        break;
5191 a7dd0415 Kostas Papadimitriou
                                }
5192 a7dd0415 Kostas Papadimitriou
5193 a7dd0415 Kostas Papadimitriou
                                elem = elem[dir];
5194 a7dd0415 Kostas Papadimitriou
                        }
5195 a7dd0415 Kostas Papadimitriou
5196 a7dd0415 Kostas Papadimitriou
                        checkSet[i] = match;
5197 a7dd0415 Kostas Papadimitriou
                }
5198 a7dd0415 Kostas Papadimitriou
        }
5199 a7dd0415 Kostas Papadimitriou
}
5200 a7dd0415 Kostas Papadimitriou
5201 a7dd0415 Kostas Papadimitriou
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5202 a7dd0415 Kostas Papadimitriou
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5203 a7dd0415 Kostas Papadimitriou
                var elem = checkSet[i];
5204 a7dd0415 Kostas Papadimitriou
5205 a7dd0415 Kostas Papadimitriou
                if ( elem ) {
5206 a7dd0415 Kostas Papadimitriou
                        var match = false;
5207 a7dd0415 Kostas Papadimitriou
                        
5208 a7dd0415 Kostas Papadimitriou
                        elem = elem[dir];
5209 a7dd0415 Kostas Papadimitriou
5210 a7dd0415 Kostas Papadimitriou
                        while ( elem ) {
5211 a7dd0415 Kostas Papadimitriou
                                if ( elem[ expando ] === doneName ) {
5212 a7dd0415 Kostas Papadimitriou
                                        match = checkSet[elem.sizset];
5213 a7dd0415 Kostas Papadimitriou
                                        break;
5214 a7dd0415 Kostas Papadimitriou
                                }
5215 a7dd0415 Kostas Papadimitriou
5216 a7dd0415 Kostas Papadimitriou
                                if ( elem.nodeType === 1 ) {
5217 a7dd0415 Kostas Papadimitriou
                                        if ( !isXML ) {
5218 a7dd0415 Kostas Papadimitriou
                                                elem[ expando ] = doneName;
5219 a7dd0415 Kostas Papadimitriou
                                                elem.sizset = i;
5220 a7dd0415 Kostas Papadimitriou
                                        }
5221 a7dd0415 Kostas Papadimitriou
5222 a7dd0415 Kostas Papadimitriou
                                        if ( typeof cur !== "string" ) {
5223 a7dd0415 Kostas Papadimitriou
                                                if ( elem === cur ) {
5224 a7dd0415 Kostas Papadimitriou
                                                        match = true;
5225 a7dd0415 Kostas Papadimitriou
                                                        break;
5226 a7dd0415 Kostas Papadimitriou
                                                }
5227 a7dd0415 Kostas Papadimitriou
5228 a7dd0415 Kostas Papadimitriou
                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
5229 a7dd0415 Kostas Papadimitriou
                                                match = elem;
5230 a7dd0415 Kostas Papadimitriou
                                                break;
5231 a7dd0415 Kostas Papadimitriou
                                        }
5232 a7dd0415 Kostas Papadimitriou
                                }
5233 a7dd0415 Kostas Papadimitriou
5234 a7dd0415 Kostas Papadimitriou
                                elem = elem[dir];
5235 a7dd0415 Kostas Papadimitriou
                        }
5236 a7dd0415 Kostas Papadimitriou
5237 a7dd0415 Kostas Papadimitriou
                        checkSet[i] = match;
5238 a7dd0415 Kostas Papadimitriou
                }
5239 a7dd0415 Kostas Papadimitriou
        }
5240 a7dd0415 Kostas Papadimitriou
}
5241 a7dd0415 Kostas Papadimitriou
5242 a7dd0415 Kostas Papadimitriou
if ( document.documentElement.contains ) {
5243 a7dd0415 Kostas Papadimitriou
        Sizzle.contains = function( a, b ) {
5244 a7dd0415 Kostas Papadimitriou
                return a !== b && (a.contains ? a.contains(b) : true);
5245 a7dd0415 Kostas Papadimitriou
        };
5246 a7dd0415 Kostas Papadimitriou
5247 a7dd0415 Kostas Papadimitriou
} else if ( document.documentElement.compareDocumentPosition ) {
5248 a7dd0415 Kostas Papadimitriou
        Sizzle.contains = function( a, b ) {
5249 a7dd0415 Kostas Papadimitriou
                return !!(a.compareDocumentPosition(b) & 16);
5250 a7dd0415 Kostas Papadimitriou
        };
5251 a7dd0415 Kostas Papadimitriou
5252 a7dd0415 Kostas Papadimitriou
} else {
5253 a7dd0415 Kostas Papadimitriou
        Sizzle.contains = function() {
5254 a7dd0415 Kostas Papadimitriou
                return false;
5255 a7dd0415 Kostas Papadimitriou
        };
5256 a7dd0415 Kostas Papadimitriou
}
5257 a7dd0415 Kostas Papadimitriou
5258 a7dd0415 Kostas Papadimitriou
Sizzle.isXML = function( elem ) {
5259 a7dd0415 Kostas Papadimitriou
        // documentElement is verified for cases where it doesn't yet exist
5260 a7dd0415 Kostas Papadimitriou
        // (such as loading iframes in IE - #4833) 
5261 a7dd0415 Kostas Papadimitriou
        var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
5262 a7dd0415 Kostas Papadimitriou
5263 a7dd0415 Kostas Papadimitriou
        return documentElement ? documentElement.nodeName !== "HTML" : false;
5264 a7dd0415 Kostas Papadimitriou
};
5265 a7dd0415 Kostas Papadimitriou
5266 a7dd0415 Kostas Papadimitriou
var posProcess = function( selector, context, seed ) {
5267 a7dd0415 Kostas Papadimitriou
        var match,
5268 a7dd0415 Kostas Papadimitriou
                tmpSet = [],
5269 a7dd0415 Kostas Papadimitriou
                later = "",
5270 a7dd0415 Kostas Papadimitriou
                root = context.nodeType ? [context] : context;
5271 a7dd0415 Kostas Papadimitriou
5272 a7dd0415 Kostas Papadimitriou
        // Position selectors must be done after the filter
5273 a7dd0415 Kostas Papadimitriou
        // And so must :not(positional) so we move all PSEUDOs to the end
5274 a7dd0415 Kostas Papadimitriou
        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
5275 a7dd0415 Kostas Papadimitriou
                later += match[0];
5276 a7dd0415 Kostas Papadimitriou
                selector = selector.replace( Expr.match.PSEUDO, "" );
5277 a7dd0415 Kostas Papadimitriou
        }
5278 a7dd0415 Kostas Papadimitriou
5279 a7dd0415 Kostas Papadimitriou
        selector = Expr.relative[selector] ? selector + "*" : selector;
5280 a7dd0415 Kostas Papadimitriou
5281 a7dd0415 Kostas Papadimitriou
        for ( var i = 0, l = root.length; i < l; i++ ) {
5282 a7dd0415 Kostas Papadimitriou
                Sizzle( selector, root[i], tmpSet, seed );
5283 a7dd0415 Kostas Papadimitriou
        }
5284 a7dd0415 Kostas Papadimitriou
5285 a7dd0415 Kostas Papadimitriou
        return Sizzle.filter( later, tmpSet );
5286 a7dd0415 Kostas Papadimitriou
};
5287 a7dd0415 Kostas Papadimitriou
5288 a7dd0415 Kostas Papadimitriou
// EXPOSE
5289 a7dd0415 Kostas Papadimitriou
// Override sizzle attribute retrieval
5290 a7dd0415 Kostas Papadimitriou
Sizzle.attr = jQuery.attr;
5291 a7dd0415 Kostas Papadimitriou
Sizzle.selectors.attrMap = {};
5292 a7dd0415 Kostas Papadimitriou
jQuery.find = Sizzle;
5293 a7dd0415 Kostas Papadimitriou
jQuery.expr = Sizzle.selectors;
5294 a7dd0415 Kostas Papadimitriou
jQuery.expr[":"] = jQuery.expr.filters;
5295 a7dd0415 Kostas Papadimitriou
jQuery.unique = Sizzle.uniqueSort;
5296 a7dd0415 Kostas Papadimitriou
jQuery.text = Sizzle.getText;
5297 a7dd0415 Kostas Papadimitriou
jQuery.isXMLDoc = Sizzle.isXML;
5298 a7dd0415 Kostas Papadimitriou
jQuery.contains = Sizzle.contains;
5299 a7dd0415 Kostas Papadimitriou
5300 a7dd0415 Kostas Papadimitriou
5301 a7dd0415 Kostas Papadimitriou
})();
5302 a7dd0415 Kostas Papadimitriou
5303 a7dd0415 Kostas Papadimitriou
5304 a7dd0415 Kostas Papadimitriou
var runtil = /Until$/,
5305 a7dd0415 Kostas Papadimitriou
        rparentsprev = /^(?:parents|prevUntil|prevAll)/,
5306 a7dd0415 Kostas Papadimitriou
        // Note: This RegExp should be improved, or likely pulled from Sizzle
5307 a7dd0415 Kostas Papadimitriou
        rmultiselector = /,/,
5308 a7dd0415 Kostas Papadimitriou
        isSimple = /^.[^:#\[\.,]*$/,
5309 a7dd0415 Kostas Papadimitriou
        slice = Array.prototype.slice,
5310 a7dd0415 Kostas Papadimitriou
        POS = jQuery.expr.match.POS,
5311 a7dd0415 Kostas Papadimitriou
        // methods guaranteed to produce a unique set when starting from a unique set
5312 a7dd0415 Kostas Papadimitriou
        guaranteedUnique = {
5313 a7dd0415 Kostas Papadimitriou
                children: true,
5314 a7dd0415 Kostas Papadimitriou
                contents: true,
5315 a7dd0415 Kostas Papadimitriou
                next: true,
5316 a7dd0415 Kostas Papadimitriou
                prev: true
5317 a7dd0415 Kostas Papadimitriou
        };
5318 a7dd0415 Kostas Papadimitriou
5319 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
5320 a7dd0415 Kostas Papadimitriou
        find: function( selector ) {
5321 a7dd0415 Kostas Papadimitriou
                var self = this,
5322 a7dd0415 Kostas Papadimitriou
                        i, l;
5323 a7dd0415 Kostas Papadimitriou
5324 a7dd0415 Kostas Papadimitriou
                if ( typeof selector !== "string" ) {
5325 a7dd0415 Kostas Papadimitriou
                        return jQuery( selector ).filter(function() {
5326 a7dd0415 Kostas Papadimitriou
                                for ( i = 0, l = self.length; i < l; i++ ) {
5327 a7dd0415 Kostas Papadimitriou
                                        if ( jQuery.contains( self[ i ], this ) ) {
5328 a7dd0415 Kostas Papadimitriou
                                                return true;
5329 a7dd0415 Kostas Papadimitriou
                                        }
5330 a7dd0415 Kostas Papadimitriou
                                }
5331 a7dd0415 Kostas Papadimitriou
                        });
5332 a7dd0415 Kostas Papadimitriou
                }
5333 a7dd0415 Kostas Papadimitriou
5334 a7dd0415 Kostas Papadimitriou
                var ret = this.pushStack( "", "find", selector ),
5335 a7dd0415 Kostas Papadimitriou
                        length, n, r;
5336 a7dd0415 Kostas Papadimitriou
5337 a7dd0415 Kostas Papadimitriou
                for ( i = 0, l = this.length; i < l; i++ ) {
5338 a7dd0415 Kostas Papadimitriou
                        length = ret.length;
5339 a7dd0415 Kostas Papadimitriou
                        jQuery.find( selector, this[i], ret );
5340 a7dd0415 Kostas Papadimitriou
5341 a7dd0415 Kostas Papadimitriou
                        if ( i > 0 ) {
5342 a7dd0415 Kostas Papadimitriou
                                // Make sure that the results are unique
5343 a7dd0415 Kostas Papadimitriou
                                for ( n = length; n < ret.length; n++ ) {
5344 a7dd0415 Kostas Papadimitriou
                                        for ( r = 0; r < length; r++ ) {
5345 a7dd0415 Kostas Papadimitriou
                                                if ( ret[r] === ret[n] ) {
5346 a7dd0415 Kostas Papadimitriou
                                                        ret.splice(n--, 1);
5347 a7dd0415 Kostas Papadimitriou
                                                        break;
5348 a7dd0415 Kostas Papadimitriou
                                                }
5349 a7dd0415 Kostas Papadimitriou
                                        }
5350 a7dd0415 Kostas Papadimitriou
                                }
5351 a7dd0415 Kostas Papadimitriou
                        }
5352 a7dd0415 Kostas Papadimitriou
                }
5353 a7dd0415 Kostas Papadimitriou
5354 a7dd0415 Kostas Papadimitriou
                return ret;
5355 a7dd0415 Kostas Papadimitriou
        },
5356 a7dd0415 Kostas Papadimitriou
5357 a7dd0415 Kostas Papadimitriou
        has: function( target ) {
5358 a7dd0415 Kostas Papadimitriou
                var targets = jQuery( target );
5359 a7dd0415 Kostas Papadimitriou
                return this.filter(function() {
5360 a7dd0415 Kostas Papadimitriou
                        for ( var i = 0, l = targets.length; i < l; i++ ) {
5361 a7dd0415 Kostas Papadimitriou
                                if ( jQuery.contains( this, targets[i] ) ) {
5362 a7dd0415 Kostas Papadimitriou
                                        return true;
5363 a7dd0415 Kostas Papadimitriou
                                }
5364 a7dd0415 Kostas Papadimitriou
                        }
5365 a7dd0415 Kostas Papadimitriou
                });
5366 a7dd0415 Kostas Papadimitriou
        },
5367 a7dd0415 Kostas Papadimitriou
5368 a7dd0415 Kostas Papadimitriou
        not: function( selector ) {
5369 a7dd0415 Kostas Papadimitriou
                return this.pushStack( winnow(this, selector, false), "not", selector);
5370 a7dd0415 Kostas Papadimitriou
        },
5371 a7dd0415 Kostas Papadimitriou
5372 a7dd0415 Kostas Papadimitriou
        filter: function( selector ) {
5373 a7dd0415 Kostas Papadimitriou
                return this.pushStack( winnow(this, selector, true), "filter", selector );
5374 a7dd0415 Kostas Papadimitriou
        },
5375 a7dd0415 Kostas Papadimitriou
5376 a7dd0415 Kostas Papadimitriou
        is: function( selector ) {
5377 a7dd0415 Kostas Papadimitriou
                return !!selector && ( 
5378 a7dd0415 Kostas Papadimitriou
                        typeof selector === "string" ?
5379 a7dd0415 Kostas Papadimitriou
                                // If this is a positional selector, check membership in the returned set
5380 a7dd0415 Kostas Papadimitriou
                                // so $("p:first").is("p:last") won't return true for a doc with two "p".
5381 a7dd0415 Kostas Papadimitriou
                                POS.test( selector ) ? 
5382 a7dd0415 Kostas Papadimitriou
                                        jQuery( selector, this.context ).index( this[0] ) >= 0 :
5383 a7dd0415 Kostas Papadimitriou
                                        jQuery.filter( selector, this ).length > 0 :
5384 a7dd0415 Kostas Papadimitriou
                                this.filter( selector ).length > 0 );
5385 a7dd0415 Kostas Papadimitriou
        },
5386 a7dd0415 Kostas Papadimitriou
5387 a7dd0415 Kostas Papadimitriou
        closest: function( selectors, context ) {
5388 a7dd0415 Kostas Papadimitriou
                var ret = [], i, l, cur = this[0];
5389 a7dd0415 Kostas Papadimitriou
                
5390 a7dd0415 Kostas Papadimitriou
                // Array (deprecated as of jQuery 1.7)
5391 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isArray( selectors ) ) {
5392 a7dd0415 Kostas Papadimitriou
                        var level = 1;
5393 a7dd0415 Kostas Papadimitriou
5394 a7dd0415 Kostas Papadimitriou
                        while ( cur && cur.ownerDocument && cur !== context ) {
5395 a7dd0415 Kostas Papadimitriou
                                for ( i = 0; i < selectors.length; i++ ) {
5396 a7dd0415 Kostas Papadimitriou
5397 a7dd0415 Kostas Papadimitriou
                                        if ( jQuery( cur ).is( selectors[ i ] ) ) {
5398 a7dd0415 Kostas Papadimitriou
                                                ret.push({ selector: selectors[ i ], elem: cur, level: level });
5399 a7dd0415 Kostas Papadimitriou
                                        }
5400 a7dd0415 Kostas Papadimitriou
                                }
5401 a7dd0415 Kostas Papadimitriou
5402 a7dd0415 Kostas Papadimitriou
                                cur = cur.parentNode;
5403 a7dd0415 Kostas Papadimitriou
                                level++;
5404 a7dd0415 Kostas Papadimitriou
                        }
5405 a7dd0415 Kostas Papadimitriou
5406 a7dd0415 Kostas Papadimitriou
                        return ret;
5407 a7dd0415 Kostas Papadimitriou
                }
5408 a7dd0415 Kostas Papadimitriou
5409 a7dd0415 Kostas Papadimitriou
                // String
5410 a7dd0415 Kostas Papadimitriou
                var pos = POS.test( selectors ) || typeof selectors !== "string" ?
5411 a7dd0415 Kostas Papadimitriou
                                jQuery( selectors, context || this.context ) :
5412 a7dd0415 Kostas Papadimitriou
                                0;
5413 a7dd0415 Kostas Papadimitriou
5414 a7dd0415 Kostas Papadimitriou
                for ( i = 0, l = this.length; i < l; i++ ) {
5415 a7dd0415 Kostas Papadimitriou
                        cur = this[i];
5416 a7dd0415 Kostas Papadimitriou
5417 a7dd0415 Kostas Papadimitriou
                        while ( cur ) {
5418 a7dd0415 Kostas Papadimitriou
                                if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5419 a7dd0415 Kostas Papadimitriou
                                        ret.push( cur );
5420 a7dd0415 Kostas Papadimitriou
                                        break;
5421 a7dd0415 Kostas Papadimitriou
5422 a7dd0415 Kostas Papadimitriou
                                } else {
5423 a7dd0415 Kostas Papadimitriou
                                        cur = cur.parentNode;
5424 a7dd0415 Kostas Papadimitriou
                                        if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
5425 a7dd0415 Kostas Papadimitriou
                                                break;
5426 a7dd0415 Kostas Papadimitriou
                                        }
5427 a7dd0415 Kostas Papadimitriou
                                }
5428 a7dd0415 Kostas Papadimitriou
                        }
5429 a7dd0415 Kostas Papadimitriou
                }
5430 a7dd0415 Kostas Papadimitriou
5431 a7dd0415 Kostas Papadimitriou
                ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
5432 a7dd0415 Kostas Papadimitriou
5433 a7dd0415 Kostas Papadimitriou
                return this.pushStack( ret, "closest", selectors );
5434 a7dd0415 Kostas Papadimitriou
        },
5435 a7dd0415 Kostas Papadimitriou
5436 a7dd0415 Kostas Papadimitriou
        // Determine the position of an element within
5437 a7dd0415 Kostas Papadimitriou
        // the matched set of elements
5438 a7dd0415 Kostas Papadimitriou
        index: function( elem ) {
5439 a7dd0415 Kostas Papadimitriou
5440 a7dd0415 Kostas Papadimitriou
                // No argument, return index in parent
5441 a7dd0415 Kostas Papadimitriou
                if ( !elem ) {
5442 a7dd0415 Kostas Papadimitriou
                        return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
5443 a7dd0415 Kostas Papadimitriou
                }
5444 a7dd0415 Kostas Papadimitriou
5445 a7dd0415 Kostas Papadimitriou
                // index in selector
5446 a7dd0415 Kostas Papadimitriou
                if ( typeof elem === "string" ) {
5447 a7dd0415 Kostas Papadimitriou
                        return jQuery.inArray( this[0], jQuery( elem ) );
5448 a7dd0415 Kostas Papadimitriou
                }
5449 a7dd0415 Kostas Papadimitriou
5450 a7dd0415 Kostas Papadimitriou
                // Locate the position of the desired element
5451 a7dd0415 Kostas Papadimitriou
                return jQuery.inArray(
5452 a7dd0415 Kostas Papadimitriou
                        // If it receives a jQuery object, the first element is used
5453 a7dd0415 Kostas Papadimitriou
                        elem.jquery ? elem[0] : elem, this );
5454 a7dd0415 Kostas Papadimitriou
        },
5455 a7dd0415 Kostas Papadimitriou
5456 a7dd0415 Kostas Papadimitriou
        add: function( selector, context ) {
5457 a7dd0415 Kostas Papadimitriou
                var set = typeof selector === "string" ?
5458 a7dd0415 Kostas Papadimitriou
                                jQuery( selector, context ) :
5459 a7dd0415 Kostas Papadimitriou
                                jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5460 a7dd0415 Kostas Papadimitriou
                        all = jQuery.merge( this.get(), set );
5461 a7dd0415 Kostas Papadimitriou
5462 a7dd0415 Kostas Papadimitriou
                return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
5463 a7dd0415 Kostas Papadimitriou
                        all :
5464 a7dd0415 Kostas Papadimitriou
                        jQuery.unique( all ) );
5465 a7dd0415 Kostas Papadimitriou
        },
5466 a7dd0415 Kostas Papadimitriou
5467 a7dd0415 Kostas Papadimitriou
        andSelf: function() {
5468 a7dd0415 Kostas Papadimitriou
                return this.add( this.prevObject );
5469 a7dd0415 Kostas Papadimitriou
        }
5470 a7dd0415 Kostas Papadimitriou
});
5471 a7dd0415 Kostas Papadimitriou
5472 a7dd0415 Kostas Papadimitriou
// A painfully simple check to see if an element is disconnected
5473 a7dd0415 Kostas Papadimitriou
// from a document (should be improved, where feasible).
5474 a7dd0415 Kostas Papadimitriou
function isDisconnected( node ) {
5475 a7dd0415 Kostas Papadimitriou
        return !node || !node.parentNode || node.parentNode.nodeType === 11;
5476 a7dd0415 Kostas Papadimitriou
}
5477 a7dd0415 Kostas Papadimitriou
5478 a7dd0415 Kostas Papadimitriou
jQuery.each({
5479 a7dd0415 Kostas Papadimitriou
        parent: function( elem ) {
5480 a7dd0415 Kostas Papadimitriou
                var parent = elem.parentNode;
5481 a7dd0415 Kostas Papadimitriou
                return parent && parent.nodeType !== 11 ? parent : null;
5482 a7dd0415 Kostas Papadimitriou
        },
5483 a7dd0415 Kostas Papadimitriou
        parents: function( elem ) {
5484 a7dd0415 Kostas Papadimitriou
                return jQuery.dir( elem, "parentNode" );
5485 a7dd0415 Kostas Papadimitriou
        },
5486 a7dd0415 Kostas Papadimitriou
        parentsUntil: function( elem, i, until ) {
5487 a7dd0415 Kostas Papadimitriou
                return jQuery.dir( elem, "parentNode", until );
5488 a7dd0415 Kostas Papadimitriou
        },
5489 a7dd0415 Kostas Papadimitriou
        next: function( elem ) {
5490 a7dd0415 Kostas Papadimitriou
                return jQuery.nth( elem, 2, "nextSibling" );
5491 a7dd0415 Kostas Papadimitriou
        },
5492 a7dd0415 Kostas Papadimitriou
        prev: function( elem ) {
5493 a7dd0415 Kostas Papadimitriou
                return jQuery.nth( elem, 2, "previousSibling" );
5494 a7dd0415 Kostas Papadimitriou
        },
5495 a7dd0415 Kostas Papadimitriou
        nextAll: function( elem ) {
5496 a7dd0415 Kostas Papadimitriou
                return jQuery.dir( elem, "nextSibling" );
5497 a7dd0415 Kostas Papadimitriou
        },
5498 a7dd0415 Kostas Papadimitriou
        prevAll: function( elem ) {
5499 a7dd0415 Kostas Papadimitriou
                return jQuery.dir( elem, "previousSibling" );
5500 a7dd0415 Kostas Papadimitriou
        },
5501 a7dd0415 Kostas Papadimitriou
        nextUntil: function( elem, i, until ) {
5502 a7dd0415 Kostas Papadimitriou
                return jQuery.dir( elem, "nextSibling", until );
5503 a7dd0415 Kostas Papadimitriou
        },
5504 a7dd0415 Kostas Papadimitriou
        prevUntil: function( elem, i, until ) {
5505 a7dd0415 Kostas Papadimitriou
                return jQuery.dir( elem, "previousSibling", until );
5506 a7dd0415 Kostas Papadimitriou
        },
5507 a7dd0415 Kostas Papadimitriou
        siblings: function( elem ) {
5508 a7dd0415 Kostas Papadimitriou
                return jQuery.sibling( elem.parentNode.firstChild, elem );
5509 a7dd0415 Kostas Papadimitriou
        },
5510 a7dd0415 Kostas Papadimitriou
        children: function( elem ) {
5511 a7dd0415 Kostas Papadimitriou
                return jQuery.sibling( elem.firstChild );
5512 a7dd0415 Kostas Papadimitriou
        },
5513 a7dd0415 Kostas Papadimitriou
        contents: function( elem ) {
5514 a7dd0415 Kostas Papadimitriou
                return jQuery.nodeName( elem, "iframe" ) ?
5515 a7dd0415 Kostas Papadimitriou
                        elem.contentDocument || elem.contentWindow.document :
5516 a7dd0415 Kostas Papadimitriou
                        jQuery.makeArray( elem.childNodes );
5517 a7dd0415 Kostas Papadimitriou
        }
5518 a7dd0415 Kostas Papadimitriou
}, function( name, fn ) {
5519 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ name ] = function( until, selector ) {
5520 a7dd0415 Kostas Papadimitriou
                var ret = jQuery.map( this, fn, until );
5521 a7dd0415 Kostas Papadimitriou
5522 a7dd0415 Kostas Papadimitriou
                if ( !runtil.test( name ) ) {
5523 a7dd0415 Kostas Papadimitriou
                        selector = until;
5524 a7dd0415 Kostas Papadimitriou
                }
5525 a7dd0415 Kostas Papadimitriou
5526 a7dd0415 Kostas Papadimitriou
                if ( selector && typeof selector === "string" ) {
5527 a7dd0415 Kostas Papadimitriou
                        ret = jQuery.filter( selector, ret );
5528 a7dd0415 Kostas Papadimitriou
                }
5529 a7dd0415 Kostas Papadimitriou
5530 a7dd0415 Kostas Papadimitriou
                ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5531 a7dd0415 Kostas Papadimitriou
5532 a7dd0415 Kostas Papadimitriou
                if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
5533 a7dd0415 Kostas Papadimitriou
                        ret = ret.reverse();
5534 a7dd0415 Kostas Papadimitriou
                }
5535 a7dd0415 Kostas Papadimitriou
5536 a7dd0415 Kostas Papadimitriou
                return this.pushStack( ret, name, slice.call( arguments ).join(",") );
5537 a7dd0415 Kostas Papadimitriou
        };
5538 a7dd0415 Kostas Papadimitriou
});
5539 a7dd0415 Kostas Papadimitriou
5540 a7dd0415 Kostas Papadimitriou
jQuery.extend({
5541 a7dd0415 Kostas Papadimitriou
        filter: function( expr, elems, not ) {
5542 a7dd0415 Kostas Papadimitriou
                if ( not ) {
5543 a7dd0415 Kostas Papadimitriou
                        expr = ":not(" + expr + ")";
5544 a7dd0415 Kostas Papadimitriou
                }
5545 a7dd0415 Kostas Papadimitriou
5546 a7dd0415 Kostas Papadimitriou
                return elems.length === 1 ?
5547 a7dd0415 Kostas Papadimitriou
                        jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5548 a7dd0415 Kostas Papadimitriou
                        jQuery.find.matches(expr, elems);
5549 a7dd0415 Kostas Papadimitriou
        },
5550 a7dd0415 Kostas Papadimitriou
5551 a7dd0415 Kostas Papadimitriou
        dir: function( elem, dir, until ) {
5552 a7dd0415 Kostas Papadimitriou
                var matched = [],
5553 a7dd0415 Kostas Papadimitriou
                        cur = elem[ dir ];
5554 a7dd0415 Kostas Papadimitriou
5555 a7dd0415 Kostas Papadimitriou
                while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5556 a7dd0415 Kostas Papadimitriou
                        if ( cur.nodeType === 1 ) {
5557 a7dd0415 Kostas Papadimitriou
                                matched.push( cur );
5558 a7dd0415 Kostas Papadimitriou
                        }
5559 a7dd0415 Kostas Papadimitriou
                        cur = cur[dir];
5560 a7dd0415 Kostas Papadimitriou
                }
5561 a7dd0415 Kostas Papadimitriou
                return matched;
5562 a7dd0415 Kostas Papadimitriou
        },
5563 a7dd0415 Kostas Papadimitriou
5564 a7dd0415 Kostas Papadimitriou
        nth: function( cur, result, dir, elem ) {
5565 a7dd0415 Kostas Papadimitriou
                result = result || 1;
5566 a7dd0415 Kostas Papadimitriou
                var num = 0;
5567 a7dd0415 Kostas Papadimitriou
5568 a7dd0415 Kostas Papadimitriou
                for ( ; cur; cur = cur[dir] ) {
5569 a7dd0415 Kostas Papadimitriou
                        if ( cur.nodeType === 1 && ++num === result ) {
5570 a7dd0415 Kostas Papadimitriou
                                break;
5571 a7dd0415 Kostas Papadimitriou
                        }
5572 a7dd0415 Kostas Papadimitriou
                }
5573 a7dd0415 Kostas Papadimitriou
5574 a7dd0415 Kostas Papadimitriou
                return cur;
5575 a7dd0415 Kostas Papadimitriou
        },
5576 a7dd0415 Kostas Papadimitriou
5577 a7dd0415 Kostas Papadimitriou
        sibling: function( n, elem ) {
5578 a7dd0415 Kostas Papadimitriou
                var r = [];
5579 a7dd0415 Kostas Papadimitriou
5580 a7dd0415 Kostas Papadimitriou
                for ( ; n; n = n.nextSibling ) {
5581 a7dd0415 Kostas Papadimitriou
                        if ( n.nodeType === 1 && n !== elem ) {
5582 a7dd0415 Kostas Papadimitriou
                                r.push( n );
5583 a7dd0415 Kostas Papadimitriou
                        }
5584 a7dd0415 Kostas Papadimitriou
                }
5585 a7dd0415 Kostas Papadimitriou
5586 a7dd0415 Kostas Papadimitriou
                return r;
5587 a7dd0415 Kostas Papadimitriou
        }
5588 a7dd0415 Kostas Papadimitriou
});
5589 a7dd0415 Kostas Papadimitriou
5590 a7dd0415 Kostas Papadimitriou
// Implement the identical functionality for filter and not
5591 a7dd0415 Kostas Papadimitriou
function winnow( elements, qualifier, keep ) {
5592 a7dd0415 Kostas Papadimitriou
5593 a7dd0415 Kostas Papadimitriou
        // Can't pass null or undefined to indexOf in Firefox 4
5594 a7dd0415 Kostas Papadimitriou
        // Set to 0 to skip string check
5595 a7dd0415 Kostas Papadimitriou
        qualifier = qualifier || 0;
5596 a7dd0415 Kostas Papadimitriou
5597 a7dd0415 Kostas Papadimitriou
        if ( jQuery.isFunction( qualifier ) ) {
5598 a7dd0415 Kostas Papadimitriou
                return jQuery.grep(elements, function( elem, i ) {
5599 a7dd0415 Kostas Papadimitriou
                        var retVal = !!qualifier.call( elem, i, elem );
5600 a7dd0415 Kostas Papadimitriou
                        return retVal === keep;
5601 a7dd0415 Kostas Papadimitriou
                });
5602 a7dd0415 Kostas Papadimitriou
5603 a7dd0415 Kostas Papadimitriou
        } else if ( qualifier.nodeType ) {
5604 a7dd0415 Kostas Papadimitriou
                return jQuery.grep(elements, function( elem, i ) {
5605 a7dd0415 Kostas Papadimitriou
                        return ( elem === qualifier ) === keep;
5606 a7dd0415 Kostas Papadimitriou
                });
5607 a7dd0415 Kostas Papadimitriou
5608 a7dd0415 Kostas Papadimitriou
        } else if ( typeof qualifier === "string" ) {
5609 a7dd0415 Kostas Papadimitriou
                var filtered = jQuery.grep(elements, function( elem ) {
5610 a7dd0415 Kostas Papadimitriou
                        return elem.nodeType === 1;
5611 a7dd0415 Kostas Papadimitriou
                });
5612 a7dd0415 Kostas Papadimitriou
5613 a7dd0415 Kostas Papadimitriou
                if ( isSimple.test( qualifier ) ) {
5614 a7dd0415 Kostas Papadimitriou
                        return jQuery.filter(qualifier, filtered, !keep);
5615 a7dd0415 Kostas Papadimitriou
                } else {
5616 a7dd0415 Kostas Papadimitriou
                        qualifier = jQuery.filter( qualifier, filtered );
5617 a7dd0415 Kostas Papadimitriou
                }
5618 a7dd0415 Kostas Papadimitriou
        }
5619 a7dd0415 Kostas Papadimitriou
5620 a7dd0415 Kostas Papadimitriou
        return jQuery.grep(elements, function( elem, i ) {
5621 a7dd0415 Kostas Papadimitriou
                return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
5622 a7dd0415 Kostas Papadimitriou
        });
5623 a7dd0415 Kostas Papadimitriou
}
5624 a7dd0415 Kostas Papadimitriou
5625 a7dd0415 Kostas Papadimitriou
5626 a7dd0415 Kostas Papadimitriou
5627 a7dd0415 Kostas Papadimitriou
5628 a7dd0415 Kostas Papadimitriou
function createSafeFragment( document ) {
5629 a7dd0415 Kostas Papadimitriou
        var list = nodeNames.split( "|" ),
5630 a7dd0415 Kostas Papadimitriou
        safeFrag = document.createDocumentFragment();
5631 a7dd0415 Kostas Papadimitriou
5632 a7dd0415 Kostas Papadimitriou
        if ( safeFrag.createElement ) {
5633 a7dd0415 Kostas Papadimitriou
                while ( list.length ) {
5634 a7dd0415 Kostas Papadimitriou
                        safeFrag.createElement(
5635 a7dd0415 Kostas Papadimitriou
                                list.pop()
5636 a7dd0415 Kostas Papadimitriou
                        );
5637 a7dd0415 Kostas Papadimitriou
                }
5638 a7dd0415 Kostas Papadimitriou
        }
5639 a7dd0415 Kostas Papadimitriou
        return safeFrag;
5640 a7dd0415 Kostas Papadimitriou
}
5641 a7dd0415 Kostas Papadimitriou
5642 a7dd0415 Kostas Papadimitriou
var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
5643 a7dd0415 Kostas Papadimitriou
                "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
5644 a7dd0415 Kostas Papadimitriou
        rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
5645 a7dd0415 Kostas Papadimitriou
        rleadingWhitespace = /^\s+/,
5646 a7dd0415 Kostas Papadimitriou
        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
5647 a7dd0415 Kostas Papadimitriou
        rtagName = /<([\w:]+)/,
5648 a7dd0415 Kostas Papadimitriou
        rtbody = /<tbody/i,
5649 a7dd0415 Kostas Papadimitriou
        rhtml = /<|&#?\w+;/,
5650 a7dd0415 Kostas Papadimitriou
        rnoInnerhtml = /<(?:script|style)/i,
5651 a7dd0415 Kostas Papadimitriou
        rnocache = /<(?:script|object|embed|option|style)/i,
5652 a7dd0415 Kostas Papadimitriou
        rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
5653 a7dd0415 Kostas Papadimitriou
        // checked="checked" or checked
5654 a7dd0415 Kostas Papadimitriou
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5655 a7dd0415 Kostas Papadimitriou
        rscriptType = /\/(java|ecma)script/i,
5656 a7dd0415 Kostas Papadimitriou
        rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
5657 a7dd0415 Kostas Papadimitriou
        wrapMap = {
5658 a7dd0415 Kostas Papadimitriou
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
5659 a7dd0415 Kostas Papadimitriou
                legend: [ 1, "<fieldset>", "</fieldset>" ],
5660 a7dd0415 Kostas Papadimitriou
                thead: [ 1, "<table>", "</table>" ],
5661 a7dd0415 Kostas Papadimitriou
                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5662 a7dd0415 Kostas Papadimitriou
                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5663 a7dd0415 Kostas Papadimitriou
                col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5664 a7dd0415 Kostas Papadimitriou
                area: [ 1, "<map>", "</map>" ],
5665 a7dd0415 Kostas Papadimitriou
                _default: [ 0, "", "" ]
5666 a7dd0415 Kostas Papadimitriou
        },
5667 a7dd0415 Kostas Papadimitriou
        safeFragment = createSafeFragment( document );
5668 a7dd0415 Kostas Papadimitriou
5669 a7dd0415 Kostas Papadimitriou
wrapMap.optgroup = wrapMap.option;
5670 a7dd0415 Kostas Papadimitriou
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5671 a7dd0415 Kostas Papadimitriou
wrapMap.th = wrapMap.td;
5672 a7dd0415 Kostas Papadimitriou
5673 a7dd0415 Kostas Papadimitriou
// IE can't serialize <link> and <script> tags normally
5674 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.htmlSerialize ) {
5675 a7dd0415 Kostas Papadimitriou
        wrapMap._default = [ 1, "div<div>", "</div>" ];
5676 a7dd0415 Kostas Papadimitriou
}
5677 a7dd0415 Kostas Papadimitriou
5678 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
5679 a7dd0415 Kostas Papadimitriou
        text: function( text ) {
5680 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction(text) ) {
5681 a7dd0415 Kostas Papadimitriou
                        return this.each(function(i) {
5682 a7dd0415 Kostas Papadimitriou
                                var self = jQuery( this );
5683 a7dd0415 Kostas Papadimitriou
5684 a7dd0415 Kostas Papadimitriou
                                self.text( text.call(this, i, self.text()) );
5685 a7dd0415 Kostas Papadimitriou
                        });
5686 a7dd0415 Kostas Papadimitriou
                }
5687 a7dd0415 Kostas Papadimitriou
5688 a7dd0415 Kostas Papadimitriou
                if ( typeof text !== "object" && text !== undefined ) {
5689 a7dd0415 Kostas Papadimitriou
                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
5690 a7dd0415 Kostas Papadimitriou
                }
5691 a7dd0415 Kostas Papadimitriou
5692 a7dd0415 Kostas Papadimitriou
                return jQuery.text( this );
5693 a7dd0415 Kostas Papadimitriou
        },
5694 a7dd0415 Kostas Papadimitriou
5695 a7dd0415 Kostas Papadimitriou
        wrapAll: function( html ) {
5696 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( html ) ) {
5697 a7dd0415 Kostas Papadimitriou
                        return this.each(function(i) {
5698 a7dd0415 Kostas Papadimitriou
                                jQuery(this).wrapAll( html.call(this, i) );
5699 a7dd0415 Kostas Papadimitriou
                        });
5700 a7dd0415 Kostas Papadimitriou
                }
5701 a7dd0415 Kostas Papadimitriou
5702 a7dd0415 Kostas Papadimitriou
                if ( this[0] ) {
5703 a7dd0415 Kostas Papadimitriou
                        // The elements to wrap the target around
5704 a7dd0415 Kostas Papadimitriou
                        var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5705 a7dd0415 Kostas Papadimitriou
5706 a7dd0415 Kostas Papadimitriou
                        if ( this[0].parentNode ) {
5707 a7dd0415 Kostas Papadimitriou
                                wrap.insertBefore( this[0] );
5708 a7dd0415 Kostas Papadimitriou
                        }
5709 a7dd0415 Kostas Papadimitriou
5710 a7dd0415 Kostas Papadimitriou
                        wrap.map(function() {
5711 a7dd0415 Kostas Papadimitriou
                                var elem = this;
5712 a7dd0415 Kostas Papadimitriou
5713 a7dd0415 Kostas Papadimitriou
                                while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5714 a7dd0415 Kostas Papadimitriou
                                        elem = elem.firstChild;
5715 a7dd0415 Kostas Papadimitriou
                                }
5716 a7dd0415 Kostas Papadimitriou
5717 a7dd0415 Kostas Papadimitriou
                                return elem;
5718 a7dd0415 Kostas Papadimitriou
                        }).append( this );
5719 a7dd0415 Kostas Papadimitriou
                }
5720 a7dd0415 Kostas Papadimitriou
5721 a7dd0415 Kostas Papadimitriou
                return this;
5722 a7dd0415 Kostas Papadimitriou
        },
5723 a7dd0415 Kostas Papadimitriou
5724 a7dd0415 Kostas Papadimitriou
        wrapInner: function( html ) {
5725 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( html ) ) {
5726 a7dd0415 Kostas Papadimitriou
                        return this.each(function(i) {
5727 a7dd0415 Kostas Papadimitriou
                                jQuery(this).wrapInner( html.call(this, i) );
5728 a7dd0415 Kostas Papadimitriou
                        });
5729 a7dd0415 Kostas Papadimitriou
                }
5730 a7dd0415 Kostas Papadimitriou
5731 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
5732 a7dd0415 Kostas Papadimitriou
                        var self = jQuery( this ),
5733 a7dd0415 Kostas Papadimitriou
                                contents = self.contents();
5734 a7dd0415 Kostas Papadimitriou
5735 a7dd0415 Kostas Papadimitriou
                        if ( contents.length ) {
5736 a7dd0415 Kostas Papadimitriou
                                contents.wrapAll( html );
5737 a7dd0415 Kostas Papadimitriou
5738 a7dd0415 Kostas Papadimitriou
                        } else {
5739 a7dd0415 Kostas Papadimitriou
                                self.append( html );
5740 a7dd0415 Kostas Papadimitriou
                        }
5741 a7dd0415 Kostas Papadimitriou
                });
5742 a7dd0415 Kostas Papadimitriou
        },
5743 a7dd0415 Kostas Papadimitriou
5744 a7dd0415 Kostas Papadimitriou
        wrap: function( html ) {
5745 a7dd0415 Kostas Papadimitriou
                var isFunction = jQuery.isFunction( html );
5746 a7dd0415 Kostas Papadimitriou
5747 a7dd0415 Kostas Papadimitriou
                return this.each(function(i) {
5748 a7dd0415 Kostas Papadimitriou
                        jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
5749 a7dd0415 Kostas Papadimitriou
                });
5750 a7dd0415 Kostas Papadimitriou
        },
5751 a7dd0415 Kostas Papadimitriou
5752 a7dd0415 Kostas Papadimitriou
        unwrap: function() {
5753 a7dd0415 Kostas Papadimitriou
                return this.parent().each(function() {
5754 a7dd0415 Kostas Papadimitriou
                        if ( !jQuery.nodeName( this, "body" ) ) {
5755 a7dd0415 Kostas Papadimitriou
                                jQuery( this ).replaceWith( this.childNodes );
5756 a7dd0415 Kostas Papadimitriou
                        }
5757 a7dd0415 Kostas Papadimitriou
                }).end();
5758 a7dd0415 Kostas Papadimitriou
        },
5759 a7dd0415 Kostas Papadimitriou
5760 a7dd0415 Kostas Papadimitriou
        append: function() {
5761 a7dd0415 Kostas Papadimitriou
                return this.domManip(arguments, true, function( elem ) {
5762 a7dd0415 Kostas Papadimitriou
                        if ( this.nodeType === 1 ) {
5763 a7dd0415 Kostas Papadimitriou
                                this.appendChild( elem );
5764 a7dd0415 Kostas Papadimitriou
                        }
5765 a7dd0415 Kostas Papadimitriou
                });
5766 a7dd0415 Kostas Papadimitriou
        },
5767 a7dd0415 Kostas Papadimitriou
5768 a7dd0415 Kostas Papadimitriou
        prepend: function() {
5769 a7dd0415 Kostas Papadimitriou
                return this.domManip(arguments, true, function( elem ) {
5770 a7dd0415 Kostas Papadimitriou
                        if ( this.nodeType === 1 ) {
5771 a7dd0415 Kostas Papadimitriou
                                this.insertBefore( elem, this.firstChild );
5772 a7dd0415 Kostas Papadimitriou
                        }
5773 a7dd0415 Kostas Papadimitriou
                });
5774 a7dd0415 Kostas Papadimitriou
        },
5775 a7dd0415 Kostas Papadimitriou
5776 a7dd0415 Kostas Papadimitriou
        before: function() {
5777 a7dd0415 Kostas Papadimitriou
                if ( this[0] && this[0].parentNode ) {
5778 a7dd0415 Kostas Papadimitriou
                        return this.domManip(arguments, false, function( elem ) {
5779 a7dd0415 Kostas Papadimitriou
                                this.parentNode.insertBefore( elem, this );
5780 a7dd0415 Kostas Papadimitriou
                        });
5781 a7dd0415 Kostas Papadimitriou
                } else if ( arguments.length ) {
5782 a7dd0415 Kostas Papadimitriou
                        var set = jQuery.clean( arguments );
5783 a7dd0415 Kostas Papadimitriou
                        set.push.apply( set, this.toArray() );
5784 a7dd0415 Kostas Papadimitriou
                        return this.pushStack( set, "before", arguments );
5785 a7dd0415 Kostas Papadimitriou
                }
5786 a7dd0415 Kostas Papadimitriou
        },
5787 a7dd0415 Kostas Papadimitriou
5788 a7dd0415 Kostas Papadimitriou
        after: function() {
5789 a7dd0415 Kostas Papadimitriou
                if ( this[0] && this[0].parentNode ) {
5790 a7dd0415 Kostas Papadimitriou
                        return this.domManip(arguments, false, function( elem ) {
5791 a7dd0415 Kostas Papadimitriou
                                this.parentNode.insertBefore( elem, this.nextSibling );
5792 a7dd0415 Kostas Papadimitriou
                        });
5793 a7dd0415 Kostas Papadimitriou
                } else if ( arguments.length ) {
5794 a7dd0415 Kostas Papadimitriou
                        var set = this.pushStack( this, "after", arguments );
5795 a7dd0415 Kostas Papadimitriou
                        set.push.apply( set, jQuery.clean(arguments) );
5796 a7dd0415 Kostas Papadimitriou
                        return set;
5797 a7dd0415 Kostas Papadimitriou
                }
5798 a7dd0415 Kostas Papadimitriou
        },
5799 a7dd0415 Kostas Papadimitriou
5800 a7dd0415 Kostas Papadimitriou
        // keepData is for internal use only--do not document
5801 a7dd0415 Kostas Papadimitriou
        remove: function( selector, keepData ) {
5802 a7dd0415 Kostas Papadimitriou
                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5803 a7dd0415 Kostas Papadimitriou
                        if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5804 a7dd0415 Kostas Papadimitriou
                                if ( !keepData && elem.nodeType === 1 ) {
5805 a7dd0415 Kostas Papadimitriou
                                        jQuery.cleanData( elem.getElementsByTagName("*") );
5806 a7dd0415 Kostas Papadimitriou
                                        jQuery.cleanData( [ elem ] );
5807 a7dd0415 Kostas Papadimitriou
                                }
5808 a7dd0415 Kostas Papadimitriou
5809 a7dd0415 Kostas Papadimitriou
                                if ( elem.parentNode ) {
5810 a7dd0415 Kostas Papadimitriou
                                        elem.parentNode.removeChild( elem );
5811 a7dd0415 Kostas Papadimitriou
                                }
5812 a7dd0415 Kostas Papadimitriou
                        }
5813 a7dd0415 Kostas Papadimitriou
                }
5814 a7dd0415 Kostas Papadimitriou
5815 a7dd0415 Kostas Papadimitriou
                return this;
5816 a7dd0415 Kostas Papadimitriou
        },
5817 a7dd0415 Kostas Papadimitriou
5818 a7dd0415 Kostas Papadimitriou
        empty: function() {
5819 a7dd0415 Kostas Papadimitriou
                for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5820 a7dd0415 Kostas Papadimitriou
                        // Remove element nodes and prevent memory leaks
5821 a7dd0415 Kostas Papadimitriou
                        if ( elem.nodeType === 1 ) {
5822 a7dd0415 Kostas Papadimitriou
                                jQuery.cleanData( elem.getElementsByTagName("*") );
5823 a7dd0415 Kostas Papadimitriou
                        }
5824 a7dd0415 Kostas Papadimitriou
5825 a7dd0415 Kostas Papadimitriou
                        // Remove any remaining nodes
5826 a7dd0415 Kostas Papadimitriou
                        while ( elem.firstChild ) {
5827 a7dd0415 Kostas Papadimitriou
                                elem.removeChild( elem.firstChild );
5828 a7dd0415 Kostas Papadimitriou
                        }
5829 a7dd0415 Kostas Papadimitriou
                }
5830 a7dd0415 Kostas Papadimitriou
5831 a7dd0415 Kostas Papadimitriou
                return this;
5832 a7dd0415 Kostas Papadimitriou
        },
5833 a7dd0415 Kostas Papadimitriou
5834 a7dd0415 Kostas Papadimitriou
        clone: function( dataAndEvents, deepDataAndEvents ) {
5835 a7dd0415 Kostas Papadimitriou
                dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5836 a7dd0415 Kostas Papadimitriou
                deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5837 a7dd0415 Kostas Papadimitriou
5838 a7dd0415 Kostas Papadimitriou
                return this.map( function () {
5839 a7dd0415 Kostas Papadimitriou
                        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5840 a7dd0415 Kostas Papadimitriou
                });
5841 a7dd0415 Kostas Papadimitriou
        },
5842 a7dd0415 Kostas Papadimitriou
5843 a7dd0415 Kostas Papadimitriou
        html: function( value ) {
5844 a7dd0415 Kostas Papadimitriou
                if ( value === undefined ) {
5845 a7dd0415 Kostas Papadimitriou
                        return this[0] && this[0].nodeType === 1 ?
5846 a7dd0415 Kostas Papadimitriou
                                this[0].innerHTML.replace(rinlinejQuery, "") :
5847 a7dd0415 Kostas Papadimitriou
                                null;
5848 a7dd0415 Kostas Papadimitriou
5849 a7dd0415 Kostas Papadimitriou
                // See if we can take a shortcut and just use innerHTML
5850 a7dd0415 Kostas Papadimitriou
                } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5851 a7dd0415 Kostas Papadimitriou
                        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
5852 a7dd0415 Kostas Papadimitriou
                        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
5853 a7dd0415 Kostas Papadimitriou
5854 a7dd0415 Kostas Papadimitriou
                        value = value.replace(rxhtmlTag, "<$1></$2>");
5855 a7dd0415 Kostas Papadimitriou
5856 a7dd0415 Kostas Papadimitriou
                        try {
5857 a7dd0415 Kostas Papadimitriou
                                for ( var i = 0, l = this.length; i < l; i++ ) {
5858 a7dd0415 Kostas Papadimitriou
                                        // Remove element nodes and prevent memory leaks
5859 a7dd0415 Kostas Papadimitriou
                                        if ( this[i].nodeType === 1 ) {
5860 a7dd0415 Kostas Papadimitriou
                                                jQuery.cleanData( this[i].getElementsByTagName("*") );
5861 a7dd0415 Kostas Papadimitriou
                                                this[i].innerHTML = value;
5862 a7dd0415 Kostas Papadimitriou
                                        }
5863 a7dd0415 Kostas Papadimitriou
                                }
5864 a7dd0415 Kostas Papadimitriou
5865 a7dd0415 Kostas Papadimitriou
                        // If using innerHTML throws an exception, use the fallback method
5866 a7dd0415 Kostas Papadimitriou
                        } catch(e) {
5867 a7dd0415 Kostas Papadimitriou
                                this.empty().append( value );
5868 a7dd0415 Kostas Papadimitriou
                        }
5869 a7dd0415 Kostas Papadimitriou
5870 a7dd0415 Kostas Papadimitriou
                } else if ( jQuery.isFunction( value ) ) {
5871 a7dd0415 Kostas Papadimitriou
                        this.each(function(i){
5872 a7dd0415 Kostas Papadimitriou
                                var self = jQuery( this );
5873 a7dd0415 Kostas Papadimitriou
5874 a7dd0415 Kostas Papadimitriou
                                self.html( value.call(this, i, self.html()) );
5875 a7dd0415 Kostas Papadimitriou
                        });
5876 a7dd0415 Kostas Papadimitriou
5877 a7dd0415 Kostas Papadimitriou
                } else {
5878 a7dd0415 Kostas Papadimitriou
                        this.empty().append( value );
5879 a7dd0415 Kostas Papadimitriou
                }
5880 a7dd0415 Kostas Papadimitriou
5881 a7dd0415 Kostas Papadimitriou
                return this;
5882 a7dd0415 Kostas Papadimitriou
        },
5883 a7dd0415 Kostas Papadimitriou
5884 a7dd0415 Kostas Papadimitriou
        replaceWith: function( value ) {
5885 a7dd0415 Kostas Papadimitriou
                if ( this[0] && this[0].parentNode ) {
5886 a7dd0415 Kostas Papadimitriou
                        // Make sure that the elements are removed from the DOM before they are inserted
5887 a7dd0415 Kostas Papadimitriou
                        // this can help fix replacing a parent with child elements
5888 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.isFunction( value ) ) {
5889 a7dd0415 Kostas Papadimitriou
                                return this.each(function(i) {
5890 a7dd0415 Kostas Papadimitriou
                                        var self = jQuery(this), old = self.html();
5891 a7dd0415 Kostas Papadimitriou
                                        self.replaceWith( value.call( this, i, old ) );
5892 a7dd0415 Kostas Papadimitriou
                                });
5893 a7dd0415 Kostas Papadimitriou
                        }
5894 a7dd0415 Kostas Papadimitriou
5895 a7dd0415 Kostas Papadimitriou
                        if ( typeof value !== "string" ) {
5896 a7dd0415 Kostas Papadimitriou
                                value = jQuery( value ).detach();
5897 a7dd0415 Kostas Papadimitriou
                        }
5898 a7dd0415 Kostas Papadimitriou
5899 a7dd0415 Kostas Papadimitriou
                        return this.each(function() {
5900 a7dd0415 Kostas Papadimitriou
                                var next = this.nextSibling,
5901 a7dd0415 Kostas Papadimitriou
                                        parent = this.parentNode;
5902 a7dd0415 Kostas Papadimitriou
5903 a7dd0415 Kostas Papadimitriou
                                jQuery( this ).remove();
5904 a7dd0415 Kostas Papadimitriou
5905 a7dd0415 Kostas Papadimitriou
                                if ( next ) {
5906 a7dd0415 Kostas Papadimitriou
                                        jQuery(next).before( value );
5907 a7dd0415 Kostas Papadimitriou
                                } else {
5908 a7dd0415 Kostas Papadimitriou
                                        jQuery(parent).append( value );
5909 a7dd0415 Kostas Papadimitriou
                                }
5910 a7dd0415 Kostas Papadimitriou
                        });
5911 a7dd0415 Kostas Papadimitriou
                } else {
5912 a7dd0415 Kostas Papadimitriou
                        return this.length ?
5913 a7dd0415 Kostas Papadimitriou
                                this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
5914 a7dd0415 Kostas Papadimitriou
                                this;
5915 a7dd0415 Kostas Papadimitriou
                }
5916 a7dd0415 Kostas Papadimitriou
        },
5917 a7dd0415 Kostas Papadimitriou
5918 a7dd0415 Kostas Papadimitriou
        detach: function( selector ) {
5919 a7dd0415 Kostas Papadimitriou
                return this.remove( selector, true );
5920 a7dd0415 Kostas Papadimitriou
        },
5921 a7dd0415 Kostas Papadimitriou
5922 a7dd0415 Kostas Papadimitriou
        domManip: function( args, table, callback ) {
5923 a7dd0415 Kostas Papadimitriou
                var results, first, fragment, parent,
5924 a7dd0415 Kostas Papadimitriou
                        value = args[0],
5925 a7dd0415 Kostas Papadimitriou
                        scripts = [];
5926 a7dd0415 Kostas Papadimitriou
5927 a7dd0415 Kostas Papadimitriou
                // We can't cloneNode fragments that contain checked, in WebKit
5928 a7dd0415 Kostas Papadimitriou
                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
5929 a7dd0415 Kostas Papadimitriou
                        return this.each(function() {
5930 a7dd0415 Kostas Papadimitriou
                                jQuery(this).domManip( args, table, callback, true );
5931 a7dd0415 Kostas Papadimitriou
                        });
5932 a7dd0415 Kostas Papadimitriou
                }
5933 a7dd0415 Kostas Papadimitriou
5934 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction(value) ) {
5935 a7dd0415 Kostas Papadimitriou
                        return this.each(function(i) {
5936 a7dd0415 Kostas Papadimitriou
                                var self = jQuery(this);
5937 a7dd0415 Kostas Papadimitriou
                                args[0] = value.call(this, i, table ? self.html() : undefined);
5938 a7dd0415 Kostas Papadimitriou
                                self.domManip( args, table, callback );
5939 a7dd0415 Kostas Papadimitriou
                        });
5940 a7dd0415 Kostas Papadimitriou
                }
5941 a7dd0415 Kostas Papadimitriou
5942 a7dd0415 Kostas Papadimitriou
                if ( this[0] ) {
5943 a7dd0415 Kostas Papadimitriou
                        parent = value && value.parentNode;
5944 a7dd0415 Kostas Papadimitriou
5945 a7dd0415 Kostas Papadimitriou
                        // If we're in a fragment, just use that instead of building a new one
5946 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
5947 a7dd0415 Kostas Papadimitriou
                                results = { fragment: parent };
5948 a7dd0415 Kostas Papadimitriou
5949 a7dd0415 Kostas Papadimitriou
                        } else {
5950 a7dd0415 Kostas Papadimitriou
                                results = jQuery.buildFragment( args, this, scripts );
5951 a7dd0415 Kostas Papadimitriou
                        }
5952 a7dd0415 Kostas Papadimitriou
5953 a7dd0415 Kostas Papadimitriou
                        fragment = results.fragment;
5954 a7dd0415 Kostas Papadimitriou
5955 a7dd0415 Kostas Papadimitriou
                        if ( fragment.childNodes.length === 1 ) {
5956 a7dd0415 Kostas Papadimitriou
                                first = fragment = fragment.firstChild;
5957 a7dd0415 Kostas Papadimitriou
                        } else {
5958 a7dd0415 Kostas Papadimitriou
                                first = fragment.firstChild;
5959 a7dd0415 Kostas Papadimitriou
                        }
5960 a7dd0415 Kostas Papadimitriou
5961 a7dd0415 Kostas Papadimitriou
                        if ( first ) {
5962 a7dd0415 Kostas Papadimitriou
                                table = table && jQuery.nodeName( first, "tr" );
5963 a7dd0415 Kostas Papadimitriou
5964 a7dd0415 Kostas Papadimitriou
                                for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
5965 a7dd0415 Kostas Papadimitriou
                                        callback.call(
5966 a7dd0415 Kostas Papadimitriou
                                                table ?
5967 a7dd0415 Kostas Papadimitriou
                                                        root(this[i], first) :
5968 a7dd0415 Kostas Papadimitriou
                                                        this[i],
5969 a7dd0415 Kostas Papadimitriou
                                                // Make sure that we do not leak memory by inadvertently discarding
5970 a7dd0415 Kostas Papadimitriou
                                                // the original fragment (which might have attached data) instead of
5971 a7dd0415 Kostas Papadimitriou
                                                // using it; in addition, use the original fragment object for the last
5972 a7dd0415 Kostas Papadimitriou
                                                // item instead of first because it can end up being emptied incorrectly
5973 a7dd0415 Kostas Papadimitriou
                                                // in certain situations (Bug #8070).
5974 a7dd0415 Kostas Papadimitriou
                                                // Fragments from the fragment cache must always be cloned and never used
5975 a7dd0415 Kostas Papadimitriou
                                                // in place.
5976 a7dd0415 Kostas Papadimitriou
                                                results.cacheable || ( l > 1 && i < lastIndex ) ?
5977 a7dd0415 Kostas Papadimitriou
                                                        jQuery.clone( fragment, true, true ) :
5978 a7dd0415 Kostas Papadimitriou
                                                        fragment
5979 a7dd0415 Kostas Papadimitriou
                                        );
5980 a7dd0415 Kostas Papadimitriou
                                }
5981 a7dd0415 Kostas Papadimitriou
                        }
5982 a7dd0415 Kostas Papadimitriou
5983 a7dd0415 Kostas Papadimitriou
                        if ( scripts.length ) {
5984 a7dd0415 Kostas Papadimitriou
                                jQuery.each( scripts, evalScript );
5985 a7dd0415 Kostas Papadimitriou
                        }
5986 a7dd0415 Kostas Papadimitriou
                }
5987 a7dd0415 Kostas Papadimitriou
5988 a7dd0415 Kostas Papadimitriou
                return this;
5989 a7dd0415 Kostas Papadimitriou
        }
5990 a7dd0415 Kostas Papadimitriou
});
5991 a7dd0415 Kostas Papadimitriou
5992 a7dd0415 Kostas Papadimitriou
function root( elem, cur ) {
5993 a7dd0415 Kostas Papadimitriou
        return jQuery.nodeName(elem, "table") ?
5994 a7dd0415 Kostas Papadimitriou
                (elem.getElementsByTagName("tbody")[0] ||
5995 a7dd0415 Kostas Papadimitriou
                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
5996 a7dd0415 Kostas Papadimitriou
                elem;
5997 a7dd0415 Kostas Papadimitriou
}
5998 a7dd0415 Kostas Papadimitriou
5999 a7dd0415 Kostas Papadimitriou
function cloneCopyEvent( src, dest ) {
6000 a7dd0415 Kostas Papadimitriou
6001 a7dd0415 Kostas Papadimitriou
        if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6002 a7dd0415 Kostas Papadimitriou
                return;
6003 a7dd0415 Kostas Papadimitriou
        }
6004 a7dd0415 Kostas Papadimitriou
6005 a7dd0415 Kostas Papadimitriou
        var type, i, l,
6006 a7dd0415 Kostas Papadimitriou
                oldData = jQuery._data( src ),
6007 a7dd0415 Kostas Papadimitriou
                curData = jQuery._data( dest, oldData ),
6008 a7dd0415 Kostas Papadimitriou
                events = oldData.events;
6009 a7dd0415 Kostas Papadimitriou
6010 a7dd0415 Kostas Papadimitriou
        if ( events ) {
6011 a7dd0415 Kostas Papadimitriou
                delete curData.handle;
6012 a7dd0415 Kostas Papadimitriou
                curData.events = {};
6013 a7dd0415 Kostas Papadimitriou
6014 a7dd0415 Kostas Papadimitriou
                for ( type in events ) {
6015 a7dd0415 Kostas Papadimitriou
                        for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6016 a7dd0415 Kostas Papadimitriou
                                jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
6017 a7dd0415 Kostas Papadimitriou
                        }
6018 a7dd0415 Kostas Papadimitriou
                }
6019 a7dd0415 Kostas Papadimitriou
        }
6020 a7dd0415 Kostas Papadimitriou
6021 a7dd0415 Kostas Papadimitriou
        // make the cloned public data object a copy from the original
6022 a7dd0415 Kostas Papadimitriou
        if ( curData.data ) {
6023 a7dd0415 Kostas Papadimitriou
                curData.data = jQuery.extend( {}, curData.data );
6024 a7dd0415 Kostas Papadimitriou
        }
6025 a7dd0415 Kostas Papadimitriou
}
6026 a7dd0415 Kostas Papadimitriou
6027 a7dd0415 Kostas Papadimitriou
function cloneFixAttributes( src, dest ) {
6028 a7dd0415 Kostas Papadimitriou
        var nodeName;
6029 a7dd0415 Kostas Papadimitriou
6030 a7dd0415 Kostas Papadimitriou
        // We do not need to do anything for non-Elements
6031 a7dd0415 Kostas Papadimitriou
        if ( dest.nodeType !== 1 ) {
6032 a7dd0415 Kostas Papadimitriou
                return;
6033 a7dd0415 Kostas Papadimitriou
        }
6034 a7dd0415 Kostas Papadimitriou
6035 a7dd0415 Kostas Papadimitriou
        // clearAttributes removes the attributes, which we don't want,
6036 a7dd0415 Kostas Papadimitriou
        // but also removes the attachEvent events, which we *do* want
6037 a7dd0415 Kostas Papadimitriou
        if ( dest.clearAttributes ) {
6038 a7dd0415 Kostas Papadimitriou
                dest.clearAttributes();
6039 a7dd0415 Kostas Papadimitriou
        }
6040 a7dd0415 Kostas Papadimitriou
6041 a7dd0415 Kostas Papadimitriou
        // mergeAttributes, in contrast, only merges back on the
6042 a7dd0415 Kostas Papadimitriou
        // original attributes, not the events
6043 a7dd0415 Kostas Papadimitriou
        if ( dest.mergeAttributes ) {
6044 a7dd0415 Kostas Papadimitriou
                dest.mergeAttributes( src );
6045 a7dd0415 Kostas Papadimitriou
        }
6046 a7dd0415 Kostas Papadimitriou
6047 a7dd0415 Kostas Papadimitriou
        nodeName = dest.nodeName.toLowerCase();
6048 a7dd0415 Kostas Papadimitriou
6049 a7dd0415 Kostas Papadimitriou
        // IE6-8 fail to clone children inside object elements that use
6050 a7dd0415 Kostas Papadimitriou
        // the proprietary classid attribute value (rather than the type
6051 a7dd0415 Kostas Papadimitriou
        // attribute) to identify the type of content to display
6052 a7dd0415 Kostas Papadimitriou
        if ( nodeName === "object" ) {
6053 a7dd0415 Kostas Papadimitriou
                dest.outerHTML = src.outerHTML;
6054 a7dd0415 Kostas Papadimitriou
6055 a7dd0415 Kostas Papadimitriou
        } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
6056 a7dd0415 Kostas Papadimitriou
                // IE6-8 fails to persist the checked state of a cloned checkbox
6057 a7dd0415 Kostas Papadimitriou
                // or radio button. Worse, IE6-7 fail to give the cloned element
6058 a7dd0415 Kostas Papadimitriou
                // a checked appearance if the defaultChecked value isn't also set
6059 a7dd0415 Kostas Papadimitriou
                if ( src.checked ) {
6060 a7dd0415 Kostas Papadimitriou
                        dest.defaultChecked = dest.checked = src.checked;
6061 a7dd0415 Kostas Papadimitriou
                }
6062 a7dd0415 Kostas Papadimitriou
6063 a7dd0415 Kostas Papadimitriou
                // IE6-7 get confused and end up setting the value of a cloned
6064 a7dd0415 Kostas Papadimitriou
                // checkbox/radio button to an empty string instead of "on"
6065 a7dd0415 Kostas Papadimitriou
                if ( dest.value !== src.value ) {
6066 a7dd0415 Kostas Papadimitriou
                        dest.value = src.value;
6067 a7dd0415 Kostas Papadimitriou
                }
6068 a7dd0415 Kostas Papadimitriou
6069 a7dd0415 Kostas Papadimitriou
        // IE6-8 fails to return the selected option to the default selected
6070 a7dd0415 Kostas Papadimitriou
        // state when cloning options
6071 a7dd0415 Kostas Papadimitriou
        } else if ( nodeName === "option" ) {
6072 a7dd0415 Kostas Papadimitriou
                dest.selected = src.defaultSelected;
6073 a7dd0415 Kostas Papadimitriou
6074 a7dd0415 Kostas Papadimitriou
        // IE6-8 fails to set the defaultValue to the correct value when
6075 a7dd0415 Kostas Papadimitriou
        // cloning other types of input fields
6076 a7dd0415 Kostas Papadimitriou
        } else if ( nodeName === "input" || nodeName === "textarea" ) {
6077 a7dd0415 Kostas Papadimitriou
                dest.defaultValue = src.defaultValue;
6078 a7dd0415 Kostas Papadimitriou
        }
6079 a7dd0415 Kostas Papadimitriou
6080 a7dd0415 Kostas Papadimitriou
        // Event data gets referenced instead of copied if the expando
6081 a7dd0415 Kostas Papadimitriou
        // gets copied too
6082 a7dd0415 Kostas Papadimitriou
        dest.removeAttribute( jQuery.expando );
6083 a7dd0415 Kostas Papadimitriou
}
6084 a7dd0415 Kostas Papadimitriou
6085 a7dd0415 Kostas Papadimitriou
jQuery.buildFragment = function( args, nodes, scripts ) {
6086 a7dd0415 Kostas Papadimitriou
        var fragment, cacheable, cacheresults, doc,
6087 a7dd0415 Kostas Papadimitriou
        first = args[ 0 ];
6088 a7dd0415 Kostas Papadimitriou
6089 a7dd0415 Kostas Papadimitriou
        // nodes may contain either an explicit document object,
6090 a7dd0415 Kostas Papadimitriou
        // a jQuery collection or context object.
6091 a7dd0415 Kostas Papadimitriou
        // If nodes[0] contains a valid object to assign to doc
6092 a7dd0415 Kostas Papadimitriou
        if ( nodes && nodes[0] ) {
6093 a7dd0415 Kostas Papadimitriou
                doc = nodes[0].ownerDocument || nodes[0];
6094 a7dd0415 Kostas Papadimitriou
        }
6095 a7dd0415 Kostas Papadimitriou
6096 a7dd0415 Kostas Papadimitriou
        // Ensure that an attr object doesn't incorrectly stand in as a document object
6097 a7dd0415 Kostas Papadimitriou
        // Chrome and Firefox seem to allow this to occur and will throw exception
6098 a7dd0415 Kostas Papadimitriou
        // Fixes #8950
6099 a7dd0415 Kostas Papadimitriou
        if ( !doc.createDocumentFragment ) {
6100 a7dd0415 Kostas Papadimitriou
                doc = document;
6101 a7dd0415 Kostas Papadimitriou
        }
6102 a7dd0415 Kostas Papadimitriou
6103 a7dd0415 Kostas Papadimitriou
        // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
6104 a7dd0415 Kostas Papadimitriou
        // Cloning options loses the selected state, so don't cache them
6105 a7dd0415 Kostas Papadimitriou
        // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
6106 a7dd0415 Kostas Papadimitriou
        // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
6107 a7dd0415 Kostas Papadimitriou
        // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
6108 a7dd0415 Kostas Papadimitriou
        if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
6109 a7dd0415 Kostas Papadimitriou
                first.charAt(0) === "<" && !rnocache.test( first ) &&
6110 a7dd0415 Kostas Papadimitriou
                (jQuery.support.checkClone || !rchecked.test( first )) &&
6111 a7dd0415 Kostas Papadimitriou
                (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
6112 a7dd0415 Kostas Papadimitriou
6113 a7dd0415 Kostas Papadimitriou
                cacheable = true;
6114 a7dd0415 Kostas Papadimitriou
6115 a7dd0415 Kostas Papadimitriou
                cacheresults = jQuery.fragments[ first ];
6116 a7dd0415 Kostas Papadimitriou
                if ( cacheresults && cacheresults !== 1 ) {
6117 a7dd0415 Kostas Papadimitriou
                        fragment = cacheresults;
6118 a7dd0415 Kostas Papadimitriou
                }
6119 a7dd0415 Kostas Papadimitriou
        }
6120 a7dd0415 Kostas Papadimitriou
6121 a7dd0415 Kostas Papadimitriou
        if ( !fragment ) {
6122 a7dd0415 Kostas Papadimitriou
                fragment = doc.createDocumentFragment();
6123 a7dd0415 Kostas Papadimitriou
                jQuery.clean( args, doc, fragment, scripts );
6124 a7dd0415 Kostas Papadimitriou
        }
6125 a7dd0415 Kostas Papadimitriou
6126 a7dd0415 Kostas Papadimitriou
        if ( cacheable ) {
6127 a7dd0415 Kostas Papadimitriou
                jQuery.fragments[ first ] = cacheresults ? fragment : 1;
6128 a7dd0415 Kostas Papadimitriou
        }
6129 a7dd0415 Kostas Papadimitriou
6130 a7dd0415 Kostas Papadimitriou
        return { fragment: fragment, cacheable: cacheable };
6131 a7dd0415 Kostas Papadimitriou
};
6132 a7dd0415 Kostas Papadimitriou
6133 a7dd0415 Kostas Papadimitriou
jQuery.fragments = {};
6134 a7dd0415 Kostas Papadimitriou
6135 a7dd0415 Kostas Papadimitriou
jQuery.each({
6136 a7dd0415 Kostas Papadimitriou
        appendTo: "append",
6137 a7dd0415 Kostas Papadimitriou
        prependTo: "prepend",
6138 a7dd0415 Kostas Papadimitriou
        insertBefore: "before",
6139 a7dd0415 Kostas Papadimitriou
        insertAfter: "after",
6140 a7dd0415 Kostas Papadimitriou
        replaceAll: "replaceWith"
6141 a7dd0415 Kostas Papadimitriou
}, function( name, original ) {
6142 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ name ] = function( selector ) {
6143 a7dd0415 Kostas Papadimitriou
                var ret = [],
6144 a7dd0415 Kostas Papadimitriou
                        insert = jQuery( selector ),
6145 a7dd0415 Kostas Papadimitriou
                        parent = this.length === 1 && this[0].parentNode;
6146 a7dd0415 Kostas Papadimitriou
6147 a7dd0415 Kostas Papadimitriou
                if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
6148 a7dd0415 Kostas Papadimitriou
                        insert[ original ]( this[0] );
6149 a7dd0415 Kostas Papadimitriou
                        return this;
6150 a7dd0415 Kostas Papadimitriou
6151 a7dd0415 Kostas Papadimitriou
                } else {
6152 a7dd0415 Kostas Papadimitriou
                        for ( var i = 0, l = insert.length; i < l; i++ ) {
6153 a7dd0415 Kostas Papadimitriou
                                var elems = ( i > 0 ? this.clone(true) : this ).get();
6154 a7dd0415 Kostas Papadimitriou
                                jQuery( insert[i] )[ original ]( elems );
6155 a7dd0415 Kostas Papadimitriou
                                ret = ret.concat( elems );
6156 a7dd0415 Kostas Papadimitriou
                        }
6157 a7dd0415 Kostas Papadimitriou
6158 a7dd0415 Kostas Papadimitriou
                        return this.pushStack( ret, name, insert.selector );
6159 a7dd0415 Kostas Papadimitriou
                }
6160 a7dd0415 Kostas Papadimitriou
        };
6161 a7dd0415 Kostas Papadimitriou
});
6162 a7dd0415 Kostas Papadimitriou
6163 a7dd0415 Kostas Papadimitriou
function getAll( elem ) {
6164 a7dd0415 Kostas Papadimitriou
        if ( typeof elem.getElementsByTagName !== "undefined" ) {
6165 a7dd0415 Kostas Papadimitriou
                return elem.getElementsByTagName( "*" );
6166 a7dd0415 Kostas Papadimitriou
6167 a7dd0415 Kostas Papadimitriou
        } else if ( typeof elem.querySelectorAll !== "undefined" ) {
6168 a7dd0415 Kostas Papadimitriou
                return elem.querySelectorAll( "*" );
6169 a7dd0415 Kostas Papadimitriou
6170 a7dd0415 Kostas Papadimitriou
        } else {
6171 a7dd0415 Kostas Papadimitriou
                return [];
6172 a7dd0415 Kostas Papadimitriou
        }
6173 a7dd0415 Kostas Papadimitriou
}
6174 a7dd0415 Kostas Papadimitriou
6175 a7dd0415 Kostas Papadimitriou
// Used in clean, fixes the defaultChecked property
6176 a7dd0415 Kostas Papadimitriou
function fixDefaultChecked( elem ) {
6177 a7dd0415 Kostas Papadimitriou
        if ( elem.type === "checkbox" || elem.type === "radio" ) {
6178 a7dd0415 Kostas Papadimitriou
                elem.defaultChecked = elem.checked;
6179 a7dd0415 Kostas Papadimitriou
        }
6180 a7dd0415 Kostas Papadimitriou
}
6181 a7dd0415 Kostas Papadimitriou
// Finds all inputs and passes them to fixDefaultChecked
6182 a7dd0415 Kostas Papadimitriou
function findInputs( elem ) {
6183 a7dd0415 Kostas Papadimitriou
        var nodeName = ( elem.nodeName || "" ).toLowerCase();
6184 a7dd0415 Kostas Papadimitriou
        if ( nodeName === "input" ) {
6185 a7dd0415 Kostas Papadimitriou
                fixDefaultChecked( elem );
6186 a7dd0415 Kostas Papadimitriou
        // Skip scripts, get other children
6187 a7dd0415 Kostas Papadimitriou
        } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
6188 a7dd0415 Kostas Papadimitriou
                jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
6189 a7dd0415 Kostas Papadimitriou
        }
6190 a7dd0415 Kostas Papadimitriou
}
6191 a7dd0415 Kostas Papadimitriou
6192 a7dd0415 Kostas Papadimitriou
// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
6193 a7dd0415 Kostas Papadimitriou
function shimCloneNode( elem ) {
6194 a7dd0415 Kostas Papadimitriou
        var div = document.createElement( "div" );
6195 a7dd0415 Kostas Papadimitriou
        safeFragment.appendChild( div );
6196 a7dd0415 Kostas Papadimitriou
6197 a7dd0415 Kostas Papadimitriou
        div.innerHTML = elem.outerHTML;
6198 a7dd0415 Kostas Papadimitriou
        return div.firstChild;
6199 a7dd0415 Kostas Papadimitriou
}
6200 a7dd0415 Kostas Papadimitriou
6201 a7dd0415 Kostas Papadimitriou
jQuery.extend({
6202 a7dd0415 Kostas Papadimitriou
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6203 a7dd0415 Kostas Papadimitriou
                var srcElements,
6204 a7dd0415 Kostas Papadimitriou
                        destElements,
6205 a7dd0415 Kostas Papadimitriou
                        i,
6206 a7dd0415 Kostas Papadimitriou
                        // IE<=8 does not properly clone detached, unknown element nodes
6207 a7dd0415 Kostas Papadimitriou
                        clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
6208 a7dd0415 Kostas Papadimitriou
                                elem.cloneNode( true ) :
6209 a7dd0415 Kostas Papadimitriou
                                shimCloneNode( elem );
6210 a7dd0415 Kostas Papadimitriou
6211 a7dd0415 Kostas Papadimitriou
                if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6212 a7dd0415 Kostas Papadimitriou
                                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6213 a7dd0415 Kostas Papadimitriou
                        // IE copies events bound via attachEvent when using cloneNode.
6214 a7dd0415 Kostas Papadimitriou
                        // Calling detachEvent on the clone will also remove the events
6215 a7dd0415 Kostas Papadimitriou
                        // from the original. In order to get around this, we use some
6216 a7dd0415 Kostas Papadimitriou
                        // proprietary methods to clear the events. Thanks to MooTools
6217 a7dd0415 Kostas Papadimitriou
                        // guys for this hotness.
6218 a7dd0415 Kostas Papadimitriou
6219 a7dd0415 Kostas Papadimitriou
                        cloneFixAttributes( elem, clone );
6220 a7dd0415 Kostas Papadimitriou
6221 a7dd0415 Kostas Papadimitriou
                        // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
6222 a7dd0415 Kostas Papadimitriou
                        srcElements = getAll( elem );
6223 a7dd0415 Kostas Papadimitriou
                        destElements = getAll( clone );
6224 a7dd0415 Kostas Papadimitriou
6225 a7dd0415 Kostas Papadimitriou
                        // Weird iteration because IE will replace the length property
6226 a7dd0415 Kostas Papadimitriou
                        // with an element if you are cloning the body and one of the
6227 a7dd0415 Kostas Papadimitriou
                        // elements on the page has a name or id of "length"
6228 a7dd0415 Kostas Papadimitriou
                        for ( i = 0; srcElements[i]; ++i ) {
6229 a7dd0415 Kostas Papadimitriou
                                // Ensure that the destination node is not null; Fixes #9587
6230 a7dd0415 Kostas Papadimitriou
                                if ( destElements[i] ) {
6231 a7dd0415 Kostas Papadimitriou
                                        cloneFixAttributes( srcElements[i], destElements[i] );
6232 a7dd0415 Kostas Papadimitriou
                                }
6233 a7dd0415 Kostas Papadimitriou
                        }
6234 a7dd0415 Kostas Papadimitriou
                }
6235 a7dd0415 Kostas Papadimitriou
6236 a7dd0415 Kostas Papadimitriou
                // Copy the events from the original to the clone
6237 a7dd0415 Kostas Papadimitriou
                if ( dataAndEvents ) {
6238 a7dd0415 Kostas Papadimitriou
                        cloneCopyEvent( elem, clone );
6239 a7dd0415 Kostas Papadimitriou
6240 a7dd0415 Kostas Papadimitriou
                        if ( deepDataAndEvents ) {
6241 a7dd0415 Kostas Papadimitriou
                                srcElements = getAll( elem );
6242 a7dd0415 Kostas Papadimitriou
                                destElements = getAll( clone );
6243 a7dd0415 Kostas Papadimitriou
6244 a7dd0415 Kostas Papadimitriou
                                for ( i = 0; srcElements[i]; ++i ) {
6245 a7dd0415 Kostas Papadimitriou
                                        cloneCopyEvent( srcElements[i], destElements[i] );
6246 a7dd0415 Kostas Papadimitriou
                                }
6247 a7dd0415 Kostas Papadimitriou
                        }
6248 a7dd0415 Kostas Papadimitriou
                }
6249 a7dd0415 Kostas Papadimitriou
6250 a7dd0415 Kostas Papadimitriou
                srcElements = destElements = null;
6251 a7dd0415 Kostas Papadimitriou
6252 a7dd0415 Kostas Papadimitriou
                // Return the cloned set
6253 a7dd0415 Kostas Papadimitriou
                return clone;
6254 a7dd0415 Kostas Papadimitriou
        },
6255 a7dd0415 Kostas Papadimitriou
6256 a7dd0415 Kostas Papadimitriou
        clean: function( elems, context, fragment, scripts ) {
6257 a7dd0415 Kostas Papadimitriou
                var checkScriptType;
6258 a7dd0415 Kostas Papadimitriou
6259 a7dd0415 Kostas Papadimitriou
                context = context || document;
6260 a7dd0415 Kostas Papadimitriou
6261 a7dd0415 Kostas Papadimitriou
                // !context.createElement fails in IE with an error but returns typeof 'object'
6262 a7dd0415 Kostas Papadimitriou
                if ( typeof context.createElement === "undefined" ) {
6263 a7dd0415 Kostas Papadimitriou
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
6264 a7dd0415 Kostas Papadimitriou
                }
6265 a7dd0415 Kostas Papadimitriou
6266 a7dd0415 Kostas Papadimitriou
                var ret = [], j;
6267 a7dd0415 Kostas Papadimitriou
6268 a7dd0415 Kostas Papadimitriou
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6269 a7dd0415 Kostas Papadimitriou
                        if ( typeof elem === "number" ) {
6270 a7dd0415 Kostas Papadimitriou
                                elem += "";
6271 a7dd0415 Kostas Papadimitriou
                        }
6272 a7dd0415 Kostas Papadimitriou
6273 a7dd0415 Kostas Papadimitriou
                        if ( !elem ) {
6274 a7dd0415 Kostas Papadimitriou
                                continue;
6275 a7dd0415 Kostas Papadimitriou
                        }
6276 a7dd0415 Kostas Papadimitriou
6277 a7dd0415 Kostas Papadimitriou
                        // Convert html string into DOM nodes
6278 a7dd0415 Kostas Papadimitriou
                        if ( typeof elem === "string" ) {
6279 a7dd0415 Kostas Papadimitriou
                                if ( !rhtml.test( elem ) ) {
6280 a7dd0415 Kostas Papadimitriou
                                        elem = context.createTextNode( elem );
6281 a7dd0415 Kostas Papadimitriou
                                } else {
6282 a7dd0415 Kostas Papadimitriou
                                        // Fix "XHTML"-style tags in all browsers
6283 a7dd0415 Kostas Papadimitriou
                                        elem = elem.replace(rxhtmlTag, "<$1></$2>");
6284 a7dd0415 Kostas Papadimitriou
6285 a7dd0415 Kostas Papadimitriou
                                        // Trim whitespace, otherwise indexOf won't work as expected
6286 a7dd0415 Kostas Papadimitriou
                                        var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
6287 a7dd0415 Kostas Papadimitriou
                                                wrap = wrapMap[ tag ] || wrapMap._default,
6288 a7dd0415 Kostas Papadimitriou
                                                depth = wrap[0],
6289 a7dd0415 Kostas Papadimitriou
                                                div = context.createElement("div");
6290 a7dd0415 Kostas Papadimitriou
6291 a7dd0415 Kostas Papadimitriou
                                        // Append wrapper element to unknown element safe doc fragment
6292 a7dd0415 Kostas Papadimitriou
                                        if ( context === document ) {
6293 a7dd0415 Kostas Papadimitriou
                                                // Use the fragment we've already created for this document
6294 a7dd0415 Kostas Papadimitriou
                                                safeFragment.appendChild( div );
6295 a7dd0415 Kostas Papadimitriou
                                        } else {
6296 a7dd0415 Kostas Papadimitriou
                                                // Use a fragment created with the owner document
6297 a7dd0415 Kostas Papadimitriou
                                                createSafeFragment( context ).appendChild( div );
6298 a7dd0415 Kostas Papadimitriou
                                        }
6299 a7dd0415 Kostas Papadimitriou
6300 a7dd0415 Kostas Papadimitriou
                                        // Go to html and back, then peel off extra wrappers
6301 a7dd0415 Kostas Papadimitriou
                                        div.innerHTML = wrap[1] + elem + wrap[2];
6302 a7dd0415 Kostas Papadimitriou
6303 a7dd0415 Kostas Papadimitriou
                                        // Move to the right depth
6304 a7dd0415 Kostas Papadimitriou
                                        while ( depth-- ) {
6305 a7dd0415 Kostas Papadimitriou
                                                div = div.lastChild;
6306 a7dd0415 Kostas Papadimitriou
                                        }
6307 a7dd0415 Kostas Papadimitriou
6308 a7dd0415 Kostas Papadimitriou
                                        // Remove IE's autoinserted <tbody> from table fragments
6309 a7dd0415 Kostas Papadimitriou
                                        if ( !jQuery.support.tbody ) {
6310 a7dd0415 Kostas Papadimitriou
6311 a7dd0415 Kostas Papadimitriou
                                                // String was a <table>, *may* have spurious <tbody>
6312 a7dd0415 Kostas Papadimitriou
                                                var hasBody = rtbody.test(elem),
6313 a7dd0415 Kostas Papadimitriou
                                                        tbody = tag === "table" && !hasBody ?
6314 a7dd0415 Kostas Papadimitriou
                                                                div.firstChild && div.firstChild.childNodes :
6315 a7dd0415 Kostas Papadimitriou
6316 a7dd0415 Kostas Papadimitriou
                                                                // String was a bare <thead> or <tfoot>
6317 a7dd0415 Kostas Papadimitriou
                                                                wrap[1] === "<table>" && !hasBody ?
6318 a7dd0415 Kostas Papadimitriou
                                                                        div.childNodes :
6319 a7dd0415 Kostas Papadimitriou
                                                                        [];
6320 a7dd0415 Kostas Papadimitriou
6321 a7dd0415 Kostas Papadimitriou
                                                for ( j = tbody.length - 1; j >= 0 ; --j ) {
6322 a7dd0415 Kostas Papadimitriou
                                                        if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
6323 a7dd0415 Kostas Papadimitriou
                                                                tbody[ j ].parentNode.removeChild( tbody[ j ] );
6324 a7dd0415 Kostas Papadimitriou
                                                        }
6325 a7dd0415 Kostas Papadimitriou
                                                }
6326 a7dd0415 Kostas Papadimitriou
                                        }
6327 a7dd0415 Kostas Papadimitriou
6328 a7dd0415 Kostas Papadimitriou
                                        // IE completely kills leading whitespace when innerHTML is used
6329 a7dd0415 Kostas Papadimitriou
                                        if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6330 a7dd0415 Kostas Papadimitriou
                                                div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
6331 a7dd0415 Kostas Papadimitriou
                                        }
6332 a7dd0415 Kostas Papadimitriou
6333 a7dd0415 Kostas Papadimitriou
                                        elem = div.childNodes;
6334 a7dd0415 Kostas Papadimitriou
                                }
6335 a7dd0415 Kostas Papadimitriou
                        }
6336 a7dd0415 Kostas Papadimitriou
6337 a7dd0415 Kostas Papadimitriou
                        // Resets defaultChecked for any radios and checkboxes
6338 a7dd0415 Kostas Papadimitriou
                        // about to be appended to the DOM in IE 6/7 (#8060)
6339 a7dd0415 Kostas Papadimitriou
                        var len;
6340 a7dd0415 Kostas Papadimitriou
                        if ( !jQuery.support.appendChecked ) {
6341 a7dd0415 Kostas Papadimitriou
                                if ( elem[0] && typeof (len = elem.length) === "number" ) {
6342 a7dd0415 Kostas Papadimitriou
                                        for ( j = 0; j < len; j++ ) {
6343 a7dd0415 Kostas Papadimitriou
                                                findInputs( elem[j] );
6344 a7dd0415 Kostas Papadimitriou
                                        }
6345 a7dd0415 Kostas Papadimitriou
                                } else {
6346 a7dd0415 Kostas Papadimitriou
                                        findInputs( elem );
6347 a7dd0415 Kostas Papadimitriou
                                }
6348 a7dd0415 Kostas Papadimitriou
                        }
6349 a7dd0415 Kostas Papadimitriou
6350 a7dd0415 Kostas Papadimitriou
                        if ( elem.nodeType ) {
6351 a7dd0415 Kostas Papadimitriou
                                ret.push( elem );
6352 a7dd0415 Kostas Papadimitriou
                        } else {
6353 a7dd0415 Kostas Papadimitriou
                                ret = jQuery.merge( ret, elem );
6354 a7dd0415 Kostas Papadimitriou
                        }
6355 a7dd0415 Kostas Papadimitriou
                }
6356 a7dd0415 Kostas Papadimitriou
6357 a7dd0415 Kostas Papadimitriou
                if ( fragment ) {
6358 a7dd0415 Kostas Papadimitriou
                        checkScriptType = function( elem ) {
6359 a7dd0415 Kostas Papadimitriou
                                return !elem.type || rscriptType.test( elem.type );
6360 a7dd0415 Kostas Papadimitriou
                        };
6361 a7dd0415 Kostas Papadimitriou
                        for ( i = 0; ret[i]; i++ ) {
6362 a7dd0415 Kostas Papadimitriou
                                if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
6363 a7dd0415 Kostas Papadimitriou
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
6364 a7dd0415 Kostas Papadimitriou
6365 a7dd0415 Kostas Papadimitriou
                                } else {
6366 a7dd0415 Kostas Papadimitriou
                                        if ( ret[i].nodeType === 1 ) {
6367 a7dd0415 Kostas Papadimitriou
                                                var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
6368 a7dd0415 Kostas Papadimitriou
6369 a7dd0415 Kostas Papadimitriou
                                                ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
6370 a7dd0415 Kostas Papadimitriou
                                        }
6371 a7dd0415 Kostas Papadimitriou
                                        fragment.appendChild( ret[i] );
6372 a7dd0415 Kostas Papadimitriou
                                }
6373 a7dd0415 Kostas Papadimitriou
                        }
6374 a7dd0415 Kostas Papadimitriou
                }
6375 a7dd0415 Kostas Papadimitriou
6376 a7dd0415 Kostas Papadimitriou
                return ret;
6377 a7dd0415 Kostas Papadimitriou
        },
6378 a7dd0415 Kostas Papadimitriou
6379 a7dd0415 Kostas Papadimitriou
        cleanData: function( elems ) {
6380 a7dd0415 Kostas Papadimitriou
                var data, id,
6381 a7dd0415 Kostas Papadimitriou
                        cache = jQuery.cache,
6382 a7dd0415 Kostas Papadimitriou
                        special = jQuery.event.special,
6383 a7dd0415 Kostas Papadimitriou
                        deleteExpando = jQuery.support.deleteExpando;
6384 a7dd0415 Kostas Papadimitriou
6385 a7dd0415 Kostas Papadimitriou
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6386 a7dd0415 Kostas Papadimitriou
                        if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
6387 a7dd0415 Kostas Papadimitriou
                                continue;
6388 a7dd0415 Kostas Papadimitriou
                        }
6389 a7dd0415 Kostas Papadimitriou
6390 a7dd0415 Kostas Papadimitriou
                        id = elem[ jQuery.expando ];
6391 a7dd0415 Kostas Papadimitriou
6392 a7dd0415 Kostas Papadimitriou
                        if ( id ) {
6393 a7dd0415 Kostas Papadimitriou
                                data = cache[ id ];
6394 a7dd0415 Kostas Papadimitriou
6395 a7dd0415 Kostas Papadimitriou
                                if ( data && data.events ) {
6396 a7dd0415 Kostas Papadimitriou
                                        for ( var type in data.events ) {
6397 a7dd0415 Kostas Papadimitriou
                                                if ( special[ type ] ) {
6398 a7dd0415 Kostas Papadimitriou
                                                        jQuery.event.remove( elem, type );
6399 a7dd0415 Kostas Papadimitriou
6400 a7dd0415 Kostas Papadimitriou
                                                // This is a shortcut to avoid jQuery.event.remove's overhead
6401 a7dd0415 Kostas Papadimitriou
                                                } else {
6402 a7dd0415 Kostas Papadimitriou
                                                        jQuery.removeEvent( elem, type, data.handle );
6403 a7dd0415 Kostas Papadimitriou
                                                }
6404 a7dd0415 Kostas Papadimitriou
                                        }
6405 a7dd0415 Kostas Papadimitriou
6406 a7dd0415 Kostas Papadimitriou
                                        // Null the DOM reference to avoid IE6/7/8 leak (#7054)
6407 a7dd0415 Kostas Papadimitriou
                                        if ( data.handle ) {
6408 a7dd0415 Kostas Papadimitriou
                                                data.handle.elem = null;
6409 a7dd0415 Kostas Papadimitriou
                                        }
6410 a7dd0415 Kostas Papadimitriou
                                }
6411 a7dd0415 Kostas Papadimitriou
6412 a7dd0415 Kostas Papadimitriou
                                if ( deleteExpando ) {
6413 a7dd0415 Kostas Papadimitriou
                                        delete elem[ jQuery.expando ];
6414 a7dd0415 Kostas Papadimitriou
6415 a7dd0415 Kostas Papadimitriou
                                } else if ( elem.removeAttribute ) {
6416 a7dd0415 Kostas Papadimitriou
                                        elem.removeAttribute( jQuery.expando );
6417 a7dd0415 Kostas Papadimitriou
                                }
6418 a7dd0415 Kostas Papadimitriou
6419 a7dd0415 Kostas Papadimitriou
                                delete cache[ id ];
6420 a7dd0415 Kostas Papadimitriou
                        }
6421 a7dd0415 Kostas Papadimitriou
                }
6422 a7dd0415 Kostas Papadimitriou
        }
6423 a7dd0415 Kostas Papadimitriou
});
6424 a7dd0415 Kostas Papadimitriou
6425 a7dd0415 Kostas Papadimitriou
function evalScript( i, elem ) {
6426 a7dd0415 Kostas Papadimitriou
        if ( elem.src ) {
6427 a7dd0415 Kostas Papadimitriou
                jQuery.ajax({
6428 a7dd0415 Kostas Papadimitriou
                        url: elem.src,
6429 a7dd0415 Kostas Papadimitriou
                        async: false,
6430 a7dd0415 Kostas Papadimitriou
                        dataType: "script"
6431 a7dd0415 Kostas Papadimitriou
                });
6432 a7dd0415 Kostas Papadimitriou
        } else {
6433 a7dd0415 Kostas Papadimitriou
                jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
6434 a7dd0415 Kostas Papadimitriou
        }
6435 a7dd0415 Kostas Papadimitriou
6436 a7dd0415 Kostas Papadimitriou
        if ( elem.parentNode ) {
6437 a7dd0415 Kostas Papadimitriou
                elem.parentNode.removeChild( elem );
6438 a7dd0415 Kostas Papadimitriou
        }
6439 a7dd0415 Kostas Papadimitriou
}
6440 a7dd0415 Kostas Papadimitriou
6441 a7dd0415 Kostas Papadimitriou
6442 a7dd0415 Kostas Papadimitriou
6443 a7dd0415 Kostas Papadimitriou
6444 a7dd0415 Kostas Papadimitriou
var ralpha = /alpha\([^)]*\)/i,
6445 a7dd0415 Kostas Papadimitriou
        ropacity = /opacity=([^)]*)/,
6446 a7dd0415 Kostas Papadimitriou
        // fixed for IE9, see #8346
6447 a7dd0415 Kostas Papadimitriou
        rupper = /([A-Z]|^ms)/g,
6448 a7dd0415 Kostas Papadimitriou
        rnumpx = /^-?\d+(?:px)?$/i,
6449 a7dd0415 Kostas Papadimitriou
        rnum = /^-?\d/,
6450 a7dd0415 Kostas Papadimitriou
        rrelNum = /^([\-+])=([\-+.\de]+)/,
6451 a7dd0415 Kostas Papadimitriou
6452 a7dd0415 Kostas Papadimitriou
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6453 a7dd0415 Kostas Papadimitriou
        cssWidth = [ "Left", "Right" ],
6454 a7dd0415 Kostas Papadimitriou
        cssHeight = [ "Top", "Bottom" ],
6455 a7dd0415 Kostas Papadimitriou
        curCSS,
6456 a7dd0415 Kostas Papadimitriou
6457 a7dd0415 Kostas Papadimitriou
        getComputedStyle,
6458 a7dd0415 Kostas Papadimitriou
        currentStyle;
6459 a7dd0415 Kostas Papadimitriou
6460 a7dd0415 Kostas Papadimitriou
jQuery.fn.css = function( name, value ) {
6461 a7dd0415 Kostas Papadimitriou
        // Setting 'undefined' is a no-op
6462 a7dd0415 Kostas Papadimitriou
        if ( arguments.length === 2 && value === undefined ) {
6463 a7dd0415 Kostas Papadimitriou
                return this;
6464 a7dd0415 Kostas Papadimitriou
        }
6465 a7dd0415 Kostas Papadimitriou
6466 a7dd0415 Kostas Papadimitriou
        return jQuery.access( this, name, value, true, function( elem, name, value ) {
6467 a7dd0415 Kostas Papadimitriou
                return value !== undefined ?
6468 a7dd0415 Kostas Papadimitriou
                        jQuery.style( elem, name, value ) :
6469 a7dd0415 Kostas Papadimitriou
                        jQuery.css( elem, name );
6470 a7dd0415 Kostas Papadimitriou
        });
6471 a7dd0415 Kostas Papadimitriou
};
6472 a7dd0415 Kostas Papadimitriou
6473 a7dd0415 Kostas Papadimitriou
jQuery.extend({
6474 a7dd0415 Kostas Papadimitriou
        // Add in style property hooks for overriding the default
6475 a7dd0415 Kostas Papadimitriou
        // behavior of getting and setting a style property
6476 a7dd0415 Kostas Papadimitriou
        cssHooks: {
6477 a7dd0415 Kostas Papadimitriou
                opacity: {
6478 a7dd0415 Kostas Papadimitriou
                        get: function( elem, computed ) {
6479 a7dd0415 Kostas Papadimitriou
                                if ( computed ) {
6480 a7dd0415 Kostas Papadimitriou
                                        // We should always get a number back from opacity
6481 a7dd0415 Kostas Papadimitriou
                                        var ret = curCSS( elem, "opacity", "opacity" );
6482 a7dd0415 Kostas Papadimitriou
                                        return ret === "" ? "1" : ret;
6483 a7dd0415 Kostas Papadimitriou
6484 a7dd0415 Kostas Papadimitriou
                                } else {
6485 a7dd0415 Kostas Papadimitriou
                                        return elem.style.opacity;
6486 a7dd0415 Kostas Papadimitriou
                                }
6487 a7dd0415 Kostas Papadimitriou
                        }
6488 a7dd0415 Kostas Papadimitriou
                }
6489 a7dd0415 Kostas Papadimitriou
        },
6490 a7dd0415 Kostas Papadimitriou
6491 a7dd0415 Kostas Papadimitriou
        // Exclude the following css properties to add px
6492 a7dd0415 Kostas Papadimitriou
        cssNumber: {
6493 a7dd0415 Kostas Papadimitriou
                "fillOpacity": true,
6494 a7dd0415 Kostas Papadimitriou
                "fontWeight": true,
6495 a7dd0415 Kostas Papadimitriou
                "lineHeight": true,
6496 a7dd0415 Kostas Papadimitriou
                "opacity": true,
6497 a7dd0415 Kostas Papadimitriou
                "orphans": true,
6498 a7dd0415 Kostas Papadimitriou
                "widows": true,
6499 a7dd0415 Kostas Papadimitriou
                "zIndex": true,
6500 a7dd0415 Kostas Papadimitriou
                "zoom": true
6501 a7dd0415 Kostas Papadimitriou
        },
6502 a7dd0415 Kostas Papadimitriou
6503 a7dd0415 Kostas Papadimitriou
        // Add in properties whose names you wish to fix before
6504 a7dd0415 Kostas Papadimitriou
        // setting or getting the value
6505 a7dd0415 Kostas Papadimitriou
        cssProps: {
6506 a7dd0415 Kostas Papadimitriou
                // normalize float css property
6507 a7dd0415 Kostas Papadimitriou
                "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6508 a7dd0415 Kostas Papadimitriou
        },
6509 a7dd0415 Kostas Papadimitriou
6510 a7dd0415 Kostas Papadimitriou
        // Get and set the style property on a DOM Node
6511 a7dd0415 Kostas Papadimitriou
        style: function( elem, name, value, extra ) {
6512 a7dd0415 Kostas Papadimitriou
                // Don't set styles on text and comment nodes
6513 a7dd0415 Kostas Papadimitriou
                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6514 a7dd0415 Kostas Papadimitriou
                        return;
6515 a7dd0415 Kostas Papadimitriou
                }
6516 a7dd0415 Kostas Papadimitriou
6517 a7dd0415 Kostas Papadimitriou
                // Make sure that we're working with the right name
6518 a7dd0415 Kostas Papadimitriou
                var ret, type, origName = jQuery.camelCase( name ),
6519 a7dd0415 Kostas Papadimitriou
                        style = elem.style, hooks = jQuery.cssHooks[ origName ];
6520 a7dd0415 Kostas Papadimitriou
6521 a7dd0415 Kostas Papadimitriou
                name = jQuery.cssProps[ origName ] || origName;
6522 a7dd0415 Kostas Papadimitriou
6523 a7dd0415 Kostas Papadimitriou
                // Check if we're setting a value
6524 a7dd0415 Kostas Papadimitriou
                if ( value !== undefined ) {
6525 a7dd0415 Kostas Papadimitriou
                        type = typeof value;
6526 a7dd0415 Kostas Papadimitriou
6527 a7dd0415 Kostas Papadimitriou
                        // convert relative number strings (+= or -=) to relative numbers. #7345
6528 a7dd0415 Kostas Papadimitriou
                        if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6529 a7dd0415 Kostas Papadimitriou
                                value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
6530 a7dd0415 Kostas Papadimitriou
                                // Fixes bug #9237
6531 a7dd0415 Kostas Papadimitriou
                                type = "number";
6532 a7dd0415 Kostas Papadimitriou
                        }
6533 a7dd0415 Kostas Papadimitriou
6534 a7dd0415 Kostas Papadimitriou
                        // Make sure that NaN and null values aren't set. See: #7116
6535 a7dd0415 Kostas Papadimitriou
                        if ( value == null || type === "number" && isNaN( value ) ) {
6536 a7dd0415 Kostas Papadimitriou
                                return;
6537 a7dd0415 Kostas Papadimitriou
                        }
6538 a7dd0415 Kostas Papadimitriou
6539 a7dd0415 Kostas Papadimitriou
                        // If a number was passed in, add 'px' to the (except for certain CSS properties)
6540 a7dd0415 Kostas Papadimitriou
                        if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6541 a7dd0415 Kostas Papadimitriou
                                value += "px";
6542 a7dd0415 Kostas Papadimitriou
                        }
6543 a7dd0415 Kostas Papadimitriou
6544 a7dd0415 Kostas Papadimitriou
                        // If a hook was provided, use that value, otherwise just set the specified value
6545 a7dd0415 Kostas Papadimitriou
                        if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
6546 a7dd0415 Kostas Papadimitriou
                                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6547 a7dd0415 Kostas Papadimitriou
                                // Fixes bug #5509
6548 a7dd0415 Kostas Papadimitriou
                                try {
6549 a7dd0415 Kostas Papadimitriou
                                        style[ name ] = value;
6550 a7dd0415 Kostas Papadimitriou
                                } catch(e) {}
6551 a7dd0415 Kostas Papadimitriou
                        }
6552 a7dd0415 Kostas Papadimitriou
6553 a7dd0415 Kostas Papadimitriou
                } else {
6554 a7dd0415 Kostas Papadimitriou
                        // If a hook was provided get the non-computed value from there
6555 a7dd0415 Kostas Papadimitriou
                        if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6556 a7dd0415 Kostas Papadimitriou
                                return ret;
6557 a7dd0415 Kostas Papadimitriou
                        }
6558 a7dd0415 Kostas Papadimitriou
6559 a7dd0415 Kostas Papadimitriou
                        // Otherwise just get the value from the style object
6560 a7dd0415 Kostas Papadimitriou
                        return style[ name ];
6561 a7dd0415 Kostas Papadimitriou
                }
6562 a7dd0415 Kostas Papadimitriou
        },
6563 a7dd0415 Kostas Papadimitriou
6564 a7dd0415 Kostas Papadimitriou
        css: function( elem, name, extra ) {
6565 a7dd0415 Kostas Papadimitriou
                var ret, hooks;
6566 a7dd0415 Kostas Papadimitriou
6567 a7dd0415 Kostas Papadimitriou
                // Make sure that we're working with the right name
6568 a7dd0415 Kostas Papadimitriou
                name = jQuery.camelCase( name );
6569 a7dd0415 Kostas Papadimitriou
                hooks = jQuery.cssHooks[ name ];
6570 a7dd0415 Kostas Papadimitriou
                name = jQuery.cssProps[ name ] || name;
6571 a7dd0415 Kostas Papadimitriou
6572 a7dd0415 Kostas Papadimitriou
                // cssFloat needs a special treatment
6573 a7dd0415 Kostas Papadimitriou
                if ( name === "cssFloat" ) {
6574 a7dd0415 Kostas Papadimitriou
                        name = "float";
6575 a7dd0415 Kostas Papadimitriou
                }
6576 a7dd0415 Kostas Papadimitriou
6577 a7dd0415 Kostas Papadimitriou
                // If a hook was provided get the computed value from there
6578 a7dd0415 Kostas Papadimitriou
                if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
6579 a7dd0415 Kostas Papadimitriou
                        return ret;
6580 a7dd0415 Kostas Papadimitriou
6581 a7dd0415 Kostas Papadimitriou
                // Otherwise, if a way to get the computed value exists, use that
6582 a7dd0415 Kostas Papadimitriou
                } else if ( curCSS ) {
6583 a7dd0415 Kostas Papadimitriou
                        return curCSS( elem, name );
6584 a7dd0415 Kostas Papadimitriou
                }
6585 a7dd0415 Kostas Papadimitriou
        },
6586 a7dd0415 Kostas Papadimitriou
6587 a7dd0415 Kostas Papadimitriou
        // A method for quickly swapping in/out CSS properties to get correct calculations
6588 a7dd0415 Kostas Papadimitriou
        swap: function( elem, options, callback ) {
6589 a7dd0415 Kostas Papadimitriou
                var old = {};
6590 a7dd0415 Kostas Papadimitriou
6591 a7dd0415 Kostas Papadimitriou
                // Remember the old values, and insert the new ones
6592 a7dd0415 Kostas Papadimitriou
                for ( var name in options ) {
6593 a7dd0415 Kostas Papadimitriou
                        old[ name ] = elem.style[ name ];
6594 a7dd0415 Kostas Papadimitriou
                        elem.style[ name ] = options[ name ];
6595 a7dd0415 Kostas Papadimitriou
                }
6596 a7dd0415 Kostas Papadimitriou
6597 a7dd0415 Kostas Papadimitriou
                callback.call( elem );
6598 a7dd0415 Kostas Papadimitriou
6599 a7dd0415 Kostas Papadimitriou
                // Revert the old values
6600 a7dd0415 Kostas Papadimitriou
                for ( name in options ) {
6601 a7dd0415 Kostas Papadimitriou
                        elem.style[ name ] = old[ name ];
6602 a7dd0415 Kostas Papadimitriou
                }
6603 a7dd0415 Kostas Papadimitriou
        }
6604 a7dd0415 Kostas Papadimitriou
});
6605 a7dd0415 Kostas Papadimitriou
6606 a7dd0415 Kostas Papadimitriou
// DEPRECATED, Use jQuery.css() instead
6607 a7dd0415 Kostas Papadimitriou
jQuery.curCSS = jQuery.css;
6608 a7dd0415 Kostas Papadimitriou
6609 a7dd0415 Kostas Papadimitriou
jQuery.each(["height", "width"], function( i, name ) {
6610 a7dd0415 Kostas Papadimitriou
        jQuery.cssHooks[ name ] = {
6611 a7dd0415 Kostas Papadimitriou
                get: function( elem, computed, extra ) {
6612 a7dd0415 Kostas Papadimitriou
                        var val;
6613 a7dd0415 Kostas Papadimitriou
6614 a7dd0415 Kostas Papadimitriou
                        if ( computed ) {
6615 a7dd0415 Kostas Papadimitriou
                                if ( elem.offsetWidth !== 0 ) {
6616 a7dd0415 Kostas Papadimitriou
                                        return getWH( elem, name, extra );
6617 a7dd0415 Kostas Papadimitriou
                                } else {
6618 a7dd0415 Kostas Papadimitriou
                                        jQuery.swap( elem, cssShow, function() {
6619 a7dd0415 Kostas Papadimitriou
                                                val = getWH( elem, name, extra );
6620 a7dd0415 Kostas Papadimitriou
                                        });
6621 a7dd0415 Kostas Papadimitriou
                                }
6622 a7dd0415 Kostas Papadimitriou
6623 a7dd0415 Kostas Papadimitriou
                                return val;
6624 a7dd0415 Kostas Papadimitriou
                        }
6625 a7dd0415 Kostas Papadimitriou
                },
6626 a7dd0415 Kostas Papadimitriou
6627 a7dd0415 Kostas Papadimitriou
                set: function( elem, value ) {
6628 a7dd0415 Kostas Papadimitriou
                        if ( rnumpx.test( value ) ) {
6629 a7dd0415 Kostas Papadimitriou
                                // ignore negative width and height values #1599
6630 a7dd0415 Kostas Papadimitriou
                                value = parseFloat( value );
6631 a7dd0415 Kostas Papadimitriou
6632 a7dd0415 Kostas Papadimitriou
                                if ( value >= 0 ) {
6633 a7dd0415 Kostas Papadimitriou
                                        return value + "px";
6634 a7dd0415 Kostas Papadimitriou
                                }
6635 a7dd0415 Kostas Papadimitriou
6636 a7dd0415 Kostas Papadimitriou
                        } else {
6637 a7dd0415 Kostas Papadimitriou
                                return value;
6638 a7dd0415 Kostas Papadimitriou
                        }
6639 a7dd0415 Kostas Papadimitriou
                }
6640 a7dd0415 Kostas Papadimitriou
        };
6641 a7dd0415 Kostas Papadimitriou
});
6642 a7dd0415 Kostas Papadimitriou
6643 a7dd0415 Kostas Papadimitriou
if ( !jQuery.support.opacity ) {
6644 a7dd0415 Kostas Papadimitriou
        jQuery.cssHooks.opacity = {
6645 a7dd0415 Kostas Papadimitriou
                get: function( elem, computed ) {
6646 a7dd0415 Kostas Papadimitriou
                        // IE uses filters for opacity
6647 a7dd0415 Kostas Papadimitriou
                        return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6648 a7dd0415 Kostas Papadimitriou
                                ( parseFloat( RegExp.$1 ) / 100 ) + "" :
6649 a7dd0415 Kostas Papadimitriou
                                computed ? "1" : "";
6650 a7dd0415 Kostas Papadimitriou
                },
6651 a7dd0415 Kostas Papadimitriou
6652 a7dd0415 Kostas Papadimitriou
                set: function( elem, value ) {
6653 a7dd0415 Kostas Papadimitriou
                        var style = elem.style,
6654 a7dd0415 Kostas Papadimitriou
                                currentStyle = elem.currentStyle,
6655 a7dd0415 Kostas Papadimitriou
                                opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
6656 a7dd0415 Kostas Papadimitriou
                                filter = currentStyle && currentStyle.filter || style.filter || "";
6657 a7dd0415 Kostas Papadimitriou
6658 a7dd0415 Kostas Papadimitriou
                        // IE has trouble with opacity if it does not have layout
6659 a7dd0415 Kostas Papadimitriou
                        // Force it by setting the zoom level
6660 a7dd0415 Kostas Papadimitriou
                        style.zoom = 1;
6661 a7dd0415 Kostas Papadimitriou
6662 a7dd0415 Kostas Papadimitriou
                        // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
6663 a7dd0415 Kostas Papadimitriou
                        if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
6664 a7dd0415 Kostas Papadimitriou
6665 a7dd0415 Kostas Papadimitriou
                                // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
6666 a7dd0415 Kostas Papadimitriou
                                // if "filter:" is present at all, clearType is disabled, we want to avoid this
6667 a7dd0415 Kostas Papadimitriou
                                // style.removeAttribute is IE Only, but so apparently is this code path...
6668 a7dd0415 Kostas Papadimitriou
                                style.removeAttribute( "filter" );
6669 a7dd0415 Kostas Papadimitriou
6670 a7dd0415 Kostas Papadimitriou
                                // if there there is no filter style applied in a css rule, we are done
6671 a7dd0415 Kostas Papadimitriou
                                if ( currentStyle && !currentStyle.filter ) {
6672 a7dd0415 Kostas Papadimitriou
                                        return;
6673 a7dd0415 Kostas Papadimitriou
                                }
6674 a7dd0415 Kostas Papadimitriou
                        }
6675 a7dd0415 Kostas Papadimitriou
6676 a7dd0415 Kostas Papadimitriou
                        // otherwise, set new filter values
6677 a7dd0415 Kostas Papadimitriou
                        style.filter = ralpha.test( filter ) ?
6678 a7dd0415 Kostas Papadimitriou
                                filter.replace( ralpha, opacity ) :
6679 a7dd0415 Kostas Papadimitriou
                                filter + " " + opacity;
6680 a7dd0415 Kostas Papadimitriou
                }
6681 a7dd0415 Kostas Papadimitriou
        };
6682 a7dd0415 Kostas Papadimitriou
}
6683 a7dd0415 Kostas Papadimitriou
6684 a7dd0415 Kostas Papadimitriou
jQuery(function() {
6685 a7dd0415 Kostas Papadimitriou
        // This hook cannot be added until DOM ready because the support test
6686 a7dd0415 Kostas Papadimitriou
        // for it is not run until after DOM ready
6687 a7dd0415 Kostas Papadimitriou
        if ( !jQuery.support.reliableMarginRight ) {
6688 a7dd0415 Kostas Papadimitriou
                jQuery.cssHooks.marginRight = {
6689 a7dd0415 Kostas Papadimitriou
                        get: function( elem, computed ) {
6690 a7dd0415 Kostas Papadimitriou
                                // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6691 a7dd0415 Kostas Papadimitriou
                                // Work around by temporarily setting element display to inline-block
6692 a7dd0415 Kostas Papadimitriou
                                var ret;
6693 a7dd0415 Kostas Papadimitriou
                                jQuery.swap( elem, { "display": "inline-block" }, function() {
6694 a7dd0415 Kostas Papadimitriou
                                        if ( computed ) {
6695 a7dd0415 Kostas Papadimitriou
                                                ret = curCSS( elem, "margin-right", "marginRight" );
6696 a7dd0415 Kostas Papadimitriou
                                        } else {
6697 a7dd0415 Kostas Papadimitriou
                                                ret = elem.style.marginRight;
6698 a7dd0415 Kostas Papadimitriou
                                        }
6699 a7dd0415 Kostas Papadimitriou
                                });
6700 a7dd0415 Kostas Papadimitriou
                                return ret;
6701 a7dd0415 Kostas Papadimitriou
                        }
6702 a7dd0415 Kostas Papadimitriou
                };
6703 a7dd0415 Kostas Papadimitriou
        }
6704 a7dd0415 Kostas Papadimitriou
});
6705 a7dd0415 Kostas Papadimitriou
6706 a7dd0415 Kostas Papadimitriou
if ( document.defaultView && document.defaultView.getComputedStyle ) {
6707 a7dd0415 Kostas Papadimitriou
        getComputedStyle = function( elem, name ) {
6708 a7dd0415 Kostas Papadimitriou
                var ret, defaultView, computedStyle;
6709 a7dd0415 Kostas Papadimitriou
6710 a7dd0415 Kostas Papadimitriou
                name = name.replace( rupper, "-$1" ).toLowerCase();
6711 a7dd0415 Kostas Papadimitriou
6712 a7dd0415 Kostas Papadimitriou
                if ( (defaultView = elem.ownerDocument.defaultView) &&
6713 a7dd0415 Kostas Papadimitriou
                                (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
6714 a7dd0415 Kostas Papadimitriou
                        ret = computedStyle.getPropertyValue( name );
6715 a7dd0415 Kostas Papadimitriou
                        if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
6716 a7dd0415 Kostas Papadimitriou
                                ret = jQuery.style( elem, name );
6717 a7dd0415 Kostas Papadimitriou
                        }
6718 a7dd0415 Kostas Papadimitriou
                }
6719 a7dd0415 Kostas Papadimitriou
6720 a7dd0415 Kostas Papadimitriou
                return ret;
6721 a7dd0415 Kostas Papadimitriou
        };
6722 a7dd0415 Kostas Papadimitriou
}
6723 a7dd0415 Kostas Papadimitriou
6724 a7dd0415 Kostas Papadimitriou
if ( document.documentElement.currentStyle ) {
6725 a7dd0415 Kostas Papadimitriou
        currentStyle = function( elem, name ) {
6726 a7dd0415 Kostas Papadimitriou
                var left, rsLeft, uncomputed,
6727 a7dd0415 Kostas Papadimitriou
                        ret = elem.currentStyle && elem.currentStyle[ name ],
6728 a7dd0415 Kostas Papadimitriou
                        style = elem.style;
6729 a7dd0415 Kostas Papadimitriou
6730 a7dd0415 Kostas Papadimitriou
                // Avoid setting ret to empty string here
6731 a7dd0415 Kostas Papadimitriou
                // so we don't default to auto
6732 a7dd0415 Kostas Papadimitriou
                if ( ret === null && style && (uncomputed = style[ name ]) ) {
6733 a7dd0415 Kostas Papadimitriou
                        ret = uncomputed;
6734 a7dd0415 Kostas Papadimitriou
                }
6735 a7dd0415 Kostas Papadimitriou
6736 a7dd0415 Kostas Papadimitriou
                // From the awesome hack by Dean Edwards
6737 a7dd0415 Kostas Papadimitriou
                // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6738 a7dd0415 Kostas Papadimitriou
6739 a7dd0415 Kostas Papadimitriou
                // If we're not dealing with a regular pixel number
6740 a7dd0415 Kostas Papadimitriou
                // but a number that has a weird ending, we need to convert it to pixels
6741 a7dd0415 Kostas Papadimitriou
                if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
6742 a7dd0415 Kostas Papadimitriou
6743 a7dd0415 Kostas Papadimitriou
                        // Remember the original values
6744 a7dd0415 Kostas Papadimitriou
                        left = style.left;
6745 a7dd0415 Kostas Papadimitriou
                        rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
6746 a7dd0415 Kostas Papadimitriou
6747 a7dd0415 Kostas Papadimitriou
                        // Put in the new values to get a computed value out
6748 a7dd0415 Kostas Papadimitriou
                        if ( rsLeft ) {
6749 a7dd0415 Kostas Papadimitriou
                                elem.runtimeStyle.left = elem.currentStyle.left;
6750 a7dd0415 Kostas Papadimitriou
                        }
6751 a7dd0415 Kostas Papadimitriou
                        style.left = name === "fontSize" ? "1em" : ( ret || 0 );
6752 a7dd0415 Kostas Papadimitriou
                        ret = style.pixelLeft + "px";
6753 a7dd0415 Kostas Papadimitriou
6754 a7dd0415 Kostas Papadimitriou
                        // Revert the changed values
6755 a7dd0415 Kostas Papadimitriou
                        style.left = left;
6756 a7dd0415 Kostas Papadimitriou
                        if ( rsLeft ) {
6757 a7dd0415 Kostas Papadimitriou
                                elem.runtimeStyle.left = rsLeft;
6758 a7dd0415 Kostas Papadimitriou
                        }
6759 a7dd0415 Kostas Papadimitriou
                }
6760 a7dd0415 Kostas Papadimitriou
6761 a7dd0415 Kostas Papadimitriou
                return ret === "" ? "auto" : ret;
6762 a7dd0415 Kostas Papadimitriou
        };
6763 a7dd0415 Kostas Papadimitriou
}
6764 a7dd0415 Kostas Papadimitriou
6765 a7dd0415 Kostas Papadimitriou
curCSS = getComputedStyle || currentStyle;
6766 a7dd0415 Kostas Papadimitriou
6767 a7dd0415 Kostas Papadimitriou
function getWH( elem, name, extra ) {
6768 a7dd0415 Kostas Papadimitriou
6769 a7dd0415 Kostas Papadimitriou
        // Start with offset property
6770 a7dd0415 Kostas Papadimitriou
        var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6771 a7dd0415 Kostas Papadimitriou
                which = name === "width" ? cssWidth : cssHeight,
6772 a7dd0415 Kostas Papadimitriou
                i = 0,
6773 a7dd0415 Kostas Papadimitriou
                len = which.length;
6774 a7dd0415 Kostas Papadimitriou
6775 a7dd0415 Kostas Papadimitriou
        if ( val > 0 ) {
6776 a7dd0415 Kostas Papadimitriou
                if ( extra !== "border" ) {
6777 a7dd0415 Kostas Papadimitriou
                        for ( ; i < len; i++ ) {
6778 a7dd0415 Kostas Papadimitriou
                                if ( !extra ) {
6779 a7dd0415 Kostas Papadimitriou
                                        val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
6780 a7dd0415 Kostas Papadimitriou
                                }
6781 a7dd0415 Kostas Papadimitriou
                                if ( extra === "margin" ) {
6782 a7dd0415 Kostas Papadimitriou
                                        val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
6783 a7dd0415 Kostas Papadimitriou
                                } else {
6784 a7dd0415 Kostas Papadimitriou
                                        val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
6785 a7dd0415 Kostas Papadimitriou
                                }
6786 a7dd0415 Kostas Papadimitriou
                        }
6787 a7dd0415 Kostas Papadimitriou
                }
6788 a7dd0415 Kostas Papadimitriou
6789 a7dd0415 Kostas Papadimitriou
                return val + "px";
6790 a7dd0415 Kostas Papadimitriou
        }
6791 a7dd0415 Kostas Papadimitriou
6792 a7dd0415 Kostas Papadimitriou
        // Fall back to computed then uncomputed css if necessary
6793 a7dd0415 Kostas Papadimitriou
        val = curCSS( elem, name, name );
6794 a7dd0415 Kostas Papadimitriou
        if ( val < 0 || val == null ) {
6795 a7dd0415 Kostas Papadimitriou
                val = elem.style[ name ] || 0;
6796 a7dd0415 Kostas Papadimitriou
        }
6797 a7dd0415 Kostas Papadimitriou
        // Normalize "", auto, and prepare for extra
6798 a7dd0415 Kostas Papadimitriou
        val = parseFloat( val ) || 0;
6799 a7dd0415 Kostas Papadimitriou
6800 a7dd0415 Kostas Papadimitriou
        // Add padding, border, margin
6801 a7dd0415 Kostas Papadimitriou
        if ( extra ) {
6802 a7dd0415 Kostas Papadimitriou
                for ( ; i < len; i++ ) {
6803 a7dd0415 Kostas Papadimitriou
                        val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
6804 a7dd0415 Kostas Papadimitriou
                        if ( extra !== "padding" ) {
6805 a7dd0415 Kostas Papadimitriou
                                val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
6806 a7dd0415 Kostas Papadimitriou
                        }
6807 a7dd0415 Kostas Papadimitriou
                        if ( extra === "margin" ) {
6808 a7dd0415 Kostas Papadimitriou
                                val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
6809 a7dd0415 Kostas Papadimitriou
                        }
6810 a7dd0415 Kostas Papadimitriou
                }
6811 a7dd0415 Kostas Papadimitriou
        }
6812 a7dd0415 Kostas Papadimitriou
6813 a7dd0415 Kostas Papadimitriou
        return val + "px";
6814 a7dd0415 Kostas Papadimitriou
}
6815 a7dd0415 Kostas Papadimitriou
6816 a7dd0415 Kostas Papadimitriou
if ( jQuery.expr && jQuery.expr.filters ) {
6817 a7dd0415 Kostas Papadimitriou
        jQuery.expr.filters.hidden = function( elem ) {
6818 a7dd0415 Kostas Papadimitriou
                var width = elem.offsetWidth,
6819 a7dd0415 Kostas Papadimitriou
                        height = elem.offsetHeight;
6820 a7dd0415 Kostas Papadimitriou
6821 a7dd0415 Kostas Papadimitriou
                return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
6822 a7dd0415 Kostas Papadimitriou
        };
6823 a7dd0415 Kostas Papadimitriou
6824 a7dd0415 Kostas Papadimitriou
        jQuery.expr.filters.visible = function( elem ) {
6825 a7dd0415 Kostas Papadimitriou
                return !jQuery.expr.filters.hidden( elem );
6826 a7dd0415 Kostas Papadimitriou
        };
6827 a7dd0415 Kostas Papadimitriou
}
6828 a7dd0415 Kostas Papadimitriou
6829 a7dd0415 Kostas Papadimitriou
6830 a7dd0415 Kostas Papadimitriou
6831 a7dd0415 Kostas Papadimitriou
6832 a7dd0415 Kostas Papadimitriou
var r20 = /%20/g,
6833 a7dd0415 Kostas Papadimitriou
        rbracket = /\[\]$/,
6834 a7dd0415 Kostas Papadimitriou
        rCRLF = /\r?\n/g,
6835 a7dd0415 Kostas Papadimitriou
        rhash = /#.*$/,
6836 a7dd0415 Kostas Papadimitriou
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
6837 a7dd0415 Kostas Papadimitriou
        rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
6838 a7dd0415 Kostas Papadimitriou
        // #7653, #8125, #8152: local protocol detection
6839 a7dd0415 Kostas Papadimitriou
        rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
6840 a7dd0415 Kostas Papadimitriou
        rnoContent = /^(?:GET|HEAD)$/,
6841 a7dd0415 Kostas Papadimitriou
        rprotocol = /^\/\//,
6842 a7dd0415 Kostas Papadimitriou
        rquery = /\?/,
6843 a7dd0415 Kostas Papadimitriou
        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
6844 a7dd0415 Kostas Papadimitriou
        rselectTextarea = /^(?:select|textarea)/i,
6845 a7dd0415 Kostas Papadimitriou
        rspacesAjax = /\s+/,
6846 a7dd0415 Kostas Papadimitriou
        rts = /([?&])_=[^&]*/,
6847 a7dd0415 Kostas Papadimitriou
        rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
6848 a7dd0415 Kostas Papadimitriou
6849 a7dd0415 Kostas Papadimitriou
        // Keep a copy of the old load method
6850 a7dd0415 Kostas Papadimitriou
        _load = jQuery.fn.load,
6851 a7dd0415 Kostas Papadimitriou
6852 a7dd0415 Kostas Papadimitriou
        /* Prefilters
6853 a7dd0415 Kostas Papadimitriou
         * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6854 a7dd0415 Kostas Papadimitriou
         * 2) These are called:
6855 a7dd0415 Kostas Papadimitriou
         *    - BEFORE asking for a transport
6856 a7dd0415 Kostas Papadimitriou
         *    - AFTER param serialization (s.data is a string if s.processData is true)
6857 a7dd0415 Kostas Papadimitriou
         * 3) key is the dataType
6858 a7dd0415 Kostas Papadimitriou
         * 4) the catchall symbol "*" can be used
6859 a7dd0415 Kostas Papadimitriou
         * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6860 a7dd0415 Kostas Papadimitriou
         */
6861 a7dd0415 Kostas Papadimitriou
        prefilters = {},
6862 a7dd0415 Kostas Papadimitriou
6863 a7dd0415 Kostas Papadimitriou
        /* Transports bindings
6864 a7dd0415 Kostas Papadimitriou
         * 1) key is the dataType
6865 a7dd0415 Kostas Papadimitriou
         * 2) the catchall symbol "*" can be used
6866 a7dd0415 Kostas Papadimitriou
         * 3) selection will start with transport dataType and THEN go to "*" if needed
6867 a7dd0415 Kostas Papadimitriou
         */
6868 a7dd0415 Kostas Papadimitriou
        transports = {},
6869 a7dd0415 Kostas Papadimitriou
6870 a7dd0415 Kostas Papadimitriou
        // Document location
6871 a7dd0415 Kostas Papadimitriou
        ajaxLocation,
6872 a7dd0415 Kostas Papadimitriou
6873 a7dd0415 Kostas Papadimitriou
        // Document location segments
6874 a7dd0415 Kostas Papadimitriou
        ajaxLocParts,
6875 a7dd0415 Kostas Papadimitriou
6876 a7dd0415 Kostas Papadimitriou
        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
6877 a7dd0415 Kostas Papadimitriou
        allTypes = ["*/"] + ["*"];
6878 a7dd0415 Kostas Papadimitriou
6879 a7dd0415 Kostas Papadimitriou
// #8138, IE may throw an exception when accessing
6880 a7dd0415 Kostas Papadimitriou
// a field from window.location if document.domain has been set
6881 a7dd0415 Kostas Papadimitriou
try {
6882 a7dd0415 Kostas Papadimitriou
        ajaxLocation = location.href;
6883 a7dd0415 Kostas Papadimitriou
} catch( e ) {
6884 a7dd0415 Kostas Papadimitriou
        // Use the href attribute of an A element
6885 a7dd0415 Kostas Papadimitriou
        // since IE will modify it given document.location
6886 a7dd0415 Kostas Papadimitriou
        ajaxLocation = document.createElement( "a" );
6887 a7dd0415 Kostas Papadimitriou
        ajaxLocation.href = "";
6888 a7dd0415 Kostas Papadimitriou
        ajaxLocation = ajaxLocation.href;
6889 a7dd0415 Kostas Papadimitriou
}
6890 a7dd0415 Kostas Papadimitriou
6891 a7dd0415 Kostas Papadimitriou
// Segment location into parts
6892 a7dd0415 Kostas Papadimitriou
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
6893 a7dd0415 Kostas Papadimitriou
6894 a7dd0415 Kostas Papadimitriou
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
6895 a7dd0415 Kostas Papadimitriou
function addToPrefiltersOrTransports( structure ) {
6896 a7dd0415 Kostas Papadimitriou
6897 a7dd0415 Kostas Papadimitriou
        // dataTypeExpression is optional and defaults to "*"
6898 a7dd0415 Kostas Papadimitriou
        return function( dataTypeExpression, func ) {
6899 a7dd0415 Kostas Papadimitriou
6900 a7dd0415 Kostas Papadimitriou
                if ( typeof dataTypeExpression !== "string" ) {
6901 a7dd0415 Kostas Papadimitriou
                        func = dataTypeExpression;
6902 a7dd0415 Kostas Papadimitriou
                        dataTypeExpression = "*";
6903 a7dd0415 Kostas Papadimitriou
                }
6904 a7dd0415 Kostas Papadimitriou
6905 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( func ) ) {
6906 a7dd0415 Kostas Papadimitriou
                        var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
6907 a7dd0415 Kostas Papadimitriou
                                i = 0,
6908 a7dd0415 Kostas Papadimitriou
                                length = dataTypes.length,
6909 a7dd0415 Kostas Papadimitriou
                                dataType,
6910 a7dd0415 Kostas Papadimitriou
                                list,
6911 a7dd0415 Kostas Papadimitriou
                                placeBefore;
6912 a7dd0415 Kostas Papadimitriou
6913 a7dd0415 Kostas Papadimitriou
                        // For each dataType in the dataTypeExpression
6914 a7dd0415 Kostas Papadimitriou
                        for ( ; i < length; i++ ) {
6915 a7dd0415 Kostas Papadimitriou
                                dataType = dataTypes[ i ];
6916 a7dd0415 Kostas Papadimitriou
                                // We control if we're asked to add before
6917 a7dd0415 Kostas Papadimitriou
                                // any existing element
6918 a7dd0415 Kostas Papadimitriou
                                placeBefore = /^\+/.test( dataType );
6919 a7dd0415 Kostas Papadimitriou
                                if ( placeBefore ) {
6920 a7dd0415 Kostas Papadimitriou
                                        dataType = dataType.substr( 1 ) || "*";
6921 a7dd0415 Kostas Papadimitriou
                                }
6922 a7dd0415 Kostas Papadimitriou
                                list = structure[ dataType ] = structure[ dataType ] || [];
6923 a7dd0415 Kostas Papadimitriou
                                // then we add to the structure accordingly
6924 a7dd0415 Kostas Papadimitriou
                                list[ placeBefore ? "unshift" : "push" ]( func );
6925 a7dd0415 Kostas Papadimitriou
                        }
6926 a7dd0415 Kostas Papadimitriou
                }
6927 a7dd0415 Kostas Papadimitriou
        };
6928 a7dd0415 Kostas Papadimitriou
}
6929 a7dd0415 Kostas Papadimitriou
6930 a7dd0415 Kostas Papadimitriou
// Base inspection function for prefilters and transports
6931 a7dd0415 Kostas Papadimitriou
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
6932 a7dd0415 Kostas Papadimitriou
                dataType /* internal */, inspected /* internal */ ) {
6933 a7dd0415 Kostas Papadimitriou
6934 a7dd0415 Kostas Papadimitriou
        dataType = dataType || options.dataTypes[ 0 ];
6935 a7dd0415 Kostas Papadimitriou
        inspected = inspected || {};
6936 a7dd0415 Kostas Papadimitriou
6937 a7dd0415 Kostas Papadimitriou
        inspected[ dataType ] = true;
6938 a7dd0415 Kostas Papadimitriou
6939 a7dd0415 Kostas Papadimitriou
        var list = structure[ dataType ],
6940 a7dd0415 Kostas Papadimitriou
                i = 0,
6941 a7dd0415 Kostas Papadimitriou
                length = list ? list.length : 0,
6942 a7dd0415 Kostas Papadimitriou
                executeOnly = ( structure === prefilters ),
6943 a7dd0415 Kostas Papadimitriou
                selection;
6944 a7dd0415 Kostas Papadimitriou
6945 a7dd0415 Kostas Papadimitriou
        for ( ; i < length && ( executeOnly || !selection ); i++ ) {
6946 a7dd0415 Kostas Papadimitriou
                selection = list[ i ]( options, originalOptions, jqXHR );
6947 a7dd0415 Kostas Papadimitriou
                // If we got redirected to another dataType
6948 a7dd0415 Kostas Papadimitriou
                // we try there if executing only and not done already
6949 a7dd0415 Kostas Papadimitriou
                if ( typeof selection === "string" ) {
6950 a7dd0415 Kostas Papadimitriou
                        if ( !executeOnly || inspected[ selection ] ) {
6951 a7dd0415 Kostas Papadimitriou
                                selection = undefined;
6952 a7dd0415 Kostas Papadimitriou
                        } else {
6953 a7dd0415 Kostas Papadimitriou
                                options.dataTypes.unshift( selection );
6954 a7dd0415 Kostas Papadimitriou
                                selection = inspectPrefiltersOrTransports(
6955 a7dd0415 Kostas Papadimitriou
                                                structure, options, originalOptions, jqXHR, selection, inspected );
6956 a7dd0415 Kostas Papadimitriou
                        }
6957 a7dd0415 Kostas Papadimitriou
                }
6958 a7dd0415 Kostas Papadimitriou
        }
6959 a7dd0415 Kostas Papadimitriou
        // If we're only executing or nothing was selected
6960 a7dd0415 Kostas Papadimitriou
        // we try the catchall dataType if not done already
6961 a7dd0415 Kostas Papadimitriou
        if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
6962 a7dd0415 Kostas Papadimitriou
                selection = inspectPrefiltersOrTransports(
6963 a7dd0415 Kostas Papadimitriou
                                structure, options, originalOptions, jqXHR, "*", inspected );
6964 a7dd0415 Kostas Papadimitriou
        }
6965 a7dd0415 Kostas Papadimitriou
        // unnecessary when only executing (prefilters)
6966 a7dd0415 Kostas Papadimitriou
        // but it'll be ignored by the caller in that case
6967 a7dd0415 Kostas Papadimitriou
        return selection;
6968 a7dd0415 Kostas Papadimitriou
}
6969 a7dd0415 Kostas Papadimitriou
6970 a7dd0415 Kostas Papadimitriou
// A special extend for ajax options
6971 a7dd0415 Kostas Papadimitriou
// that takes "flat" options (not to be deep extended)
6972 a7dd0415 Kostas Papadimitriou
// Fixes #9887
6973 a7dd0415 Kostas Papadimitriou
function ajaxExtend( target, src ) {
6974 a7dd0415 Kostas Papadimitriou
        var key, deep,
6975 a7dd0415 Kostas Papadimitriou
                flatOptions = jQuery.ajaxSettings.flatOptions || {};
6976 a7dd0415 Kostas Papadimitriou
        for ( key in src ) {
6977 a7dd0415 Kostas Papadimitriou
                if ( src[ key ] !== undefined ) {
6978 a7dd0415 Kostas Papadimitriou
                        ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
6979 a7dd0415 Kostas Papadimitriou
                }
6980 a7dd0415 Kostas Papadimitriou
        }
6981 a7dd0415 Kostas Papadimitriou
        if ( deep ) {
6982 a7dd0415 Kostas Papadimitriou
                jQuery.extend( true, target, deep );
6983 a7dd0415 Kostas Papadimitriou
        }
6984 a7dd0415 Kostas Papadimitriou
}
6985 a7dd0415 Kostas Papadimitriou
6986 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
6987 a7dd0415 Kostas Papadimitriou
        load: function( url, params, callback ) {
6988 a7dd0415 Kostas Papadimitriou
                if ( typeof url !== "string" && _load ) {
6989 a7dd0415 Kostas Papadimitriou
                        return _load.apply( this, arguments );
6990 a7dd0415 Kostas Papadimitriou
6991 a7dd0415 Kostas Papadimitriou
                // Don't do a request if no elements are being requested
6992 a7dd0415 Kostas Papadimitriou
                } else if ( !this.length ) {
6993 a7dd0415 Kostas Papadimitriou
                        return this;
6994 a7dd0415 Kostas Papadimitriou
                }
6995 a7dd0415 Kostas Papadimitriou
6996 a7dd0415 Kostas Papadimitriou
                var off = url.indexOf( " " );
6997 a7dd0415 Kostas Papadimitriou
                if ( off >= 0 ) {
6998 a7dd0415 Kostas Papadimitriou
                        var selector = url.slice( off, url.length );
6999 a7dd0415 Kostas Papadimitriou
                        url = url.slice( 0, off );
7000 a7dd0415 Kostas Papadimitriou
                }
7001 a7dd0415 Kostas Papadimitriou
7002 a7dd0415 Kostas Papadimitriou
                // Default to a GET request
7003 a7dd0415 Kostas Papadimitriou
                var type = "GET";
7004 a7dd0415 Kostas Papadimitriou
7005 a7dd0415 Kostas Papadimitriou
                // If the second parameter was provided
7006 a7dd0415 Kostas Papadimitriou
                if ( params ) {
7007 a7dd0415 Kostas Papadimitriou
                        // If it's a function
7008 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.isFunction( params ) ) {
7009 a7dd0415 Kostas Papadimitriou
                                // We assume that it's the callback
7010 a7dd0415 Kostas Papadimitriou
                                callback = params;
7011 a7dd0415 Kostas Papadimitriou
                                params = undefined;
7012 a7dd0415 Kostas Papadimitriou
7013 a7dd0415 Kostas Papadimitriou
                        // Otherwise, build a param string
7014 a7dd0415 Kostas Papadimitriou
                        } else if ( typeof params === "object" ) {
7015 a7dd0415 Kostas Papadimitriou
                                params = jQuery.param( params, jQuery.ajaxSettings.traditional );
7016 a7dd0415 Kostas Papadimitriou
                                type = "POST";
7017 a7dd0415 Kostas Papadimitriou
                        }
7018 a7dd0415 Kostas Papadimitriou
                }
7019 a7dd0415 Kostas Papadimitriou
7020 a7dd0415 Kostas Papadimitriou
                var self = this;
7021 a7dd0415 Kostas Papadimitriou
7022 a7dd0415 Kostas Papadimitriou
                // Request the remote document
7023 a7dd0415 Kostas Papadimitriou
                jQuery.ajax({
7024 a7dd0415 Kostas Papadimitriou
                        url: url,
7025 a7dd0415 Kostas Papadimitriou
                        type: type,
7026 a7dd0415 Kostas Papadimitriou
                        dataType: "html",
7027 a7dd0415 Kostas Papadimitriou
                        data: params,
7028 a7dd0415 Kostas Papadimitriou
                        // Complete callback (responseText is used internally)
7029 a7dd0415 Kostas Papadimitriou
                        complete: function( jqXHR, status, responseText ) {
7030 a7dd0415 Kostas Papadimitriou
                                // Store the response as specified by the jqXHR object
7031 a7dd0415 Kostas Papadimitriou
                                responseText = jqXHR.responseText;
7032 a7dd0415 Kostas Papadimitriou
                                // If successful, inject the HTML into all the matched elements
7033 a7dd0415 Kostas Papadimitriou
                                if ( jqXHR.isResolved() ) {
7034 a7dd0415 Kostas Papadimitriou
                                        // #4825: Get the actual response in case
7035 a7dd0415 Kostas Papadimitriou
                                        // a dataFilter is present in ajaxSettings
7036 a7dd0415 Kostas Papadimitriou
                                        jqXHR.done(function( r ) {
7037 a7dd0415 Kostas Papadimitriou
                                                responseText = r;
7038 a7dd0415 Kostas Papadimitriou
                                        });
7039 a7dd0415 Kostas Papadimitriou
                                        // See if a selector was specified
7040 a7dd0415 Kostas Papadimitriou
                                        self.html( selector ?
7041 a7dd0415 Kostas Papadimitriou
                                                // Create a dummy div to hold the results
7042 a7dd0415 Kostas Papadimitriou
                                                jQuery("<div>")
7043 a7dd0415 Kostas Papadimitriou
                                                        // inject the contents of the document in, removing the scripts
7044 a7dd0415 Kostas Papadimitriou
                                                        // to avoid any 'Permission Denied' errors in IE
7045 a7dd0415 Kostas Papadimitriou
                                                        .append(responseText.replace(rscript, ""))
7046 a7dd0415 Kostas Papadimitriou
7047 a7dd0415 Kostas Papadimitriou
                                                        // Locate the specified elements
7048 a7dd0415 Kostas Papadimitriou
                                                        .find(selector) :
7049 a7dd0415 Kostas Papadimitriou
7050 a7dd0415 Kostas Papadimitriou
                                                // If not, just inject the full result
7051 a7dd0415 Kostas Papadimitriou
                                                responseText );
7052 a7dd0415 Kostas Papadimitriou
                                }
7053 a7dd0415 Kostas Papadimitriou
7054 a7dd0415 Kostas Papadimitriou
                                if ( callback ) {
7055 a7dd0415 Kostas Papadimitriou
                                        self.each( callback, [ responseText, status, jqXHR ] );
7056 a7dd0415 Kostas Papadimitriou
                                }
7057 a7dd0415 Kostas Papadimitriou
                        }
7058 a7dd0415 Kostas Papadimitriou
                });
7059 a7dd0415 Kostas Papadimitriou
7060 a7dd0415 Kostas Papadimitriou
                return this;
7061 a7dd0415 Kostas Papadimitriou
        },
7062 a7dd0415 Kostas Papadimitriou
7063 a7dd0415 Kostas Papadimitriou
        serialize: function() {
7064 a7dd0415 Kostas Papadimitriou
                return jQuery.param( this.serializeArray() );
7065 a7dd0415 Kostas Papadimitriou
        },
7066 a7dd0415 Kostas Papadimitriou
7067 a7dd0415 Kostas Papadimitriou
        serializeArray: function() {
7068 a7dd0415 Kostas Papadimitriou
                return this.map(function(){
7069 a7dd0415 Kostas Papadimitriou
                        return this.elements ? jQuery.makeArray( this.elements ) : this;
7070 a7dd0415 Kostas Papadimitriou
                })
7071 a7dd0415 Kostas Papadimitriou
                .filter(function(){
7072 a7dd0415 Kostas Papadimitriou
                        return this.name && !this.disabled &&
7073 a7dd0415 Kostas Papadimitriou
                                ( this.checked || rselectTextarea.test( this.nodeName ) ||
7074 a7dd0415 Kostas Papadimitriou
                                        rinput.test( this.type ) );
7075 a7dd0415 Kostas Papadimitriou
                })
7076 a7dd0415 Kostas Papadimitriou
                .map(function( i, elem ){
7077 a7dd0415 Kostas Papadimitriou
                        var val = jQuery( this ).val();
7078 a7dd0415 Kostas Papadimitriou
7079 a7dd0415 Kostas Papadimitriou
                        return val == null ?
7080 a7dd0415 Kostas Papadimitriou
                                null :
7081 a7dd0415 Kostas Papadimitriou
                                jQuery.isArray( val ) ?
7082 a7dd0415 Kostas Papadimitriou
                                        jQuery.map( val, function( val, i ){
7083 a7dd0415 Kostas Papadimitriou
                                                return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7084 a7dd0415 Kostas Papadimitriou
                                        }) :
7085 a7dd0415 Kostas Papadimitriou
                                        { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7086 a7dd0415 Kostas Papadimitriou
                }).get();
7087 a7dd0415 Kostas Papadimitriou
        }
7088 a7dd0415 Kostas Papadimitriou
});
7089 a7dd0415 Kostas Papadimitriou
7090 a7dd0415 Kostas Papadimitriou
// Attach a bunch of functions for handling common AJAX events
7091 a7dd0415 Kostas Papadimitriou
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
7092 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ o ] = function( f ){
7093 a7dd0415 Kostas Papadimitriou
                return this.on( o, f );
7094 a7dd0415 Kostas Papadimitriou
        };
7095 a7dd0415 Kostas Papadimitriou
});
7096 a7dd0415 Kostas Papadimitriou
7097 a7dd0415 Kostas Papadimitriou
jQuery.each( [ "get", "post" ], function( i, method ) {
7098 a7dd0415 Kostas Papadimitriou
        jQuery[ method ] = function( url, data, callback, type ) {
7099 a7dd0415 Kostas Papadimitriou
                // shift arguments if data argument was omitted
7100 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( data ) ) {
7101 a7dd0415 Kostas Papadimitriou
                        type = type || callback;
7102 a7dd0415 Kostas Papadimitriou
                        callback = data;
7103 a7dd0415 Kostas Papadimitriou
                        data = undefined;
7104 a7dd0415 Kostas Papadimitriou
                }
7105 a7dd0415 Kostas Papadimitriou
7106 a7dd0415 Kostas Papadimitriou
                return jQuery.ajax({
7107 a7dd0415 Kostas Papadimitriou
                        type: method,
7108 a7dd0415 Kostas Papadimitriou
                        url: url,
7109 a7dd0415 Kostas Papadimitriou
                        data: data,
7110 a7dd0415 Kostas Papadimitriou
                        success: callback,
7111 a7dd0415 Kostas Papadimitriou
                        dataType: type
7112 a7dd0415 Kostas Papadimitriou
                });
7113 a7dd0415 Kostas Papadimitriou
        };
7114 a7dd0415 Kostas Papadimitriou
});
7115 a7dd0415 Kostas Papadimitriou
7116 a7dd0415 Kostas Papadimitriou
jQuery.extend({
7117 a7dd0415 Kostas Papadimitriou
7118 a7dd0415 Kostas Papadimitriou
        getScript: function( url, callback ) {
7119 a7dd0415 Kostas Papadimitriou
                return jQuery.get( url, undefined, callback, "script" );
7120 a7dd0415 Kostas Papadimitriou
        },
7121 a7dd0415 Kostas Papadimitriou
7122 a7dd0415 Kostas Papadimitriou
        getJSON: function( url, data, callback ) {
7123 a7dd0415 Kostas Papadimitriou
                return jQuery.get( url, data, callback, "json" );
7124 a7dd0415 Kostas Papadimitriou
        },
7125 a7dd0415 Kostas Papadimitriou
7126 a7dd0415 Kostas Papadimitriou
        // Creates a full fledged settings object into target
7127 a7dd0415 Kostas Papadimitriou
        // with both ajaxSettings and settings fields.
7128 a7dd0415 Kostas Papadimitriou
        // If target is omitted, writes into ajaxSettings.
7129 a7dd0415 Kostas Papadimitriou
        ajaxSetup: function( target, settings ) {
7130 a7dd0415 Kostas Papadimitriou
                if ( settings ) {
7131 a7dd0415 Kostas Papadimitriou
                        // Building a settings object
7132 a7dd0415 Kostas Papadimitriou
                        ajaxExtend( target, jQuery.ajaxSettings );
7133 a7dd0415 Kostas Papadimitriou
                } else {
7134 a7dd0415 Kostas Papadimitriou
                        // Extending ajaxSettings
7135 a7dd0415 Kostas Papadimitriou
                        settings = target;
7136 a7dd0415 Kostas Papadimitriou
                        target = jQuery.ajaxSettings;
7137 a7dd0415 Kostas Papadimitriou
                }
7138 a7dd0415 Kostas Papadimitriou
                ajaxExtend( target, settings );
7139 a7dd0415 Kostas Papadimitriou
                return target;
7140 a7dd0415 Kostas Papadimitriou
        },
7141 a7dd0415 Kostas Papadimitriou
7142 a7dd0415 Kostas Papadimitriou
        ajaxSettings: {
7143 a7dd0415 Kostas Papadimitriou
                url: ajaxLocation,
7144 a7dd0415 Kostas Papadimitriou
                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7145 a7dd0415 Kostas Papadimitriou
                global: true,
7146 a7dd0415 Kostas Papadimitriou
                type: "GET",
7147 a7dd0415 Kostas Papadimitriou
                contentType: "application/x-www-form-urlencoded",
7148 a7dd0415 Kostas Papadimitriou
                processData: true,
7149 a7dd0415 Kostas Papadimitriou
                async: true,
7150 a7dd0415 Kostas Papadimitriou
                /*
7151 a7dd0415 Kostas Papadimitriou
                timeout: 0,
7152 a7dd0415 Kostas Papadimitriou
                data: null,
7153 a7dd0415 Kostas Papadimitriou
                dataType: null,
7154 a7dd0415 Kostas Papadimitriou
                username: null,
7155 a7dd0415 Kostas Papadimitriou
                password: null,
7156 a7dd0415 Kostas Papadimitriou
                cache: null,
7157 a7dd0415 Kostas Papadimitriou
                traditional: false,
7158 a7dd0415 Kostas Papadimitriou
                headers: {},
7159 a7dd0415 Kostas Papadimitriou
                */
7160 a7dd0415 Kostas Papadimitriou
7161 a7dd0415 Kostas Papadimitriou
                accepts: {
7162 a7dd0415 Kostas Papadimitriou
                        xml: "application/xml, text/xml",
7163 a7dd0415 Kostas Papadimitriou
                        html: "text/html",
7164 a7dd0415 Kostas Papadimitriou
                        text: "text/plain",
7165 a7dd0415 Kostas Papadimitriou
                        json: "application/json, text/javascript",
7166 a7dd0415 Kostas Papadimitriou
                        "*": allTypes
7167 a7dd0415 Kostas Papadimitriou
                },
7168 a7dd0415 Kostas Papadimitriou
7169 a7dd0415 Kostas Papadimitriou
                contents: {
7170 a7dd0415 Kostas Papadimitriou
                        xml: /xml/,
7171 a7dd0415 Kostas Papadimitriou
                        html: /html/,
7172 a7dd0415 Kostas Papadimitriou
                        json: /json/
7173 a7dd0415 Kostas Papadimitriou
                },
7174 a7dd0415 Kostas Papadimitriou
7175 a7dd0415 Kostas Papadimitriou
                responseFields: {
7176 a7dd0415 Kostas Papadimitriou
                        xml: "responseXML",
7177 a7dd0415 Kostas Papadimitriou
                        text: "responseText"
7178 a7dd0415 Kostas Papadimitriou
                },
7179 a7dd0415 Kostas Papadimitriou
7180 a7dd0415 Kostas Papadimitriou
                // List of data converters
7181 a7dd0415 Kostas Papadimitriou
                // 1) key format is "source_type destination_type" (a single space in-between)
7182 a7dd0415 Kostas Papadimitriou
                // 2) the catchall symbol "*" can be used for source_type
7183 a7dd0415 Kostas Papadimitriou
                converters: {
7184 a7dd0415 Kostas Papadimitriou
7185 a7dd0415 Kostas Papadimitriou
                        // Convert anything to text
7186 a7dd0415 Kostas Papadimitriou
                        "* text": window.String,
7187 a7dd0415 Kostas Papadimitriou
7188 a7dd0415 Kostas Papadimitriou
                        // Text to html (true = no transformation)
7189 a7dd0415 Kostas Papadimitriou
                        "text html": true,
7190 a7dd0415 Kostas Papadimitriou
7191 a7dd0415 Kostas Papadimitriou
                        // Evaluate text as a json expression
7192 a7dd0415 Kostas Papadimitriou
                        "text json": jQuery.parseJSON,
7193 a7dd0415 Kostas Papadimitriou
7194 a7dd0415 Kostas Papadimitriou
                        // Parse text as xml
7195 a7dd0415 Kostas Papadimitriou
                        "text xml": jQuery.parseXML
7196 a7dd0415 Kostas Papadimitriou
                },
7197 a7dd0415 Kostas Papadimitriou
7198 a7dd0415 Kostas Papadimitriou
                // For options that shouldn't be deep extended:
7199 a7dd0415 Kostas Papadimitriou
                // you can add your own custom options here if
7200 a7dd0415 Kostas Papadimitriou
                // and when you create one that shouldn't be
7201 a7dd0415 Kostas Papadimitriou
                // deep extended (see ajaxExtend)
7202 a7dd0415 Kostas Papadimitriou
                flatOptions: {
7203 a7dd0415 Kostas Papadimitriou
                        context: true,
7204 a7dd0415 Kostas Papadimitriou
                        url: true
7205 a7dd0415 Kostas Papadimitriou
                }
7206 a7dd0415 Kostas Papadimitriou
        },
7207 a7dd0415 Kostas Papadimitriou
7208 a7dd0415 Kostas Papadimitriou
        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7209 a7dd0415 Kostas Papadimitriou
        ajaxTransport: addToPrefiltersOrTransports( transports ),
7210 a7dd0415 Kostas Papadimitriou
7211 a7dd0415 Kostas Papadimitriou
        // Main method
7212 a7dd0415 Kostas Papadimitriou
        ajax: function( url, options ) {
7213 a7dd0415 Kostas Papadimitriou
7214 a7dd0415 Kostas Papadimitriou
                // If url is an object, simulate pre-1.5 signature
7215 a7dd0415 Kostas Papadimitriou
                if ( typeof url === "object" ) {
7216 a7dd0415 Kostas Papadimitriou
                        options = url;
7217 a7dd0415 Kostas Papadimitriou
                        url = undefined;
7218 a7dd0415 Kostas Papadimitriou
                }
7219 a7dd0415 Kostas Papadimitriou
7220 a7dd0415 Kostas Papadimitriou
                // Force options to be an object
7221 a7dd0415 Kostas Papadimitriou
                options = options || {};
7222 a7dd0415 Kostas Papadimitriou
7223 a7dd0415 Kostas Papadimitriou
                var // Create the final options object
7224 a7dd0415 Kostas Papadimitriou
                        s = jQuery.ajaxSetup( {}, options ),
7225 a7dd0415 Kostas Papadimitriou
                        // Callbacks context
7226 a7dd0415 Kostas Papadimitriou
                        callbackContext = s.context || s,
7227 a7dd0415 Kostas Papadimitriou
                        // Context for global events
7228 a7dd0415 Kostas Papadimitriou
                        // It's the callbackContext if one was provided in the options
7229 a7dd0415 Kostas Papadimitriou
                        // and if it's a DOM node or a jQuery collection
7230 a7dd0415 Kostas Papadimitriou
                        globalEventContext = callbackContext !== s &&
7231 a7dd0415 Kostas Papadimitriou
                                ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
7232 a7dd0415 Kostas Papadimitriou
                                                jQuery( callbackContext ) : jQuery.event,
7233 a7dd0415 Kostas Papadimitriou
                        // Deferreds
7234 a7dd0415 Kostas Papadimitriou
                        deferred = jQuery.Deferred(),
7235 a7dd0415 Kostas Papadimitriou
                        completeDeferred = jQuery.Callbacks( "once memory" ),
7236 a7dd0415 Kostas Papadimitriou
                        // Status-dependent callbacks
7237 a7dd0415 Kostas Papadimitriou
                        statusCode = s.statusCode || {},
7238 a7dd0415 Kostas Papadimitriou
                        // ifModified key
7239 a7dd0415 Kostas Papadimitriou
                        ifModifiedKey,
7240 a7dd0415 Kostas Papadimitriou
                        // Headers (they are sent all at once)
7241 a7dd0415 Kostas Papadimitriou
                        requestHeaders = {},
7242 a7dd0415 Kostas Papadimitriou
                        requestHeadersNames = {},
7243 a7dd0415 Kostas Papadimitriou
                        // Response headers
7244 a7dd0415 Kostas Papadimitriou
                        responseHeadersString,
7245 a7dd0415 Kostas Papadimitriou
                        responseHeaders,
7246 a7dd0415 Kostas Papadimitriou
                        // transport
7247 a7dd0415 Kostas Papadimitriou
                        transport,
7248 a7dd0415 Kostas Papadimitriou
                        // timeout handle
7249 a7dd0415 Kostas Papadimitriou
                        timeoutTimer,
7250 a7dd0415 Kostas Papadimitriou
                        // Cross-domain detection vars
7251 a7dd0415 Kostas Papadimitriou
                        parts,
7252 a7dd0415 Kostas Papadimitriou
                        // The jqXHR state
7253 a7dd0415 Kostas Papadimitriou
                        state = 0,
7254 a7dd0415 Kostas Papadimitriou
                        // To know if global events are to be dispatched
7255 a7dd0415 Kostas Papadimitriou
                        fireGlobals,
7256 a7dd0415 Kostas Papadimitriou
                        // Loop variable
7257 a7dd0415 Kostas Papadimitriou
                        i,
7258 a7dd0415 Kostas Papadimitriou
                        // Fake xhr
7259 a7dd0415 Kostas Papadimitriou
                        jqXHR = {
7260 a7dd0415 Kostas Papadimitriou
7261 a7dd0415 Kostas Papadimitriou
                                readyState: 0,
7262 a7dd0415 Kostas Papadimitriou
7263 a7dd0415 Kostas Papadimitriou
                                // Caches the header
7264 a7dd0415 Kostas Papadimitriou
                                setRequestHeader: function( name, value ) {
7265 a7dd0415 Kostas Papadimitriou
                                        if ( !state ) {
7266 a7dd0415 Kostas Papadimitriou
                                                var lname = name.toLowerCase();
7267 a7dd0415 Kostas Papadimitriou
                                                name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7268 a7dd0415 Kostas Papadimitriou
                                                requestHeaders[ name ] = value;
7269 a7dd0415 Kostas Papadimitriou
                                        }
7270 a7dd0415 Kostas Papadimitriou
                                        return this;
7271 a7dd0415 Kostas Papadimitriou
                                },
7272 a7dd0415 Kostas Papadimitriou
7273 a7dd0415 Kostas Papadimitriou
                                // Raw string
7274 a7dd0415 Kostas Papadimitriou
                                getAllResponseHeaders: function() {
7275 a7dd0415 Kostas Papadimitriou
                                        return state === 2 ? responseHeadersString : null;
7276 a7dd0415 Kostas Papadimitriou
                                },
7277 a7dd0415 Kostas Papadimitriou
7278 a7dd0415 Kostas Papadimitriou
                                // Builds headers hashtable if needed
7279 a7dd0415 Kostas Papadimitriou
                                getResponseHeader: function( key ) {
7280 a7dd0415 Kostas Papadimitriou
                                        var match;
7281 a7dd0415 Kostas Papadimitriou
                                        if ( state === 2 ) {
7282 a7dd0415 Kostas Papadimitriou
                                                if ( !responseHeaders ) {
7283 a7dd0415 Kostas Papadimitriou
                                                        responseHeaders = {};
7284 a7dd0415 Kostas Papadimitriou
                                                        while( ( match = rheaders.exec( responseHeadersString ) ) ) {
7285 a7dd0415 Kostas Papadimitriou
                                                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7286 a7dd0415 Kostas Papadimitriou
                                                        }
7287 a7dd0415 Kostas Papadimitriou
                                                }
7288 a7dd0415 Kostas Papadimitriou
                                                match = responseHeaders[ key.toLowerCase() ];
7289 a7dd0415 Kostas Papadimitriou
                                        }
7290 a7dd0415 Kostas Papadimitriou
                                        return match === undefined ? null : match;
7291 a7dd0415 Kostas Papadimitriou
                                },
7292 a7dd0415 Kostas Papadimitriou
7293 a7dd0415 Kostas Papadimitriou
                                // Overrides response content-type header
7294 a7dd0415 Kostas Papadimitriou
                                overrideMimeType: function( type ) {
7295 a7dd0415 Kostas Papadimitriou
                                        if ( !state ) {
7296 a7dd0415 Kostas Papadimitriou
                                                s.mimeType = type;
7297 a7dd0415 Kostas Papadimitriou
                                        }
7298 a7dd0415 Kostas Papadimitriou
                                        return this;
7299 a7dd0415 Kostas Papadimitriou
                                },
7300 a7dd0415 Kostas Papadimitriou
7301 a7dd0415 Kostas Papadimitriou
                                // Cancel the request
7302 a7dd0415 Kostas Papadimitriou
                                abort: function( statusText ) {
7303 a7dd0415 Kostas Papadimitriou
                                        statusText = statusText || "abort";
7304 a7dd0415 Kostas Papadimitriou
                                        if ( transport ) {
7305 a7dd0415 Kostas Papadimitriou
                                                transport.abort( statusText );
7306 a7dd0415 Kostas Papadimitriou
                                        }
7307 a7dd0415 Kostas Papadimitriou
                                        done( 0, statusText );
7308 a7dd0415 Kostas Papadimitriou
                                        return this;
7309 a7dd0415 Kostas Papadimitriou
                                }
7310 a7dd0415 Kostas Papadimitriou
                        };
7311 a7dd0415 Kostas Papadimitriou
7312 a7dd0415 Kostas Papadimitriou
                // Callback for when everything is done
7313 a7dd0415 Kostas Papadimitriou
                // It is defined here because jslint complains if it is declared
7314 a7dd0415 Kostas Papadimitriou
                // at the end of the function (which would be more logical and readable)
7315 a7dd0415 Kostas Papadimitriou
                function done( status, nativeStatusText, responses, headers ) {
7316 a7dd0415 Kostas Papadimitriou
7317 a7dd0415 Kostas Papadimitriou
                        // Called once
7318 a7dd0415 Kostas Papadimitriou
                        if ( state === 2 ) {
7319 a7dd0415 Kostas Papadimitriou
                                return;
7320 a7dd0415 Kostas Papadimitriou
                        }
7321 a7dd0415 Kostas Papadimitriou
7322 a7dd0415 Kostas Papadimitriou
                        // State is "done" now
7323 a7dd0415 Kostas Papadimitriou
                        state = 2;
7324 a7dd0415 Kostas Papadimitriou
7325 a7dd0415 Kostas Papadimitriou
                        // Clear timeout if it exists
7326 a7dd0415 Kostas Papadimitriou
                        if ( timeoutTimer ) {
7327 a7dd0415 Kostas Papadimitriou
                                clearTimeout( timeoutTimer );
7328 a7dd0415 Kostas Papadimitriou
                        }
7329 a7dd0415 Kostas Papadimitriou
7330 a7dd0415 Kostas Papadimitriou
                        // Dereference transport for early garbage collection
7331 a7dd0415 Kostas Papadimitriou
                        // (no matter how long the jqXHR object will be used)
7332 a7dd0415 Kostas Papadimitriou
                        transport = undefined;
7333 a7dd0415 Kostas Papadimitriou
7334 a7dd0415 Kostas Papadimitriou
                        // Cache response headers
7335 a7dd0415 Kostas Papadimitriou
                        responseHeadersString = headers || "";
7336 a7dd0415 Kostas Papadimitriou
7337 a7dd0415 Kostas Papadimitriou
                        // Set readyState
7338 a7dd0415 Kostas Papadimitriou
                        jqXHR.readyState = status > 0 ? 4 : 0;
7339 a7dd0415 Kostas Papadimitriou
7340 a7dd0415 Kostas Papadimitriou
                        var isSuccess,
7341 a7dd0415 Kostas Papadimitriou
                                success,
7342 a7dd0415 Kostas Papadimitriou
                                error,
7343 a7dd0415 Kostas Papadimitriou
                                statusText = nativeStatusText,
7344 a7dd0415 Kostas Papadimitriou
                                response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
7345 a7dd0415 Kostas Papadimitriou
                                lastModified,
7346 a7dd0415 Kostas Papadimitriou
                                etag;
7347 a7dd0415 Kostas Papadimitriou
7348 a7dd0415 Kostas Papadimitriou
                        // If successful, handle type chaining
7349 a7dd0415 Kostas Papadimitriou
                        if ( status >= 200 && status < 300 || status === 304 ) {
7350 a7dd0415 Kostas Papadimitriou
7351 a7dd0415 Kostas Papadimitriou
                                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7352 a7dd0415 Kostas Papadimitriou
                                if ( s.ifModified ) {
7353 a7dd0415 Kostas Papadimitriou
7354 a7dd0415 Kostas Papadimitriou
                                        if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
7355 a7dd0415 Kostas Papadimitriou
                                                jQuery.lastModified[ ifModifiedKey ] = lastModified;
7356 a7dd0415 Kostas Papadimitriou
                                        }
7357 a7dd0415 Kostas Papadimitriou
                                        if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
7358 a7dd0415 Kostas Papadimitriou
                                                jQuery.etag[ ifModifiedKey ] = etag;
7359 a7dd0415 Kostas Papadimitriou
                                        }
7360 a7dd0415 Kostas Papadimitriou
                                }
7361 a7dd0415 Kostas Papadimitriou
7362 a7dd0415 Kostas Papadimitriou
                                // If not modified
7363 a7dd0415 Kostas Papadimitriou
                                if ( status === 304 ) {
7364 a7dd0415 Kostas Papadimitriou
7365 a7dd0415 Kostas Papadimitriou
                                        statusText = "notmodified";
7366 a7dd0415 Kostas Papadimitriou
                                        isSuccess = true;
7367 a7dd0415 Kostas Papadimitriou
7368 a7dd0415 Kostas Papadimitriou
                                // If we have data
7369 a7dd0415 Kostas Papadimitriou
                                } else {
7370 a7dd0415 Kostas Papadimitriou
7371 a7dd0415 Kostas Papadimitriou
                                        try {
7372 a7dd0415 Kostas Papadimitriou
                                                success = ajaxConvert( s, response );
7373 a7dd0415 Kostas Papadimitriou
                                                statusText = "success";
7374 a7dd0415 Kostas Papadimitriou
                                                isSuccess = true;
7375 a7dd0415 Kostas Papadimitriou
                                        } catch(e) {
7376 a7dd0415 Kostas Papadimitriou
                                                // We have a parsererror
7377 a7dd0415 Kostas Papadimitriou
                                                statusText = "parsererror";
7378 a7dd0415 Kostas Papadimitriou
                                                error = e;
7379 a7dd0415 Kostas Papadimitriou
                                        }
7380 a7dd0415 Kostas Papadimitriou
                                }
7381 a7dd0415 Kostas Papadimitriou
                        } else {
7382 a7dd0415 Kostas Papadimitriou
                                // We extract error from statusText
7383 a7dd0415 Kostas Papadimitriou
                                // then normalize statusText and status for non-aborts
7384 a7dd0415 Kostas Papadimitriou
                                error = statusText;
7385 a7dd0415 Kostas Papadimitriou
                                if ( !statusText || status ) {
7386 a7dd0415 Kostas Papadimitriou
                                        statusText = "error";
7387 a7dd0415 Kostas Papadimitriou
                                        if ( status < 0 ) {
7388 a7dd0415 Kostas Papadimitriou
                                                status = 0;
7389 a7dd0415 Kostas Papadimitriou
                                        }
7390 a7dd0415 Kostas Papadimitriou
                                }
7391 a7dd0415 Kostas Papadimitriou
                        }
7392 a7dd0415 Kostas Papadimitriou
7393 a7dd0415 Kostas Papadimitriou
                        // Set data for the fake xhr object
7394 a7dd0415 Kostas Papadimitriou
                        jqXHR.status = status;
7395 a7dd0415 Kostas Papadimitriou
                        jqXHR.statusText = "" + ( nativeStatusText || statusText );
7396 a7dd0415 Kostas Papadimitriou
7397 a7dd0415 Kostas Papadimitriou
                        // Success/Error
7398 a7dd0415 Kostas Papadimitriou
                        if ( isSuccess ) {
7399 a7dd0415 Kostas Papadimitriou
                                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
7400 a7dd0415 Kostas Papadimitriou
                        } else {
7401 a7dd0415 Kostas Papadimitriou
                                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
7402 a7dd0415 Kostas Papadimitriou
                        }
7403 a7dd0415 Kostas Papadimitriou
7404 a7dd0415 Kostas Papadimitriou
                        // Status-dependent callbacks
7405 a7dd0415 Kostas Papadimitriou
                        jqXHR.statusCode( statusCode );
7406 a7dd0415 Kostas Papadimitriou
                        statusCode = undefined;
7407 a7dd0415 Kostas Papadimitriou
7408 a7dd0415 Kostas Papadimitriou
                        if ( fireGlobals ) {
7409 a7dd0415 Kostas Papadimitriou
                                globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
7410 a7dd0415 Kostas Papadimitriou
                                                [ jqXHR, s, isSuccess ? success : error ] );
7411 a7dd0415 Kostas Papadimitriou
                        }
7412 a7dd0415 Kostas Papadimitriou
7413 a7dd0415 Kostas Papadimitriou
                        // Complete
7414 a7dd0415 Kostas Papadimitriou
                        completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
7415 a7dd0415 Kostas Papadimitriou
7416 a7dd0415 Kostas Papadimitriou
                        if ( fireGlobals ) {
7417 a7dd0415 Kostas Papadimitriou
                                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
7418 a7dd0415 Kostas Papadimitriou
                                // Handle the global AJAX counter
7419 a7dd0415 Kostas Papadimitriou
                                if ( !( --jQuery.active ) ) {
7420 a7dd0415 Kostas Papadimitriou
                                        jQuery.event.trigger( "ajaxStop" );
7421 a7dd0415 Kostas Papadimitriou
                                }
7422 a7dd0415 Kostas Papadimitriou
                        }
7423 a7dd0415 Kostas Papadimitriou
                }
7424 a7dd0415 Kostas Papadimitriou
7425 a7dd0415 Kostas Papadimitriou
                // Attach deferreds
7426 a7dd0415 Kostas Papadimitriou
                deferred.promise( jqXHR );
7427 a7dd0415 Kostas Papadimitriou
                jqXHR.success = jqXHR.done;
7428 a7dd0415 Kostas Papadimitriou
                jqXHR.error = jqXHR.fail;
7429 a7dd0415 Kostas Papadimitriou
                jqXHR.complete = completeDeferred.add;
7430 a7dd0415 Kostas Papadimitriou
7431 a7dd0415 Kostas Papadimitriou
                // Status-dependent callbacks
7432 a7dd0415 Kostas Papadimitriou
                jqXHR.statusCode = function( map ) {
7433 a7dd0415 Kostas Papadimitriou
                        if ( map ) {
7434 a7dd0415 Kostas Papadimitriou
                                var tmp;
7435 a7dd0415 Kostas Papadimitriou
                                if ( state < 2 ) {
7436 a7dd0415 Kostas Papadimitriou
                                        for ( tmp in map ) {
7437 a7dd0415 Kostas Papadimitriou
                                                statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
7438 a7dd0415 Kostas Papadimitriou
                                        }
7439 a7dd0415 Kostas Papadimitriou
                                } else {
7440 a7dd0415 Kostas Papadimitriou
                                        tmp = map[ jqXHR.status ];
7441 a7dd0415 Kostas Papadimitriou
                                        jqXHR.then( tmp, tmp );
7442 a7dd0415 Kostas Papadimitriou
                                }
7443 a7dd0415 Kostas Papadimitriou
                        }
7444 a7dd0415 Kostas Papadimitriou
                        return this;
7445 a7dd0415 Kostas Papadimitriou
                };
7446 a7dd0415 Kostas Papadimitriou
7447 a7dd0415 Kostas Papadimitriou
                // Remove hash character (#7531: and string promotion)
7448 a7dd0415 Kostas Papadimitriou
                // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7449 a7dd0415 Kostas Papadimitriou
                // We also use the url parameter if available
7450 a7dd0415 Kostas Papadimitriou
                s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7451 a7dd0415 Kostas Papadimitriou
7452 a7dd0415 Kostas Papadimitriou
                // Extract dataTypes list
7453 a7dd0415 Kostas Papadimitriou
                s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
7454 a7dd0415 Kostas Papadimitriou
7455 a7dd0415 Kostas Papadimitriou
                // Determine if a cross-domain request is in order
7456 a7dd0415 Kostas Papadimitriou
                if ( s.crossDomain == null ) {
7457 a7dd0415 Kostas Papadimitriou
                        parts = rurl.exec( s.url.toLowerCase() );
7458 a7dd0415 Kostas Papadimitriou
                        s.crossDomain = !!( parts &&
7459 a7dd0415 Kostas Papadimitriou
                                ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
7460 a7dd0415 Kostas Papadimitriou
                                        ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7461 a7dd0415 Kostas Papadimitriou
                                                ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7462 a7dd0415 Kostas Papadimitriou
                        );
7463 a7dd0415 Kostas Papadimitriou
                }
7464 a7dd0415 Kostas Papadimitriou
7465 a7dd0415 Kostas Papadimitriou
                // Convert data if not already a string
7466 a7dd0415 Kostas Papadimitriou
                if ( s.data && s.processData && typeof s.data !== "string" ) {
7467 a7dd0415 Kostas Papadimitriou
                        s.data = jQuery.param( s.data, s.traditional );
7468 a7dd0415 Kostas Papadimitriou
                }
7469 a7dd0415 Kostas Papadimitriou
7470 a7dd0415 Kostas Papadimitriou
                // Apply prefilters
7471 a7dd0415 Kostas Papadimitriou
                inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7472 a7dd0415 Kostas Papadimitriou
7473 a7dd0415 Kostas Papadimitriou
                // If request was aborted inside a prefiler, stop there
7474 a7dd0415 Kostas Papadimitriou
                if ( state === 2 ) {
7475 a7dd0415 Kostas Papadimitriou
                        return false;
7476 a7dd0415 Kostas Papadimitriou
                }
7477 a7dd0415 Kostas Papadimitriou
7478 a7dd0415 Kostas Papadimitriou
                // We can fire global events as of now if asked to
7479 a7dd0415 Kostas Papadimitriou
                fireGlobals = s.global;
7480 a7dd0415 Kostas Papadimitriou
7481 a7dd0415 Kostas Papadimitriou
                // Uppercase the type
7482 a7dd0415 Kostas Papadimitriou
                s.type = s.type.toUpperCase();
7483 a7dd0415 Kostas Papadimitriou
7484 a7dd0415 Kostas Papadimitriou
                // Determine if request has content
7485 a7dd0415 Kostas Papadimitriou
                s.hasContent = !rnoContent.test( s.type );
7486 a7dd0415 Kostas Papadimitriou
7487 a7dd0415 Kostas Papadimitriou
                // Watch for a new set of requests
7488 a7dd0415 Kostas Papadimitriou
                if ( fireGlobals && jQuery.active++ === 0 ) {
7489 a7dd0415 Kostas Papadimitriou
                        jQuery.event.trigger( "ajaxStart" );
7490 a7dd0415 Kostas Papadimitriou
                }
7491 a7dd0415 Kostas Papadimitriou
7492 a7dd0415 Kostas Papadimitriou
                // More options handling for requests with no content
7493 a7dd0415 Kostas Papadimitriou
                if ( !s.hasContent ) {
7494 a7dd0415 Kostas Papadimitriou
7495 a7dd0415 Kostas Papadimitriou
                        // If data is available, append data to url
7496 a7dd0415 Kostas Papadimitriou
                        if ( s.data ) {
7497 a7dd0415 Kostas Papadimitriou
                                s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
7498 a7dd0415 Kostas Papadimitriou
                                // #9682: remove data so that it's not used in an eventual retry
7499 a7dd0415 Kostas Papadimitriou
                                delete s.data;
7500 a7dd0415 Kostas Papadimitriou
                        }
7501 a7dd0415 Kostas Papadimitriou
7502 a7dd0415 Kostas Papadimitriou
                        // Get ifModifiedKey before adding the anti-cache parameter
7503 a7dd0415 Kostas Papadimitriou
                        ifModifiedKey = s.url;
7504 a7dd0415 Kostas Papadimitriou
7505 a7dd0415 Kostas Papadimitriou
                        // Add anti-cache in url if needed
7506 a7dd0415 Kostas Papadimitriou
                        if ( s.cache === false ) {
7507 a7dd0415 Kostas Papadimitriou
7508 a7dd0415 Kostas Papadimitriou
                                var ts = jQuery.now(),
7509 a7dd0415 Kostas Papadimitriou
                                        // try replacing _= if it is there
7510 a7dd0415 Kostas Papadimitriou
                                        ret = s.url.replace( rts, "$1_=" + ts );
7511 a7dd0415 Kostas Papadimitriou
7512 a7dd0415 Kostas Papadimitriou
                                // if nothing was replaced, add timestamp to the end
7513 a7dd0415 Kostas Papadimitriou
                                s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
7514 a7dd0415 Kostas Papadimitriou
                        }
7515 a7dd0415 Kostas Papadimitriou
                }
7516 a7dd0415 Kostas Papadimitriou
7517 a7dd0415 Kostas Papadimitriou
                // Set the correct header, if data is being sent
7518 a7dd0415 Kostas Papadimitriou
                if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7519 a7dd0415 Kostas Papadimitriou
                        jqXHR.setRequestHeader( "Content-Type", s.contentType );
7520 a7dd0415 Kostas Papadimitriou
                }
7521 a7dd0415 Kostas Papadimitriou
7522 a7dd0415 Kostas Papadimitriou
                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7523 a7dd0415 Kostas Papadimitriou
                if ( s.ifModified ) {
7524 a7dd0415 Kostas Papadimitriou
                        ifModifiedKey = ifModifiedKey || s.url;
7525 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.lastModified[ ifModifiedKey ] ) {
7526 a7dd0415 Kostas Papadimitriou
                                jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
7527 a7dd0415 Kostas Papadimitriou
                        }
7528 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.etag[ ifModifiedKey ] ) {
7529 a7dd0415 Kostas Papadimitriou
                                jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
7530 a7dd0415 Kostas Papadimitriou
                        }
7531 a7dd0415 Kostas Papadimitriou
                }
7532 a7dd0415 Kostas Papadimitriou
7533 a7dd0415 Kostas Papadimitriou
                // Set the Accepts header for the server, depending on the dataType
7534 a7dd0415 Kostas Papadimitriou
                jqXHR.setRequestHeader(
7535 a7dd0415 Kostas Papadimitriou
                        "Accept",
7536 a7dd0415 Kostas Papadimitriou
                        s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7537 a7dd0415 Kostas Papadimitriou
                                s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
7538 a7dd0415 Kostas Papadimitriou
                                s.accepts[ "*" ]
7539 a7dd0415 Kostas Papadimitriou
                );
7540 a7dd0415 Kostas Papadimitriou
7541 a7dd0415 Kostas Papadimitriou
                // Check for headers option
7542 a7dd0415 Kostas Papadimitriou
                for ( i in s.headers ) {
7543 a7dd0415 Kostas Papadimitriou
                        jqXHR.setRequestHeader( i, s.headers[ i ] );
7544 a7dd0415 Kostas Papadimitriou
                }
7545 a7dd0415 Kostas Papadimitriou
7546 a7dd0415 Kostas Papadimitriou
                // Allow custom headers/mimetypes and early abort
7547 a7dd0415 Kostas Papadimitriou
                if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7548 a7dd0415 Kostas Papadimitriou
                                // Abort if not done already
7549 a7dd0415 Kostas Papadimitriou
                                jqXHR.abort();
7550 a7dd0415 Kostas Papadimitriou
                                return false;
7551 a7dd0415 Kostas Papadimitriou
7552 a7dd0415 Kostas Papadimitriou
                }
7553 a7dd0415 Kostas Papadimitriou
7554 a7dd0415 Kostas Papadimitriou
                // Install callbacks on deferreds
7555 a7dd0415 Kostas Papadimitriou
                for ( i in { success: 1, error: 1, complete: 1 } ) {
7556 a7dd0415 Kostas Papadimitriou
                        jqXHR[ i ]( s[ i ] );
7557 a7dd0415 Kostas Papadimitriou
                }
7558 a7dd0415 Kostas Papadimitriou
7559 a7dd0415 Kostas Papadimitriou
                // Get transport
7560 a7dd0415 Kostas Papadimitriou
                transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7561 a7dd0415 Kostas Papadimitriou
7562 a7dd0415 Kostas Papadimitriou
                // If no transport, we auto-abort
7563 a7dd0415 Kostas Papadimitriou
                if ( !transport ) {
7564 a7dd0415 Kostas Papadimitriou
                        done( -1, "No Transport" );
7565 a7dd0415 Kostas Papadimitriou
                } else {
7566 a7dd0415 Kostas Papadimitriou
                        jqXHR.readyState = 1;
7567 a7dd0415 Kostas Papadimitriou
                        // Send global event
7568 a7dd0415 Kostas Papadimitriou
                        if ( fireGlobals ) {
7569 a7dd0415 Kostas Papadimitriou
                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7570 a7dd0415 Kostas Papadimitriou
                        }
7571 a7dd0415 Kostas Papadimitriou
                        // Timeout
7572 a7dd0415 Kostas Papadimitriou
                        if ( s.async && s.timeout > 0 ) {
7573 a7dd0415 Kostas Papadimitriou
                                timeoutTimer = setTimeout( function(){
7574 a7dd0415 Kostas Papadimitriou
                                        jqXHR.abort( "timeout" );
7575 a7dd0415 Kostas Papadimitriou
                                }, s.timeout );
7576 a7dd0415 Kostas Papadimitriou
                        }
7577 a7dd0415 Kostas Papadimitriou
7578 a7dd0415 Kostas Papadimitriou
                        try {
7579 a7dd0415 Kostas Papadimitriou
                                state = 1;
7580 a7dd0415 Kostas Papadimitriou
                                transport.send( requestHeaders, done );
7581 a7dd0415 Kostas Papadimitriou
                        } catch (e) {
7582 a7dd0415 Kostas Papadimitriou
                                // Propagate exception as error if not done
7583 a7dd0415 Kostas Papadimitriou
                                if ( state < 2 ) {
7584 a7dd0415 Kostas Papadimitriou
                                        done( -1, e );
7585 a7dd0415 Kostas Papadimitriou
                                // Simply rethrow otherwise
7586 a7dd0415 Kostas Papadimitriou
                                } else {
7587 a7dd0415 Kostas Papadimitriou
                                        throw e;
7588 a7dd0415 Kostas Papadimitriou
                                }
7589 a7dd0415 Kostas Papadimitriou
                        }
7590 a7dd0415 Kostas Papadimitriou
                }
7591 a7dd0415 Kostas Papadimitriou
7592 a7dd0415 Kostas Papadimitriou
                return jqXHR;
7593 a7dd0415 Kostas Papadimitriou
        },
7594 a7dd0415 Kostas Papadimitriou
7595 a7dd0415 Kostas Papadimitriou
        // Serialize an array of form elements or a set of
7596 a7dd0415 Kostas Papadimitriou
        // key/values into a query string
7597 a7dd0415 Kostas Papadimitriou
        param: function( a, traditional ) {
7598 a7dd0415 Kostas Papadimitriou
                var s = [],
7599 a7dd0415 Kostas Papadimitriou
                        add = function( key, value ) {
7600 a7dd0415 Kostas Papadimitriou
                                // If value is a function, invoke it and return its value
7601 a7dd0415 Kostas Papadimitriou
                                value = jQuery.isFunction( value ) ? value() : value;
7602 a7dd0415 Kostas Papadimitriou
                                s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7603 a7dd0415 Kostas Papadimitriou
                        };
7604 a7dd0415 Kostas Papadimitriou
7605 a7dd0415 Kostas Papadimitriou
                // Set traditional to true for jQuery <= 1.3.2 behavior.
7606 a7dd0415 Kostas Papadimitriou
                if ( traditional === undefined ) {
7607 a7dd0415 Kostas Papadimitriou
                        traditional = jQuery.ajaxSettings.traditional;
7608 a7dd0415 Kostas Papadimitriou
                }
7609 a7dd0415 Kostas Papadimitriou
7610 a7dd0415 Kostas Papadimitriou
                // If an array was passed in, assume that it is an array of form elements.
7611 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7612 a7dd0415 Kostas Papadimitriou
                        // Serialize the form elements
7613 a7dd0415 Kostas Papadimitriou
                        jQuery.each( a, function() {
7614 a7dd0415 Kostas Papadimitriou
                                add( this.name, this.value );
7615 a7dd0415 Kostas Papadimitriou
                        });
7616 a7dd0415 Kostas Papadimitriou
7617 a7dd0415 Kostas Papadimitriou
                } else {
7618 a7dd0415 Kostas Papadimitriou
                        // If traditional, encode the "old" way (the way 1.3.2 or older
7619 a7dd0415 Kostas Papadimitriou
                        // did it), otherwise encode params recursively.
7620 a7dd0415 Kostas Papadimitriou
                        for ( var prefix in a ) {
7621 a7dd0415 Kostas Papadimitriou
                                buildParams( prefix, a[ prefix ], traditional, add );
7622 a7dd0415 Kostas Papadimitriou
                        }
7623 a7dd0415 Kostas Papadimitriou
                }
7624 a7dd0415 Kostas Papadimitriou
7625 a7dd0415 Kostas Papadimitriou
                // Return the resulting serialization
7626 a7dd0415 Kostas Papadimitriou
                return s.join( "&" ).replace( r20, "+" );
7627 a7dd0415 Kostas Papadimitriou
        }
7628 a7dd0415 Kostas Papadimitriou
});
7629 a7dd0415 Kostas Papadimitriou
7630 a7dd0415 Kostas Papadimitriou
function buildParams( prefix, obj, traditional, add ) {
7631 a7dd0415 Kostas Papadimitriou
        if ( jQuery.isArray( obj ) ) {
7632 a7dd0415 Kostas Papadimitriou
                // Serialize array item.
7633 a7dd0415 Kostas Papadimitriou
                jQuery.each( obj, function( i, v ) {
7634 a7dd0415 Kostas Papadimitriou
                        if ( traditional || rbracket.test( prefix ) ) {
7635 a7dd0415 Kostas Papadimitriou
                                // Treat each array item as a scalar.
7636 a7dd0415 Kostas Papadimitriou
                                add( prefix, v );
7637 a7dd0415 Kostas Papadimitriou
7638 a7dd0415 Kostas Papadimitriou
                        } else {
7639 a7dd0415 Kostas Papadimitriou
                                // If array item is non-scalar (array or object), encode its
7640 a7dd0415 Kostas Papadimitriou
                                // numeric index to resolve deserialization ambiguity issues.
7641 a7dd0415 Kostas Papadimitriou
                                // Note that rack (as of 1.0.0) can't currently deserialize
7642 a7dd0415 Kostas Papadimitriou
                                // nested arrays properly, and attempting to do so may cause
7643 a7dd0415 Kostas Papadimitriou
                                // a server error. Possible fixes are to modify rack's
7644 a7dd0415 Kostas Papadimitriou
                                // deserialization algorithm or to provide an option or flag
7645 a7dd0415 Kostas Papadimitriou
                                // to force array serialization to be shallow.
7646 a7dd0415 Kostas Papadimitriou
                                buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
7647 a7dd0415 Kostas Papadimitriou
                        }
7648 a7dd0415 Kostas Papadimitriou
                });
7649 a7dd0415 Kostas Papadimitriou
7650 a7dd0415 Kostas Papadimitriou
        } else if ( !traditional && obj != null && typeof obj === "object" ) {
7651 a7dd0415 Kostas Papadimitriou
                // Serialize object item.
7652 a7dd0415 Kostas Papadimitriou
                for ( var name in obj ) {
7653 a7dd0415 Kostas Papadimitriou
                        buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7654 a7dd0415 Kostas Papadimitriou
                }
7655 a7dd0415 Kostas Papadimitriou
7656 a7dd0415 Kostas Papadimitriou
        } else {
7657 a7dd0415 Kostas Papadimitriou
                // Serialize scalar item.
7658 a7dd0415 Kostas Papadimitriou
                add( prefix, obj );
7659 a7dd0415 Kostas Papadimitriou
        }
7660 a7dd0415 Kostas Papadimitriou
}
7661 a7dd0415 Kostas Papadimitriou
7662 a7dd0415 Kostas Papadimitriou
// This is still on the jQuery object... for now
7663 a7dd0415 Kostas Papadimitriou
// Want to move this to jQuery.ajax some day
7664 a7dd0415 Kostas Papadimitriou
jQuery.extend({
7665 a7dd0415 Kostas Papadimitriou
7666 a7dd0415 Kostas Papadimitriou
        // Counter for holding the number of active queries
7667 a7dd0415 Kostas Papadimitriou
        active: 0,
7668 a7dd0415 Kostas Papadimitriou
7669 a7dd0415 Kostas Papadimitriou
        // Last-Modified header cache for next request
7670 a7dd0415 Kostas Papadimitriou
        lastModified: {},
7671 a7dd0415 Kostas Papadimitriou
        etag: {}
7672 a7dd0415 Kostas Papadimitriou
7673 a7dd0415 Kostas Papadimitriou
});
7674 a7dd0415 Kostas Papadimitriou
7675 a7dd0415 Kostas Papadimitriou
/* Handles responses to an ajax request:
7676 a7dd0415 Kostas Papadimitriou
 * - sets all responseXXX fields accordingly
7677 a7dd0415 Kostas Papadimitriou
 * - finds the right dataType (mediates between content-type and expected dataType)
7678 a7dd0415 Kostas Papadimitriou
 * - returns the corresponding response
7679 a7dd0415 Kostas Papadimitriou
 */
7680 a7dd0415 Kostas Papadimitriou
function ajaxHandleResponses( s, jqXHR, responses ) {
7681 a7dd0415 Kostas Papadimitriou
7682 a7dd0415 Kostas Papadimitriou
        var contents = s.contents,
7683 a7dd0415 Kostas Papadimitriou
                dataTypes = s.dataTypes,
7684 a7dd0415 Kostas Papadimitriou
                responseFields = s.responseFields,
7685 a7dd0415 Kostas Papadimitriou
                ct,
7686 a7dd0415 Kostas Papadimitriou
                type,
7687 a7dd0415 Kostas Papadimitriou
                finalDataType,
7688 a7dd0415 Kostas Papadimitriou
                firstDataType;
7689 a7dd0415 Kostas Papadimitriou
7690 a7dd0415 Kostas Papadimitriou
        // Fill responseXXX fields
7691 a7dd0415 Kostas Papadimitriou
        for ( type in responseFields ) {
7692 a7dd0415 Kostas Papadimitriou
                if ( type in responses ) {
7693 a7dd0415 Kostas Papadimitriou
                        jqXHR[ responseFields[type] ] = responses[ type ];
7694 a7dd0415 Kostas Papadimitriou
                }
7695 a7dd0415 Kostas Papadimitriou
        }
7696 a7dd0415 Kostas Papadimitriou
7697 a7dd0415 Kostas Papadimitriou
        // Remove auto dataType and get content-type in the process
7698 a7dd0415 Kostas Papadimitriou
        while( dataTypes[ 0 ] === "*" ) {
7699 a7dd0415 Kostas Papadimitriou
                dataTypes.shift();
7700 a7dd0415 Kostas Papadimitriou
                if ( ct === undefined ) {
7701 a7dd0415 Kostas Papadimitriou
                        ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
7702 a7dd0415 Kostas Papadimitriou
                }
7703 a7dd0415 Kostas Papadimitriou
        }
7704 a7dd0415 Kostas Papadimitriou
7705 a7dd0415 Kostas Papadimitriou
        // Check if we're dealing with a known content-type
7706 a7dd0415 Kostas Papadimitriou
        if ( ct ) {
7707 a7dd0415 Kostas Papadimitriou
                for ( type in contents ) {
7708 a7dd0415 Kostas Papadimitriou
                        if ( contents[ type ] && contents[ type ].test( ct ) ) {
7709 a7dd0415 Kostas Papadimitriou
                                dataTypes.unshift( type );
7710 a7dd0415 Kostas Papadimitriou
                                break;
7711 a7dd0415 Kostas Papadimitriou
                        }
7712 a7dd0415 Kostas Papadimitriou
                }
7713 a7dd0415 Kostas Papadimitriou
        }
7714 a7dd0415 Kostas Papadimitriou
7715 a7dd0415 Kostas Papadimitriou
        // Check to see if we have a response for the expected dataType
7716 a7dd0415 Kostas Papadimitriou
        if ( dataTypes[ 0 ] in responses ) {
7717 a7dd0415 Kostas Papadimitriou
                finalDataType = dataTypes[ 0 ];
7718 a7dd0415 Kostas Papadimitriou
        } else {
7719 a7dd0415 Kostas Papadimitriou
                // Try convertible dataTypes
7720 a7dd0415 Kostas Papadimitriou
                for ( type in responses ) {
7721 a7dd0415 Kostas Papadimitriou
                        if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
7722 a7dd0415 Kostas Papadimitriou
                                finalDataType = type;
7723 a7dd0415 Kostas Papadimitriou
                                break;
7724 a7dd0415 Kostas Papadimitriou
                        }
7725 a7dd0415 Kostas Papadimitriou
                        if ( !firstDataType ) {
7726 a7dd0415 Kostas Papadimitriou
                                firstDataType = type;
7727 a7dd0415 Kostas Papadimitriou
                        }
7728 a7dd0415 Kostas Papadimitriou
                }
7729 a7dd0415 Kostas Papadimitriou
                // Or just use first one
7730 a7dd0415 Kostas Papadimitriou
                finalDataType = finalDataType || firstDataType;
7731 a7dd0415 Kostas Papadimitriou
        }
7732 a7dd0415 Kostas Papadimitriou
7733 a7dd0415 Kostas Papadimitriou
        // If we found a dataType
7734 a7dd0415 Kostas Papadimitriou
        // We add the dataType to the list if needed
7735 a7dd0415 Kostas Papadimitriou
        // and return the corresponding response
7736 a7dd0415 Kostas Papadimitriou
        if ( finalDataType ) {
7737 a7dd0415 Kostas Papadimitriou
                if ( finalDataType !== dataTypes[ 0 ] ) {
7738 a7dd0415 Kostas Papadimitriou
                        dataTypes.unshift( finalDataType );
7739 a7dd0415 Kostas Papadimitriou
                }
7740 a7dd0415 Kostas Papadimitriou
                return responses[ finalDataType ];
7741 a7dd0415 Kostas Papadimitriou
        }
7742 a7dd0415 Kostas Papadimitriou
}
7743 a7dd0415 Kostas Papadimitriou
7744 a7dd0415 Kostas Papadimitriou
// Chain conversions given the request and the original response
7745 a7dd0415 Kostas Papadimitriou
function ajaxConvert( s, response ) {
7746 a7dd0415 Kostas Papadimitriou
7747 a7dd0415 Kostas Papadimitriou
        // Apply the dataFilter if provided
7748 a7dd0415 Kostas Papadimitriou
        if ( s.dataFilter ) {
7749 a7dd0415 Kostas Papadimitriou
                response = s.dataFilter( response, s.dataType );
7750 a7dd0415 Kostas Papadimitriou
        }
7751 a7dd0415 Kostas Papadimitriou
7752 a7dd0415 Kostas Papadimitriou
        var dataTypes = s.dataTypes,
7753 a7dd0415 Kostas Papadimitriou
                converters = {},
7754 a7dd0415 Kostas Papadimitriou
                i,
7755 a7dd0415 Kostas Papadimitriou
                key,
7756 a7dd0415 Kostas Papadimitriou
                length = dataTypes.length,
7757 a7dd0415 Kostas Papadimitriou
                tmp,
7758 a7dd0415 Kostas Papadimitriou
                // Current and previous dataTypes
7759 a7dd0415 Kostas Papadimitriou
                current = dataTypes[ 0 ],
7760 a7dd0415 Kostas Papadimitriou
                prev,
7761 a7dd0415 Kostas Papadimitriou
                // Conversion expression
7762 a7dd0415 Kostas Papadimitriou
                conversion,
7763 a7dd0415 Kostas Papadimitriou
                // Conversion function
7764 a7dd0415 Kostas Papadimitriou
                conv,
7765 a7dd0415 Kostas Papadimitriou
                // Conversion functions (transitive conversion)
7766 a7dd0415 Kostas Papadimitriou
                conv1,
7767 a7dd0415 Kostas Papadimitriou
                conv2;
7768 a7dd0415 Kostas Papadimitriou
7769 a7dd0415 Kostas Papadimitriou
        // For each dataType in the chain
7770 a7dd0415 Kostas Papadimitriou
        for ( i = 1; i < length; i++ ) {
7771 a7dd0415 Kostas Papadimitriou
7772 a7dd0415 Kostas Papadimitriou
                // Create converters map
7773 a7dd0415 Kostas Papadimitriou
                // with lowercased keys
7774 a7dd0415 Kostas Papadimitriou
                if ( i === 1 ) {
7775 a7dd0415 Kostas Papadimitriou
                        for ( key in s.converters ) {
7776 a7dd0415 Kostas Papadimitriou
                                if ( typeof key === "string" ) {
7777 a7dd0415 Kostas Papadimitriou
                                        converters[ key.toLowerCase() ] = s.converters[ key ];
7778 a7dd0415 Kostas Papadimitriou
                                }
7779 a7dd0415 Kostas Papadimitriou
                        }
7780 a7dd0415 Kostas Papadimitriou
                }
7781 a7dd0415 Kostas Papadimitriou
7782 a7dd0415 Kostas Papadimitriou
                // Get the dataTypes
7783 a7dd0415 Kostas Papadimitriou
                prev = current;
7784 a7dd0415 Kostas Papadimitriou
                current = dataTypes[ i ];
7785 a7dd0415 Kostas Papadimitriou
7786 a7dd0415 Kostas Papadimitriou
                // If current is auto dataType, update it to prev
7787 a7dd0415 Kostas Papadimitriou
                if ( current === "*" ) {
7788 a7dd0415 Kostas Papadimitriou
                        current = prev;
7789 a7dd0415 Kostas Papadimitriou
                // If no auto and dataTypes are actually different
7790 a7dd0415 Kostas Papadimitriou
                } else if ( prev !== "*" && prev !== current ) {
7791 a7dd0415 Kostas Papadimitriou
7792 a7dd0415 Kostas Papadimitriou
                        // Get the converter
7793 a7dd0415 Kostas Papadimitriou
                        conversion = prev + " " + current;
7794 a7dd0415 Kostas Papadimitriou
                        conv = converters[ conversion ] || converters[ "* " + current ];
7795 a7dd0415 Kostas Papadimitriou
7796 a7dd0415 Kostas Papadimitriou
                        // If there is no direct converter, search transitively
7797 a7dd0415 Kostas Papadimitriou
                        if ( !conv ) {
7798 a7dd0415 Kostas Papadimitriou
                                conv2 = undefined;
7799 a7dd0415 Kostas Papadimitriou
                                for ( conv1 in converters ) {
7800 a7dd0415 Kostas Papadimitriou
                                        tmp = conv1.split( " " );
7801 a7dd0415 Kostas Papadimitriou
                                        if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
7802 a7dd0415 Kostas Papadimitriou
                                                conv2 = converters[ tmp[1] + " " + current ];
7803 a7dd0415 Kostas Papadimitriou
                                                if ( conv2 ) {
7804 a7dd0415 Kostas Papadimitriou
                                                        conv1 = converters[ conv1 ];
7805 a7dd0415 Kostas Papadimitriou
                                                        if ( conv1 === true ) {
7806 a7dd0415 Kostas Papadimitriou
                                                                conv = conv2;
7807 a7dd0415 Kostas Papadimitriou
                                                        } else if ( conv2 === true ) {
7808 a7dd0415 Kostas Papadimitriou
                                                                conv = conv1;
7809 a7dd0415 Kostas Papadimitriou
                                                        }
7810 a7dd0415 Kostas Papadimitriou
                                                        break;
7811 a7dd0415 Kostas Papadimitriou
                                                }
7812 a7dd0415 Kostas Papadimitriou
                                        }
7813 a7dd0415 Kostas Papadimitriou
                                }
7814 a7dd0415 Kostas Papadimitriou
                        }
7815 a7dd0415 Kostas Papadimitriou
                        // If we found no converter, dispatch an error
7816 a7dd0415 Kostas Papadimitriou
                        if ( !( conv || conv2 ) ) {
7817 a7dd0415 Kostas Papadimitriou
                                jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
7818 a7dd0415 Kostas Papadimitriou
                        }
7819 a7dd0415 Kostas Papadimitriou
                        // If found converter is not an equivalence
7820 a7dd0415 Kostas Papadimitriou
                        if ( conv !== true ) {
7821 a7dd0415 Kostas Papadimitriou
                                // Convert with 1 or 2 converters accordingly
7822 a7dd0415 Kostas Papadimitriou
                                response = conv ? conv( response ) : conv2( conv1(response) );
7823 a7dd0415 Kostas Papadimitriou
                        }
7824 a7dd0415 Kostas Papadimitriou
                }
7825 a7dd0415 Kostas Papadimitriou
        }
7826 a7dd0415 Kostas Papadimitriou
        return response;
7827 a7dd0415 Kostas Papadimitriou
}
7828 a7dd0415 Kostas Papadimitriou
7829 a7dd0415 Kostas Papadimitriou
7830 a7dd0415 Kostas Papadimitriou
7831 a7dd0415 Kostas Papadimitriou
7832 a7dd0415 Kostas Papadimitriou
var jsc = jQuery.now(),
7833 a7dd0415 Kostas Papadimitriou
        jsre = /(\=)\?(&|$)|\?\?/i;
7834 a7dd0415 Kostas Papadimitriou
7835 a7dd0415 Kostas Papadimitriou
// Default jsonp settings
7836 a7dd0415 Kostas Papadimitriou
jQuery.ajaxSetup({
7837 a7dd0415 Kostas Papadimitriou
        jsonp: "callback",
7838 a7dd0415 Kostas Papadimitriou
        jsonpCallback: function() {
7839 a7dd0415 Kostas Papadimitriou
                return jQuery.expando + "_" + ( jsc++ );
7840 a7dd0415 Kostas Papadimitriou
        }
7841 a7dd0415 Kostas Papadimitriou
});
7842 a7dd0415 Kostas Papadimitriou
7843 a7dd0415 Kostas Papadimitriou
// Detect, normalize options and install callbacks for jsonp requests
7844 a7dd0415 Kostas Papadimitriou
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
7845 a7dd0415 Kostas Papadimitriou
7846 a7dd0415 Kostas Papadimitriou
        var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
7847 a7dd0415 Kostas Papadimitriou
                ( typeof s.data === "string" );
7848 a7dd0415 Kostas Papadimitriou
7849 a7dd0415 Kostas Papadimitriou
        if ( s.dataTypes[ 0 ] === "jsonp" ||
7850 a7dd0415 Kostas Papadimitriou
                s.jsonp !== false && ( jsre.test( s.url ) ||
7851 a7dd0415 Kostas Papadimitriou
                                inspectData && jsre.test( s.data ) ) ) {
7852 a7dd0415 Kostas Papadimitriou
7853 a7dd0415 Kostas Papadimitriou
                var responseContainer,
7854 a7dd0415 Kostas Papadimitriou
                        jsonpCallback = s.jsonpCallback =
7855 a7dd0415 Kostas Papadimitriou
                                jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
7856 a7dd0415 Kostas Papadimitriou
                        previous = window[ jsonpCallback ],
7857 a7dd0415 Kostas Papadimitriou
                        url = s.url,
7858 a7dd0415 Kostas Papadimitriou
                        data = s.data,
7859 a7dd0415 Kostas Papadimitriou
                        replace = "$1" + jsonpCallback + "$2";
7860 a7dd0415 Kostas Papadimitriou
7861 a7dd0415 Kostas Papadimitriou
                if ( s.jsonp !== false ) {
7862 a7dd0415 Kostas Papadimitriou
                        url = url.replace( jsre, replace );
7863 a7dd0415 Kostas Papadimitriou
                        if ( s.url === url ) {
7864 a7dd0415 Kostas Papadimitriou
                                if ( inspectData ) {
7865 a7dd0415 Kostas Papadimitriou
                                        data = data.replace( jsre, replace );
7866 a7dd0415 Kostas Papadimitriou
                                }
7867 a7dd0415 Kostas Papadimitriou
                                if ( s.data === data ) {
7868 a7dd0415 Kostas Papadimitriou
                                        // Add callback manually
7869 a7dd0415 Kostas Papadimitriou
                                        url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
7870 a7dd0415 Kostas Papadimitriou
                                }
7871 a7dd0415 Kostas Papadimitriou
                        }
7872 a7dd0415 Kostas Papadimitriou
                }
7873 a7dd0415 Kostas Papadimitriou
7874 a7dd0415 Kostas Papadimitriou
                s.url = url;
7875 a7dd0415 Kostas Papadimitriou
                s.data = data;
7876 a7dd0415 Kostas Papadimitriou
7877 a7dd0415 Kostas Papadimitriou
                // Install callback
7878 a7dd0415 Kostas Papadimitriou
                window[ jsonpCallback ] = function( response ) {
7879 a7dd0415 Kostas Papadimitriou
                        responseContainer = [ response ];
7880 a7dd0415 Kostas Papadimitriou
                };
7881 a7dd0415 Kostas Papadimitriou
7882 a7dd0415 Kostas Papadimitriou
                // Clean-up function
7883 a7dd0415 Kostas Papadimitriou
                jqXHR.always(function() {
7884 a7dd0415 Kostas Papadimitriou
                        // Set callback back to previous value
7885 a7dd0415 Kostas Papadimitriou
                        window[ jsonpCallback ] = previous;
7886 a7dd0415 Kostas Papadimitriou
                        // Call if it was a function and we have a response
7887 a7dd0415 Kostas Papadimitriou
                        if ( responseContainer && jQuery.isFunction( previous ) ) {
7888 a7dd0415 Kostas Papadimitriou
                                window[ jsonpCallback ]( responseContainer[ 0 ] );
7889 a7dd0415 Kostas Papadimitriou
                        }
7890 a7dd0415 Kostas Papadimitriou
                });
7891 a7dd0415 Kostas Papadimitriou
7892 a7dd0415 Kostas Papadimitriou
                // Use data converter to retrieve json after script execution
7893 a7dd0415 Kostas Papadimitriou
                s.converters["script json"] = function() {
7894 a7dd0415 Kostas Papadimitriou
                        if ( !responseContainer ) {
7895 a7dd0415 Kostas Papadimitriou
                                jQuery.error( jsonpCallback + " was not called" );
7896 a7dd0415 Kostas Papadimitriou
                        }
7897 a7dd0415 Kostas Papadimitriou
                        return responseContainer[ 0 ];
7898 a7dd0415 Kostas Papadimitriou
                };
7899 a7dd0415 Kostas Papadimitriou
7900 a7dd0415 Kostas Papadimitriou
                // force json dataType
7901 a7dd0415 Kostas Papadimitriou
                s.dataTypes[ 0 ] = "json";
7902 a7dd0415 Kostas Papadimitriou
7903 a7dd0415 Kostas Papadimitriou
                // Delegate to script
7904 a7dd0415 Kostas Papadimitriou
                return "script";
7905 a7dd0415 Kostas Papadimitriou
        }
7906 a7dd0415 Kostas Papadimitriou
});
7907 a7dd0415 Kostas Papadimitriou
7908 a7dd0415 Kostas Papadimitriou
7909 a7dd0415 Kostas Papadimitriou
7910 a7dd0415 Kostas Papadimitriou
7911 a7dd0415 Kostas Papadimitriou
// Install script dataType
7912 a7dd0415 Kostas Papadimitriou
jQuery.ajaxSetup({
7913 a7dd0415 Kostas Papadimitriou
        accepts: {
7914 a7dd0415 Kostas Papadimitriou
                script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
7915 a7dd0415 Kostas Papadimitriou
        },
7916 a7dd0415 Kostas Papadimitriou
        contents: {
7917 a7dd0415 Kostas Papadimitriou
                script: /javascript|ecmascript/
7918 a7dd0415 Kostas Papadimitriou
        },
7919 a7dd0415 Kostas Papadimitriou
        converters: {
7920 a7dd0415 Kostas Papadimitriou
                "text script": function( text ) {
7921 a7dd0415 Kostas Papadimitriou
                        jQuery.globalEval( text );
7922 a7dd0415 Kostas Papadimitriou
                        return text;
7923 a7dd0415 Kostas Papadimitriou
                }
7924 a7dd0415 Kostas Papadimitriou
        }
7925 a7dd0415 Kostas Papadimitriou
});
7926 a7dd0415 Kostas Papadimitriou
7927 a7dd0415 Kostas Papadimitriou
// Handle cache's special case and global
7928 a7dd0415 Kostas Papadimitriou
jQuery.ajaxPrefilter( "script", function( s ) {
7929 a7dd0415 Kostas Papadimitriou
        if ( s.cache === undefined ) {
7930 a7dd0415 Kostas Papadimitriou
                s.cache = false;
7931 a7dd0415 Kostas Papadimitriou
        }
7932 a7dd0415 Kostas Papadimitriou
        if ( s.crossDomain ) {
7933 a7dd0415 Kostas Papadimitriou
                s.type = "GET";
7934 a7dd0415 Kostas Papadimitriou
                s.global = false;
7935 a7dd0415 Kostas Papadimitriou
        }
7936 a7dd0415 Kostas Papadimitriou
});
7937 a7dd0415 Kostas Papadimitriou
7938 a7dd0415 Kostas Papadimitriou
// Bind script tag hack transport
7939 a7dd0415 Kostas Papadimitriou
jQuery.ajaxTransport( "script", function(s) {
7940 a7dd0415 Kostas Papadimitriou
7941 a7dd0415 Kostas Papadimitriou
        // This transport only deals with cross domain requests
7942 a7dd0415 Kostas Papadimitriou
        if ( s.crossDomain ) {
7943 a7dd0415 Kostas Papadimitriou
7944 a7dd0415 Kostas Papadimitriou
                var script,
7945 a7dd0415 Kostas Papadimitriou
                        head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
7946 a7dd0415 Kostas Papadimitriou
7947 a7dd0415 Kostas Papadimitriou
                return {
7948 a7dd0415 Kostas Papadimitriou
7949 a7dd0415 Kostas Papadimitriou
                        send: function( _, callback ) {
7950 a7dd0415 Kostas Papadimitriou
7951 a7dd0415 Kostas Papadimitriou
                                script = document.createElement( "script" );
7952 a7dd0415 Kostas Papadimitriou
7953 a7dd0415 Kostas Papadimitriou
                                script.async = "async";
7954 a7dd0415 Kostas Papadimitriou
7955 a7dd0415 Kostas Papadimitriou
                                if ( s.scriptCharset ) {
7956 a7dd0415 Kostas Papadimitriou
                                        script.charset = s.scriptCharset;
7957 a7dd0415 Kostas Papadimitriou
                                }
7958 a7dd0415 Kostas Papadimitriou
7959 a7dd0415 Kostas Papadimitriou
                                script.src = s.url;
7960 a7dd0415 Kostas Papadimitriou
7961 a7dd0415 Kostas Papadimitriou
                                // Attach handlers for all browsers
7962 a7dd0415 Kostas Papadimitriou
                                script.onload = script.onreadystatechange = function( _, isAbort ) {
7963 a7dd0415 Kostas Papadimitriou
7964 a7dd0415 Kostas Papadimitriou
                                        if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
7965 a7dd0415 Kostas Papadimitriou
7966 a7dd0415 Kostas Papadimitriou
                                                // Handle memory leak in IE
7967 a7dd0415 Kostas Papadimitriou
                                                script.onload = script.onreadystatechange = null;
7968 a7dd0415 Kostas Papadimitriou
7969 a7dd0415 Kostas Papadimitriou
                                                // Remove the script
7970 a7dd0415 Kostas Papadimitriou
                                                if ( head && script.parentNode ) {
7971 a7dd0415 Kostas Papadimitriou
                                                        head.removeChild( script );
7972 a7dd0415 Kostas Papadimitriou
                                                }
7973 a7dd0415 Kostas Papadimitriou
7974 a7dd0415 Kostas Papadimitriou
                                                // Dereference the script
7975 a7dd0415 Kostas Papadimitriou
                                                script = undefined;
7976 a7dd0415 Kostas Papadimitriou
7977 a7dd0415 Kostas Papadimitriou
                                                // Callback if not abort
7978 a7dd0415 Kostas Papadimitriou
                                                if ( !isAbort ) {
7979 a7dd0415 Kostas Papadimitriou
                                                        callback( 200, "success" );
7980 a7dd0415 Kostas Papadimitriou
                                                }
7981 a7dd0415 Kostas Papadimitriou
                                        }
7982 a7dd0415 Kostas Papadimitriou
                                };
7983 a7dd0415 Kostas Papadimitriou
                                // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
7984 a7dd0415 Kostas Papadimitriou
                                // This arises when a base node is used (#2709 and #4378).
7985 a7dd0415 Kostas Papadimitriou
                                head.insertBefore( script, head.firstChild );
7986 a7dd0415 Kostas Papadimitriou
                        },
7987 a7dd0415 Kostas Papadimitriou
7988 a7dd0415 Kostas Papadimitriou
                        abort: function() {
7989 a7dd0415 Kostas Papadimitriou
                                if ( script ) {
7990 a7dd0415 Kostas Papadimitriou
                                        script.onload( 0, 1 );
7991 a7dd0415 Kostas Papadimitriou
                                }
7992 a7dd0415 Kostas Papadimitriou
                        }
7993 a7dd0415 Kostas Papadimitriou
                };
7994 a7dd0415 Kostas Papadimitriou
        }
7995 a7dd0415 Kostas Papadimitriou
});
7996 a7dd0415 Kostas Papadimitriou
7997 a7dd0415 Kostas Papadimitriou
7998 a7dd0415 Kostas Papadimitriou
7999 a7dd0415 Kostas Papadimitriou
8000 a7dd0415 Kostas Papadimitriou
var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
8001 a7dd0415 Kostas Papadimitriou
        xhrOnUnloadAbort = window.ActiveXObject ? function() {
8002 a7dd0415 Kostas Papadimitriou
                // Abort all pending requests
8003 a7dd0415 Kostas Papadimitriou
                for ( var key in xhrCallbacks ) {
8004 a7dd0415 Kostas Papadimitriou
                        xhrCallbacks[ key ]( 0, 1 );
8005 a7dd0415 Kostas Papadimitriou
                }
8006 a7dd0415 Kostas Papadimitriou
        } : false,
8007 a7dd0415 Kostas Papadimitriou
        xhrId = 0,
8008 a7dd0415 Kostas Papadimitriou
        xhrCallbacks;
8009 a7dd0415 Kostas Papadimitriou
8010 a7dd0415 Kostas Papadimitriou
// Functions to create xhrs
8011 a7dd0415 Kostas Papadimitriou
function createStandardXHR() {
8012 a7dd0415 Kostas Papadimitriou
        try {
8013 a7dd0415 Kostas Papadimitriou
                return new window.XMLHttpRequest();
8014 a7dd0415 Kostas Papadimitriou
        } catch( e ) {}
8015 a7dd0415 Kostas Papadimitriou
}
8016 a7dd0415 Kostas Papadimitriou
8017 a7dd0415 Kostas Papadimitriou
function createActiveXHR() {
8018 a7dd0415 Kostas Papadimitriou
        try {
8019 a7dd0415 Kostas Papadimitriou
                return new window.ActiveXObject( "Microsoft.XMLHTTP" );
8020 a7dd0415 Kostas Papadimitriou
        } catch( e ) {}
8021 a7dd0415 Kostas Papadimitriou
}
8022 a7dd0415 Kostas Papadimitriou
8023 a7dd0415 Kostas Papadimitriou
// Create the request object
8024 a7dd0415 Kostas Papadimitriou
// (This is still attached to ajaxSettings for backward compatibility)
8025 a7dd0415 Kostas Papadimitriou
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
8026 a7dd0415 Kostas Papadimitriou
        /* Microsoft failed to properly
8027 a7dd0415 Kostas Papadimitriou
         * implement the XMLHttpRequest in IE7 (can't request local files),
8028 a7dd0415 Kostas Papadimitriou
         * so we use the ActiveXObject when it is available
8029 a7dd0415 Kostas Papadimitriou
         * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8030 a7dd0415 Kostas Papadimitriou
         * we need a fallback.
8031 a7dd0415 Kostas Papadimitriou
         */
8032 a7dd0415 Kostas Papadimitriou
        function() {
8033 a7dd0415 Kostas Papadimitriou
                return !this.isLocal && createStandardXHR() || createActiveXHR();
8034 a7dd0415 Kostas Papadimitriou
        } :
8035 a7dd0415 Kostas Papadimitriou
        // For all other browsers, use the standard XMLHttpRequest object
8036 a7dd0415 Kostas Papadimitriou
        createStandardXHR;
8037 a7dd0415 Kostas Papadimitriou
8038 a7dd0415 Kostas Papadimitriou
// Determine support properties
8039 a7dd0415 Kostas Papadimitriou
(function( xhr ) {
8040 a7dd0415 Kostas Papadimitriou
        jQuery.extend( jQuery.support, {
8041 a7dd0415 Kostas Papadimitriou
                ajax: !!xhr,
8042 a7dd0415 Kostas Papadimitriou
                cors: !!xhr && ( "withCredentials" in xhr )
8043 a7dd0415 Kostas Papadimitriou
        });
8044 a7dd0415 Kostas Papadimitriou
})( jQuery.ajaxSettings.xhr() );
8045 a7dd0415 Kostas Papadimitriou
8046 a7dd0415 Kostas Papadimitriou
// Create transport if the browser can provide an xhr
8047 a7dd0415 Kostas Papadimitriou
if ( jQuery.support.ajax ) {
8048 a7dd0415 Kostas Papadimitriou
8049 a7dd0415 Kostas Papadimitriou
        jQuery.ajaxTransport(function( s ) {
8050 a7dd0415 Kostas Papadimitriou
                // Cross domain only allowed if supported through XMLHttpRequest
8051 a7dd0415 Kostas Papadimitriou
                if ( !s.crossDomain || jQuery.support.cors ) {
8052 a7dd0415 Kostas Papadimitriou
8053 a7dd0415 Kostas Papadimitriou
                        var callback;
8054 a7dd0415 Kostas Papadimitriou
8055 a7dd0415 Kostas Papadimitriou
                        return {
8056 a7dd0415 Kostas Papadimitriou
                                send: function( headers, complete ) {
8057 a7dd0415 Kostas Papadimitriou
8058 a7dd0415 Kostas Papadimitriou
                                        // Get a new xhr
8059 a7dd0415 Kostas Papadimitriou
                                        var xhr = s.xhr(),
8060 a7dd0415 Kostas Papadimitriou
                                                handle,
8061 a7dd0415 Kostas Papadimitriou
                                                i;
8062 a7dd0415 Kostas Papadimitriou
8063 a7dd0415 Kostas Papadimitriou
                                        // Open the socket
8064 a7dd0415 Kostas Papadimitriou
                                        // Passing null username, generates a login popup on Opera (#2865)
8065 a7dd0415 Kostas Papadimitriou
                                        if ( s.username ) {
8066 a7dd0415 Kostas Papadimitriou
                                                xhr.open( s.type, s.url, s.async, s.username, s.password );
8067 a7dd0415 Kostas Papadimitriou
                                        } else {
8068 a7dd0415 Kostas Papadimitriou
                                                xhr.open( s.type, s.url, s.async );
8069 a7dd0415 Kostas Papadimitriou
                                        }
8070 a7dd0415 Kostas Papadimitriou
8071 a7dd0415 Kostas Papadimitriou
                                        // Apply custom fields if provided
8072 a7dd0415 Kostas Papadimitriou
                                        if ( s.xhrFields ) {
8073 a7dd0415 Kostas Papadimitriou
                                                for ( i in s.xhrFields ) {
8074 a7dd0415 Kostas Papadimitriou
                                                        xhr[ i ] = s.xhrFields[ i ];
8075 a7dd0415 Kostas Papadimitriou
                                                }
8076 a7dd0415 Kostas Papadimitriou
                                        }
8077 a7dd0415 Kostas Papadimitriou
8078 a7dd0415 Kostas Papadimitriou
                                        // Override mime type if needed
8079 a7dd0415 Kostas Papadimitriou
                                        if ( s.mimeType && xhr.overrideMimeType ) {
8080 a7dd0415 Kostas Papadimitriou
                                                xhr.overrideMimeType( s.mimeType );
8081 a7dd0415 Kostas Papadimitriou
                                        }
8082 a7dd0415 Kostas Papadimitriou
8083 a7dd0415 Kostas Papadimitriou
                                        // X-Requested-With header
8084 a7dd0415 Kostas Papadimitriou
                                        // For cross-domain requests, seeing as conditions for a preflight are
8085 a7dd0415 Kostas Papadimitriou
                                        // akin to a jigsaw puzzle, we simply never set it to be sure.
8086 a7dd0415 Kostas Papadimitriou
                                        // (it can always be set on a per-request basis or even using ajaxSetup)
8087 a7dd0415 Kostas Papadimitriou
                                        // For same-domain requests, won't change header if already provided.
8088 a7dd0415 Kostas Papadimitriou
                                        if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8089 a7dd0415 Kostas Papadimitriou
                                                headers[ "X-Requested-With" ] = "XMLHttpRequest";
8090 a7dd0415 Kostas Papadimitriou
                                        }
8091 a7dd0415 Kostas Papadimitriou
8092 a7dd0415 Kostas Papadimitriou
                                        // Need an extra try/catch for cross domain requests in Firefox 3
8093 a7dd0415 Kostas Papadimitriou
                                        try {
8094 a7dd0415 Kostas Papadimitriou
                                                for ( i in headers ) {
8095 a7dd0415 Kostas Papadimitriou
                                                        xhr.setRequestHeader( i, headers[ i ] );
8096 a7dd0415 Kostas Papadimitriou
                                                }
8097 a7dd0415 Kostas Papadimitriou
                                        } catch( _ ) {}
8098 a7dd0415 Kostas Papadimitriou
8099 a7dd0415 Kostas Papadimitriou
                                        // Do send the request
8100 a7dd0415 Kostas Papadimitriou
                                        // This may raise an exception which is actually
8101 a7dd0415 Kostas Papadimitriou
                                        // handled in jQuery.ajax (so no try/catch here)
8102 a7dd0415 Kostas Papadimitriou
                                        xhr.send( ( s.hasContent && s.data ) || null );
8103 a7dd0415 Kostas Papadimitriou
8104 a7dd0415 Kostas Papadimitriou
                                        // Listener
8105 a7dd0415 Kostas Papadimitriou
                                        callback = function( _, isAbort ) {
8106 a7dd0415 Kostas Papadimitriou
8107 a7dd0415 Kostas Papadimitriou
                                                var status,
8108 a7dd0415 Kostas Papadimitriou
                                                        statusText,
8109 a7dd0415 Kostas Papadimitriou
                                                        responseHeaders,
8110 a7dd0415 Kostas Papadimitriou
                                                        responses,
8111 a7dd0415 Kostas Papadimitriou
                                                        xml;
8112 a7dd0415 Kostas Papadimitriou
8113 a7dd0415 Kostas Papadimitriou
                                                // Firefox throws exceptions when accessing properties
8114 a7dd0415 Kostas Papadimitriou
                                                // of an xhr when a network error occured
8115 a7dd0415 Kostas Papadimitriou
                                                // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8116 a7dd0415 Kostas Papadimitriou
                                                try {
8117 a7dd0415 Kostas Papadimitriou
8118 a7dd0415 Kostas Papadimitriou
                                                        // Was never called and is aborted or complete
8119 a7dd0415 Kostas Papadimitriou
                                                        if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8120 a7dd0415 Kostas Papadimitriou
8121 a7dd0415 Kostas Papadimitriou
                                                                // Only called once
8122 a7dd0415 Kostas Papadimitriou
                                                                callback = undefined;
8123 a7dd0415 Kostas Papadimitriou
8124 a7dd0415 Kostas Papadimitriou
                                                                // Do not keep as active anymore
8125 a7dd0415 Kostas Papadimitriou
                                                                if ( handle ) {
8126 a7dd0415 Kostas Papadimitriou
                                                                        xhr.onreadystatechange = jQuery.noop;
8127 a7dd0415 Kostas Papadimitriou
                                                                        if ( xhrOnUnloadAbort ) {
8128 a7dd0415 Kostas Papadimitriou
                                                                                delete xhrCallbacks[ handle ];
8129 a7dd0415 Kostas Papadimitriou
                                                                        }
8130 a7dd0415 Kostas Papadimitriou
                                                                }
8131 a7dd0415 Kostas Papadimitriou
8132 a7dd0415 Kostas Papadimitriou
                                                                // If it's an abort
8133 a7dd0415 Kostas Papadimitriou
                                                                if ( isAbort ) {
8134 a7dd0415 Kostas Papadimitriou
                                                                        // Abort it manually if needed
8135 a7dd0415 Kostas Papadimitriou
                                                                        if ( xhr.readyState !== 4 ) {
8136 a7dd0415 Kostas Papadimitriou
                                                                                xhr.abort();
8137 a7dd0415 Kostas Papadimitriou
                                                                        }
8138 a7dd0415 Kostas Papadimitriou
                                                                } else {
8139 a7dd0415 Kostas Papadimitriou
                                                                        status = xhr.status;
8140 a7dd0415 Kostas Papadimitriou
                                                                        responseHeaders = xhr.getAllResponseHeaders();
8141 a7dd0415 Kostas Papadimitriou
                                                                        responses = {};
8142 a7dd0415 Kostas Papadimitriou
                                                                        xml = xhr.responseXML;
8143 a7dd0415 Kostas Papadimitriou
8144 a7dd0415 Kostas Papadimitriou
                                                                        // Construct response list
8145 a7dd0415 Kostas Papadimitriou
                                                                        if ( xml && xml.documentElement /* #4958 */ ) {
8146 a7dd0415 Kostas Papadimitriou
                                                                                responses.xml = xml;
8147 a7dd0415 Kostas Papadimitriou
                                                                        }
8148 a7dd0415 Kostas Papadimitriou
                                                                        responses.text = xhr.responseText;
8149 a7dd0415 Kostas Papadimitriou
8150 a7dd0415 Kostas Papadimitriou
                                                                        // Firefox throws an exception when accessing
8151 a7dd0415 Kostas Papadimitriou
                                                                        // statusText for faulty cross-domain requests
8152 a7dd0415 Kostas Papadimitriou
                                                                        try {
8153 a7dd0415 Kostas Papadimitriou
                                                                                statusText = xhr.statusText;
8154 a7dd0415 Kostas Papadimitriou
                                                                        } catch( e ) {
8155 a7dd0415 Kostas Papadimitriou
                                                                                // We normalize with Webkit giving an empty statusText
8156 a7dd0415 Kostas Papadimitriou
                                                                                statusText = "";
8157 a7dd0415 Kostas Papadimitriou
                                                                        }
8158 a7dd0415 Kostas Papadimitriou
8159 a7dd0415 Kostas Papadimitriou
                                                                        // Filter status for non standard behaviors
8160 a7dd0415 Kostas Papadimitriou
8161 a7dd0415 Kostas Papadimitriou
                                                                        // If the request is local and we have data: assume a success
8162 a7dd0415 Kostas Papadimitriou
                                                                        // (success with no data won't get notified, that's the best we
8163 a7dd0415 Kostas Papadimitriou
                                                                        // can do given current implementations)
8164 a7dd0415 Kostas Papadimitriou
                                                                        if ( !status && s.isLocal && !s.crossDomain ) {
8165 a7dd0415 Kostas Papadimitriou
                                                                                status = responses.text ? 200 : 404;
8166 a7dd0415 Kostas Papadimitriou
                                                                        // IE - #1450: sometimes returns 1223 when it should be 204
8167 a7dd0415 Kostas Papadimitriou
                                                                        } else if ( status === 1223 ) {
8168 a7dd0415 Kostas Papadimitriou
                                                                                status = 204;
8169 a7dd0415 Kostas Papadimitriou
                                                                        }
8170 a7dd0415 Kostas Papadimitriou
                                                                }
8171 a7dd0415 Kostas Papadimitriou
                                                        }
8172 a7dd0415 Kostas Papadimitriou
                                                } catch( firefoxAccessException ) {
8173 a7dd0415 Kostas Papadimitriou
                                                        if ( !isAbort ) {
8174 a7dd0415 Kostas Papadimitriou
                                                                complete( -1, firefoxAccessException );
8175 a7dd0415 Kostas Papadimitriou
                                                        }
8176 a7dd0415 Kostas Papadimitriou
                                                }
8177 a7dd0415 Kostas Papadimitriou
8178 a7dd0415 Kostas Papadimitriou
                                                // Call complete if needed
8179 a7dd0415 Kostas Papadimitriou
                                                if ( responses ) {
8180 a7dd0415 Kostas Papadimitriou
                                                        complete( status, statusText, responses, responseHeaders );
8181 a7dd0415 Kostas Papadimitriou
                                                }
8182 a7dd0415 Kostas Papadimitriou
                                        };
8183 a7dd0415 Kostas Papadimitriou
8184 a7dd0415 Kostas Papadimitriou
                                        // if we're in sync mode or it's in cache
8185 a7dd0415 Kostas Papadimitriou
                                        // and has been retrieved directly (IE6 & IE7)
8186 a7dd0415 Kostas Papadimitriou
                                        // we need to manually fire the callback
8187 a7dd0415 Kostas Papadimitriou
                                        if ( !s.async || xhr.readyState === 4 ) {
8188 a7dd0415 Kostas Papadimitriou
                                                callback();
8189 a7dd0415 Kostas Papadimitriou
                                        } else {
8190 a7dd0415 Kostas Papadimitriou
                                                handle = ++xhrId;
8191 a7dd0415 Kostas Papadimitriou
                                                if ( xhrOnUnloadAbort ) {
8192 a7dd0415 Kostas Papadimitriou
                                                        // Create the active xhrs callbacks list if needed
8193 a7dd0415 Kostas Papadimitriou
                                                        // and attach the unload handler
8194 a7dd0415 Kostas Papadimitriou
                                                        if ( !xhrCallbacks ) {
8195 a7dd0415 Kostas Papadimitriou
                                                                xhrCallbacks = {};
8196 a7dd0415 Kostas Papadimitriou
                                                                jQuery( window ).unload( xhrOnUnloadAbort );
8197 a7dd0415 Kostas Papadimitriou
                                                        }
8198 a7dd0415 Kostas Papadimitriou
                                                        // Add to list of active xhrs callbacks
8199 a7dd0415 Kostas Papadimitriou
                                                        xhrCallbacks[ handle ] = callback;
8200 a7dd0415 Kostas Papadimitriou
                                                }
8201 a7dd0415 Kostas Papadimitriou
                                                xhr.onreadystatechange = callback;
8202 a7dd0415 Kostas Papadimitriou
                                        }
8203 a7dd0415 Kostas Papadimitriou
                                },
8204 a7dd0415 Kostas Papadimitriou
8205 a7dd0415 Kostas Papadimitriou
                                abort: function() {
8206 a7dd0415 Kostas Papadimitriou
                                        if ( callback ) {
8207 a7dd0415 Kostas Papadimitriou
                                                callback(0,1);
8208 a7dd0415 Kostas Papadimitriou
                                        }
8209 a7dd0415 Kostas Papadimitriou
                                }
8210 a7dd0415 Kostas Papadimitriou
                        };
8211 a7dd0415 Kostas Papadimitriou
                }
8212 a7dd0415 Kostas Papadimitriou
        });
8213 a7dd0415 Kostas Papadimitriou
}
8214 a7dd0415 Kostas Papadimitriou
8215 a7dd0415 Kostas Papadimitriou
8216 a7dd0415 Kostas Papadimitriou
8217 a7dd0415 Kostas Papadimitriou
8218 a7dd0415 Kostas Papadimitriou
var elemdisplay = {},
8219 a7dd0415 Kostas Papadimitriou
        iframe, iframeDoc,
8220 a7dd0415 Kostas Papadimitriou
        rfxtypes = /^(?:toggle|show|hide)$/,
8221 a7dd0415 Kostas Papadimitriou
        rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
8222 a7dd0415 Kostas Papadimitriou
        timerId,
8223 a7dd0415 Kostas Papadimitriou
        fxAttrs = [
8224 a7dd0415 Kostas Papadimitriou
                // height animations
8225 a7dd0415 Kostas Papadimitriou
                [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
8226 a7dd0415 Kostas Papadimitriou
                // width animations
8227 a7dd0415 Kostas Papadimitriou
                [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
8228 a7dd0415 Kostas Papadimitriou
                // opacity animations
8229 a7dd0415 Kostas Papadimitriou
                [ "opacity" ]
8230 a7dd0415 Kostas Papadimitriou
        ],
8231 a7dd0415 Kostas Papadimitriou
        fxNow;
8232 a7dd0415 Kostas Papadimitriou
8233 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
8234 a7dd0415 Kostas Papadimitriou
        show: function( speed, easing, callback ) {
8235 a7dd0415 Kostas Papadimitriou
                var elem, display;
8236 a7dd0415 Kostas Papadimitriou
8237 a7dd0415 Kostas Papadimitriou
                if ( speed || speed === 0 ) {
8238 a7dd0415 Kostas Papadimitriou
                        return this.animate( genFx("show", 3), speed, easing, callback );
8239 a7dd0415 Kostas Papadimitriou
8240 a7dd0415 Kostas Papadimitriou
                } else {
8241 a7dd0415 Kostas Papadimitriou
                        for ( var i = 0, j = this.length; i < j; i++ ) {
8242 a7dd0415 Kostas Papadimitriou
                                elem = this[ i ];
8243 a7dd0415 Kostas Papadimitriou
8244 a7dd0415 Kostas Papadimitriou
                                if ( elem.style ) {
8245 a7dd0415 Kostas Papadimitriou
                                        display = elem.style.display;
8246 a7dd0415 Kostas Papadimitriou
8247 a7dd0415 Kostas Papadimitriou
                                        // Reset the inline display of this element to learn if it is
8248 a7dd0415 Kostas Papadimitriou
                                        // being hidden by cascaded rules or not
8249 a7dd0415 Kostas Papadimitriou
                                        if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
8250 a7dd0415 Kostas Papadimitriou
                                                display = elem.style.display = "";
8251 a7dd0415 Kostas Papadimitriou
                                        }
8252 a7dd0415 Kostas Papadimitriou
8253 a7dd0415 Kostas Papadimitriou
                                        // Set elements which have been overridden with display: none
8254 a7dd0415 Kostas Papadimitriou
                                        // in a stylesheet to whatever the default browser style is
8255 a7dd0415 Kostas Papadimitriou
                                        // for such an element
8256 a7dd0415 Kostas Papadimitriou
                                        if ( display === "" && jQuery.css(elem, "display") === "none" ) {
8257 a7dd0415 Kostas Papadimitriou
                                                jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
8258 a7dd0415 Kostas Papadimitriou
                                        }
8259 a7dd0415 Kostas Papadimitriou
                                }
8260 a7dd0415 Kostas Papadimitriou
                        }
8261 a7dd0415 Kostas Papadimitriou
8262 a7dd0415 Kostas Papadimitriou
                        // Set the display of most of the elements in a second loop
8263 a7dd0415 Kostas Papadimitriou
                        // to avoid the constant reflow
8264 a7dd0415 Kostas Papadimitriou
                        for ( i = 0; i < j; i++ ) {
8265 a7dd0415 Kostas Papadimitriou
                                elem = this[ i ];
8266 a7dd0415 Kostas Papadimitriou
8267 a7dd0415 Kostas Papadimitriou
                                if ( elem.style ) {
8268 a7dd0415 Kostas Papadimitriou
                                        display = elem.style.display;
8269 a7dd0415 Kostas Papadimitriou
8270 a7dd0415 Kostas Papadimitriou
                                        if ( display === "" || display === "none" ) {
8271 a7dd0415 Kostas Papadimitriou
                                                elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
8272 a7dd0415 Kostas Papadimitriou
                                        }
8273 a7dd0415 Kostas Papadimitriou
                                }
8274 a7dd0415 Kostas Papadimitriou
                        }
8275 a7dd0415 Kostas Papadimitriou
8276 a7dd0415 Kostas Papadimitriou
                        return this;
8277 a7dd0415 Kostas Papadimitriou
                }
8278 a7dd0415 Kostas Papadimitriou
        },
8279 a7dd0415 Kostas Papadimitriou
8280 a7dd0415 Kostas Papadimitriou
        hide: function( speed, easing, callback ) {
8281 a7dd0415 Kostas Papadimitriou
                if ( speed || speed === 0 ) {
8282 a7dd0415 Kostas Papadimitriou
                        return this.animate( genFx("hide", 3), speed, easing, callback);
8283 a7dd0415 Kostas Papadimitriou
8284 a7dd0415 Kostas Papadimitriou
                } else {
8285 a7dd0415 Kostas Papadimitriou
                        var elem, display,
8286 a7dd0415 Kostas Papadimitriou
                                i = 0,
8287 a7dd0415 Kostas Papadimitriou
                                j = this.length;
8288 a7dd0415 Kostas Papadimitriou
8289 a7dd0415 Kostas Papadimitriou
                        for ( ; i < j; i++ ) {
8290 a7dd0415 Kostas Papadimitriou
                                elem = this[i];
8291 a7dd0415 Kostas Papadimitriou
                                if ( elem.style ) {
8292 a7dd0415 Kostas Papadimitriou
                                        display = jQuery.css( elem, "display" );
8293 a7dd0415 Kostas Papadimitriou
8294 a7dd0415 Kostas Papadimitriou
                                        if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
8295 a7dd0415 Kostas Papadimitriou
                                                jQuery._data( elem, "olddisplay", display );
8296 a7dd0415 Kostas Papadimitriou
                                        }
8297 a7dd0415 Kostas Papadimitriou
                                }
8298 a7dd0415 Kostas Papadimitriou
                        }
8299 a7dd0415 Kostas Papadimitriou
8300 a7dd0415 Kostas Papadimitriou
                        // Set the display of the elements in a second loop
8301 a7dd0415 Kostas Papadimitriou
                        // to avoid the constant reflow
8302 a7dd0415 Kostas Papadimitriou
                        for ( i = 0; i < j; i++ ) {
8303 a7dd0415 Kostas Papadimitriou
                                if ( this[i].style ) {
8304 a7dd0415 Kostas Papadimitriou
                                        this[i].style.display = "none";
8305 a7dd0415 Kostas Papadimitriou
                                }
8306 a7dd0415 Kostas Papadimitriou
                        }
8307 a7dd0415 Kostas Papadimitriou
8308 a7dd0415 Kostas Papadimitriou
                        return this;
8309 a7dd0415 Kostas Papadimitriou
                }
8310 a7dd0415 Kostas Papadimitriou
        },
8311 a7dd0415 Kostas Papadimitriou
8312 a7dd0415 Kostas Papadimitriou
        // Save the old toggle function
8313 a7dd0415 Kostas Papadimitriou
        _toggle: jQuery.fn.toggle,
8314 a7dd0415 Kostas Papadimitriou
8315 a7dd0415 Kostas Papadimitriou
        toggle: function( fn, fn2, callback ) {
8316 a7dd0415 Kostas Papadimitriou
                var bool = typeof fn === "boolean";
8317 a7dd0415 Kostas Papadimitriou
8318 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
8319 a7dd0415 Kostas Papadimitriou
                        this._toggle.apply( this, arguments );
8320 a7dd0415 Kostas Papadimitriou
8321 a7dd0415 Kostas Papadimitriou
                } else if ( fn == null || bool ) {
8322 a7dd0415 Kostas Papadimitriou
                        this.each(function() {
8323 a7dd0415 Kostas Papadimitriou
                                var state = bool ? fn : jQuery(this).is(":hidden");
8324 a7dd0415 Kostas Papadimitriou
                                jQuery(this)[ state ? "show" : "hide" ]();
8325 a7dd0415 Kostas Papadimitriou
                        });
8326 a7dd0415 Kostas Papadimitriou
8327 a7dd0415 Kostas Papadimitriou
                } else {
8328 a7dd0415 Kostas Papadimitriou
                        this.animate(genFx("toggle", 3), fn, fn2, callback);
8329 a7dd0415 Kostas Papadimitriou
                }
8330 a7dd0415 Kostas Papadimitriou
8331 a7dd0415 Kostas Papadimitriou
                return this;
8332 a7dd0415 Kostas Papadimitriou
        },
8333 a7dd0415 Kostas Papadimitriou
8334 a7dd0415 Kostas Papadimitriou
        fadeTo: function( speed, to, easing, callback ) {
8335 a7dd0415 Kostas Papadimitriou
                return this.filter(":hidden").css("opacity", 0).show().end()
8336 a7dd0415 Kostas Papadimitriou
                                        .animate({opacity: to}, speed, easing, callback);
8337 a7dd0415 Kostas Papadimitriou
        },
8338 a7dd0415 Kostas Papadimitriou
8339 a7dd0415 Kostas Papadimitriou
        animate: function( prop, speed, easing, callback ) {
8340 a7dd0415 Kostas Papadimitriou
                var optall = jQuery.speed( speed, easing, callback );
8341 a7dd0415 Kostas Papadimitriou
8342 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isEmptyObject( prop ) ) {
8343 a7dd0415 Kostas Papadimitriou
                        return this.each( optall.complete, [ false ] );
8344 a7dd0415 Kostas Papadimitriou
                }
8345 a7dd0415 Kostas Papadimitriou
8346 a7dd0415 Kostas Papadimitriou
                // Do not change referenced properties as per-property easing will be lost
8347 a7dd0415 Kostas Papadimitriou
                prop = jQuery.extend( {}, prop );
8348 a7dd0415 Kostas Papadimitriou
8349 a7dd0415 Kostas Papadimitriou
                function doAnimation() {
8350 a7dd0415 Kostas Papadimitriou
                        // XXX 'this' does not always have a nodeName when running the
8351 a7dd0415 Kostas Papadimitriou
                        // test suite
8352 a7dd0415 Kostas Papadimitriou
8353 a7dd0415 Kostas Papadimitriou
                        if ( optall.queue === false ) {
8354 a7dd0415 Kostas Papadimitriou
                                jQuery._mark( this );
8355 a7dd0415 Kostas Papadimitriou
                        }
8356 a7dd0415 Kostas Papadimitriou
8357 a7dd0415 Kostas Papadimitriou
                        var opt = jQuery.extend( {}, optall ),
8358 a7dd0415 Kostas Papadimitriou
                                isElement = this.nodeType === 1,
8359 a7dd0415 Kostas Papadimitriou
                                hidden = isElement && jQuery(this).is(":hidden"),
8360 a7dd0415 Kostas Papadimitriou
                                name, val, p, e,
8361 a7dd0415 Kostas Papadimitriou
                                parts, start, end, unit,
8362 a7dd0415 Kostas Papadimitriou
                                method;
8363 a7dd0415 Kostas Papadimitriou
8364 a7dd0415 Kostas Papadimitriou
                        // will store per property easing and be used to determine when an animation is complete
8365 a7dd0415 Kostas Papadimitriou
                        opt.animatedProperties = {};
8366 a7dd0415 Kostas Papadimitriou
8367 a7dd0415 Kostas Papadimitriou
                        for ( p in prop ) {
8368 a7dd0415 Kostas Papadimitriou
8369 a7dd0415 Kostas Papadimitriou
                                // property name normalization
8370 a7dd0415 Kostas Papadimitriou
                                name = jQuery.camelCase( p );
8371 a7dd0415 Kostas Papadimitriou
                                if ( p !== name ) {
8372 a7dd0415 Kostas Papadimitriou
                                        prop[ name ] = prop[ p ];
8373 a7dd0415 Kostas Papadimitriou
                                        delete prop[ p ];
8374 a7dd0415 Kostas Papadimitriou
                                }
8375 a7dd0415 Kostas Papadimitriou
8376 a7dd0415 Kostas Papadimitriou
                                val = prop[ name ];
8377 a7dd0415 Kostas Papadimitriou
8378 a7dd0415 Kostas Papadimitriou
                                // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
8379 a7dd0415 Kostas Papadimitriou
                                if ( jQuery.isArray( val ) ) {
8380 a7dd0415 Kostas Papadimitriou
                                        opt.animatedProperties[ name ] = val[ 1 ];
8381 a7dd0415 Kostas Papadimitriou
                                        val = prop[ name ] = val[ 0 ];
8382 a7dd0415 Kostas Papadimitriou
                                } else {
8383 a7dd0415 Kostas Papadimitriou
                                        opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
8384 a7dd0415 Kostas Papadimitriou
                                }
8385 a7dd0415 Kostas Papadimitriou
8386 a7dd0415 Kostas Papadimitriou
                                if ( val === "hide" && hidden || val === "show" && !hidden ) {
8387 a7dd0415 Kostas Papadimitriou
                                        return opt.complete.call( this );
8388 a7dd0415 Kostas Papadimitriou
                                }
8389 a7dd0415 Kostas Papadimitriou
8390 a7dd0415 Kostas Papadimitriou
                                if ( isElement && ( name === "height" || name === "width" ) ) {
8391 a7dd0415 Kostas Papadimitriou
                                        // Make sure that nothing sneaks out
8392 a7dd0415 Kostas Papadimitriou
                                        // Record all 3 overflow attributes because IE does not
8393 a7dd0415 Kostas Papadimitriou
                                        // change the overflow attribute when overflowX and
8394 a7dd0415 Kostas Papadimitriou
                                        // overflowY are set to the same value
8395 a7dd0415 Kostas Papadimitriou
                                        opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
8396 a7dd0415 Kostas Papadimitriou
8397 a7dd0415 Kostas Papadimitriou
                                        // Set display property to inline-block for height/width
8398 a7dd0415 Kostas Papadimitriou
                                        // animations on inline elements that are having width/height animated
8399 a7dd0415 Kostas Papadimitriou
                                        if ( jQuery.css( this, "display" ) === "inline" &&
8400 a7dd0415 Kostas Papadimitriou
                                                        jQuery.css( this, "float" ) === "none" ) {
8401 a7dd0415 Kostas Papadimitriou
8402 a7dd0415 Kostas Papadimitriou
                                                // inline-level elements accept inline-block;
8403 a7dd0415 Kostas Papadimitriou
                                                // block-level elements need to be inline with layout
8404 a7dd0415 Kostas Papadimitriou
                                                if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
8405 a7dd0415 Kostas Papadimitriou
                                                        this.style.display = "inline-block";
8406 a7dd0415 Kostas Papadimitriou
8407 a7dd0415 Kostas Papadimitriou
                                                } else {
8408 a7dd0415 Kostas Papadimitriou
                                                        this.style.zoom = 1;
8409 a7dd0415 Kostas Papadimitriou
                                                }
8410 a7dd0415 Kostas Papadimitriou
                                        }
8411 a7dd0415 Kostas Papadimitriou
                                }
8412 a7dd0415 Kostas Papadimitriou
                        }
8413 a7dd0415 Kostas Papadimitriou
8414 a7dd0415 Kostas Papadimitriou
                        if ( opt.overflow != null ) {
8415 a7dd0415 Kostas Papadimitriou
                                this.style.overflow = "hidden";
8416 a7dd0415 Kostas Papadimitriou
                        }
8417 a7dd0415 Kostas Papadimitriou
8418 a7dd0415 Kostas Papadimitriou
                        for ( p in prop ) {
8419 a7dd0415 Kostas Papadimitriou
                                e = new jQuery.fx( this, opt, p );
8420 a7dd0415 Kostas Papadimitriou
                                val = prop[ p ];
8421 a7dd0415 Kostas Papadimitriou
8422 a7dd0415 Kostas Papadimitriou
                                if ( rfxtypes.test( val ) ) {
8423 a7dd0415 Kostas Papadimitriou
8424 a7dd0415 Kostas Papadimitriou
                                        // Tracks whether to show or hide based on private
8425 a7dd0415 Kostas Papadimitriou
                                        // data attached to the element
8426 a7dd0415 Kostas Papadimitriou
                                        method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
8427 a7dd0415 Kostas Papadimitriou
                                        if ( method ) {
8428 a7dd0415 Kostas Papadimitriou
                                                jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
8429 a7dd0415 Kostas Papadimitriou
                                                e[ method ]();
8430 a7dd0415 Kostas Papadimitriou
                                        } else {
8431 a7dd0415 Kostas Papadimitriou
                                                e[ val ]();
8432 a7dd0415 Kostas Papadimitriou
                                        }
8433 a7dd0415 Kostas Papadimitriou
8434 a7dd0415 Kostas Papadimitriou
                                } else {
8435 a7dd0415 Kostas Papadimitriou
                                        parts = rfxnum.exec( val );
8436 a7dd0415 Kostas Papadimitriou
                                        start = e.cur();
8437 a7dd0415 Kostas Papadimitriou
8438 a7dd0415 Kostas Papadimitriou
                                        if ( parts ) {
8439 a7dd0415 Kostas Papadimitriou
                                                end = parseFloat( parts[2] );
8440 a7dd0415 Kostas Papadimitriou
                                                unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
8441 a7dd0415 Kostas Papadimitriou
8442 a7dd0415 Kostas Papadimitriou
                                                // We need to compute starting value
8443 a7dd0415 Kostas Papadimitriou
                                                if ( unit !== "px" ) {
8444 a7dd0415 Kostas Papadimitriou
                                                        jQuery.style( this, p, (end || 1) + unit);
8445 a7dd0415 Kostas Papadimitriou
                                                        start = ( (end || 1) / e.cur() ) * start;
8446 a7dd0415 Kostas Papadimitriou
                                                        jQuery.style( this, p, start + unit);
8447 a7dd0415 Kostas Papadimitriou
                                                }
8448 a7dd0415 Kostas Papadimitriou
8449 a7dd0415 Kostas Papadimitriou
                                                // If a +=/-= token was provided, we're doing a relative animation
8450 a7dd0415 Kostas Papadimitriou
                                                if ( parts[1] ) {
8451 a7dd0415 Kostas Papadimitriou
                                                        end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
8452 a7dd0415 Kostas Papadimitriou
                                                }
8453 a7dd0415 Kostas Papadimitriou
8454 a7dd0415 Kostas Papadimitriou
                                                e.custom( start, end, unit );
8455 a7dd0415 Kostas Papadimitriou
8456 a7dd0415 Kostas Papadimitriou
                                        } else {
8457 a7dd0415 Kostas Papadimitriou
                                                e.custom( start, val, "" );
8458 a7dd0415 Kostas Papadimitriou
                                        }
8459 a7dd0415 Kostas Papadimitriou
                                }
8460 a7dd0415 Kostas Papadimitriou
                        }
8461 a7dd0415 Kostas Papadimitriou
8462 a7dd0415 Kostas Papadimitriou
                        // For JS strict compliance
8463 a7dd0415 Kostas Papadimitriou
                        return true;
8464 a7dd0415 Kostas Papadimitriou
                }
8465 a7dd0415 Kostas Papadimitriou
8466 a7dd0415 Kostas Papadimitriou
                return optall.queue === false ?
8467 a7dd0415 Kostas Papadimitriou
                        this.each( doAnimation ) :
8468 a7dd0415 Kostas Papadimitriou
                        this.queue( optall.queue, doAnimation );
8469 a7dd0415 Kostas Papadimitriou
        },
8470 a7dd0415 Kostas Papadimitriou
8471 a7dd0415 Kostas Papadimitriou
        stop: function( type, clearQueue, gotoEnd ) {
8472 a7dd0415 Kostas Papadimitriou
                if ( typeof type !== "string" ) {
8473 a7dd0415 Kostas Papadimitriou
                        gotoEnd = clearQueue;
8474 a7dd0415 Kostas Papadimitriou
                        clearQueue = type;
8475 a7dd0415 Kostas Papadimitriou
                        type = undefined;
8476 a7dd0415 Kostas Papadimitriou
                }
8477 a7dd0415 Kostas Papadimitriou
                if ( clearQueue && type !== false ) {
8478 a7dd0415 Kostas Papadimitriou
                        this.queue( type || "fx", [] );
8479 a7dd0415 Kostas Papadimitriou
                }
8480 a7dd0415 Kostas Papadimitriou
8481 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
8482 a7dd0415 Kostas Papadimitriou
                        var index,
8483 a7dd0415 Kostas Papadimitriou
                                hadTimers = false,
8484 a7dd0415 Kostas Papadimitriou
                                timers = jQuery.timers,
8485 a7dd0415 Kostas Papadimitriou
                                data = jQuery._data( this );
8486 a7dd0415 Kostas Papadimitriou
8487 a7dd0415 Kostas Papadimitriou
                        // clear marker counters if we know they won't be
8488 a7dd0415 Kostas Papadimitriou
                        if ( !gotoEnd ) {
8489 a7dd0415 Kostas Papadimitriou
                                jQuery._unmark( true, this );
8490 a7dd0415 Kostas Papadimitriou
                        }
8491 a7dd0415 Kostas Papadimitriou
8492 a7dd0415 Kostas Papadimitriou
                        function stopQueue( elem, data, index ) {
8493 a7dd0415 Kostas Papadimitriou
                                var hooks = data[ index ];
8494 a7dd0415 Kostas Papadimitriou
                                jQuery.removeData( elem, index, true );
8495 a7dd0415 Kostas Papadimitriou
                                hooks.stop( gotoEnd );
8496 a7dd0415 Kostas Papadimitriou
                        }
8497 a7dd0415 Kostas Papadimitriou
8498 a7dd0415 Kostas Papadimitriou
                        if ( type == null ) {
8499 a7dd0415 Kostas Papadimitriou
                                for ( index in data ) {
8500 a7dd0415 Kostas Papadimitriou
                                        if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
8501 a7dd0415 Kostas Papadimitriou
                                                stopQueue( this, data, index );
8502 a7dd0415 Kostas Papadimitriou
                                        }
8503 a7dd0415 Kostas Papadimitriou
                                }
8504 a7dd0415 Kostas Papadimitriou
                        } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
8505 a7dd0415 Kostas Papadimitriou
                                stopQueue( this, data, index );
8506 a7dd0415 Kostas Papadimitriou
                        }
8507 a7dd0415 Kostas Papadimitriou
8508 a7dd0415 Kostas Papadimitriou
                        for ( index = timers.length; index--; ) {
8509 a7dd0415 Kostas Papadimitriou
                                if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
8510 a7dd0415 Kostas Papadimitriou
                                        if ( gotoEnd ) {
8511 a7dd0415 Kostas Papadimitriou
8512 a7dd0415 Kostas Papadimitriou
                                                // force the next step to be the last
8513 a7dd0415 Kostas Papadimitriou
                                                timers[ index ]( true );
8514 a7dd0415 Kostas Papadimitriou
                                        } else {
8515 a7dd0415 Kostas Papadimitriou
                                                timers[ index ].saveState();
8516 a7dd0415 Kostas Papadimitriou
                                        }
8517 a7dd0415 Kostas Papadimitriou
                                        hadTimers = true;
8518 a7dd0415 Kostas Papadimitriou
                                        timers.splice( index, 1 );
8519 a7dd0415 Kostas Papadimitriou
                                }
8520 a7dd0415 Kostas Papadimitriou
                        }
8521 a7dd0415 Kostas Papadimitriou
8522 a7dd0415 Kostas Papadimitriou
                        // start the next in the queue if the last step wasn't forced
8523 a7dd0415 Kostas Papadimitriou
                        // timers currently will call their complete callbacks, which will dequeue
8524 a7dd0415 Kostas Papadimitriou
                        // but only if they were gotoEnd
8525 a7dd0415 Kostas Papadimitriou
                        if ( !( gotoEnd && hadTimers ) ) {
8526 a7dd0415 Kostas Papadimitriou
                                jQuery.dequeue( this, type );
8527 a7dd0415 Kostas Papadimitriou
                        }
8528 a7dd0415 Kostas Papadimitriou
                });
8529 a7dd0415 Kostas Papadimitriou
        }
8530 a7dd0415 Kostas Papadimitriou
8531 a7dd0415 Kostas Papadimitriou
});
8532 a7dd0415 Kostas Papadimitriou
8533 a7dd0415 Kostas Papadimitriou
// Animations created synchronously will run synchronously
8534 a7dd0415 Kostas Papadimitriou
function createFxNow() {
8535 a7dd0415 Kostas Papadimitriou
        setTimeout( clearFxNow, 0 );
8536 a7dd0415 Kostas Papadimitriou
        return ( fxNow = jQuery.now() );
8537 a7dd0415 Kostas Papadimitriou
}
8538 a7dd0415 Kostas Papadimitriou
8539 a7dd0415 Kostas Papadimitriou
function clearFxNow() {
8540 a7dd0415 Kostas Papadimitriou
        fxNow = undefined;
8541 a7dd0415 Kostas Papadimitriou
}
8542 a7dd0415 Kostas Papadimitriou
8543 a7dd0415 Kostas Papadimitriou
// Generate parameters to create a standard animation
8544 a7dd0415 Kostas Papadimitriou
function genFx( type, num ) {
8545 a7dd0415 Kostas Papadimitriou
        var obj = {};
8546 a7dd0415 Kostas Papadimitriou
8547 a7dd0415 Kostas Papadimitriou
        jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
8548 a7dd0415 Kostas Papadimitriou
                obj[ this ] = type;
8549 a7dd0415 Kostas Papadimitriou
        });
8550 a7dd0415 Kostas Papadimitriou
8551 a7dd0415 Kostas Papadimitriou
        return obj;
8552 a7dd0415 Kostas Papadimitriou
}
8553 a7dd0415 Kostas Papadimitriou
8554 a7dd0415 Kostas Papadimitriou
// Generate shortcuts for custom animations
8555 a7dd0415 Kostas Papadimitriou
jQuery.each({
8556 a7dd0415 Kostas Papadimitriou
        slideDown: genFx( "show", 1 ),
8557 a7dd0415 Kostas Papadimitriou
        slideUp: genFx( "hide", 1 ),
8558 a7dd0415 Kostas Papadimitriou
        slideToggle: genFx( "toggle", 1 ),
8559 a7dd0415 Kostas Papadimitriou
        fadeIn: { opacity: "show" },
8560 a7dd0415 Kostas Papadimitriou
        fadeOut: { opacity: "hide" },
8561 a7dd0415 Kostas Papadimitriou
        fadeToggle: { opacity: "toggle" }
8562 a7dd0415 Kostas Papadimitriou
}, function( name, props ) {
8563 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ name ] = function( speed, easing, callback ) {
8564 a7dd0415 Kostas Papadimitriou
                return this.animate( props, speed, easing, callback );
8565 a7dd0415 Kostas Papadimitriou
        };
8566 a7dd0415 Kostas Papadimitriou
});
8567 a7dd0415 Kostas Papadimitriou
8568 a7dd0415 Kostas Papadimitriou
jQuery.extend({
8569 a7dd0415 Kostas Papadimitriou
        speed: function( speed, easing, fn ) {
8570 a7dd0415 Kostas Papadimitriou
                var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
8571 a7dd0415 Kostas Papadimitriou
                        complete: fn || !fn && easing ||
8572 a7dd0415 Kostas Papadimitriou
                                jQuery.isFunction( speed ) && speed,
8573 a7dd0415 Kostas Papadimitriou
                        duration: speed,
8574 a7dd0415 Kostas Papadimitriou
                        easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
8575 a7dd0415 Kostas Papadimitriou
                };
8576 a7dd0415 Kostas Papadimitriou
8577 a7dd0415 Kostas Papadimitriou
                opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
8578 a7dd0415 Kostas Papadimitriou
                        opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
8579 a7dd0415 Kostas Papadimitriou
8580 a7dd0415 Kostas Papadimitriou
                // normalize opt.queue - true/undefined/null -> "fx"
8581 a7dd0415 Kostas Papadimitriou
                if ( opt.queue == null || opt.queue === true ) {
8582 a7dd0415 Kostas Papadimitriou
                        opt.queue = "fx";
8583 a7dd0415 Kostas Papadimitriou
                }
8584 a7dd0415 Kostas Papadimitriou
8585 a7dd0415 Kostas Papadimitriou
                // Queueing
8586 a7dd0415 Kostas Papadimitriou
                opt.old = opt.complete;
8587 a7dd0415 Kostas Papadimitriou
8588 a7dd0415 Kostas Papadimitriou
                opt.complete = function( noUnmark ) {
8589 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.isFunction( opt.old ) ) {
8590 a7dd0415 Kostas Papadimitriou
                                opt.old.call( this );
8591 a7dd0415 Kostas Papadimitriou
                        }
8592 a7dd0415 Kostas Papadimitriou
8593 a7dd0415 Kostas Papadimitriou
                        if ( opt.queue ) {
8594 a7dd0415 Kostas Papadimitriou
                                jQuery.dequeue( this, opt.queue );
8595 a7dd0415 Kostas Papadimitriou
                        } else if ( noUnmark !== false ) {
8596 a7dd0415 Kostas Papadimitriou
                                jQuery._unmark( this );
8597 a7dd0415 Kostas Papadimitriou
                        }
8598 a7dd0415 Kostas Papadimitriou
                };
8599 a7dd0415 Kostas Papadimitriou
8600 a7dd0415 Kostas Papadimitriou
                return opt;
8601 a7dd0415 Kostas Papadimitriou
        },
8602 a7dd0415 Kostas Papadimitriou
8603 a7dd0415 Kostas Papadimitriou
        easing: {
8604 a7dd0415 Kostas Papadimitriou
                linear: function( p, n, firstNum, diff ) {
8605 a7dd0415 Kostas Papadimitriou
                        return firstNum + diff * p;
8606 a7dd0415 Kostas Papadimitriou
                },
8607 a7dd0415 Kostas Papadimitriou
                swing: function( p, n, firstNum, diff ) {
8608 a7dd0415 Kostas Papadimitriou
                        return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
8609 a7dd0415 Kostas Papadimitriou
                }
8610 a7dd0415 Kostas Papadimitriou
        },
8611 a7dd0415 Kostas Papadimitriou
8612 a7dd0415 Kostas Papadimitriou
        timers: [],
8613 a7dd0415 Kostas Papadimitriou
8614 a7dd0415 Kostas Papadimitriou
        fx: function( elem, options, prop ) {
8615 a7dd0415 Kostas Papadimitriou
                this.options = options;
8616 a7dd0415 Kostas Papadimitriou
                this.elem = elem;
8617 a7dd0415 Kostas Papadimitriou
                this.prop = prop;
8618 a7dd0415 Kostas Papadimitriou
8619 a7dd0415 Kostas Papadimitriou
                options.orig = options.orig || {};
8620 a7dd0415 Kostas Papadimitriou
        }
8621 a7dd0415 Kostas Papadimitriou
8622 a7dd0415 Kostas Papadimitriou
});
8623 a7dd0415 Kostas Papadimitriou
8624 a7dd0415 Kostas Papadimitriou
jQuery.fx.prototype = {
8625 a7dd0415 Kostas Papadimitriou
        // Simple function for setting a style value
8626 a7dd0415 Kostas Papadimitriou
        update: function() {
8627 a7dd0415 Kostas Papadimitriou
                if ( this.options.step ) {
8628 a7dd0415 Kostas Papadimitriou
                        this.options.step.call( this.elem, this.now, this );
8629 a7dd0415 Kostas Papadimitriou
                }
8630 a7dd0415 Kostas Papadimitriou
8631 a7dd0415 Kostas Papadimitriou
                ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
8632 a7dd0415 Kostas Papadimitriou
        },
8633 a7dd0415 Kostas Papadimitriou
8634 a7dd0415 Kostas Papadimitriou
        // Get the current size
8635 a7dd0415 Kostas Papadimitriou
        cur: function() {
8636 a7dd0415 Kostas Papadimitriou
                if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
8637 a7dd0415 Kostas Papadimitriou
                        return this.elem[ this.prop ];
8638 a7dd0415 Kostas Papadimitriou
                }
8639 a7dd0415 Kostas Papadimitriou
8640 a7dd0415 Kostas Papadimitriou
                var parsed,
8641 a7dd0415 Kostas Papadimitriou
                        r = jQuery.css( this.elem, this.prop );
8642 a7dd0415 Kostas Papadimitriou
                // Empty strings, null, undefined and "auto" are converted to 0,
8643 a7dd0415 Kostas Papadimitriou
                // complex values such as "rotate(1rad)" are returned as is,
8644 a7dd0415 Kostas Papadimitriou
                // simple values such as "10px" are parsed to Float.
8645 a7dd0415 Kostas Papadimitriou
                return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
8646 a7dd0415 Kostas Papadimitriou
        },
8647 a7dd0415 Kostas Papadimitriou
8648 a7dd0415 Kostas Papadimitriou
        // Start an animation from one number to another
8649 a7dd0415 Kostas Papadimitriou
        custom: function( from, to, unit ) {
8650 a7dd0415 Kostas Papadimitriou
                var self = this,
8651 a7dd0415 Kostas Papadimitriou
                        fx = jQuery.fx;
8652 a7dd0415 Kostas Papadimitriou
8653 a7dd0415 Kostas Papadimitriou
                this.startTime = fxNow || createFxNow();
8654 a7dd0415 Kostas Papadimitriou
                this.end = to;
8655 a7dd0415 Kostas Papadimitriou
                this.now = this.start = from;
8656 a7dd0415 Kostas Papadimitriou
                this.pos = this.state = 0;
8657 a7dd0415 Kostas Papadimitriou
                this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
8658 a7dd0415 Kostas Papadimitriou
8659 a7dd0415 Kostas Papadimitriou
                function t( gotoEnd ) {
8660 a7dd0415 Kostas Papadimitriou
                        return self.step( gotoEnd );
8661 a7dd0415 Kostas Papadimitriou
                }
8662 a7dd0415 Kostas Papadimitriou
8663 a7dd0415 Kostas Papadimitriou
                t.queue = this.options.queue;
8664 a7dd0415 Kostas Papadimitriou
                t.elem = this.elem;
8665 a7dd0415 Kostas Papadimitriou
                t.saveState = function() {
8666 a7dd0415 Kostas Papadimitriou
                        if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
8667 a7dd0415 Kostas Papadimitriou
                                jQuery._data( self.elem, "fxshow" + self.prop, self.start );
8668 a7dd0415 Kostas Papadimitriou
                        }
8669 a7dd0415 Kostas Papadimitriou
                };
8670 a7dd0415 Kostas Papadimitriou
8671 a7dd0415 Kostas Papadimitriou
                if ( t() && jQuery.timers.push(t) && !timerId ) {
8672 a7dd0415 Kostas Papadimitriou
                        timerId = setInterval( fx.tick, fx.interval );
8673 a7dd0415 Kostas Papadimitriou
                }
8674 a7dd0415 Kostas Papadimitriou
        },
8675 a7dd0415 Kostas Papadimitriou
8676 a7dd0415 Kostas Papadimitriou
        // Simple 'show' function
8677 a7dd0415 Kostas Papadimitriou
        show: function() {
8678 a7dd0415 Kostas Papadimitriou
                var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
8679 a7dd0415 Kostas Papadimitriou
8680 a7dd0415 Kostas Papadimitriou
                // Remember where we started, so that we can go back to it later
8681 a7dd0415 Kostas Papadimitriou
                this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
8682 a7dd0415 Kostas Papadimitriou
                this.options.show = true;
8683 a7dd0415 Kostas Papadimitriou
8684 a7dd0415 Kostas Papadimitriou
                // Begin the animation
8685 a7dd0415 Kostas Papadimitriou
                // Make sure that we start at a small width/height to avoid any flash of content
8686 a7dd0415 Kostas Papadimitriou
                if ( dataShow !== undefined ) {
8687 a7dd0415 Kostas Papadimitriou
                        // This show is picking up where a previous hide or show left off
8688 a7dd0415 Kostas Papadimitriou
                        this.custom( this.cur(), dataShow );
8689 a7dd0415 Kostas Papadimitriou
                } else {
8690 a7dd0415 Kostas Papadimitriou
                        this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
8691 a7dd0415 Kostas Papadimitriou
                }
8692 a7dd0415 Kostas Papadimitriou
8693 a7dd0415 Kostas Papadimitriou
                // Start by showing the element
8694 a7dd0415 Kostas Papadimitriou
                jQuery( this.elem ).show();
8695 a7dd0415 Kostas Papadimitriou
        },
8696 a7dd0415 Kostas Papadimitriou
8697 a7dd0415 Kostas Papadimitriou
        // Simple 'hide' function
8698 a7dd0415 Kostas Papadimitriou
        hide: function() {
8699 a7dd0415 Kostas Papadimitriou
                // Remember where we started, so that we can go back to it later
8700 a7dd0415 Kostas Papadimitriou
                this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
8701 a7dd0415 Kostas Papadimitriou
                this.options.hide = true;
8702 a7dd0415 Kostas Papadimitriou
8703 a7dd0415 Kostas Papadimitriou
                // Begin the animation
8704 a7dd0415 Kostas Papadimitriou
                this.custom( this.cur(), 0 );
8705 a7dd0415 Kostas Papadimitriou
        },
8706 a7dd0415 Kostas Papadimitriou
8707 a7dd0415 Kostas Papadimitriou
        // Each step of an animation
8708 a7dd0415 Kostas Papadimitriou
        step: function( gotoEnd ) {
8709 a7dd0415 Kostas Papadimitriou
                var p, n, complete,
8710 a7dd0415 Kostas Papadimitriou
                        t = fxNow || createFxNow(),
8711 a7dd0415 Kostas Papadimitriou
                        done = true,
8712 a7dd0415 Kostas Papadimitriou
                        elem = this.elem,
8713 a7dd0415 Kostas Papadimitriou
                        options = this.options;
8714 a7dd0415 Kostas Papadimitriou
8715 a7dd0415 Kostas Papadimitriou
                if ( gotoEnd || t >= options.duration + this.startTime ) {
8716 a7dd0415 Kostas Papadimitriou
                        this.now = this.end;
8717 a7dd0415 Kostas Papadimitriou
                        this.pos = this.state = 1;
8718 a7dd0415 Kostas Papadimitriou
                        this.update();
8719 a7dd0415 Kostas Papadimitriou
8720 a7dd0415 Kostas Papadimitriou
                        options.animatedProperties[ this.prop ] = true;
8721 a7dd0415 Kostas Papadimitriou
8722 a7dd0415 Kostas Papadimitriou
                        for ( p in options.animatedProperties ) {
8723 a7dd0415 Kostas Papadimitriou
                                if ( options.animatedProperties[ p ] !== true ) {
8724 a7dd0415 Kostas Papadimitriou
                                        done = false;
8725 a7dd0415 Kostas Papadimitriou
                                }
8726 a7dd0415 Kostas Papadimitriou
                        }
8727 a7dd0415 Kostas Papadimitriou
8728 a7dd0415 Kostas Papadimitriou
                        if ( done ) {
8729 a7dd0415 Kostas Papadimitriou
                                // Reset the overflow
8730 a7dd0415 Kostas Papadimitriou
                                if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
8731 a7dd0415 Kostas Papadimitriou
8732 a7dd0415 Kostas Papadimitriou
                                        jQuery.each( [ "", "X", "Y" ], function( index, value ) {
8733 a7dd0415 Kostas Papadimitriou
                                                elem.style[ "overflow" + value ] = options.overflow[ index ];
8734 a7dd0415 Kostas Papadimitriou
                                        });
8735 a7dd0415 Kostas Papadimitriou
                                }
8736 a7dd0415 Kostas Papadimitriou
8737 a7dd0415 Kostas Papadimitriou
                                // Hide the element if the "hide" operation was done
8738 a7dd0415 Kostas Papadimitriou
                                if ( options.hide ) {
8739 a7dd0415 Kostas Papadimitriou
                                        jQuery( elem ).hide();
8740 a7dd0415 Kostas Papadimitriou
                                }
8741 a7dd0415 Kostas Papadimitriou
8742 a7dd0415 Kostas Papadimitriou
                                // Reset the properties, if the item has been hidden or shown
8743 a7dd0415 Kostas Papadimitriou
                                if ( options.hide || options.show ) {
8744 a7dd0415 Kostas Papadimitriou
                                        for ( p in options.animatedProperties ) {
8745 a7dd0415 Kostas Papadimitriou
                                                jQuery.style( elem, p, options.orig[ p ] );
8746 a7dd0415 Kostas Papadimitriou
                                                jQuery.removeData( elem, "fxshow" + p, true );
8747 a7dd0415 Kostas Papadimitriou
                                                // Toggle data is no longer needed
8748 a7dd0415 Kostas Papadimitriou
                                                jQuery.removeData( elem, "toggle" + p, true );
8749 a7dd0415 Kostas Papadimitriou
                                        }
8750 a7dd0415 Kostas Papadimitriou
                                }
8751 a7dd0415 Kostas Papadimitriou
8752 a7dd0415 Kostas Papadimitriou
                                // Execute the complete function
8753 a7dd0415 Kostas Papadimitriou
                                // in the event that the complete function throws an exception
8754 a7dd0415 Kostas Papadimitriou
                                // we must ensure it won't be called twice. #5684
8755 a7dd0415 Kostas Papadimitriou
8756 a7dd0415 Kostas Papadimitriou
                                complete = options.complete;
8757 a7dd0415 Kostas Papadimitriou
                                if ( complete ) {
8758 a7dd0415 Kostas Papadimitriou
8759 a7dd0415 Kostas Papadimitriou
                                        options.complete = false;
8760 a7dd0415 Kostas Papadimitriou
                                        complete.call( elem );
8761 a7dd0415 Kostas Papadimitriou
                                }
8762 a7dd0415 Kostas Papadimitriou
                        }
8763 a7dd0415 Kostas Papadimitriou
8764 a7dd0415 Kostas Papadimitriou
                        return false;
8765 a7dd0415 Kostas Papadimitriou
8766 a7dd0415 Kostas Papadimitriou
                } else {
8767 a7dd0415 Kostas Papadimitriou
                        // classical easing cannot be used with an Infinity duration
8768 a7dd0415 Kostas Papadimitriou
                        if ( options.duration == Infinity ) {
8769 a7dd0415 Kostas Papadimitriou
                                this.now = t;
8770 a7dd0415 Kostas Papadimitriou
                        } else {
8771 a7dd0415 Kostas Papadimitriou
                                n = t - this.startTime;
8772 a7dd0415 Kostas Papadimitriou
                                this.state = n / options.duration;
8773 a7dd0415 Kostas Papadimitriou
8774 a7dd0415 Kostas Papadimitriou
                                // Perform the easing function, defaults to swing
8775 a7dd0415 Kostas Papadimitriou
                                this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
8776 a7dd0415 Kostas Papadimitriou
                                this.now = this.start + ( (this.end - this.start) * this.pos );
8777 a7dd0415 Kostas Papadimitriou
                        }
8778 a7dd0415 Kostas Papadimitriou
                        // Perform the next step of the animation
8779 a7dd0415 Kostas Papadimitriou
                        this.update();
8780 a7dd0415 Kostas Papadimitriou
                }
8781 a7dd0415 Kostas Papadimitriou
8782 a7dd0415 Kostas Papadimitriou
                return true;
8783 a7dd0415 Kostas Papadimitriou
        }
8784 a7dd0415 Kostas Papadimitriou
};
8785 a7dd0415 Kostas Papadimitriou
8786 a7dd0415 Kostas Papadimitriou
jQuery.extend( jQuery.fx, {
8787 a7dd0415 Kostas Papadimitriou
        tick: function() {
8788 a7dd0415 Kostas Papadimitriou
                var timer,
8789 a7dd0415 Kostas Papadimitriou
                        timers = jQuery.timers,
8790 a7dd0415 Kostas Papadimitriou
                        i = 0;
8791 a7dd0415 Kostas Papadimitriou
8792 a7dd0415 Kostas Papadimitriou
                for ( ; i < timers.length; i++ ) {
8793 a7dd0415 Kostas Papadimitriou
                        timer = timers[ i ];
8794 a7dd0415 Kostas Papadimitriou
                        // Checks the timer has not already been removed
8795 a7dd0415 Kostas Papadimitriou
                        if ( !timer() && timers[ i ] === timer ) {
8796 a7dd0415 Kostas Papadimitriou
                                timers.splice( i--, 1 );
8797 a7dd0415 Kostas Papadimitriou
                        }
8798 a7dd0415 Kostas Papadimitriou
                }
8799 a7dd0415 Kostas Papadimitriou
8800 a7dd0415 Kostas Papadimitriou
                if ( !timers.length ) {
8801 a7dd0415 Kostas Papadimitriou
                        jQuery.fx.stop();
8802 a7dd0415 Kostas Papadimitriou
                }
8803 a7dd0415 Kostas Papadimitriou
        },
8804 a7dd0415 Kostas Papadimitriou
8805 a7dd0415 Kostas Papadimitriou
        interval: 13,
8806 a7dd0415 Kostas Papadimitriou
8807 a7dd0415 Kostas Papadimitriou
        stop: function() {
8808 a7dd0415 Kostas Papadimitriou
                clearInterval( timerId );
8809 a7dd0415 Kostas Papadimitriou
                timerId = null;
8810 a7dd0415 Kostas Papadimitriou
        },
8811 a7dd0415 Kostas Papadimitriou
8812 a7dd0415 Kostas Papadimitriou
        speeds: {
8813 a7dd0415 Kostas Papadimitriou
                slow: 600,
8814 a7dd0415 Kostas Papadimitriou
                fast: 200,
8815 a7dd0415 Kostas Papadimitriou
                // Default speed
8816 a7dd0415 Kostas Papadimitriou
                _default: 400
8817 a7dd0415 Kostas Papadimitriou
        },
8818 a7dd0415 Kostas Papadimitriou
8819 a7dd0415 Kostas Papadimitriou
        step: {
8820 a7dd0415 Kostas Papadimitriou
                opacity: function( fx ) {
8821 a7dd0415 Kostas Papadimitriou
                        jQuery.style( fx.elem, "opacity", fx.now );
8822 a7dd0415 Kostas Papadimitriou
                },
8823 a7dd0415 Kostas Papadimitriou
8824 a7dd0415 Kostas Papadimitriou
                _default: function( fx ) {
8825 a7dd0415 Kostas Papadimitriou
                        if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
8826 a7dd0415 Kostas Papadimitriou
                                fx.elem.style[ fx.prop ] = fx.now + fx.unit;
8827 a7dd0415 Kostas Papadimitriou
                        } else {
8828 a7dd0415 Kostas Papadimitriou
                                fx.elem[ fx.prop ] = fx.now;
8829 a7dd0415 Kostas Papadimitriou
                        }
8830 a7dd0415 Kostas Papadimitriou
                }
8831 a7dd0415 Kostas Papadimitriou
        }
8832 a7dd0415 Kostas Papadimitriou
});
8833 a7dd0415 Kostas Papadimitriou
8834 a7dd0415 Kostas Papadimitriou
// Adds width/height step functions
8835 a7dd0415 Kostas Papadimitriou
// Do not set anything below 0
8836 a7dd0415 Kostas Papadimitriou
jQuery.each([ "width", "height" ], function( i, prop ) {
8837 a7dd0415 Kostas Papadimitriou
        jQuery.fx.step[ prop ] = function( fx ) {
8838 a7dd0415 Kostas Papadimitriou
                jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
8839 a7dd0415 Kostas Papadimitriou
        };
8840 a7dd0415 Kostas Papadimitriou
});
8841 a7dd0415 Kostas Papadimitriou
8842 a7dd0415 Kostas Papadimitriou
if ( jQuery.expr && jQuery.expr.filters ) {
8843 a7dd0415 Kostas Papadimitriou
        jQuery.expr.filters.animated = function( elem ) {
8844 a7dd0415 Kostas Papadimitriou
                return jQuery.grep(jQuery.timers, function( fn ) {
8845 a7dd0415 Kostas Papadimitriou
                        return elem === fn.elem;
8846 a7dd0415 Kostas Papadimitriou
                }).length;
8847 a7dd0415 Kostas Papadimitriou
        };
8848 a7dd0415 Kostas Papadimitriou
}
8849 a7dd0415 Kostas Papadimitriou
8850 a7dd0415 Kostas Papadimitriou
// Try to restore the default display value of an element
8851 a7dd0415 Kostas Papadimitriou
function defaultDisplay( nodeName ) {
8852 a7dd0415 Kostas Papadimitriou
8853 a7dd0415 Kostas Papadimitriou
        if ( !elemdisplay[ nodeName ] ) {
8854 a7dd0415 Kostas Papadimitriou
8855 a7dd0415 Kostas Papadimitriou
                var body = document.body,
8856 a7dd0415 Kostas Papadimitriou
                        elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
8857 a7dd0415 Kostas Papadimitriou
                        display = elem.css( "display" );
8858 a7dd0415 Kostas Papadimitriou
                elem.remove();
8859 a7dd0415 Kostas Papadimitriou
8860 a7dd0415 Kostas Papadimitriou
                // If the simple way fails,
8861 a7dd0415 Kostas Papadimitriou
                // get element's real default display by attaching it to a temp iframe
8862 a7dd0415 Kostas Papadimitriou
                if ( display === "none" || display === "" ) {
8863 a7dd0415 Kostas Papadimitriou
                        // No iframe to use yet, so create it
8864 a7dd0415 Kostas Papadimitriou
                        if ( !iframe ) {
8865 a7dd0415 Kostas Papadimitriou
                                iframe = document.createElement( "iframe" );
8866 a7dd0415 Kostas Papadimitriou
                                iframe.frameBorder = iframe.width = iframe.height = 0;
8867 a7dd0415 Kostas Papadimitriou
                        }
8868 a7dd0415 Kostas Papadimitriou
8869 a7dd0415 Kostas Papadimitriou
                        body.appendChild( iframe );
8870 a7dd0415 Kostas Papadimitriou
8871 a7dd0415 Kostas Papadimitriou
                        // Create a cacheable copy of the iframe document on first call.
8872 a7dd0415 Kostas Papadimitriou
                        // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
8873 a7dd0415 Kostas Papadimitriou
                        // document to it; WebKit & Firefox won't allow reusing the iframe document.
8874 a7dd0415 Kostas Papadimitriou
                        if ( !iframeDoc || !iframe.createElement ) {
8875 a7dd0415 Kostas Papadimitriou
                                iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
8876 a7dd0415 Kostas Papadimitriou
                                iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
8877 a7dd0415 Kostas Papadimitriou
                                iframeDoc.close();
8878 a7dd0415 Kostas Papadimitriou
                        }
8879 a7dd0415 Kostas Papadimitriou
8880 a7dd0415 Kostas Papadimitriou
                        elem = iframeDoc.createElement( nodeName );
8881 a7dd0415 Kostas Papadimitriou
8882 a7dd0415 Kostas Papadimitriou
                        iframeDoc.body.appendChild( elem );
8883 a7dd0415 Kostas Papadimitriou
8884 a7dd0415 Kostas Papadimitriou
                        display = jQuery.css( elem, "display" );
8885 a7dd0415 Kostas Papadimitriou
                        body.removeChild( iframe );
8886 a7dd0415 Kostas Papadimitriou
                }
8887 a7dd0415 Kostas Papadimitriou
8888 a7dd0415 Kostas Papadimitriou
                // Store the correct default display
8889 a7dd0415 Kostas Papadimitriou
                elemdisplay[ nodeName ] = display;
8890 a7dd0415 Kostas Papadimitriou
        }
8891 a7dd0415 Kostas Papadimitriou
8892 a7dd0415 Kostas Papadimitriou
        return elemdisplay[ nodeName ];
8893 a7dd0415 Kostas Papadimitriou
}
8894 a7dd0415 Kostas Papadimitriou
8895 a7dd0415 Kostas Papadimitriou
8896 a7dd0415 Kostas Papadimitriou
8897 a7dd0415 Kostas Papadimitriou
8898 a7dd0415 Kostas Papadimitriou
var rtable = /^t(?:able|d|h)$/i,
8899 a7dd0415 Kostas Papadimitriou
        rroot = /^(?:body|html)$/i;
8900 a7dd0415 Kostas Papadimitriou
8901 a7dd0415 Kostas Papadimitriou
if ( "getBoundingClientRect" in document.documentElement ) {
8902 a7dd0415 Kostas Papadimitriou
        jQuery.fn.offset = function( options ) {
8903 a7dd0415 Kostas Papadimitriou
                var elem = this[0], box;
8904 a7dd0415 Kostas Papadimitriou
8905 a7dd0415 Kostas Papadimitriou
                if ( options ) {
8906 a7dd0415 Kostas Papadimitriou
                        return this.each(function( i ) {
8907 a7dd0415 Kostas Papadimitriou
                                jQuery.offset.setOffset( this, options, i );
8908 a7dd0415 Kostas Papadimitriou
                        });
8909 a7dd0415 Kostas Papadimitriou
                }
8910 a7dd0415 Kostas Papadimitriou
8911 a7dd0415 Kostas Papadimitriou
                if ( !elem || !elem.ownerDocument ) {
8912 a7dd0415 Kostas Papadimitriou
                        return null;
8913 a7dd0415 Kostas Papadimitriou
                }
8914 a7dd0415 Kostas Papadimitriou
8915 a7dd0415 Kostas Papadimitriou
                if ( elem === elem.ownerDocument.body ) {
8916 a7dd0415 Kostas Papadimitriou
                        return jQuery.offset.bodyOffset( elem );
8917 a7dd0415 Kostas Papadimitriou
                }
8918 a7dd0415 Kostas Papadimitriou
8919 a7dd0415 Kostas Papadimitriou
                try {
8920 a7dd0415 Kostas Papadimitriou
                        box = elem.getBoundingClientRect();
8921 a7dd0415 Kostas Papadimitriou
                } catch(e) {}
8922 a7dd0415 Kostas Papadimitriou
8923 a7dd0415 Kostas Papadimitriou
                var doc = elem.ownerDocument,
8924 a7dd0415 Kostas Papadimitriou
                        docElem = doc.documentElement;
8925 a7dd0415 Kostas Papadimitriou
8926 a7dd0415 Kostas Papadimitriou
                // Make sure we're not dealing with a disconnected DOM node
8927 a7dd0415 Kostas Papadimitriou
                if ( !box || !jQuery.contains( docElem, elem ) ) {
8928 a7dd0415 Kostas Papadimitriou
                        return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
8929 a7dd0415 Kostas Papadimitriou
                }
8930 a7dd0415 Kostas Papadimitriou
8931 a7dd0415 Kostas Papadimitriou
                var body = doc.body,
8932 a7dd0415 Kostas Papadimitriou
                        win = getWindow(doc),
8933 a7dd0415 Kostas Papadimitriou
                        clientTop  = docElem.clientTop  || body.clientTop  || 0,
8934 a7dd0415 Kostas Papadimitriou
                        clientLeft = docElem.clientLeft || body.clientLeft || 0,
8935 a7dd0415 Kostas Papadimitriou
                        scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
8936 a7dd0415 Kostas Papadimitriou
                        scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
8937 a7dd0415 Kostas Papadimitriou
                        top  = box.top  + scrollTop  - clientTop,
8938 a7dd0415 Kostas Papadimitriou
                        left = box.left + scrollLeft - clientLeft;
8939 a7dd0415 Kostas Papadimitriou
8940 a7dd0415 Kostas Papadimitriou
                return { top: top, left: left };
8941 a7dd0415 Kostas Papadimitriou
        };
8942 a7dd0415 Kostas Papadimitriou
8943 a7dd0415 Kostas Papadimitriou
} else {
8944 a7dd0415 Kostas Papadimitriou
        jQuery.fn.offset = function( options ) {
8945 a7dd0415 Kostas Papadimitriou
                var elem = this[0];
8946 a7dd0415 Kostas Papadimitriou
8947 a7dd0415 Kostas Papadimitriou
                if ( options ) {
8948 a7dd0415 Kostas Papadimitriou
                        return this.each(function( i ) {
8949 a7dd0415 Kostas Papadimitriou
                                jQuery.offset.setOffset( this, options, i );
8950 a7dd0415 Kostas Papadimitriou
                        });
8951 a7dd0415 Kostas Papadimitriou
                }
8952 a7dd0415 Kostas Papadimitriou
8953 a7dd0415 Kostas Papadimitriou
                if ( !elem || !elem.ownerDocument ) {
8954 a7dd0415 Kostas Papadimitriou
                        return null;
8955 a7dd0415 Kostas Papadimitriou
                }
8956 a7dd0415 Kostas Papadimitriou
8957 a7dd0415 Kostas Papadimitriou
                if ( elem === elem.ownerDocument.body ) {
8958 a7dd0415 Kostas Papadimitriou
                        return jQuery.offset.bodyOffset( elem );
8959 a7dd0415 Kostas Papadimitriou
                }
8960 a7dd0415 Kostas Papadimitriou
8961 a7dd0415 Kostas Papadimitriou
                var computedStyle,
8962 a7dd0415 Kostas Papadimitriou
                        offsetParent = elem.offsetParent,
8963 a7dd0415 Kostas Papadimitriou
                        prevOffsetParent = elem,
8964 a7dd0415 Kostas Papadimitriou
                        doc = elem.ownerDocument,
8965 a7dd0415 Kostas Papadimitriou
                        docElem = doc.documentElement,
8966 a7dd0415 Kostas Papadimitriou
                        body = doc.body,
8967 a7dd0415 Kostas Papadimitriou
                        defaultView = doc.defaultView,
8968 a7dd0415 Kostas Papadimitriou
                        prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
8969 a7dd0415 Kostas Papadimitriou
                        top = elem.offsetTop,
8970 a7dd0415 Kostas Papadimitriou
                        left = elem.offsetLeft;
8971 a7dd0415 Kostas Papadimitriou
8972 a7dd0415 Kostas Papadimitriou
                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
8973 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
8974 a7dd0415 Kostas Papadimitriou
                                break;
8975 a7dd0415 Kostas Papadimitriou
                        }
8976 a7dd0415 Kostas Papadimitriou
8977 a7dd0415 Kostas Papadimitriou
                        computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
8978 a7dd0415 Kostas Papadimitriou
                        top  -= elem.scrollTop;
8979 a7dd0415 Kostas Papadimitriou
                        left -= elem.scrollLeft;
8980 a7dd0415 Kostas Papadimitriou
8981 a7dd0415 Kostas Papadimitriou
                        if ( elem === offsetParent ) {
8982 a7dd0415 Kostas Papadimitriou
                                top  += elem.offsetTop;
8983 a7dd0415 Kostas Papadimitriou
                                left += elem.offsetLeft;
8984 a7dd0415 Kostas Papadimitriou
8985 a7dd0415 Kostas Papadimitriou
                                if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
8986 a7dd0415 Kostas Papadimitriou
                                        top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8987 a7dd0415 Kostas Papadimitriou
                                        left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8988 a7dd0415 Kostas Papadimitriou
                                }
8989 a7dd0415 Kostas Papadimitriou
8990 a7dd0415 Kostas Papadimitriou
                                prevOffsetParent = offsetParent;
8991 a7dd0415 Kostas Papadimitriou
                                offsetParent = elem.offsetParent;
8992 a7dd0415 Kostas Papadimitriou
                        }
8993 a7dd0415 Kostas Papadimitriou
8994 a7dd0415 Kostas Papadimitriou
                        if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
8995 a7dd0415 Kostas Papadimitriou
                                top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8996 a7dd0415 Kostas Papadimitriou
                                left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8997 a7dd0415 Kostas Papadimitriou
                        }
8998 a7dd0415 Kostas Papadimitriou
8999 a7dd0415 Kostas Papadimitriou
                        prevComputedStyle = computedStyle;
9000 a7dd0415 Kostas Papadimitriou
                }
9001 a7dd0415 Kostas Papadimitriou
9002 a7dd0415 Kostas Papadimitriou
                if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
9003 a7dd0415 Kostas Papadimitriou
                        top  += body.offsetTop;
9004 a7dd0415 Kostas Papadimitriou
                        left += body.offsetLeft;
9005 a7dd0415 Kostas Papadimitriou
                }
9006 a7dd0415 Kostas Papadimitriou
9007 a7dd0415 Kostas Papadimitriou
                if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
9008 a7dd0415 Kostas Papadimitriou
                        top  += Math.max( docElem.scrollTop, body.scrollTop );
9009 a7dd0415 Kostas Papadimitriou
                        left += Math.max( docElem.scrollLeft, body.scrollLeft );
9010 a7dd0415 Kostas Papadimitriou
                }
9011 a7dd0415 Kostas Papadimitriou
9012 a7dd0415 Kostas Papadimitriou
                return { top: top, left: left };
9013 a7dd0415 Kostas Papadimitriou
        };
9014 a7dd0415 Kostas Papadimitriou
}
9015 a7dd0415 Kostas Papadimitriou
9016 a7dd0415 Kostas Papadimitriou
jQuery.offset = {
9017 a7dd0415 Kostas Papadimitriou
9018 a7dd0415 Kostas Papadimitriou
        bodyOffset: function( body ) {
9019 a7dd0415 Kostas Papadimitriou
                var top = body.offsetTop,
9020 a7dd0415 Kostas Papadimitriou
                        left = body.offsetLeft;
9021 a7dd0415 Kostas Papadimitriou
9022 a7dd0415 Kostas Papadimitriou
                if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
9023 a7dd0415 Kostas Papadimitriou
                        top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
9024 a7dd0415 Kostas Papadimitriou
                        left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
9025 a7dd0415 Kostas Papadimitriou
                }
9026 a7dd0415 Kostas Papadimitriou
9027 a7dd0415 Kostas Papadimitriou
                return { top: top, left: left };
9028 a7dd0415 Kostas Papadimitriou
        },
9029 a7dd0415 Kostas Papadimitriou
9030 a7dd0415 Kostas Papadimitriou
        setOffset: function( elem, options, i ) {
9031 a7dd0415 Kostas Papadimitriou
                var position = jQuery.css( elem, "position" );
9032 a7dd0415 Kostas Papadimitriou
9033 a7dd0415 Kostas Papadimitriou
                // set position first, in-case top/left are set even on static elem
9034 a7dd0415 Kostas Papadimitriou
                if ( position === "static" ) {
9035 a7dd0415 Kostas Papadimitriou
                        elem.style.position = "relative";
9036 a7dd0415 Kostas Papadimitriou
                }
9037 a7dd0415 Kostas Papadimitriou
9038 a7dd0415 Kostas Papadimitriou
                var curElem = jQuery( elem ),
9039 a7dd0415 Kostas Papadimitriou
                        curOffset = curElem.offset(),
9040 a7dd0415 Kostas Papadimitriou
                        curCSSTop = jQuery.css( elem, "top" ),
9041 a7dd0415 Kostas Papadimitriou
                        curCSSLeft = jQuery.css( elem, "left" ),
9042 a7dd0415 Kostas Papadimitriou
                        calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9043 a7dd0415 Kostas Papadimitriou
                        props = {}, curPosition = {}, curTop, curLeft;
9044 a7dd0415 Kostas Papadimitriou
9045 a7dd0415 Kostas Papadimitriou
                // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9046 a7dd0415 Kostas Papadimitriou
                if ( calculatePosition ) {
9047 a7dd0415 Kostas Papadimitriou
                        curPosition = curElem.position();
9048 a7dd0415 Kostas Papadimitriou
                        curTop = curPosition.top;
9049 a7dd0415 Kostas Papadimitriou
                        curLeft = curPosition.left;
9050 a7dd0415 Kostas Papadimitriou
                } else {
9051 a7dd0415 Kostas Papadimitriou
                        curTop = parseFloat( curCSSTop ) || 0;
9052 a7dd0415 Kostas Papadimitriou
                        curLeft = parseFloat( curCSSLeft ) || 0;
9053 a7dd0415 Kostas Papadimitriou
                }
9054 a7dd0415 Kostas Papadimitriou
9055 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( options ) ) {
9056 a7dd0415 Kostas Papadimitriou
                        options = options.call( elem, i, curOffset );
9057 a7dd0415 Kostas Papadimitriou
                }
9058 a7dd0415 Kostas Papadimitriou
9059 a7dd0415 Kostas Papadimitriou
                if ( options.top != null ) {
9060 a7dd0415 Kostas Papadimitriou
                        props.top = ( options.top - curOffset.top ) + curTop;
9061 a7dd0415 Kostas Papadimitriou
                }
9062 a7dd0415 Kostas Papadimitriou
                if ( options.left != null ) {
9063 a7dd0415 Kostas Papadimitriou
                        props.left = ( options.left - curOffset.left ) + curLeft;
9064 a7dd0415 Kostas Papadimitriou
                }
9065 a7dd0415 Kostas Papadimitriou
9066 a7dd0415 Kostas Papadimitriou
                if ( "using" in options ) {
9067 a7dd0415 Kostas Papadimitriou
                        options.using.call( elem, props );
9068 a7dd0415 Kostas Papadimitriou
                } else {
9069 a7dd0415 Kostas Papadimitriou
                        curElem.css( props );
9070 a7dd0415 Kostas Papadimitriou
                }
9071 a7dd0415 Kostas Papadimitriou
        }
9072 a7dd0415 Kostas Papadimitriou
};
9073 a7dd0415 Kostas Papadimitriou
9074 a7dd0415 Kostas Papadimitriou
9075 a7dd0415 Kostas Papadimitriou
jQuery.fn.extend({
9076 a7dd0415 Kostas Papadimitriou
9077 a7dd0415 Kostas Papadimitriou
        position: function() {
9078 a7dd0415 Kostas Papadimitriou
                if ( !this[0] ) {
9079 a7dd0415 Kostas Papadimitriou
                        return null;
9080 a7dd0415 Kostas Papadimitriou
                }
9081 a7dd0415 Kostas Papadimitriou
9082 a7dd0415 Kostas Papadimitriou
                var elem = this[0],
9083 a7dd0415 Kostas Papadimitriou
9084 a7dd0415 Kostas Papadimitriou
                // Get *real* offsetParent
9085 a7dd0415 Kostas Papadimitriou
                offsetParent = this.offsetParent(),
9086 a7dd0415 Kostas Papadimitriou
9087 a7dd0415 Kostas Papadimitriou
                // Get correct offsets
9088 a7dd0415 Kostas Papadimitriou
                offset       = this.offset(),
9089 a7dd0415 Kostas Papadimitriou
                parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
9090 a7dd0415 Kostas Papadimitriou
9091 a7dd0415 Kostas Papadimitriou
                // Subtract element margins
9092 a7dd0415 Kostas Papadimitriou
                // note: when an element has margin: auto the offsetLeft and marginLeft
9093 a7dd0415 Kostas Papadimitriou
                // are the same in Safari causing offset.left to incorrectly be 0
9094 a7dd0415 Kostas Papadimitriou
                offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
9095 a7dd0415 Kostas Papadimitriou
                offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
9096 a7dd0415 Kostas Papadimitriou
9097 a7dd0415 Kostas Papadimitriou
                // Add offsetParent borders
9098 a7dd0415 Kostas Papadimitriou
                parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
9099 a7dd0415 Kostas Papadimitriou
                parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
9100 a7dd0415 Kostas Papadimitriou
9101 a7dd0415 Kostas Papadimitriou
                // Subtract the two offsets
9102 a7dd0415 Kostas Papadimitriou
                return {
9103 a7dd0415 Kostas Papadimitriou
                        top:  offset.top  - parentOffset.top,
9104 a7dd0415 Kostas Papadimitriou
                        left: offset.left - parentOffset.left
9105 a7dd0415 Kostas Papadimitriou
                };
9106 a7dd0415 Kostas Papadimitriou
        },
9107 a7dd0415 Kostas Papadimitriou
9108 a7dd0415 Kostas Papadimitriou
        offsetParent: function() {
9109 a7dd0415 Kostas Papadimitriou
                return this.map(function() {
9110 a7dd0415 Kostas Papadimitriou
                        var offsetParent = this.offsetParent || document.body;
9111 a7dd0415 Kostas Papadimitriou
                        while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
9112 a7dd0415 Kostas Papadimitriou
                                offsetParent = offsetParent.offsetParent;
9113 a7dd0415 Kostas Papadimitriou
                        }
9114 a7dd0415 Kostas Papadimitriou
                        return offsetParent;
9115 a7dd0415 Kostas Papadimitriou
                });
9116 a7dd0415 Kostas Papadimitriou
        }
9117 a7dd0415 Kostas Papadimitriou
});
9118 a7dd0415 Kostas Papadimitriou
9119 a7dd0415 Kostas Papadimitriou
9120 a7dd0415 Kostas Papadimitriou
// Create scrollLeft and scrollTop methods
9121 a7dd0415 Kostas Papadimitriou
jQuery.each( ["Left", "Top"], function( i, name ) {
9122 a7dd0415 Kostas Papadimitriou
        var method = "scroll" + name;
9123 a7dd0415 Kostas Papadimitriou
9124 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ method ] = function( val ) {
9125 a7dd0415 Kostas Papadimitriou
                var elem, win;
9126 a7dd0415 Kostas Papadimitriou
9127 a7dd0415 Kostas Papadimitriou
                if ( val === undefined ) {
9128 a7dd0415 Kostas Papadimitriou
                        elem = this[ 0 ];
9129 a7dd0415 Kostas Papadimitriou
9130 a7dd0415 Kostas Papadimitriou
                        if ( !elem ) {
9131 a7dd0415 Kostas Papadimitriou
                                return null;
9132 a7dd0415 Kostas Papadimitriou
                        }
9133 a7dd0415 Kostas Papadimitriou
9134 a7dd0415 Kostas Papadimitriou
                        win = getWindow( elem );
9135 a7dd0415 Kostas Papadimitriou
9136 a7dd0415 Kostas Papadimitriou
                        // Return the scroll offset
9137 a7dd0415 Kostas Papadimitriou
                        return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
9138 a7dd0415 Kostas Papadimitriou
                                jQuery.support.boxModel && win.document.documentElement[ method ] ||
9139 a7dd0415 Kostas Papadimitriou
                                        win.document.body[ method ] :
9140 a7dd0415 Kostas Papadimitriou
                                elem[ method ];
9141 a7dd0415 Kostas Papadimitriou
                }
9142 a7dd0415 Kostas Papadimitriou
9143 a7dd0415 Kostas Papadimitriou
                // Set the scroll offset
9144 a7dd0415 Kostas Papadimitriou
                return this.each(function() {
9145 a7dd0415 Kostas Papadimitriou
                        win = getWindow( this );
9146 a7dd0415 Kostas Papadimitriou
9147 a7dd0415 Kostas Papadimitriou
                        if ( win ) {
9148 a7dd0415 Kostas Papadimitriou
                                win.scrollTo(
9149 a7dd0415 Kostas Papadimitriou
                                        !i ? val : jQuery( win ).scrollLeft(),
9150 a7dd0415 Kostas Papadimitriou
                                         i ? val : jQuery( win ).scrollTop()
9151 a7dd0415 Kostas Papadimitriou
                                );
9152 a7dd0415 Kostas Papadimitriou
9153 a7dd0415 Kostas Papadimitriou
                        } else {
9154 a7dd0415 Kostas Papadimitriou
                                this[ method ] = val;
9155 a7dd0415 Kostas Papadimitriou
                        }
9156 a7dd0415 Kostas Papadimitriou
                });
9157 a7dd0415 Kostas Papadimitriou
        };
9158 a7dd0415 Kostas Papadimitriou
});
9159 a7dd0415 Kostas Papadimitriou
9160 a7dd0415 Kostas Papadimitriou
function getWindow( elem ) {
9161 a7dd0415 Kostas Papadimitriou
        return jQuery.isWindow( elem ) ?
9162 a7dd0415 Kostas Papadimitriou
                elem :
9163 a7dd0415 Kostas Papadimitriou
                elem.nodeType === 9 ?
9164 a7dd0415 Kostas Papadimitriou
                        elem.defaultView || elem.parentWindow :
9165 a7dd0415 Kostas Papadimitriou
                        false;
9166 a7dd0415 Kostas Papadimitriou
}
9167 a7dd0415 Kostas Papadimitriou
9168 a7dd0415 Kostas Papadimitriou
9169 a7dd0415 Kostas Papadimitriou
9170 a7dd0415 Kostas Papadimitriou
9171 a7dd0415 Kostas Papadimitriou
// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
9172 a7dd0415 Kostas Papadimitriou
jQuery.each([ "Height", "Width" ], function( i, name ) {
9173 a7dd0415 Kostas Papadimitriou
9174 a7dd0415 Kostas Papadimitriou
        var type = name.toLowerCase();
9175 a7dd0415 Kostas Papadimitriou
9176 a7dd0415 Kostas Papadimitriou
        // innerHeight and innerWidth
9177 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ "inner" + name ] = function() {
9178 a7dd0415 Kostas Papadimitriou
                var elem = this[0];
9179 a7dd0415 Kostas Papadimitriou
                return elem ?
9180 a7dd0415 Kostas Papadimitriou
                        elem.style ?
9181 a7dd0415 Kostas Papadimitriou
                        parseFloat( jQuery.css( elem, type, "padding" ) ) :
9182 a7dd0415 Kostas Papadimitriou
                        this[ type ]() :
9183 a7dd0415 Kostas Papadimitriou
                        null;
9184 a7dd0415 Kostas Papadimitriou
        };
9185 a7dd0415 Kostas Papadimitriou
9186 a7dd0415 Kostas Papadimitriou
        // outerHeight and outerWidth
9187 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ "outer" + name ] = function( margin ) {
9188 a7dd0415 Kostas Papadimitriou
                var elem = this[0];
9189 a7dd0415 Kostas Papadimitriou
                return elem ?
9190 a7dd0415 Kostas Papadimitriou
                        elem.style ?
9191 a7dd0415 Kostas Papadimitriou
                        parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
9192 a7dd0415 Kostas Papadimitriou
                        this[ type ]() :
9193 a7dd0415 Kostas Papadimitriou
                        null;
9194 a7dd0415 Kostas Papadimitriou
        };
9195 a7dd0415 Kostas Papadimitriou
9196 a7dd0415 Kostas Papadimitriou
        jQuery.fn[ type ] = function( size ) {
9197 a7dd0415 Kostas Papadimitriou
                // Get window width or height
9198 a7dd0415 Kostas Papadimitriou
                var elem = this[0];
9199 a7dd0415 Kostas Papadimitriou
                if ( !elem ) {
9200 a7dd0415 Kostas Papadimitriou
                        return size == null ? null : this;
9201 a7dd0415 Kostas Papadimitriou
                }
9202 a7dd0415 Kostas Papadimitriou
9203 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isFunction( size ) ) {
9204 a7dd0415 Kostas Papadimitriou
                        return this.each(function( i ) {
9205 a7dd0415 Kostas Papadimitriou
                                var self = jQuery( this );
9206 a7dd0415 Kostas Papadimitriou
                                self[ type ]( size.call( this, i, self[ type ]() ) );
9207 a7dd0415 Kostas Papadimitriou
                        });
9208 a7dd0415 Kostas Papadimitriou
                }
9209 a7dd0415 Kostas Papadimitriou
9210 a7dd0415 Kostas Papadimitriou
                if ( jQuery.isWindow( elem ) ) {
9211 a7dd0415 Kostas Papadimitriou
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
9212 a7dd0415 Kostas Papadimitriou
                        // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
9213 a7dd0415 Kostas Papadimitriou
                        var docElemProp = elem.document.documentElement[ "client" + name ],
9214 a7dd0415 Kostas Papadimitriou
                                body = elem.document.body;
9215 a7dd0415 Kostas Papadimitriou
                        return elem.document.compatMode === "CSS1Compat" && docElemProp ||
9216 a7dd0415 Kostas Papadimitriou
                                body && body[ "client" + name ] || docElemProp;
9217 a7dd0415 Kostas Papadimitriou
9218 a7dd0415 Kostas Papadimitriou
                // Get document width or height
9219 a7dd0415 Kostas Papadimitriou
                } else if ( elem.nodeType === 9 ) {
9220 a7dd0415 Kostas Papadimitriou
                        // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
9221 a7dd0415 Kostas Papadimitriou
                        return Math.max(
9222 a7dd0415 Kostas Papadimitriou
                                elem.documentElement["client" + name],
9223 a7dd0415 Kostas Papadimitriou
                                elem.body["scroll" + name], elem.documentElement["scroll" + name],
9224 a7dd0415 Kostas Papadimitriou
                                elem.body["offset" + name], elem.documentElement["offset" + name]
9225 a7dd0415 Kostas Papadimitriou
                        );
9226 a7dd0415 Kostas Papadimitriou
9227 a7dd0415 Kostas Papadimitriou
                // Get or set width or height on the element
9228 a7dd0415 Kostas Papadimitriou
                } else if ( size === undefined ) {
9229 a7dd0415 Kostas Papadimitriou
                        var orig = jQuery.css( elem, type ),
9230 a7dd0415 Kostas Papadimitriou
                                ret = parseFloat( orig );
9231 a7dd0415 Kostas Papadimitriou
9232 a7dd0415 Kostas Papadimitriou
                        return jQuery.isNumeric( ret ) ? ret : orig;
9233 a7dd0415 Kostas Papadimitriou
9234 a7dd0415 Kostas Papadimitriou
                // Set the width or height on the element (default to pixels if value is unitless)
9235 a7dd0415 Kostas Papadimitriou
                } else {
9236 a7dd0415 Kostas Papadimitriou
                        return this.css( type, typeof size === "string" ? size : size + "px" );
9237 a7dd0415 Kostas Papadimitriou
                }
9238 a7dd0415 Kostas Papadimitriou
        };
9239 a7dd0415 Kostas Papadimitriou
9240 a7dd0415 Kostas Papadimitriou
});
9241 a7dd0415 Kostas Papadimitriou
9242 a7dd0415 Kostas Papadimitriou
9243 a7dd0415 Kostas Papadimitriou
9244 a7dd0415 Kostas Papadimitriou
9245 a7dd0415 Kostas Papadimitriou
// Expose jQuery to the global object
9246 a7dd0415 Kostas Papadimitriou
window.jQuery = window.$ = jQuery;
9247 a7dd0415 Kostas Papadimitriou
9248 a7dd0415 Kostas Papadimitriou
// Expose jQuery as an AMD module, but only for AMD loaders that
9249 a7dd0415 Kostas Papadimitriou
// understand the issues with loading multiple versions of jQuery
9250 a7dd0415 Kostas Papadimitriou
// in a page that all might call define(). The loader will indicate
9251 a7dd0415 Kostas Papadimitriou
// they have special allowances for multiple jQuery versions by
9252 a7dd0415 Kostas Papadimitriou
// specifying define.amd.jQuery = true. Register as a named module,
9253 a7dd0415 Kostas Papadimitriou
// since jQuery can be concatenated with other files that may use define,
9254 a7dd0415 Kostas Papadimitriou
// but not use a proper concatenation script that understands anonymous
9255 a7dd0415 Kostas Papadimitriou
// AMD modules. A named AMD is safest and most robust way to register.
9256 a7dd0415 Kostas Papadimitriou
// Lowercase jquery is used because AMD module names are derived from
9257 a7dd0415 Kostas Papadimitriou
// file names, and jQuery is normally delivered in a lowercase file name.
9258 a7dd0415 Kostas Papadimitriou
// Do this after creating the global so that if an AMD module wants to call
9259 a7dd0415 Kostas Papadimitriou
// noConflict to hide this version of jQuery, it will work.
9260 a7dd0415 Kostas Papadimitriou
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
9261 a7dd0415 Kostas Papadimitriou
        define( "jquery", [], function () { return jQuery; } );
9262 a7dd0415 Kostas Papadimitriou
}
9263 a7dd0415 Kostas Papadimitriou
9264 a7dd0415 Kostas Papadimitriou
9265 a7dd0415 Kostas Papadimitriou
9266 a7dd0415 Kostas Papadimitriou
})( window );