Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / new_ui / ui / vendor / jquery.js @ faad3c72

History | View | Annotate | Download (283.5 kB)

1 e4a6c3b8 Olga Brani
/*!
2 e4a6c3b8 Olga Brani
 * jQuery JavaScript Library v1.9.1
3 e4a6c3b8 Olga Brani
 * http://jquery.com/
4 e4a6c3b8 Olga Brani
 *
5 e4a6c3b8 Olga Brani
 * Includes Sizzle.js
6 e4a6c3b8 Olga Brani
 * http://sizzlejs.com/
7 e4a6c3b8 Olga Brani
 *
8 e4a6c3b8 Olga Brani
 * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
9 e4a6c3b8 Olga Brani
 * Released under the MIT license
10 e4a6c3b8 Olga Brani
 * http://jquery.org/license
11 e4a6c3b8 Olga Brani
 *
12 e4a6c3b8 Olga Brani
 * Date: 2013-2-4
13 e4a6c3b8 Olga Brani
 */
14 e4a6c3b8 Olga Brani
(function( window, undefined ) {
15 e4a6c3b8 Olga Brani
16 e4a6c3b8 Olga Brani
// Can't do this because several apps including ASP.NET trace
17 e4a6c3b8 Olga Brani
// the stack via arguments.caller.callee and Firefox dies if
18 e4a6c3b8 Olga Brani
// you try to trace through "use strict" call chains. (#13335)
19 e4a6c3b8 Olga Brani
// Support: Firefox 18+
20 e4a6c3b8 Olga Brani
//"use strict";
21 e4a6c3b8 Olga Brani
var
22 e4a6c3b8 Olga Brani
  // The deferred used on DOM ready
23 e4a6c3b8 Olga Brani
  readyList,
24 e4a6c3b8 Olga Brani
25 e4a6c3b8 Olga Brani
  // A central reference to the root jQuery(document)
26 e4a6c3b8 Olga Brani
  rootjQuery,
27 e4a6c3b8 Olga Brani
28 e4a6c3b8 Olga Brani
  // Support: IE<9
29 e4a6c3b8 Olga Brani
  // For `typeof node.method` instead of `node.method !== undefined`
30 e4a6c3b8 Olga Brani
  core_strundefined = typeof undefined,
31 e4a6c3b8 Olga Brani
32 e4a6c3b8 Olga Brani
  // Use the correct document accordingly with window argument (sandbox)
33 e4a6c3b8 Olga Brani
  document = window.document,
34 e4a6c3b8 Olga Brani
  location = window.location,
35 e4a6c3b8 Olga Brani
36 e4a6c3b8 Olga Brani
  // Map over jQuery in case of overwrite
37 e4a6c3b8 Olga Brani
  _jQuery = window.jQuery,
38 e4a6c3b8 Olga Brani
39 e4a6c3b8 Olga Brani
  // Map over the $ in case of overwrite
40 e4a6c3b8 Olga Brani
  _$ = window.$,
41 e4a6c3b8 Olga Brani
42 e4a6c3b8 Olga Brani
  // [[Class]] -> type pairs
43 e4a6c3b8 Olga Brani
  class2type = {},
44 e4a6c3b8 Olga Brani
45 e4a6c3b8 Olga Brani
  // List of deleted data cache ids, so we can reuse them
46 e4a6c3b8 Olga Brani
  core_deletedIds = [],
47 e4a6c3b8 Olga Brani
48 e4a6c3b8 Olga Brani
  core_version = "1.9.1",
49 e4a6c3b8 Olga Brani
50 e4a6c3b8 Olga Brani
  // Save a reference to some core methods
51 e4a6c3b8 Olga Brani
  core_concat = core_deletedIds.concat,
52 e4a6c3b8 Olga Brani
  core_push = core_deletedIds.push,
53 e4a6c3b8 Olga Brani
  core_slice = core_deletedIds.slice,
54 e4a6c3b8 Olga Brani
  core_indexOf = core_deletedIds.indexOf,
55 e4a6c3b8 Olga Brani
  core_toString = class2type.toString,
56 e4a6c3b8 Olga Brani
  core_hasOwn = class2type.hasOwnProperty,
57 e4a6c3b8 Olga Brani
  core_trim = core_version.trim,
58 e4a6c3b8 Olga Brani
59 e4a6c3b8 Olga Brani
  // Define a local copy of jQuery
60 e4a6c3b8 Olga Brani
  jQuery = function( selector, context ) {
61 e4a6c3b8 Olga Brani
    // The jQuery object is actually just the init constructor 'enhanced'
62 e4a6c3b8 Olga Brani
    return new jQuery.fn.init( selector, context, rootjQuery );
63 e4a6c3b8 Olga Brani
  },
64 e4a6c3b8 Olga Brani
65 e4a6c3b8 Olga Brani
  // Used for matching numbers
66 e4a6c3b8 Olga Brani
  core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
67 e4a6c3b8 Olga Brani
68 e4a6c3b8 Olga Brani
  // Used for splitting on whitespace
69 e4a6c3b8 Olga Brani
  core_rnotwhite = /\S+/g,
70 e4a6c3b8 Olga Brani
71 e4a6c3b8 Olga Brani
  // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
72 e4a6c3b8 Olga Brani
  rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
73 e4a6c3b8 Olga Brani
74 e4a6c3b8 Olga Brani
  // A simple way to check for HTML strings
75 e4a6c3b8 Olga Brani
  // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
76 e4a6c3b8 Olga Brani
  // Strict HTML recognition (#11290: must start with <)
77 e4a6c3b8 Olga Brani
  rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
78 e4a6c3b8 Olga Brani
79 e4a6c3b8 Olga Brani
  // Match a standalone tag
80 e4a6c3b8 Olga Brani
  rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
81 e4a6c3b8 Olga Brani
82 e4a6c3b8 Olga Brani
  // JSON RegExp
83 e4a6c3b8 Olga Brani
  rvalidchars = /^[\],:{}\s]*$/,
84 e4a6c3b8 Olga Brani
  rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
85 e4a6c3b8 Olga Brani
  rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
86 e4a6c3b8 Olga Brani
  rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
87 e4a6c3b8 Olga Brani
88 e4a6c3b8 Olga Brani
  // Matches dashed string for camelizing
89 e4a6c3b8 Olga Brani
  rmsPrefix = /^-ms-/,
90 e4a6c3b8 Olga Brani
  rdashAlpha = /-([\da-z])/gi,
91 e4a6c3b8 Olga Brani
92 e4a6c3b8 Olga Brani
  // Used by jQuery.camelCase as callback to replace()
93 e4a6c3b8 Olga Brani
  fcamelCase = function( all, letter ) {
94 e4a6c3b8 Olga Brani
    return letter.toUpperCase();
95 e4a6c3b8 Olga Brani
  },
96 e4a6c3b8 Olga Brani
97 e4a6c3b8 Olga Brani
  // The ready event handler
98 e4a6c3b8 Olga Brani
  completed = function( event ) {
99 e4a6c3b8 Olga Brani
100 e4a6c3b8 Olga Brani
    // readyState === "complete" is good enough for us to call the dom ready in oldIE
101 e4a6c3b8 Olga Brani
    if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
102 e4a6c3b8 Olga Brani
      detach();
103 e4a6c3b8 Olga Brani
      jQuery.ready();
104 e4a6c3b8 Olga Brani
    }
105 e4a6c3b8 Olga Brani
  },
106 e4a6c3b8 Olga Brani
  // Clean-up method for dom ready events
107 e4a6c3b8 Olga Brani
  detach = function() {
108 e4a6c3b8 Olga Brani
    if ( document.addEventListener ) {
109 e4a6c3b8 Olga Brani
      document.removeEventListener( "DOMContentLoaded", completed, false );
110 e4a6c3b8 Olga Brani
      window.removeEventListener( "load", completed, false );
111 e4a6c3b8 Olga Brani
112 e4a6c3b8 Olga Brani
    } else {
113 e4a6c3b8 Olga Brani
      document.detachEvent( "onreadystatechange", completed );
114 e4a6c3b8 Olga Brani
      window.detachEvent( "onload", completed );
115 e4a6c3b8 Olga Brani
    }
116 e4a6c3b8 Olga Brani
  };
117 e4a6c3b8 Olga Brani
118 e4a6c3b8 Olga Brani
jQuery.fn = jQuery.prototype = {
119 e4a6c3b8 Olga Brani
  // The current version of jQuery being used
120 e4a6c3b8 Olga Brani
  jquery: core_version,
121 e4a6c3b8 Olga Brani
122 e4a6c3b8 Olga Brani
  constructor: jQuery,
123 e4a6c3b8 Olga Brani
  init: function( selector, context, rootjQuery ) {
124 e4a6c3b8 Olga Brani
    var match, elem;
125 e4a6c3b8 Olga Brani
126 e4a6c3b8 Olga Brani
    // HANDLE: $(""), $(null), $(undefined), $(false)
127 e4a6c3b8 Olga Brani
    if ( !selector ) {
128 e4a6c3b8 Olga Brani
      return this;
129 e4a6c3b8 Olga Brani
    }
130 e4a6c3b8 Olga Brani
131 e4a6c3b8 Olga Brani
    // Handle HTML strings
132 e4a6c3b8 Olga Brani
    if ( typeof selector === "string" ) {
133 e4a6c3b8 Olga Brani
      if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
134 e4a6c3b8 Olga Brani
        // Assume that strings that start and end with <> are HTML and skip the regex check
135 e4a6c3b8 Olga Brani
        match = [ null, selector, null ];
136 e4a6c3b8 Olga Brani
137 e4a6c3b8 Olga Brani
      } else {
138 e4a6c3b8 Olga Brani
        match = rquickExpr.exec( selector );
139 e4a6c3b8 Olga Brani
      }
140 e4a6c3b8 Olga Brani
141 e4a6c3b8 Olga Brani
      // Match html or make sure no context is specified for #id
142 e4a6c3b8 Olga Brani
      if ( match && (match[1] || !context) ) {
143 e4a6c3b8 Olga Brani
144 e4a6c3b8 Olga Brani
        // HANDLE: $(html) -> $(array)
145 e4a6c3b8 Olga Brani
        if ( match[1] ) {
146 e4a6c3b8 Olga Brani
          context = context instanceof jQuery ? context[0] : context;
147 e4a6c3b8 Olga Brani
148 e4a6c3b8 Olga Brani
          // scripts is true for back-compat
149 e4a6c3b8 Olga Brani
          jQuery.merge( this, jQuery.parseHTML(
150 e4a6c3b8 Olga Brani
            match[1],
151 e4a6c3b8 Olga Brani
            context && context.nodeType ? context.ownerDocument || context : document,
152 e4a6c3b8 Olga Brani
            true
153 e4a6c3b8 Olga Brani
          ) );
154 e4a6c3b8 Olga Brani
155 e4a6c3b8 Olga Brani
          // HANDLE: $(html, props)
156 e4a6c3b8 Olga Brani
          if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
157 e4a6c3b8 Olga Brani
            for ( match in context ) {
158 e4a6c3b8 Olga Brani
              // Properties of context are called as methods if possible
159 e4a6c3b8 Olga Brani
              if ( jQuery.isFunction( this[ match ] ) ) {
160 e4a6c3b8 Olga Brani
                this[ match ]( context[ match ] );
161 e4a6c3b8 Olga Brani
162 e4a6c3b8 Olga Brani
              // ...and otherwise set as attributes
163 e4a6c3b8 Olga Brani
              } else {
164 e4a6c3b8 Olga Brani
                this.attr( match, context[ match ] );
165 e4a6c3b8 Olga Brani
              }
166 e4a6c3b8 Olga Brani
            }
167 e4a6c3b8 Olga Brani
          }
168 e4a6c3b8 Olga Brani
169 e4a6c3b8 Olga Brani
          return this;
170 e4a6c3b8 Olga Brani
171 e4a6c3b8 Olga Brani
        // HANDLE: $(#id)
172 e4a6c3b8 Olga Brani
        } else {
173 e4a6c3b8 Olga Brani
          elem = document.getElementById( match[2] );
174 e4a6c3b8 Olga Brani
175 e4a6c3b8 Olga Brani
          // Check parentNode to catch when Blackberry 4.6 returns
176 e4a6c3b8 Olga Brani
          // nodes that are no longer in the document #6963
177 e4a6c3b8 Olga Brani
          if ( elem && elem.parentNode ) {
178 e4a6c3b8 Olga Brani
            // Handle the case where IE and Opera return items
179 e4a6c3b8 Olga Brani
            // by name instead of ID
180 e4a6c3b8 Olga Brani
            if ( elem.id !== match[2] ) {
181 e4a6c3b8 Olga Brani
              return rootjQuery.find( selector );
182 e4a6c3b8 Olga Brani
            }
183 e4a6c3b8 Olga Brani
184 e4a6c3b8 Olga Brani
            // Otherwise, we inject the element directly into the jQuery object
185 e4a6c3b8 Olga Brani
            this.length = 1;
186 e4a6c3b8 Olga Brani
            this[0] = elem;
187 e4a6c3b8 Olga Brani
          }
188 e4a6c3b8 Olga Brani
189 e4a6c3b8 Olga Brani
          this.context = document;
190 e4a6c3b8 Olga Brani
          this.selector = selector;
191 e4a6c3b8 Olga Brani
          return this;
192 e4a6c3b8 Olga Brani
        }
193 e4a6c3b8 Olga Brani
194 e4a6c3b8 Olga Brani
      // HANDLE: $(expr, $(...))
195 e4a6c3b8 Olga Brani
      } else if ( !context || context.jquery ) {
196 e4a6c3b8 Olga Brani
        return ( context || rootjQuery ).find( selector );
197 e4a6c3b8 Olga Brani
198 e4a6c3b8 Olga Brani
      // HANDLE: $(expr, context)
199 e4a6c3b8 Olga Brani
      // (which is just equivalent to: $(context).find(expr)
200 e4a6c3b8 Olga Brani
      } else {
201 e4a6c3b8 Olga Brani
        return this.constructor( context ).find( selector );
202 e4a6c3b8 Olga Brani
      }
203 e4a6c3b8 Olga Brani
204 e4a6c3b8 Olga Brani
    // HANDLE: $(DOMElement)
205 e4a6c3b8 Olga Brani
    } else if ( selector.nodeType ) {
206 e4a6c3b8 Olga Brani
      this.context = this[0] = selector;
207 e4a6c3b8 Olga Brani
      this.length = 1;
208 e4a6c3b8 Olga Brani
      return this;
209 e4a6c3b8 Olga Brani
210 e4a6c3b8 Olga Brani
    // HANDLE: $(function)
211 e4a6c3b8 Olga Brani
    // Shortcut for document ready
212 e4a6c3b8 Olga Brani
    } else if ( jQuery.isFunction( selector ) ) {
213 e4a6c3b8 Olga Brani
      return rootjQuery.ready( selector );
214 e4a6c3b8 Olga Brani
    }
215 e4a6c3b8 Olga Brani
216 e4a6c3b8 Olga Brani
    if ( selector.selector !== undefined ) {
217 e4a6c3b8 Olga Brani
      this.selector = selector.selector;
218 e4a6c3b8 Olga Brani
      this.context = selector.context;
219 e4a6c3b8 Olga Brani
    }
220 e4a6c3b8 Olga Brani
221 e4a6c3b8 Olga Brani
    return jQuery.makeArray( selector, this );
222 e4a6c3b8 Olga Brani
  },
223 e4a6c3b8 Olga Brani
224 e4a6c3b8 Olga Brani
  // Start with an empty selector
225 e4a6c3b8 Olga Brani
  selector: "",
226 e4a6c3b8 Olga Brani
227 e4a6c3b8 Olga Brani
  // The default length of a jQuery object is 0
228 e4a6c3b8 Olga Brani
  length: 0,
229 e4a6c3b8 Olga Brani
230 e4a6c3b8 Olga Brani
  // The number of elements contained in the matched element set
231 e4a6c3b8 Olga Brani
  size: function() {
232 e4a6c3b8 Olga Brani
    return this.length;
233 e4a6c3b8 Olga Brani
  },
234 e4a6c3b8 Olga Brani
235 e4a6c3b8 Olga Brani
  toArray: function() {
236 e4a6c3b8 Olga Brani
    return core_slice.call( this );
237 e4a6c3b8 Olga Brani
  },
238 e4a6c3b8 Olga Brani
239 e4a6c3b8 Olga Brani
  // Get the Nth element in the matched element set OR
240 e4a6c3b8 Olga Brani
  // Get the whole matched element set as a clean array
241 e4a6c3b8 Olga Brani
  get: function( num ) {
242 e4a6c3b8 Olga Brani
    return num == null ?
243 e4a6c3b8 Olga Brani
244 e4a6c3b8 Olga Brani
      // Return a 'clean' array
245 e4a6c3b8 Olga Brani
      this.toArray() :
246 e4a6c3b8 Olga Brani
247 e4a6c3b8 Olga Brani
      // Return just the object
248 e4a6c3b8 Olga Brani
      ( num < 0 ? this[ this.length + num ] : this[ num ] );
249 e4a6c3b8 Olga Brani
  },
250 e4a6c3b8 Olga Brani
251 e4a6c3b8 Olga Brani
  // Take an array of elements and push it onto the stack
252 e4a6c3b8 Olga Brani
  // (returning the new matched element set)
253 e4a6c3b8 Olga Brani
  pushStack: function( elems ) {
254 e4a6c3b8 Olga Brani
255 e4a6c3b8 Olga Brani
    // Build a new jQuery matched element set
256 e4a6c3b8 Olga Brani
    var ret = jQuery.merge( this.constructor(), elems );
257 e4a6c3b8 Olga Brani
258 e4a6c3b8 Olga Brani
    // Add the old object onto the stack (as a reference)
259 e4a6c3b8 Olga Brani
    ret.prevObject = this;
260 e4a6c3b8 Olga Brani
    ret.context = this.context;
261 e4a6c3b8 Olga Brani
262 e4a6c3b8 Olga Brani
    // Return the newly-formed element set
263 e4a6c3b8 Olga Brani
    return ret;
264 e4a6c3b8 Olga Brani
  },
265 e4a6c3b8 Olga Brani
266 e4a6c3b8 Olga Brani
  // Execute a callback for every element in the matched set.
267 e4a6c3b8 Olga Brani
  // (You can seed the arguments with an array of args, but this is
268 e4a6c3b8 Olga Brani
  // only used internally.)
269 e4a6c3b8 Olga Brani
  each: function( callback, args ) {
270 e4a6c3b8 Olga Brani
    return jQuery.each( this, callback, args );
271 e4a6c3b8 Olga Brani
  },
272 e4a6c3b8 Olga Brani
273 e4a6c3b8 Olga Brani
  ready: function( fn ) {
274 e4a6c3b8 Olga Brani
    // Add the callback
275 e4a6c3b8 Olga Brani
    jQuery.ready.promise().done( fn );
276 e4a6c3b8 Olga Brani
277 e4a6c3b8 Olga Brani
    return this;
278 e4a6c3b8 Olga Brani
  },
279 e4a6c3b8 Olga Brani
280 e4a6c3b8 Olga Brani
  slice: function() {
281 e4a6c3b8 Olga Brani
    return this.pushStack( core_slice.apply( this, arguments ) );
282 e4a6c3b8 Olga Brani
  },
283 e4a6c3b8 Olga Brani
284 e4a6c3b8 Olga Brani
  first: function() {
285 e4a6c3b8 Olga Brani
    return this.eq( 0 );
286 e4a6c3b8 Olga Brani
  },
287 e4a6c3b8 Olga Brani
288 e4a6c3b8 Olga Brani
  last: function() {
289 e4a6c3b8 Olga Brani
    return this.eq( -1 );
290 e4a6c3b8 Olga Brani
  },
291 e4a6c3b8 Olga Brani
292 e4a6c3b8 Olga Brani
  eq: function( i ) {
293 e4a6c3b8 Olga Brani
    var len = this.length,
294 e4a6c3b8 Olga Brani
      j = +i + ( i < 0 ? len : 0 );
295 e4a6c3b8 Olga Brani
    return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
296 e4a6c3b8 Olga Brani
  },
297 e4a6c3b8 Olga Brani
298 e4a6c3b8 Olga Brani
  map: function( callback ) {
299 e4a6c3b8 Olga Brani
    return this.pushStack( jQuery.map(this, function( elem, i ) {
300 e4a6c3b8 Olga Brani
      return callback.call( elem, i, elem );
301 e4a6c3b8 Olga Brani
    }));
302 e4a6c3b8 Olga Brani
  },
303 e4a6c3b8 Olga Brani
304 e4a6c3b8 Olga Brani
  end: function() {
305 e4a6c3b8 Olga Brani
    return this.prevObject || this.constructor(null);
306 e4a6c3b8 Olga Brani
  },
307 e4a6c3b8 Olga Brani
308 e4a6c3b8 Olga Brani
  // For internal use only.
309 e4a6c3b8 Olga Brani
  // Behaves like an Array's method, not like a jQuery method.
310 e4a6c3b8 Olga Brani
  push: core_push,
311 e4a6c3b8 Olga Brani
  sort: [].sort,
312 e4a6c3b8 Olga Brani
  splice: [].splice
313 e4a6c3b8 Olga Brani
};
314 e4a6c3b8 Olga Brani
315 e4a6c3b8 Olga Brani
// Give the init function the jQuery prototype for later instantiation
316 e4a6c3b8 Olga Brani
jQuery.fn.init.prototype = jQuery.fn;
317 e4a6c3b8 Olga Brani
318 e4a6c3b8 Olga Brani
jQuery.extend = jQuery.fn.extend = function() {
319 e4a6c3b8 Olga Brani
  var src, copyIsArray, copy, name, options, clone,
320 e4a6c3b8 Olga Brani
    target = arguments[0] || {},
321 e4a6c3b8 Olga Brani
    i = 1,
322 e4a6c3b8 Olga Brani
    length = arguments.length,
323 e4a6c3b8 Olga Brani
    deep = false;
324 e4a6c3b8 Olga Brani
325 e4a6c3b8 Olga Brani
  // Handle a deep copy situation
326 e4a6c3b8 Olga Brani
  if ( typeof target === "boolean" ) {
327 e4a6c3b8 Olga Brani
    deep = target;
328 e4a6c3b8 Olga Brani
    target = arguments[1] || {};
329 e4a6c3b8 Olga Brani
    // skip the boolean and the target
330 e4a6c3b8 Olga Brani
    i = 2;
331 e4a6c3b8 Olga Brani
  }
332 e4a6c3b8 Olga Brani
333 e4a6c3b8 Olga Brani
  // Handle case when target is a string or something (possible in deep copy)
334 e4a6c3b8 Olga Brani
  if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
335 e4a6c3b8 Olga Brani
    target = {};
336 e4a6c3b8 Olga Brani
  }
337 e4a6c3b8 Olga Brani
338 e4a6c3b8 Olga Brani
  // extend jQuery itself if only one argument is passed
339 e4a6c3b8 Olga Brani
  if ( length === i ) {
340 e4a6c3b8 Olga Brani
    target = this;
341 e4a6c3b8 Olga Brani
    --i;
342 e4a6c3b8 Olga Brani
  }
343 e4a6c3b8 Olga Brani
344 e4a6c3b8 Olga Brani
  for ( ; i < length; i++ ) {
345 e4a6c3b8 Olga Brani
    // Only deal with non-null/undefined values
346 e4a6c3b8 Olga Brani
    if ( (options = arguments[ i ]) != null ) {
347 e4a6c3b8 Olga Brani
      // Extend the base object
348 e4a6c3b8 Olga Brani
      for ( name in options ) {
349 e4a6c3b8 Olga Brani
        src = target[ name ];
350 e4a6c3b8 Olga Brani
        copy = options[ name ];
351 e4a6c3b8 Olga Brani
352 e4a6c3b8 Olga Brani
        // Prevent never-ending loop
353 e4a6c3b8 Olga Brani
        if ( target === copy ) {
354 e4a6c3b8 Olga Brani
          continue;
355 e4a6c3b8 Olga Brani
        }
356 e4a6c3b8 Olga Brani
357 e4a6c3b8 Olga Brani
        // Recurse if we're merging plain objects or arrays
358 e4a6c3b8 Olga Brani
        if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
359 e4a6c3b8 Olga Brani
          if ( copyIsArray ) {
360 e4a6c3b8 Olga Brani
            copyIsArray = false;
361 e4a6c3b8 Olga Brani
            clone = src && jQuery.isArray(src) ? src : [];
362 e4a6c3b8 Olga Brani
363 e4a6c3b8 Olga Brani
          } else {
364 e4a6c3b8 Olga Brani
            clone = src && jQuery.isPlainObject(src) ? src : {};
365 e4a6c3b8 Olga Brani
          }
366 e4a6c3b8 Olga Brani
367 e4a6c3b8 Olga Brani
          // Never move original objects, clone them
368 e4a6c3b8 Olga Brani
          target[ name ] = jQuery.extend( deep, clone, copy );
369 e4a6c3b8 Olga Brani
370 e4a6c3b8 Olga Brani
        // Don't bring in undefined values
371 e4a6c3b8 Olga Brani
        } else if ( copy !== undefined ) {
372 e4a6c3b8 Olga Brani
          target[ name ] = copy;
373 e4a6c3b8 Olga Brani
        }
374 e4a6c3b8 Olga Brani
      }
375 e4a6c3b8 Olga Brani
    }
376 e4a6c3b8 Olga Brani
  }
377 e4a6c3b8 Olga Brani
378 e4a6c3b8 Olga Brani
  // Return the modified object
379 e4a6c3b8 Olga Brani
  return target;
380 e4a6c3b8 Olga Brani
};
381 e4a6c3b8 Olga Brani
382 e4a6c3b8 Olga Brani
jQuery.extend({
383 e4a6c3b8 Olga Brani
  noConflict: function( deep ) {
384 e4a6c3b8 Olga Brani
    if ( window.$ === jQuery ) {
385 e4a6c3b8 Olga Brani
      window.$ = _$;
386 e4a6c3b8 Olga Brani
    }
387 e4a6c3b8 Olga Brani
388 e4a6c3b8 Olga Brani
    if ( deep && window.jQuery === jQuery ) {
389 e4a6c3b8 Olga Brani
      window.jQuery = _jQuery;
390 e4a6c3b8 Olga Brani
    }
391 e4a6c3b8 Olga Brani
392 e4a6c3b8 Olga Brani
    return jQuery;
393 e4a6c3b8 Olga Brani
  },
394 e4a6c3b8 Olga Brani
395 e4a6c3b8 Olga Brani
  // Is the DOM ready to be used? Set to true once it occurs.
396 e4a6c3b8 Olga Brani
  isReady: false,
397 e4a6c3b8 Olga Brani
398 e4a6c3b8 Olga Brani
  // A counter to track how many items to wait for before
399 e4a6c3b8 Olga Brani
  // the ready event fires. See #6781
400 e4a6c3b8 Olga Brani
  readyWait: 1,
401 e4a6c3b8 Olga Brani
402 e4a6c3b8 Olga Brani
  // Hold (or release) the ready event
403 e4a6c3b8 Olga Brani
  holdReady: function( hold ) {
404 e4a6c3b8 Olga Brani
    if ( hold ) {
405 e4a6c3b8 Olga Brani
      jQuery.readyWait++;
406 e4a6c3b8 Olga Brani
    } else {
407 e4a6c3b8 Olga Brani
      jQuery.ready( true );
408 e4a6c3b8 Olga Brani
    }
409 e4a6c3b8 Olga Brani
  },
410 e4a6c3b8 Olga Brani
411 e4a6c3b8 Olga Brani
  // Handle when the DOM is ready
412 e4a6c3b8 Olga Brani
  ready: function( wait ) {
413 e4a6c3b8 Olga Brani
414 e4a6c3b8 Olga Brani
    // Abort if there are pending holds or we're already ready
415 e4a6c3b8 Olga Brani
    if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
416 e4a6c3b8 Olga Brani
      return;
417 e4a6c3b8 Olga Brani
    }
418 e4a6c3b8 Olga Brani
419 e4a6c3b8 Olga Brani
    // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
420 e4a6c3b8 Olga Brani
    if ( !document.body ) {
421 e4a6c3b8 Olga Brani
      return setTimeout( jQuery.ready );
422 e4a6c3b8 Olga Brani
    }
423 e4a6c3b8 Olga Brani
424 e4a6c3b8 Olga Brani
    // Remember that the DOM is ready
425 e4a6c3b8 Olga Brani
    jQuery.isReady = true;
426 e4a6c3b8 Olga Brani
427 e4a6c3b8 Olga Brani
    // If a normal DOM Ready event fired, decrement, and wait if need be
428 e4a6c3b8 Olga Brani
    if ( wait !== true && --jQuery.readyWait > 0 ) {
429 e4a6c3b8 Olga Brani
      return;
430 e4a6c3b8 Olga Brani
    }
431 e4a6c3b8 Olga Brani
432 e4a6c3b8 Olga Brani
    // If there are functions bound, to execute
433 e4a6c3b8 Olga Brani
    readyList.resolveWith( document, [ jQuery ] );
434 e4a6c3b8 Olga Brani
435 e4a6c3b8 Olga Brani
    // Trigger any bound ready events
436 e4a6c3b8 Olga Brani
    if ( jQuery.fn.trigger ) {
437 e4a6c3b8 Olga Brani
      jQuery( document ).trigger("ready").off("ready");
438 e4a6c3b8 Olga Brani
    }
439 e4a6c3b8 Olga Brani
  },
440 e4a6c3b8 Olga Brani
441 e4a6c3b8 Olga Brani
  // See test/unit/core.js for details concerning isFunction.
442 e4a6c3b8 Olga Brani
  // Since version 1.3, DOM methods and functions like alert
443 e4a6c3b8 Olga Brani
  // aren't supported. They return false on IE (#2968).
444 e4a6c3b8 Olga Brani
  isFunction: function( obj ) {
445 e4a6c3b8 Olga Brani
    return jQuery.type(obj) === "function";
446 e4a6c3b8 Olga Brani
  },
447 e4a6c3b8 Olga Brani
448 e4a6c3b8 Olga Brani
  isArray: Array.isArray || function( obj ) {
449 e4a6c3b8 Olga Brani
    return jQuery.type(obj) === "array";
450 e4a6c3b8 Olga Brani
  },
451 e4a6c3b8 Olga Brani
452 e4a6c3b8 Olga Brani
  isWindow: function( obj ) {
453 e4a6c3b8 Olga Brani
    return obj != null && obj == obj.window;
454 e4a6c3b8 Olga Brani
  },
455 e4a6c3b8 Olga Brani
456 e4a6c3b8 Olga Brani
  isNumeric: function( obj ) {
457 e4a6c3b8 Olga Brani
    return !isNaN( parseFloat(obj) ) && isFinite( obj );
458 e4a6c3b8 Olga Brani
  },
459 e4a6c3b8 Olga Brani
460 e4a6c3b8 Olga Brani
  type: function( obj ) {
461 e4a6c3b8 Olga Brani
    if ( obj == null ) {
462 e4a6c3b8 Olga Brani
      return String( obj );
463 e4a6c3b8 Olga Brani
    }
464 e4a6c3b8 Olga Brani
    return typeof obj === "object" || typeof obj === "function" ?
465 e4a6c3b8 Olga Brani
      class2type[ core_toString.call(obj) ] || "object" :
466 e4a6c3b8 Olga Brani
      typeof obj;
467 e4a6c3b8 Olga Brani
  },
468 e4a6c3b8 Olga Brani
469 e4a6c3b8 Olga Brani
  isPlainObject: function( obj ) {
470 e4a6c3b8 Olga Brani
    // Must be an Object.
471 e4a6c3b8 Olga Brani
    // Because of IE, we also have to check the presence of the constructor property.
472 e4a6c3b8 Olga Brani
    // Make sure that DOM nodes and window objects don't pass through, as well
473 e4a6c3b8 Olga Brani
    if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
474 e4a6c3b8 Olga Brani
      return false;
475 e4a6c3b8 Olga Brani
    }
476 e4a6c3b8 Olga Brani
477 e4a6c3b8 Olga Brani
    try {
478 e4a6c3b8 Olga Brani
      // Not own constructor property must be Object
479 e4a6c3b8 Olga Brani
      if ( obj.constructor &&
480 e4a6c3b8 Olga Brani
        !core_hasOwn.call(obj, "constructor") &&
481 e4a6c3b8 Olga Brani
        !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
482 e4a6c3b8 Olga Brani
        return false;
483 e4a6c3b8 Olga Brani
      }
484 e4a6c3b8 Olga Brani
    } catch ( e ) {
485 e4a6c3b8 Olga Brani
      // IE8,9 Will throw exceptions on certain host objects #9897
486 e4a6c3b8 Olga Brani
      return false;
487 e4a6c3b8 Olga Brani
    }
488 e4a6c3b8 Olga Brani
489 e4a6c3b8 Olga Brani
    // Own properties are enumerated firstly, so to speed up,
490 e4a6c3b8 Olga Brani
    // if last one is own, then all properties are own.
491 e4a6c3b8 Olga Brani
492 e4a6c3b8 Olga Brani
    var key;
493 e4a6c3b8 Olga Brani
    for ( key in obj ) {}
494 e4a6c3b8 Olga Brani
495 e4a6c3b8 Olga Brani
    return key === undefined || core_hasOwn.call( obj, key );
496 e4a6c3b8 Olga Brani
  },
497 e4a6c3b8 Olga Brani
498 e4a6c3b8 Olga Brani
  isEmptyObject: function( obj ) {
499 e4a6c3b8 Olga Brani
    var name;
500 e4a6c3b8 Olga Brani
    for ( name in obj ) {
501 e4a6c3b8 Olga Brani
      return false;
502 e4a6c3b8 Olga Brani
    }
503 e4a6c3b8 Olga Brani
    return true;
504 e4a6c3b8 Olga Brani
  },
505 e4a6c3b8 Olga Brani
506 e4a6c3b8 Olga Brani
  error: function( msg ) {
507 e4a6c3b8 Olga Brani
    throw new Error( msg );
508 e4a6c3b8 Olga Brani
  },
509 e4a6c3b8 Olga Brani
510 e4a6c3b8 Olga Brani
  // data: string of html
511 e4a6c3b8 Olga Brani
  // context (optional): If specified, the fragment will be created in this context, defaults to document
512 e4a6c3b8 Olga Brani
  // keepScripts (optional): If true, will include scripts passed in the html string
513 e4a6c3b8 Olga Brani
  parseHTML: function( data, context, keepScripts ) {
514 e4a6c3b8 Olga Brani
    if ( !data || typeof data !== "string" ) {
515 e4a6c3b8 Olga Brani
      return null;
516 e4a6c3b8 Olga Brani
    }
517 e4a6c3b8 Olga Brani
    if ( typeof context === "boolean" ) {
518 e4a6c3b8 Olga Brani
      keepScripts = context;
519 e4a6c3b8 Olga Brani
      context = false;
520 e4a6c3b8 Olga Brani
    }
521 e4a6c3b8 Olga Brani
    context = context || document;
522 e4a6c3b8 Olga Brani
523 e4a6c3b8 Olga Brani
    var parsed = rsingleTag.exec( data ),
524 e4a6c3b8 Olga Brani
      scripts = !keepScripts && [];
525 e4a6c3b8 Olga Brani
526 e4a6c3b8 Olga Brani
    // Single tag
527 e4a6c3b8 Olga Brani
    if ( parsed ) {
528 e4a6c3b8 Olga Brani
      return [ context.createElement( parsed[1] ) ];
529 e4a6c3b8 Olga Brani
    }
530 e4a6c3b8 Olga Brani
531 e4a6c3b8 Olga Brani
    parsed = jQuery.buildFragment( [ data ], context, scripts );
532 e4a6c3b8 Olga Brani
    if ( scripts ) {
533 e4a6c3b8 Olga Brani
      jQuery( scripts ).remove();
534 e4a6c3b8 Olga Brani
    }
535 e4a6c3b8 Olga Brani
    return jQuery.merge( [], parsed.childNodes );
536 e4a6c3b8 Olga Brani
  },
537 e4a6c3b8 Olga Brani
538 e4a6c3b8 Olga Brani
  parseJSON: function( data ) {
539 e4a6c3b8 Olga Brani
    // Attempt to parse using the native JSON parser first
540 e4a6c3b8 Olga Brani
    if ( window.JSON && window.JSON.parse ) {
541 e4a6c3b8 Olga Brani
      return window.JSON.parse( data );
542 e4a6c3b8 Olga Brani
    }
543 e4a6c3b8 Olga Brani
544 e4a6c3b8 Olga Brani
    if ( data === null ) {
545 e4a6c3b8 Olga Brani
      return data;
546 e4a6c3b8 Olga Brani
    }
547 e4a6c3b8 Olga Brani
548 e4a6c3b8 Olga Brani
    if ( typeof data === "string" ) {
549 e4a6c3b8 Olga Brani
550 e4a6c3b8 Olga Brani
      // Make sure leading/trailing whitespace is removed (IE can't handle it)
551 e4a6c3b8 Olga Brani
      data = jQuery.trim( data );
552 e4a6c3b8 Olga Brani
553 e4a6c3b8 Olga Brani
      if ( data ) {
554 e4a6c3b8 Olga Brani
        // Make sure the incoming data is actual JSON
555 e4a6c3b8 Olga Brani
        // Logic borrowed from http://json.org/json2.js
556 e4a6c3b8 Olga Brani
        if ( rvalidchars.test( data.replace( rvalidescape, "@" )
557 e4a6c3b8 Olga Brani
          .replace( rvalidtokens, "]" )
558 e4a6c3b8 Olga Brani
          .replace( rvalidbraces, "")) ) {
559 e4a6c3b8 Olga Brani
560 e4a6c3b8 Olga Brani
          return ( new Function( "return " + data ) )();
561 e4a6c3b8 Olga Brani
        }
562 e4a6c3b8 Olga Brani
      }
563 e4a6c3b8 Olga Brani
    }
564 e4a6c3b8 Olga Brani
565 e4a6c3b8 Olga Brani
    jQuery.error( "Invalid JSON: " + data );
566 e4a6c3b8 Olga Brani
  },
567 e4a6c3b8 Olga Brani
568 e4a6c3b8 Olga Brani
  // Cross-browser xml parsing
569 e4a6c3b8 Olga Brani
  parseXML: function( data ) {
570 e4a6c3b8 Olga Brani
    var xml, tmp;
571 e4a6c3b8 Olga Brani
    if ( !data || typeof data !== "string" ) {
572 e4a6c3b8 Olga Brani
      return null;
573 e4a6c3b8 Olga Brani
    }
574 e4a6c3b8 Olga Brani
    try {
575 e4a6c3b8 Olga Brani
      if ( window.DOMParser ) { // Standard
576 e4a6c3b8 Olga Brani
        tmp = new DOMParser();
577 e4a6c3b8 Olga Brani
        xml = tmp.parseFromString( data , "text/xml" );
578 e4a6c3b8 Olga Brani
      } else { // IE
579 e4a6c3b8 Olga Brani
        xml = new ActiveXObject( "Microsoft.XMLDOM" );
580 e4a6c3b8 Olga Brani
        xml.async = "false";
581 e4a6c3b8 Olga Brani
        xml.loadXML( data );
582 e4a6c3b8 Olga Brani
      }
583 e4a6c3b8 Olga Brani
    } catch( e ) {
584 e4a6c3b8 Olga Brani
      xml = undefined;
585 e4a6c3b8 Olga Brani
    }
586 e4a6c3b8 Olga Brani
    if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
587 e4a6c3b8 Olga Brani
      jQuery.error( "Invalid XML: " + data );
588 e4a6c3b8 Olga Brani
    }
589 e4a6c3b8 Olga Brani
    return xml;
590 e4a6c3b8 Olga Brani
  },
591 e4a6c3b8 Olga Brani
592 e4a6c3b8 Olga Brani
  noop: function() {},
593 e4a6c3b8 Olga Brani
594 e4a6c3b8 Olga Brani
  // Evaluates a script in a global context
595 e4a6c3b8 Olga Brani
  // Workarounds based on findings by Jim Driscoll
596 e4a6c3b8 Olga Brani
  // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
597 e4a6c3b8 Olga Brani
  globalEval: function( data ) {
598 e4a6c3b8 Olga Brani
    if ( data && jQuery.trim( data ) ) {
599 e4a6c3b8 Olga Brani
      // We use execScript on Internet Explorer
600 e4a6c3b8 Olga Brani
      // We use an anonymous function so that context is window
601 e4a6c3b8 Olga Brani
      // rather than jQuery in Firefox
602 e4a6c3b8 Olga Brani
      ( window.execScript || function( data ) {
603 e4a6c3b8 Olga Brani
        window[ "eval" ].call( window, data );
604 e4a6c3b8 Olga Brani
      } )( data );
605 e4a6c3b8 Olga Brani
    }
606 e4a6c3b8 Olga Brani
  },
607 e4a6c3b8 Olga Brani
608 e4a6c3b8 Olga Brani
  // Convert dashed to camelCase; used by the css and data modules
609 e4a6c3b8 Olga Brani
  // Microsoft forgot to hump their vendor prefix (#9572)
610 e4a6c3b8 Olga Brani
  camelCase: function( string ) {
611 e4a6c3b8 Olga Brani
    return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
612 e4a6c3b8 Olga Brani
  },
613 e4a6c3b8 Olga Brani
614 e4a6c3b8 Olga Brani
  nodeName: function( elem, name ) {
615 e4a6c3b8 Olga Brani
    return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
616 e4a6c3b8 Olga Brani
  },
617 e4a6c3b8 Olga Brani
618 e4a6c3b8 Olga Brani
  // args is for internal usage only
619 e4a6c3b8 Olga Brani
  each: function( obj, callback, args ) {
620 e4a6c3b8 Olga Brani
    var value,
621 e4a6c3b8 Olga Brani
      i = 0,
622 e4a6c3b8 Olga Brani
      length = obj.length,
623 e4a6c3b8 Olga Brani
      isArray = isArraylike( obj );
624 e4a6c3b8 Olga Brani
625 e4a6c3b8 Olga Brani
    if ( args ) {
626 e4a6c3b8 Olga Brani
      if ( isArray ) {
627 e4a6c3b8 Olga Brani
        for ( ; i < length; i++ ) {
628 e4a6c3b8 Olga Brani
          value = callback.apply( obj[ i ], args );
629 e4a6c3b8 Olga Brani
630 e4a6c3b8 Olga Brani
          if ( value === false ) {
631 e4a6c3b8 Olga Brani
            break;
632 e4a6c3b8 Olga Brani
          }
633 e4a6c3b8 Olga Brani
        }
634 e4a6c3b8 Olga Brani
      } else {
635 e4a6c3b8 Olga Brani
        for ( i in obj ) {
636 e4a6c3b8 Olga Brani
          value = callback.apply( obj[ i ], args );
637 e4a6c3b8 Olga Brani
638 e4a6c3b8 Olga Brani
          if ( value === false ) {
639 e4a6c3b8 Olga Brani
            break;
640 e4a6c3b8 Olga Brani
          }
641 e4a6c3b8 Olga Brani
        }
642 e4a6c3b8 Olga Brani
      }
643 e4a6c3b8 Olga Brani
644 e4a6c3b8 Olga Brani
    // A special, fast, case for the most common use of each
645 e4a6c3b8 Olga Brani
    } else {
646 e4a6c3b8 Olga Brani
      if ( isArray ) {
647 e4a6c3b8 Olga Brani
        for ( ; i < length; i++ ) {
648 e4a6c3b8 Olga Brani
          value = callback.call( obj[ i ], i, obj[ i ] );
649 e4a6c3b8 Olga Brani
650 e4a6c3b8 Olga Brani
          if ( value === false ) {
651 e4a6c3b8 Olga Brani
            break;
652 e4a6c3b8 Olga Brani
          }
653 e4a6c3b8 Olga Brani
        }
654 e4a6c3b8 Olga Brani
      } else {
655 e4a6c3b8 Olga Brani
        for ( i in obj ) {
656 e4a6c3b8 Olga Brani
          value = callback.call( obj[ i ], i, obj[ i ] );
657 e4a6c3b8 Olga Brani
658 e4a6c3b8 Olga Brani
          if ( value === false ) {
659 e4a6c3b8 Olga Brani
            break;
660 e4a6c3b8 Olga Brani
          }
661 e4a6c3b8 Olga Brani
        }
662 e4a6c3b8 Olga Brani
      }
663 e4a6c3b8 Olga Brani
    }
664 e4a6c3b8 Olga Brani
665 e4a6c3b8 Olga Brani
    return obj;
666 e4a6c3b8 Olga Brani
  },
667 e4a6c3b8 Olga Brani
668 e4a6c3b8 Olga Brani
  // Use native String.trim function wherever possible
669 e4a6c3b8 Olga Brani
  trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
670 e4a6c3b8 Olga Brani
    function( text ) {
671 e4a6c3b8 Olga Brani
      return text == null ?
672 e4a6c3b8 Olga Brani
        "" :
673 e4a6c3b8 Olga Brani
        core_trim.call( text );
674 e4a6c3b8 Olga Brani
    } :
675 e4a6c3b8 Olga Brani
676 e4a6c3b8 Olga Brani
    // Otherwise use our own trimming functionality
677 e4a6c3b8 Olga Brani
    function( text ) {
678 e4a6c3b8 Olga Brani
      return text == null ?
679 e4a6c3b8 Olga Brani
        "" :
680 e4a6c3b8 Olga Brani
        ( text + "" ).replace( rtrim, "" );
681 e4a6c3b8 Olga Brani
    },
682 e4a6c3b8 Olga Brani
683 e4a6c3b8 Olga Brani
  // results is for internal usage only
684 e4a6c3b8 Olga Brani
  makeArray: function( arr, results ) {
685 e4a6c3b8 Olga Brani
    var ret = results || [];
686 e4a6c3b8 Olga Brani
687 e4a6c3b8 Olga Brani
    if ( arr != null ) {
688 e4a6c3b8 Olga Brani
      if ( isArraylike( Object(arr) ) ) {
689 e4a6c3b8 Olga Brani
        jQuery.merge( ret,
690 e4a6c3b8 Olga Brani
          typeof arr === "string" ?
691 e4a6c3b8 Olga Brani
          [ arr ] : arr
692 e4a6c3b8 Olga Brani
        );
693 e4a6c3b8 Olga Brani
      } else {
694 e4a6c3b8 Olga Brani
        core_push.call( ret, arr );
695 e4a6c3b8 Olga Brani
      }
696 e4a6c3b8 Olga Brani
    }
697 e4a6c3b8 Olga Brani
698 e4a6c3b8 Olga Brani
    return ret;
699 e4a6c3b8 Olga Brani
  },
700 e4a6c3b8 Olga Brani
701 e4a6c3b8 Olga Brani
  inArray: function( elem, arr, i ) {
702 e4a6c3b8 Olga Brani
    var len;
703 e4a6c3b8 Olga Brani
704 e4a6c3b8 Olga Brani
    if ( arr ) {
705 e4a6c3b8 Olga Brani
      if ( core_indexOf ) {
706 e4a6c3b8 Olga Brani
        return core_indexOf.call( arr, elem, i );
707 e4a6c3b8 Olga Brani
      }
708 e4a6c3b8 Olga Brani
709 e4a6c3b8 Olga Brani
      len = arr.length;
710 e4a6c3b8 Olga Brani
      i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
711 e4a6c3b8 Olga Brani
712 e4a6c3b8 Olga Brani
      for ( ; i < len; i++ ) {
713 e4a6c3b8 Olga Brani
        // Skip accessing in sparse arrays
714 e4a6c3b8 Olga Brani
        if ( i in arr && arr[ i ] === elem ) {
715 e4a6c3b8 Olga Brani
          return i;
716 e4a6c3b8 Olga Brani
        }
717 e4a6c3b8 Olga Brani
      }
718 e4a6c3b8 Olga Brani
    }
719 e4a6c3b8 Olga Brani
720 e4a6c3b8 Olga Brani
    return -1;
721 e4a6c3b8 Olga Brani
  },
722 e4a6c3b8 Olga Brani
723 e4a6c3b8 Olga Brani
  merge: function( first, second ) {
724 e4a6c3b8 Olga Brani
    var l = second.length,
725 e4a6c3b8 Olga Brani
      i = first.length,
726 e4a6c3b8 Olga Brani
      j = 0;
727 e4a6c3b8 Olga Brani
728 e4a6c3b8 Olga Brani
    if ( typeof l === "number" ) {
729 e4a6c3b8 Olga Brani
      for ( ; j < l; j++ ) {
730 e4a6c3b8 Olga Brani
        first[ i++ ] = second[ j ];
731 e4a6c3b8 Olga Brani
      }
732 e4a6c3b8 Olga Brani
    } else {
733 e4a6c3b8 Olga Brani
      while ( second[j] !== undefined ) {
734 e4a6c3b8 Olga Brani
        first[ i++ ] = second[ j++ ];
735 e4a6c3b8 Olga Brani
      }
736 e4a6c3b8 Olga Brani
    }
737 e4a6c3b8 Olga Brani
738 e4a6c3b8 Olga Brani
    first.length = i;
739 e4a6c3b8 Olga Brani
740 e4a6c3b8 Olga Brani
    return first;
741 e4a6c3b8 Olga Brani
  },
742 e4a6c3b8 Olga Brani
743 e4a6c3b8 Olga Brani
  grep: function( elems, callback, inv ) {
744 e4a6c3b8 Olga Brani
    var retVal,
745 e4a6c3b8 Olga Brani
      ret = [],
746 e4a6c3b8 Olga Brani
      i = 0,
747 e4a6c3b8 Olga Brani
      length = elems.length;
748 e4a6c3b8 Olga Brani
    inv = !!inv;
749 e4a6c3b8 Olga Brani
750 e4a6c3b8 Olga Brani
    // Go through the array, only saving the items
751 e4a6c3b8 Olga Brani
    // that pass the validator function
752 e4a6c3b8 Olga Brani
    for ( ; i < length; i++ ) {
753 e4a6c3b8 Olga Brani
      retVal = !!callback( elems[ i ], i );
754 e4a6c3b8 Olga Brani
      if ( inv !== retVal ) {
755 e4a6c3b8 Olga Brani
        ret.push( elems[ i ] );
756 e4a6c3b8 Olga Brani
      }
757 e4a6c3b8 Olga Brani
    }
758 e4a6c3b8 Olga Brani
759 e4a6c3b8 Olga Brani
    return ret;
760 e4a6c3b8 Olga Brani
  },
761 e4a6c3b8 Olga Brani
762 e4a6c3b8 Olga Brani
  // arg is for internal usage only
763 e4a6c3b8 Olga Brani
  map: function( elems, callback, arg ) {
764 e4a6c3b8 Olga Brani
    var value,
765 e4a6c3b8 Olga Brani
      i = 0,
766 e4a6c3b8 Olga Brani
      length = elems.length,
767 e4a6c3b8 Olga Brani
      isArray = isArraylike( elems ),
768 e4a6c3b8 Olga Brani
      ret = [];
769 e4a6c3b8 Olga Brani
770 e4a6c3b8 Olga Brani
    // Go through the array, translating each of the items to their
771 e4a6c3b8 Olga Brani
    if ( isArray ) {
772 e4a6c3b8 Olga Brani
      for ( ; i < length; i++ ) {
773 e4a6c3b8 Olga Brani
        value = callback( elems[ i ], i, arg );
774 e4a6c3b8 Olga Brani
775 e4a6c3b8 Olga Brani
        if ( value != null ) {
776 e4a6c3b8 Olga Brani
          ret[ ret.length ] = value;
777 e4a6c3b8 Olga Brani
        }
778 e4a6c3b8 Olga Brani
      }
779 e4a6c3b8 Olga Brani
780 e4a6c3b8 Olga Brani
    // Go through every key on the object,
781 e4a6c3b8 Olga Brani
    } else {
782 e4a6c3b8 Olga Brani
      for ( i in elems ) {
783 e4a6c3b8 Olga Brani
        value = callback( elems[ i ], i, arg );
784 e4a6c3b8 Olga Brani
785 e4a6c3b8 Olga Brani
        if ( value != null ) {
786 e4a6c3b8 Olga Brani
          ret[ ret.length ] = value;
787 e4a6c3b8 Olga Brani
        }
788 e4a6c3b8 Olga Brani
      }
789 e4a6c3b8 Olga Brani
    }
790 e4a6c3b8 Olga Brani
791 e4a6c3b8 Olga Brani
    // Flatten any nested arrays
792 e4a6c3b8 Olga Brani
    return core_concat.apply( [], ret );
793 e4a6c3b8 Olga Brani
  },
794 e4a6c3b8 Olga Brani
795 e4a6c3b8 Olga Brani
  // A global GUID counter for objects
796 e4a6c3b8 Olga Brani
  guid: 1,
797 e4a6c3b8 Olga Brani
798 e4a6c3b8 Olga Brani
  // Bind a function to a context, optionally partially applying any
799 e4a6c3b8 Olga Brani
  // arguments.
800 e4a6c3b8 Olga Brani
  proxy: function( fn, context ) {
801 e4a6c3b8 Olga Brani
    var args, proxy, tmp;
802 e4a6c3b8 Olga Brani
803 e4a6c3b8 Olga Brani
    if ( typeof context === "string" ) {
804 e4a6c3b8 Olga Brani
      tmp = fn[ context ];
805 e4a6c3b8 Olga Brani
      context = fn;
806 e4a6c3b8 Olga Brani
      fn = tmp;
807 e4a6c3b8 Olga Brani
    }
808 e4a6c3b8 Olga Brani
809 e4a6c3b8 Olga Brani
    // Quick check to determine if target is callable, in the spec
810 e4a6c3b8 Olga Brani
    // this throws a TypeError, but we will just return undefined.
811 e4a6c3b8 Olga Brani
    if ( !jQuery.isFunction( fn ) ) {
812 e4a6c3b8 Olga Brani
      return undefined;
813 e4a6c3b8 Olga Brani
    }
814 e4a6c3b8 Olga Brani
815 e4a6c3b8 Olga Brani
    // Simulated bind
816 e4a6c3b8 Olga Brani
    args = core_slice.call( arguments, 2 );
817 e4a6c3b8 Olga Brani
    proxy = function() {
818 e4a6c3b8 Olga Brani
      return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
819 e4a6c3b8 Olga Brani
    };
820 e4a6c3b8 Olga Brani
821 e4a6c3b8 Olga Brani
    // Set the guid of unique handler to the same of original handler, so it can be removed
822 e4a6c3b8 Olga Brani
    proxy.guid = fn.guid = fn.guid || jQuery.guid++;
823 e4a6c3b8 Olga Brani
824 e4a6c3b8 Olga Brani
    return proxy;
825 e4a6c3b8 Olga Brani
  },
826 e4a6c3b8 Olga Brani
827 e4a6c3b8 Olga Brani
  // Multifunctional method to get and set values of a collection
828 e4a6c3b8 Olga Brani
  // The value/s can optionally be executed if it's a function
829 e4a6c3b8 Olga Brani
  access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
830 e4a6c3b8 Olga Brani
    var i = 0,
831 e4a6c3b8 Olga Brani
      length = elems.length,
832 e4a6c3b8 Olga Brani
      bulk = key == null;
833 e4a6c3b8 Olga Brani
834 e4a6c3b8 Olga Brani
    // Sets many values
835 e4a6c3b8 Olga Brani
    if ( jQuery.type( key ) === "object" ) {
836 e4a6c3b8 Olga Brani
      chainable = true;
837 e4a6c3b8 Olga Brani
      for ( i in key ) {
838 e4a6c3b8 Olga Brani
        jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
839 e4a6c3b8 Olga Brani
      }
840 e4a6c3b8 Olga Brani
841 e4a6c3b8 Olga Brani
    // Sets one value
842 e4a6c3b8 Olga Brani
    } else if ( value !== undefined ) {
843 e4a6c3b8 Olga Brani
      chainable = true;
844 e4a6c3b8 Olga Brani
845 e4a6c3b8 Olga Brani
      if ( !jQuery.isFunction( value ) ) {
846 e4a6c3b8 Olga Brani
        raw = true;
847 e4a6c3b8 Olga Brani
      }
848 e4a6c3b8 Olga Brani
849 e4a6c3b8 Olga Brani
      if ( bulk ) {
850 e4a6c3b8 Olga Brani
        // Bulk operations run against the entire set
851 e4a6c3b8 Olga Brani
        if ( raw ) {
852 e4a6c3b8 Olga Brani
          fn.call( elems, value );
853 e4a6c3b8 Olga Brani
          fn = null;
854 e4a6c3b8 Olga Brani
855 e4a6c3b8 Olga Brani
        // ...except when executing function values
856 e4a6c3b8 Olga Brani
        } else {
857 e4a6c3b8 Olga Brani
          bulk = fn;
858 e4a6c3b8 Olga Brani
          fn = function( elem, key, value ) {
859 e4a6c3b8 Olga Brani
            return bulk.call( jQuery( elem ), value );
860 e4a6c3b8 Olga Brani
          };
861 e4a6c3b8 Olga Brani
        }
862 e4a6c3b8 Olga Brani
      }
863 e4a6c3b8 Olga Brani
864 e4a6c3b8 Olga Brani
      if ( fn ) {
865 e4a6c3b8 Olga Brani
        for ( ; i < length; i++ ) {
866 e4a6c3b8 Olga Brani
          fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
867 e4a6c3b8 Olga Brani
        }
868 e4a6c3b8 Olga Brani
      }
869 e4a6c3b8 Olga Brani
    }
870 e4a6c3b8 Olga Brani
871 e4a6c3b8 Olga Brani
    return chainable ?
872 e4a6c3b8 Olga Brani
      elems :
873 e4a6c3b8 Olga Brani
874 e4a6c3b8 Olga Brani
      // Gets
875 e4a6c3b8 Olga Brani
      bulk ?
876 e4a6c3b8 Olga Brani
        fn.call( elems ) :
877 e4a6c3b8 Olga Brani
        length ? fn( elems[0], key ) : emptyGet;
878 e4a6c3b8 Olga Brani
  },
879 e4a6c3b8 Olga Brani
880 e4a6c3b8 Olga Brani
  now: function() {
881 e4a6c3b8 Olga Brani
    return ( new Date() ).getTime();
882 e4a6c3b8 Olga Brani
  }
883 e4a6c3b8 Olga Brani
});
884 e4a6c3b8 Olga Brani
885 e4a6c3b8 Olga Brani
jQuery.ready.promise = function( obj ) {
886 e4a6c3b8 Olga Brani
  if ( !readyList ) {
887 e4a6c3b8 Olga Brani
888 e4a6c3b8 Olga Brani
    readyList = jQuery.Deferred();
889 e4a6c3b8 Olga Brani
890 e4a6c3b8 Olga Brani
    // Catch cases where $(document).ready() is called after the browser event has already occurred.
891 e4a6c3b8 Olga Brani
    // we once tried to use readyState "interactive" here, but it caused issues like the one
892 e4a6c3b8 Olga Brani
    // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
893 e4a6c3b8 Olga Brani
    if ( document.readyState === "complete" ) {
894 e4a6c3b8 Olga Brani
      // Handle it asynchronously to allow scripts the opportunity to delay ready
895 e4a6c3b8 Olga Brani
      setTimeout( jQuery.ready );
896 e4a6c3b8 Olga Brani
897 e4a6c3b8 Olga Brani
    // Standards-based browsers support DOMContentLoaded
898 e4a6c3b8 Olga Brani
    } else if ( document.addEventListener ) {
899 e4a6c3b8 Olga Brani
      // Use the handy event callback
900 e4a6c3b8 Olga Brani
      document.addEventListener( "DOMContentLoaded", completed, false );
901 e4a6c3b8 Olga Brani
902 e4a6c3b8 Olga Brani
      // A fallback to window.onload, that will always work
903 e4a6c3b8 Olga Brani
      window.addEventListener( "load", completed, false );
904 e4a6c3b8 Olga Brani
905 e4a6c3b8 Olga Brani
    // If IE event model is used
906 e4a6c3b8 Olga Brani
    } else {
907 e4a6c3b8 Olga Brani
      // Ensure firing before onload, maybe late but safe also for iframes
908 e4a6c3b8 Olga Brani
      document.attachEvent( "onreadystatechange", completed );
909 e4a6c3b8 Olga Brani
910 e4a6c3b8 Olga Brani
      // A fallback to window.onload, that will always work
911 e4a6c3b8 Olga Brani
      window.attachEvent( "onload", completed );
912 e4a6c3b8 Olga Brani
913 e4a6c3b8 Olga Brani
      // If IE and not a frame
914 e4a6c3b8 Olga Brani
      // continually check to see if the document is ready
915 e4a6c3b8 Olga Brani
      var top = false;
916 e4a6c3b8 Olga Brani
917 e4a6c3b8 Olga Brani
      try {
918 e4a6c3b8 Olga Brani
        top = window.frameElement == null && document.documentElement;
919 e4a6c3b8 Olga Brani
      } catch(e) {}
920 e4a6c3b8 Olga Brani
921 e4a6c3b8 Olga Brani
      if ( top && top.doScroll ) {
922 e4a6c3b8 Olga Brani
        (function doScrollCheck() {
923 e4a6c3b8 Olga Brani
          if ( !jQuery.isReady ) {
924 e4a6c3b8 Olga Brani
925 e4a6c3b8 Olga Brani
            try {
926 e4a6c3b8 Olga Brani
              // Use the trick by Diego Perini
927 e4a6c3b8 Olga Brani
              // http://javascript.nwbox.com/IEContentLoaded/
928 e4a6c3b8 Olga Brani
              top.doScroll("left");
929 e4a6c3b8 Olga Brani
            } catch(e) {
930 e4a6c3b8 Olga Brani
              return setTimeout( doScrollCheck, 50 );
931 e4a6c3b8 Olga Brani
            }
932 e4a6c3b8 Olga Brani
933 e4a6c3b8 Olga Brani
            // detach all dom ready events
934 e4a6c3b8 Olga Brani
            detach();
935 e4a6c3b8 Olga Brani
936 e4a6c3b8 Olga Brani
            // and execute any waiting functions
937 e4a6c3b8 Olga Brani
            jQuery.ready();
938 e4a6c3b8 Olga Brani
          }
939 e4a6c3b8 Olga Brani
        })();
940 e4a6c3b8 Olga Brani
      }
941 e4a6c3b8 Olga Brani
    }
942 e4a6c3b8 Olga Brani
  }
943 e4a6c3b8 Olga Brani
  return readyList.promise( obj );
944 e4a6c3b8 Olga Brani
};
945 e4a6c3b8 Olga Brani
946 e4a6c3b8 Olga Brani
// Populate the class2type map
947 e4a6c3b8 Olga Brani
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
948 e4a6c3b8 Olga Brani
  class2type[ "[object " + name + "]" ] = name.toLowerCase();
949 e4a6c3b8 Olga Brani
});
950 e4a6c3b8 Olga Brani
951 e4a6c3b8 Olga Brani
function isArraylike( obj ) {
952 e4a6c3b8 Olga Brani
  var length = obj.length,
953 e4a6c3b8 Olga Brani
    type = jQuery.type( obj );
954 e4a6c3b8 Olga Brani
955 e4a6c3b8 Olga Brani
  if ( jQuery.isWindow( obj ) ) {
956 e4a6c3b8 Olga Brani
    return false;
957 e4a6c3b8 Olga Brani
  }
958 e4a6c3b8 Olga Brani
959 e4a6c3b8 Olga Brani
  if ( obj.nodeType === 1 && length ) {
960 e4a6c3b8 Olga Brani
    return true;
961 e4a6c3b8 Olga Brani
  }
962 e4a6c3b8 Olga Brani
963 e4a6c3b8 Olga Brani
  return type === "array" || type !== "function" &&
964 e4a6c3b8 Olga Brani
    ( length === 0 ||
965 e4a6c3b8 Olga Brani
    typeof length === "number" && length > 0 && ( length - 1 ) in obj );
966 e4a6c3b8 Olga Brani
}
967 e4a6c3b8 Olga Brani
968 e4a6c3b8 Olga Brani
// All jQuery objects should point back to these
969 e4a6c3b8 Olga Brani
rootjQuery = jQuery(document);
970 e4a6c3b8 Olga Brani
// String to Object options format cache
971 e4a6c3b8 Olga Brani
var optionsCache = {};
972 e4a6c3b8 Olga Brani
973 e4a6c3b8 Olga Brani
// Convert String-formatted options into Object-formatted ones and store in cache
974 e4a6c3b8 Olga Brani
function createOptions( options ) {
975 e4a6c3b8 Olga Brani
  var object = optionsCache[ options ] = {};
976 e4a6c3b8 Olga Brani
  jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
977 e4a6c3b8 Olga Brani
    object[ flag ] = true;
978 e4a6c3b8 Olga Brani
  });
979 e4a6c3b8 Olga Brani
  return object;
980 e4a6c3b8 Olga Brani
}
981 e4a6c3b8 Olga Brani
982 e4a6c3b8 Olga Brani
/*
983 e4a6c3b8 Olga Brani
 * Create a callback list using the following parameters:
984 e4a6c3b8 Olga Brani
 *
985 e4a6c3b8 Olga Brani
 *  options: an optional list of space-separated options that will change how
986 e4a6c3b8 Olga Brani
 *      the callback list behaves or a more traditional option object
987 e4a6c3b8 Olga Brani
 *
988 e4a6c3b8 Olga Brani
 * By default a callback list will act like an event callback list and can be
989 e4a6c3b8 Olga Brani
 * "fired" multiple times.
990 e4a6c3b8 Olga Brani
 *
991 e4a6c3b8 Olga Brani
 * Possible options:
992 e4a6c3b8 Olga Brani
 *
993 e4a6c3b8 Olga Brani
 *  once:     will ensure the callback list can only be fired once (like a Deferred)
994 e4a6c3b8 Olga Brani
 *
995 e4a6c3b8 Olga Brani
 *  memory:     will keep track of previous values and will call any callback added
996 e4a6c3b8 Olga Brani
 *          after the list has been fired right away with the latest "memorized"
997 e4a6c3b8 Olga Brani
 *          values (like a Deferred)
998 e4a6c3b8 Olga Brani
 *
999 e4a6c3b8 Olga Brani
 *  unique:     will ensure a callback can only be added once (no duplicate in the list)
1000 e4a6c3b8 Olga Brani
 *
1001 e4a6c3b8 Olga Brani
 *  stopOnFalse:  interrupt callings when a callback returns false
1002 e4a6c3b8 Olga Brani
 *
1003 e4a6c3b8 Olga Brani
 */
1004 e4a6c3b8 Olga Brani
jQuery.Callbacks = function( options ) {
1005 e4a6c3b8 Olga Brani
1006 e4a6c3b8 Olga Brani
  // Convert options from String-formatted to Object-formatted if needed
1007 e4a6c3b8 Olga Brani
  // (we check in cache first)
1008 e4a6c3b8 Olga Brani
  options = typeof options === "string" ?
1009 e4a6c3b8 Olga Brani
    ( optionsCache[ options ] || createOptions( options ) ) :
1010 e4a6c3b8 Olga Brani
    jQuery.extend( {}, options );
1011 e4a6c3b8 Olga Brani
1012 e4a6c3b8 Olga Brani
  var // Flag to know if list is currently firing
1013 e4a6c3b8 Olga Brani
    firing,
1014 e4a6c3b8 Olga Brani
    // Last fire value (for non-forgettable lists)
1015 e4a6c3b8 Olga Brani
    memory,
1016 e4a6c3b8 Olga Brani
    // Flag to know if list was already fired
1017 e4a6c3b8 Olga Brani
    fired,
1018 e4a6c3b8 Olga Brani
    // End of the loop when firing
1019 e4a6c3b8 Olga Brani
    firingLength,
1020 e4a6c3b8 Olga Brani
    // Index of currently firing callback (modified by remove if needed)
1021 e4a6c3b8 Olga Brani
    firingIndex,
1022 e4a6c3b8 Olga Brani
    // First callback to fire (used internally by add and fireWith)
1023 e4a6c3b8 Olga Brani
    firingStart,
1024 e4a6c3b8 Olga Brani
    // Actual callback list
1025 e4a6c3b8 Olga Brani
    list = [],
1026 e4a6c3b8 Olga Brani
    // Stack of fire calls for repeatable lists
1027 e4a6c3b8 Olga Brani
    stack = !options.once && [],
1028 e4a6c3b8 Olga Brani
    // Fire callbacks
1029 e4a6c3b8 Olga Brani
    fire = function( data ) {
1030 e4a6c3b8 Olga Brani
      memory = options.memory && data;
1031 e4a6c3b8 Olga Brani
      fired = true;
1032 e4a6c3b8 Olga Brani
      firingIndex = firingStart || 0;
1033 e4a6c3b8 Olga Brani
      firingStart = 0;
1034 e4a6c3b8 Olga Brani
      firingLength = list.length;
1035 e4a6c3b8 Olga Brani
      firing = true;
1036 e4a6c3b8 Olga Brani
      for ( ; list && firingIndex < firingLength; firingIndex++ ) {
1037 e4a6c3b8 Olga Brani
        if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
1038 e4a6c3b8 Olga Brani
          memory = false; // To prevent further calls using add
1039 e4a6c3b8 Olga Brani
          break;
1040 e4a6c3b8 Olga Brani
        }
1041 e4a6c3b8 Olga Brani
      }
1042 e4a6c3b8 Olga Brani
      firing = false;
1043 e4a6c3b8 Olga Brani
      if ( list ) {
1044 e4a6c3b8 Olga Brani
        if ( stack ) {
1045 e4a6c3b8 Olga Brani
          if ( stack.length ) {
1046 e4a6c3b8 Olga Brani
            fire( stack.shift() );
1047 e4a6c3b8 Olga Brani
          }
1048 e4a6c3b8 Olga Brani
        } else if ( memory ) {
1049 e4a6c3b8 Olga Brani
          list = [];
1050 e4a6c3b8 Olga Brani
        } else {
1051 e4a6c3b8 Olga Brani
          self.disable();
1052 e4a6c3b8 Olga Brani
        }
1053 e4a6c3b8 Olga Brani
      }
1054 e4a6c3b8 Olga Brani
    },
1055 e4a6c3b8 Olga Brani
    // Actual Callbacks object
1056 e4a6c3b8 Olga Brani
    self = {
1057 e4a6c3b8 Olga Brani
      // Add a callback or a collection of callbacks to the list
1058 e4a6c3b8 Olga Brani
      add: function() {
1059 e4a6c3b8 Olga Brani
        if ( list ) {
1060 e4a6c3b8 Olga Brani
          // First, we save the current length
1061 e4a6c3b8 Olga Brani
          var start = list.length;
1062 e4a6c3b8 Olga Brani
          (function add( args ) {
1063 e4a6c3b8 Olga Brani
            jQuery.each( args, function( _, arg ) {
1064 e4a6c3b8 Olga Brani
              var type = jQuery.type( arg );
1065 e4a6c3b8 Olga Brani
              if ( type === "function" ) {
1066 e4a6c3b8 Olga Brani
                if ( !options.unique || !self.has( arg ) ) {
1067 e4a6c3b8 Olga Brani
                  list.push( arg );
1068 e4a6c3b8 Olga Brani
                }
1069 e4a6c3b8 Olga Brani
              } else if ( arg && arg.length && type !== "string" ) {
1070 e4a6c3b8 Olga Brani
                // Inspect recursively
1071 e4a6c3b8 Olga Brani
                add( arg );
1072 e4a6c3b8 Olga Brani
              }
1073 e4a6c3b8 Olga Brani
            });
1074 e4a6c3b8 Olga Brani
          })( arguments );
1075 e4a6c3b8 Olga Brani
          // Do we need to add the callbacks to the
1076 e4a6c3b8 Olga Brani
          // current firing batch?
1077 e4a6c3b8 Olga Brani
          if ( firing ) {
1078 e4a6c3b8 Olga Brani
            firingLength = list.length;
1079 e4a6c3b8 Olga Brani
          // With memory, if we're not firing then
1080 e4a6c3b8 Olga Brani
          // we should call right away
1081 e4a6c3b8 Olga Brani
          } else if ( memory ) {
1082 e4a6c3b8 Olga Brani
            firingStart = start;
1083 e4a6c3b8 Olga Brani
            fire( memory );
1084 e4a6c3b8 Olga Brani
          }
1085 e4a6c3b8 Olga Brani
        }
1086 e4a6c3b8 Olga Brani
        return this;
1087 e4a6c3b8 Olga Brani
      },
1088 e4a6c3b8 Olga Brani
      // Remove a callback from the list
1089 e4a6c3b8 Olga Brani
      remove: function() {
1090 e4a6c3b8 Olga Brani
        if ( list ) {
1091 e4a6c3b8 Olga Brani
          jQuery.each( arguments, function( _, arg ) {
1092 e4a6c3b8 Olga Brani
            var index;
1093 e4a6c3b8 Olga Brani
            while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
1094 e4a6c3b8 Olga Brani
              list.splice( index, 1 );
1095 e4a6c3b8 Olga Brani
              // Handle firing indexes
1096 e4a6c3b8 Olga Brani
              if ( firing ) {
1097 e4a6c3b8 Olga Brani
                if ( index <= firingLength ) {
1098 e4a6c3b8 Olga Brani
                  firingLength--;
1099 e4a6c3b8 Olga Brani
                }
1100 e4a6c3b8 Olga Brani
                if ( index <= firingIndex ) {
1101 e4a6c3b8 Olga Brani
                  firingIndex--;
1102 e4a6c3b8 Olga Brani
                }
1103 e4a6c3b8 Olga Brani
              }
1104 e4a6c3b8 Olga Brani
            }
1105 e4a6c3b8 Olga Brani
          });
1106 e4a6c3b8 Olga Brani
        }
1107 e4a6c3b8 Olga Brani
        return this;
1108 e4a6c3b8 Olga Brani
      },
1109 e4a6c3b8 Olga Brani
      // Check if a given callback is in the list.
1110 e4a6c3b8 Olga Brani
      // If no argument is given, return whether or not list has callbacks attached.
1111 e4a6c3b8 Olga Brani
      has: function( fn ) {
1112 e4a6c3b8 Olga Brani
        return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
1113 e4a6c3b8 Olga Brani
      },
1114 e4a6c3b8 Olga Brani
      // Remove all callbacks from the list
1115 e4a6c3b8 Olga Brani
      empty: function() {
1116 e4a6c3b8 Olga Brani
        list = [];
1117 e4a6c3b8 Olga Brani
        return this;
1118 e4a6c3b8 Olga Brani
      },
1119 e4a6c3b8 Olga Brani
      // Have the list do nothing anymore
1120 e4a6c3b8 Olga Brani
      disable: function() {
1121 e4a6c3b8 Olga Brani
        list = stack = memory = undefined;
1122 e4a6c3b8 Olga Brani
        return this;
1123 e4a6c3b8 Olga Brani
      },
1124 e4a6c3b8 Olga Brani
      // Is it disabled?
1125 e4a6c3b8 Olga Brani
      disabled: function() {
1126 e4a6c3b8 Olga Brani
        return !list;
1127 e4a6c3b8 Olga Brani
      },
1128 e4a6c3b8 Olga Brani
      // Lock the list in its current state
1129 e4a6c3b8 Olga Brani
      lock: function() {
1130 e4a6c3b8 Olga Brani
        stack = undefined;
1131 e4a6c3b8 Olga Brani
        if ( !memory ) {
1132 e4a6c3b8 Olga Brani
          self.disable();
1133 e4a6c3b8 Olga Brani
        }
1134 e4a6c3b8 Olga Brani
        return this;
1135 e4a6c3b8 Olga Brani
      },
1136 e4a6c3b8 Olga Brani
      // Is it locked?
1137 e4a6c3b8 Olga Brani
      locked: function() {
1138 e4a6c3b8 Olga Brani
        return !stack;
1139 e4a6c3b8 Olga Brani
      },
1140 e4a6c3b8 Olga Brani
      // Call all callbacks with the given context and arguments
1141 e4a6c3b8 Olga Brani
      fireWith: function( context, args ) {
1142 e4a6c3b8 Olga Brani
        args = args || [];
1143 e4a6c3b8 Olga Brani
        args = [ context, args.slice ? args.slice() : args ];
1144 e4a6c3b8 Olga Brani
        if ( list && ( !fired || stack ) ) {
1145 e4a6c3b8 Olga Brani
          if ( firing ) {
1146 e4a6c3b8 Olga Brani
            stack.push( args );
1147 e4a6c3b8 Olga Brani
          } else {
1148 e4a6c3b8 Olga Brani
            fire( args );
1149 e4a6c3b8 Olga Brani
          }
1150 e4a6c3b8 Olga Brani
        }
1151 e4a6c3b8 Olga Brani
        return this;
1152 e4a6c3b8 Olga Brani
      },
1153 e4a6c3b8 Olga Brani
      // Call all the callbacks with the given arguments
1154 e4a6c3b8 Olga Brani
      fire: function() {
1155 e4a6c3b8 Olga Brani
        self.fireWith( this, arguments );
1156 e4a6c3b8 Olga Brani
        return this;
1157 e4a6c3b8 Olga Brani
      },
1158 e4a6c3b8 Olga Brani
      // To know if the callbacks have already been called at least once
1159 e4a6c3b8 Olga Brani
      fired: function() {
1160 e4a6c3b8 Olga Brani
        return !!fired;
1161 e4a6c3b8 Olga Brani
      }
1162 e4a6c3b8 Olga Brani
    };
1163 e4a6c3b8 Olga Brani
1164 e4a6c3b8 Olga Brani
  return self;
1165 e4a6c3b8 Olga Brani
};
1166 e4a6c3b8 Olga Brani
jQuery.extend({
1167 e4a6c3b8 Olga Brani
1168 e4a6c3b8 Olga Brani
  Deferred: function( func ) {
1169 e4a6c3b8 Olga Brani
    var tuples = [
1170 e4a6c3b8 Olga Brani
        // action, add listener, listener list, final state
1171 e4a6c3b8 Olga Brani
        [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
1172 e4a6c3b8 Olga Brani
        [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
1173 e4a6c3b8 Olga Brani
        [ "notify", "progress", jQuery.Callbacks("memory") ]
1174 e4a6c3b8 Olga Brani
      ],
1175 e4a6c3b8 Olga Brani
      state = "pending",
1176 e4a6c3b8 Olga Brani
      promise = {
1177 e4a6c3b8 Olga Brani
        state: function() {
1178 e4a6c3b8 Olga Brani
          return state;
1179 e4a6c3b8 Olga Brani
        },
1180 e4a6c3b8 Olga Brani
        always: function() {
1181 e4a6c3b8 Olga Brani
          deferred.done( arguments ).fail( arguments );
1182 e4a6c3b8 Olga Brani
          return this;
1183 e4a6c3b8 Olga Brani
        },
1184 e4a6c3b8 Olga Brani
        then: function( /* fnDone, fnFail, fnProgress */ ) {
1185 e4a6c3b8 Olga Brani
          var fns = arguments;
1186 e4a6c3b8 Olga Brani
          return jQuery.Deferred(function( newDefer ) {
1187 e4a6c3b8 Olga Brani
            jQuery.each( tuples, function( i, tuple ) {
1188 e4a6c3b8 Olga Brani
              var action = tuple[ 0 ],
1189 e4a6c3b8 Olga Brani
                fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
1190 e4a6c3b8 Olga Brani
              // deferred[ done | fail | progress ] for forwarding actions to newDefer
1191 e4a6c3b8 Olga Brani
              deferred[ tuple[1] ](function() {
1192 e4a6c3b8 Olga Brani
                var returned = fn && fn.apply( this, arguments );
1193 e4a6c3b8 Olga Brani
                if ( returned && jQuery.isFunction( returned.promise ) ) {
1194 e4a6c3b8 Olga Brani
                  returned.promise()
1195 e4a6c3b8 Olga Brani
                    .done( newDefer.resolve )
1196 e4a6c3b8 Olga Brani
                    .fail( newDefer.reject )
1197 e4a6c3b8 Olga Brani
                    .progress( newDefer.notify );
1198 e4a6c3b8 Olga Brani
                } else {
1199 e4a6c3b8 Olga Brani
                  newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
1200 e4a6c3b8 Olga Brani
                }
1201 e4a6c3b8 Olga Brani
              });
1202 e4a6c3b8 Olga Brani
            });
1203 e4a6c3b8 Olga Brani
            fns = null;
1204 e4a6c3b8 Olga Brani
          }).promise();
1205 e4a6c3b8 Olga Brani
        },
1206 e4a6c3b8 Olga Brani
        // Get a promise for this deferred
1207 e4a6c3b8 Olga Brani
        // If obj is provided, the promise aspect is added to the object
1208 e4a6c3b8 Olga Brani
        promise: function( obj ) {
1209 e4a6c3b8 Olga Brani
          return obj != null ? jQuery.extend( obj, promise ) : promise;
1210 e4a6c3b8 Olga Brani
        }
1211 e4a6c3b8 Olga Brani
      },
1212 e4a6c3b8 Olga Brani
      deferred = {};
1213 e4a6c3b8 Olga Brani
1214 e4a6c3b8 Olga Brani
    // Keep pipe for back-compat
1215 e4a6c3b8 Olga Brani
    promise.pipe = promise.then;
1216 e4a6c3b8 Olga Brani
1217 e4a6c3b8 Olga Brani
    // Add list-specific methods
1218 e4a6c3b8 Olga Brani
    jQuery.each( tuples, function( i, tuple ) {
1219 e4a6c3b8 Olga Brani
      var list = tuple[ 2 ],
1220 e4a6c3b8 Olga Brani
        stateString = tuple[ 3 ];
1221 e4a6c3b8 Olga Brani
1222 e4a6c3b8 Olga Brani
      // promise[ done | fail | progress ] = list.add
1223 e4a6c3b8 Olga Brani
      promise[ tuple[1] ] = list.add;
1224 e4a6c3b8 Olga Brani
1225 e4a6c3b8 Olga Brani
      // Handle state
1226 e4a6c3b8 Olga Brani
      if ( stateString ) {
1227 e4a6c3b8 Olga Brani
        list.add(function() {
1228 e4a6c3b8 Olga Brani
          // state = [ resolved | rejected ]
1229 e4a6c3b8 Olga Brani
          state = stateString;
1230 e4a6c3b8 Olga Brani
1231 e4a6c3b8 Olga Brani
        // [ reject_list | resolve_list ].disable; progress_list.lock
1232 e4a6c3b8 Olga Brani
        }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
1233 e4a6c3b8 Olga Brani
      }
1234 e4a6c3b8 Olga Brani
1235 e4a6c3b8 Olga Brani
      // deferred[ resolve | reject | notify ]
1236 e4a6c3b8 Olga Brani
      deferred[ tuple[0] ] = function() {
1237 e4a6c3b8 Olga Brani
        deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
1238 e4a6c3b8 Olga Brani
        return this;
1239 e4a6c3b8 Olga Brani
      };
1240 e4a6c3b8 Olga Brani
      deferred[ tuple[0] + "With" ] = list.fireWith;
1241 e4a6c3b8 Olga Brani
    });
1242 e4a6c3b8 Olga Brani
1243 e4a6c3b8 Olga Brani
    // Make the deferred a promise
1244 e4a6c3b8 Olga Brani
    promise.promise( deferred );
1245 e4a6c3b8 Olga Brani
1246 e4a6c3b8 Olga Brani
    // Call given func if any
1247 e4a6c3b8 Olga Brani
    if ( func ) {
1248 e4a6c3b8 Olga Brani
      func.call( deferred, deferred );
1249 e4a6c3b8 Olga Brani
    }
1250 e4a6c3b8 Olga Brani
1251 e4a6c3b8 Olga Brani
    // All done!
1252 e4a6c3b8 Olga Brani
    return deferred;
1253 e4a6c3b8 Olga Brani
  },
1254 e4a6c3b8 Olga Brani
1255 e4a6c3b8 Olga Brani
  // Deferred helper
1256 e4a6c3b8 Olga Brani
  when: function( subordinate /* , ..., subordinateN */ ) {
1257 e4a6c3b8 Olga Brani
    var i = 0,
1258 e4a6c3b8 Olga Brani
      resolveValues = core_slice.call( arguments ),
1259 e4a6c3b8 Olga Brani
      length = resolveValues.length,
1260 e4a6c3b8 Olga Brani
1261 e4a6c3b8 Olga Brani
      // the count of uncompleted subordinates
1262 e4a6c3b8 Olga Brani
      remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
1263 e4a6c3b8 Olga Brani
1264 e4a6c3b8 Olga Brani
      // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
1265 e4a6c3b8 Olga Brani
      deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
1266 e4a6c3b8 Olga Brani
1267 e4a6c3b8 Olga Brani
      // Update function for both resolve and progress values
1268 e4a6c3b8 Olga Brani
      updateFunc = function( i, contexts, values ) {
1269 e4a6c3b8 Olga Brani
        return function( value ) {
1270 e4a6c3b8 Olga Brani
          contexts[ i ] = this;
1271 e4a6c3b8 Olga Brani
          values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
1272 e4a6c3b8 Olga Brani
          if( values === progressValues ) {
1273 e4a6c3b8 Olga Brani
            deferred.notifyWith( contexts, values );
1274 e4a6c3b8 Olga Brani
          } else if ( !( --remaining ) ) {
1275 e4a6c3b8 Olga Brani
            deferred.resolveWith( contexts, values );
1276 e4a6c3b8 Olga Brani
          }
1277 e4a6c3b8 Olga Brani
        };
1278 e4a6c3b8 Olga Brani
      },
1279 e4a6c3b8 Olga Brani
1280 e4a6c3b8 Olga Brani
      progressValues, progressContexts, resolveContexts;
1281 e4a6c3b8 Olga Brani
1282 e4a6c3b8 Olga Brani
    // add listeners to Deferred subordinates; treat others as resolved
1283 e4a6c3b8 Olga Brani
    if ( length > 1 ) {
1284 e4a6c3b8 Olga Brani
      progressValues = new Array( length );
1285 e4a6c3b8 Olga Brani
      progressContexts = new Array( length );
1286 e4a6c3b8 Olga Brani
      resolveContexts = new Array( length );
1287 e4a6c3b8 Olga Brani
      for ( ; i < length; i++ ) {
1288 e4a6c3b8 Olga Brani
        if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
1289 e4a6c3b8 Olga Brani
          resolveValues[ i ].promise()
1290 e4a6c3b8 Olga Brani
            .done( updateFunc( i, resolveContexts, resolveValues ) )
1291 e4a6c3b8 Olga Brani
            .fail( deferred.reject )
1292 e4a6c3b8 Olga Brani
            .progress( updateFunc( i, progressContexts, progressValues ) );
1293 e4a6c3b8 Olga Brani
        } else {
1294 e4a6c3b8 Olga Brani
          --remaining;
1295 e4a6c3b8 Olga Brani
        }
1296 e4a6c3b8 Olga Brani
      }
1297 e4a6c3b8 Olga Brani
    }
1298 e4a6c3b8 Olga Brani
1299 e4a6c3b8 Olga Brani
    // if we're not waiting on anything, resolve the master
1300 e4a6c3b8 Olga Brani
    if ( !remaining ) {
1301 e4a6c3b8 Olga Brani
      deferred.resolveWith( resolveContexts, resolveValues );
1302 e4a6c3b8 Olga Brani
    }
1303 e4a6c3b8 Olga Brani
1304 e4a6c3b8 Olga Brani
    return deferred.promise();
1305 e4a6c3b8 Olga Brani
  }
1306 e4a6c3b8 Olga Brani
});
1307 e4a6c3b8 Olga Brani
jQuery.support = (function() {
1308 e4a6c3b8 Olga Brani
1309 e4a6c3b8 Olga Brani
  var support, all, a,
1310 e4a6c3b8 Olga Brani
    input, select, fragment,
1311 e4a6c3b8 Olga Brani
    opt, eventName, isSupported, i,
1312 e4a6c3b8 Olga Brani
    div = document.createElement("div");
1313 e4a6c3b8 Olga Brani
1314 e4a6c3b8 Olga Brani
  // Setup
1315 e4a6c3b8 Olga Brani
  div.setAttribute( "className", "t" );
1316 e4a6c3b8 Olga Brani
  div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
1317 e4a6c3b8 Olga Brani
1318 e4a6c3b8 Olga Brani
  // Support tests won't run in some limited or non-browser environments
1319 e4a6c3b8 Olga Brani
  all = div.getElementsByTagName("*");
1320 e4a6c3b8 Olga Brani
  a = div.getElementsByTagName("a")[ 0 ];
1321 e4a6c3b8 Olga Brani
  if ( !all || !a || !all.length ) {
1322 e4a6c3b8 Olga Brani
    return {};
1323 e4a6c3b8 Olga Brani
  }
1324 e4a6c3b8 Olga Brani
1325 e4a6c3b8 Olga Brani
  // First batch of tests
1326 e4a6c3b8 Olga Brani
  select = document.createElement("select");
1327 e4a6c3b8 Olga Brani
  opt = select.appendChild( document.createElement("option") );
1328 e4a6c3b8 Olga Brani
  input = div.getElementsByTagName("input")[ 0 ];
1329 e4a6c3b8 Olga Brani
1330 e4a6c3b8 Olga Brani
  a.style.cssText = "top:1px;float:left;opacity:.5";
1331 e4a6c3b8 Olga Brani
  support = {
1332 e4a6c3b8 Olga Brani
    // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1333 e4a6c3b8 Olga Brani
    getSetAttribute: div.className !== "t",
1334 e4a6c3b8 Olga Brani
1335 e4a6c3b8 Olga Brani
    // IE strips leading whitespace when .innerHTML is used
1336 e4a6c3b8 Olga Brani
    leadingWhitespace: div.firstChild.nodeType === 3,
1337 e4a6c3b8 Olga Brani
1338 e4a6c3b8 Olga Brani
    // Make sure that tbody elements aren't automatically inserted
1339 e4a6c3b8 Olga Brani
    // IE will insert them into empty tables
1340 e4a6c3b8 Olga Brani
    tbody: !div.getElementsByTagName("tbody").length,
1341 e4a6c3b8 Olga Brani
1342 e4a6c3b8 Olga Brani
    // Make sure that link elements get serialized correctly by innerHTML
1343 e4a6c3b8 Olga Brani
    // This requires a wrapper element in IE
1344 e4a6c3b8 Olga Brani
    htmlSerialize: !!div.getElementsByTagName("link").length,
1345 e4a6c3b8 Olga Brani
1346 e4a6c3b8 Olga Brani
    // Get the style information from getAttribute
1347 e4a6c3b8 Olga Brani
    // (IE uses .cssText instead)
1348 e4a6c3b8 Olga Brani
    style: /top/.test( a.getAttribute("style") ),
1349 e4a6c3b8 Olga Brani
1350 e4a6c3b8 Olga Brani
    // Make sure that URLs aren't manipulated
1351 e4a6c3b8 Olga Brani
    // (IE normalizes it by default)
1352 e4a6c3b8 Olga Brani
    hrefNormalized: a.getAttribute("href") === "/a",
1353 e4a6c3b8 Olga Brani
1354 e4a6c3b8 Olga Brani
    // Make sure that element opacity exists
1355 e4a6c3b8 Olga Brani
    // (IE uses filter instead)
1356 e4a6c3b8 Olga Brani
    // Use a regex to work around a WebKit issue. See #5145
1357 e4a6c3b8 Olga Brani
    opacity: /^0.5/.test( a.style.opacity ),
1358 e4a6c3b8 Olga Brani
1359 e4a6c3b8 Olga Brani
    // Verify style float existence
1360 e4a6c3b8 Olga Brani
    // (IE uses styleFloat instead of cssFloat)
1361 e4a6c3b8 Olga Brani
    cssFloat: !!a.style.cssFloat,
1362 e4a6c3b8 Olga Brani
1363 e4a6c3b8 Olga Brani
    // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
1364 e4a6c3b8 Olga Brani
    checkOn: !!input.value,
1365 e4a6c3b8 Olga Brani
1366 e4a6c3b8 Olga Brani
    // Make sure that a selected-by-default option has a working selected property.
1367 e4a6c3b8 Olga Brani
    // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1368 e4a6c3b8 Olga Brani
    optSelected: opt.selected,
1369 e4a6c3b8 Olga Brani
1370 e4a6c3b8 Olga Brani
    // Tests for enctype support on a form (#6743)
1371 e4a6c3b8 Olga Brani
    enctype: !!document.createElement("form").enctype,
1372 e4a6c3b8 Olga Brani
1373 e4a6c3b8 Olga Brani
    // Makes sure cloning an html5 element does not cause problems
1374 e4a6c3b8 Olga Brani
    // Where outerHTML is undefined, this still works
1375 e4a6c3b8 Olga Brani
    html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
1376 e4a6c3b8 Olga Brani
1377 e4a6c3b8 Olga Brani
    // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
1378 e4a6c3b8 Olga Brani
    boxModel: document.compatMode === "CSS1Compat",
1379 e4a6c3b8 Olga Brani
1380 e4a6c3b8 Olga Brani
    // Will be defined later
1381 e4a6c3b8 Olga Brani
    deleteExpando: true,
1382 e4a6c3b8 Olga Brani
    noCloneEvent: true,
1383 e4a6c3b8 Olga Brani
    inlineBlockNeedsLayout: false,
1384 e4a6c3b8 Olga Brani
    shrinkWrapBlocks: false,
1385 e4a6c3b8 Olga Brani
    reliableMarginRight: true,
1386 e4a6c3b8 Olga Brani
    boxSizingReliable: true,
1387 e4a6c3b8 Olga Brani
    pixelPosition: false
1388 e4a6c3b8 Olga Brani
  };
1389 e4a6c3b8 Olga Brani
1390 e4a6c3b8 Olga Brani
  // Make sure checked status is properly cloned
1391 e4a6c3b8 Olga Brani
  input.checked = true;
1392 e4a6c3b8 Olga Brani
  support.noCloneChecked = input.cloneNode( true ).checked;
1393 e4a6c3b8 Olga Brani
1394 e4a6c3b8 Olga Brani
  // Make sure that the options inside disabled selects aren't marked as disabled
1395 e4a6c3b8 Olga Brani
  // (WebKit marks them as disabled)
1396 e4a6c3b8 Olga Brani
  select.disabled = true;
1397 e4a6c3b8 Olga Brani
  support.optDisabled = !opt.disabled;
1398 e4a6c3b8 Olga Brani
1399 e4a6c3b8 Olga Brani
  // Support: IE<9
1400 e4a6c3b8 Olga Brani
  try {
1401 e4a6c3b8 Olga Brani
    delete div.test;
1402 e4a6c3b8 Olga Brani
  } catch( e ) {
1403 e4a6c3b8 Olga Brani
    support.deleteExpando = false;
1404 e4a6c3b8 Olga Brani
  }
1405 e4a6c3b8 Olga Brani
1406 e4a6c3b8 Olga Brani
  // Check if we can trust getAttribute("value")
1407 e4a6c3b8 Olga Brani
  input = document.createElement("input");
1408 e4a6c3b8 Olga Brani
  input.setAttribute( "value", "" );
1409 e4a6c3b8 Olga Brani
  support.input = input.getAttribute( "value" ) === "";
1410 e4a6c3b8 Olga Brani
1411 e4a6c3b8 Olga Brani
  // Check if an input maintains its value after becoming a radio
1412 e4a6c3b8 Olga Brani
  input.value = "t";
1413 e4a6c3b8 Olga Brani
  input.setAttribute( "type", "radio" );
1414 e4a6c3b8 Olga Brani
  support.radioValue = input.value === "t";
1415 e4a6c3b8 Olga Brani
1416 e4a6c3b8 Olga Brani
  // #11217 - WebKit loses check when the name is after the checked attribute
1417 e4a6c3b8 Olga Brani
  input.setAttribute( "checked", "t" );
1418 e4a6c3b8 Olga Brani
  input.setAttribute( "name", "t" );
1419 e4a6c3b8 Olga Brani
1420 e4a6c3b8 Olga Brani
  fragment = document.createDocumentFragment();
1421 e4a6c3b8 Olga Brani
  fragment.appendChild( input );
1422 e4a6c3b8 Olga Brani
1423 e4a6c3b8 Olga Brani
  // Check if a disconnected checkbox will retain its checked
1424 e4a6c3b8 Olga Brani
  // value of true after appended to the DOM (IE6/7)
1425 e4a6c3b8 Olga Brani
  support.appendChecked = input.checked;
1426 e4a6c3b8 Olga Brani
1427 e4a6c3b8 Olga Brani
  // WebKit doesn't clone checked state correctly in fragments
1428 e4a6c3b8 Olga Brani
  support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1429 e4a6c3b8 Olga Brani
1430 e4a6c3b8 Olga Brani
  // Support: IE<9
1431 e4a6c3b8 Olga Brani
  // Opera does not clone events (and typeof div.attachEvent === undefined).
1432 e4a6c3b8 Olga Brani
  // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
1433 e4a6c3b8 Olga Brani
  if ( div.attachEvent ) {
1434 e4a6c3b8 Olga Brani
    div.attachEvent( "onclick", function() {
1435 e4a6c3b8 Olga Brani
      support.noCloneEvent = false;
1436 e4a6c3b8 Olga Brani
    });
1437 e4a6c3b8 Olga Brani
1438 e4a6c3b8 Olga Brani
    div.cloneNode( true ).click();
1439 e4a6c3b8 Olga Brani
  }
1440 e4a6c3b8 Olga Brani
1441 e4a6c3b8 Olga Brani
  // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
1442 e4a6c3b8 Olga Brani
  // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
1443 e4a6c3b8 Olga Brani
  for ( i in { submit: true, change: true, focusin: true }) {
1444 e4a6c3b8 Olga Brani
    div.setAttribute( eventName = "on" + i, "t" );
1445 e4a6c3b8 Olga Brani
1446 e4a6c3b8 Olga Brani
    support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
1447 e4a6c3b8 Olga Brani
  }
1448 e4a6c3b8 Olga Brani
1449 e4a6c3b8 Olga Brani
  div.style.backgroundClip = "content-box";
1450 e4a6c3b8 Olga Brani
  div.cloneNode( true ).style.backgroundClip = "";
1451 e4a6c3b8 Olga Brani
  support.clearCloneStyle = div.style.backgroundClip === "content-box";
1452 e4a6c3b8 Olga Brani
1453 e4a6c3b8 Olga Brani
  // Run tests that need a body at doc ready
1454 e4a6c3b8 Olga Brani
  jQuery(function() {
1455 e4a6c3b8 Olga Brani
    var container, marginDiv, tds,
1456 e4a6c3b8 Olga Brani
      divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
1457 e4a6c3b8 Olga Brani
      body = document.getElementsByTagName("body")[0];
1458 e4a6c3b8 Olga Brani
1459 e4a6c3b8 Olga Brani
    if ( !body ) {
1460 e4a6c3b8 Olga Brani
      // Return for frameset docs that don't have a body
1461 e4a6c3b8 Olga Brani
      return;
1462 e4a6c3b8 Olga Brani
    }
1463 e4a6c3b8 Olga Brani
1464 e4a6c3b8 Olga Brani
    container = document.createElement("div");
1465 e4a6c3b8 Olga Brani
    container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
1466 e4a6c3b8 Olga Brani
1467 e4a6c3b8 Olga Brani
    body.appendChild( container ).appendChild( div );
1468 e4a6c3b8 Olga Brani
1469 e4a6c3b8 Olga Brani
    // Support: IE8
1470 e4a6c3b8 Olga Brani
    // Check if table cells still have offsetWidth/Height when they are set
1471 e4a6c3b8 Olga Brani
    // to display:none and there are still other visible table cells in a
1472 e4a6c3b8 Olga Brani
    // table row; if so, offsetWidth/Height are not reliable for use when
1473 e4a6c3b8 Olga Brani
    // determining if an element has been hidden directly using
1474 e4a6c3b8 Olga Brani
    // display:none (it is still safe to use offsets if a parent element is
1475 e4a6c3b8 Olga Brani
    // hidden; don safety goggles and see bug #4512 for more information).
1476 e4a6c3b8 Olga Brani
    div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
1477 e4a6c3b8 Olga Brani
    tds = div.getElementsByTagName("td");
1478 e4a6c3b8 Olga Brani
    tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
1479 e4a6c3b8 Olga Brani
    isSupported = ( tds[ 0 ].offsetHeight === 0 );
1480 e4a6c3b8 Olga Brani
1481 e4a6c3b8 Olga Brani
    tds[ 0 ].style.display = "";
1482 e4a6c3b8 Olga Brani
    tds[ 1 ].style.display = "none";
1483 e4a6c3b8 Olga Brani
1484 e4a6c3b8 Olga Brani
    // Support: IE8
1485 e4a6c3b8 Olga Brani
    // Check if empty table cells still have offsetWidth/Height
1486 e4a6c3b8 Olga Brani
    support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1487 e4a6c3b8 Olga Brani
1488 e4a6c3b8 Olga Brani
    // Check box-sizing and margin behavior
1489 e4a6c3b8 Olga Brani
    div.innerHTML = "";
1490 e4a6c3b8 Olga Brani
    div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
1491 e4a6c3b8 Olga Brani
    support.boxSizing = ( div.offsetWidth === 4 );
1492 e4a6c3b8 Olga Brani
    support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
1493 e4a6c3b8 Olga Brani
1494 e4a6c3b8 Olga Brani
    // Use window.getComputedStyle because jsdom on node.js will break without it.
1495 e4a6c3b8 Olga Brani
    if ( window.getComputedStyle ) {
1496 e4a6c3b8 Olga Brani
      support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
1497 e4a6c3b8 Olga Brani
      support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
1498 e4a6c3b8 Olga Brani
1499 e4a6c3b8 Olga Brani
      // Check if div with explicit width and no margin-right incorrectly
1500 e4a6c3b8 Olga Brani
      // gets computed margin-right based on width of container. (#3333)
1501 e4a6c3b8 Olga Brani
      // Fails in WebKit before Feb 2011 nightlies
1502 e4a6c3b8 Olga Brani
      // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1503 e4a6c3b8 Olga Brani
      marginDiv = div.appendChild( document.createElement("div") );
1504 e4a6c3b8 Olga Brani
      marginDiv.style.cssText = div.style.cssText = divReset;
1505 e4a6c3b8 Olga Brani
      marginDiv.style.marginRight = marginDiv.style.width = "0";
1506 e4a6c3b8 Olga Brani
      div.style.width = "1px";
1507 e4a6c3b8 Olga Brani
1508 e4a6c3b8 Olga Brani
      support.reliableMarginRight =
1509 e4a6c3b8 Olga Brani
        !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
1510 e4a6c3b8 Olga Brani
    }
1511 e4a6c3b8 Olga Brani
1512 e4a6c3b8 Olga Brani
    if ( typeof div.style.zoom !== core_strundefined ) {
1513 e4a6c3b8 Olga Brani
      // Support: IE<8
1514 e4a6c3b8 Olga Brani
      // Check if natively block-level elements act like inline-block
1515 e4a6c3b8 Olga Brani
      // elements when setting their display to 'inline' and giving
1516 e4a6c3b8 Olga Brani
      // them layout
1517 e4a6c3b8 Olga Brani
      div.innerHTML = "";
1518 e4a6c3b8 Olga Brani
      div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
1519 e4a6c3b8 Olga Brani
      support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
1520 e4a6c3b8 Olga Brani
1521 e4a6c3b8 Olga Brani
      // Support: IE6
1522 e4a6c3b8 Olga Brani
      // Check if elements with layout shrink-wrap their children
1523 e4a6c3b8 Olga Brani
      div.style.display = "block";
1524 e4a6c3b8 Olga Brani
      div.innerHTML = "<div></div>";
1525 e4a6c3b8 Olga Brani
      div.firstChild.style.width = "5px";
1526 e4a6c3b8 Olga Brani
      support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
1527 e4a6c3b8 Olga Brani
1528 e4a6c3b8 Olga Brani
      if ( support.inlineBlockNeedsLayout ) {
1529 e4a6c3b8 Olga Brani
        // Prevent IE 6 from affecting layout for positioned elements #11048
1530 e4a6c3b8 Olga Brani
        // Prevent IE from shrinking the body in IE 7 mode #12869
1531 e4a6c3b8 Olga Brani
        // Support: IE<8
1532 e4a6c3b8 Olga Brani
        body.style.zoom = 1;
1533 e4a6c3b8 Olga Brani
      }
1534 e4a6c3b8 Olga Brani
    }
1535 e4a6c3b8 Olga Brani
1536 e4a6c3b8 Olga Brani
    body.removeChild( container );
1537 e4a6c3b8 Olga Brani
1538 e4a6c3b8 Olga Brani
    // Null elements to avoid leaks in IE
1539 e4a6c3b8 Olga Brani
    container = div = tds = marginDiv = null;
1540 e4a6c3b8 Olga Brani
  });
1541 e4a6c3b8 Olga Brani
1542 e4a6c3b8 Olga Brani
  // Null elements to avoid leaks in IE
1543 e4a6c3b8 Olga Brani
  all = select = fragment = opt = a = input = null;
1544 e4a6c3b8 Olga Brani
1545 e4a6c3b8 Olga Brani
  return support;
1546 e4a6c3b8 Olga Brani
})();
1547 e4a6c3b8 Olga Brani
1548 e4a6c3b8 Olga Brani
var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
1549 e4a6c3b8 Olga Brani
  rmultiDash = /([A-Z])/g;
1550 e4a6c3b8 Olga Brani
1551 e4a6c3b8 Olga Brani
function internalData( elem, name, data, pvt /* Internal Use Only */ ){
1552 e4a6c3b8 Olga Brani
  if ( !jQuery.acceptData( elem ) ) {
1553 e4a6c3b8 Olga Brani
    return;
1554 e4a6c3b8 Olga Brani
  }
1555 e4a6c3b8 Olga Brani
1556 e4a6c3b8 Olga Brani
  var thisCache, ret,
1557 e4a6c3b8 Olga Brani
    internalKey = jQuery.expando,
1558 e4a6c3b8 Olga Brani
    getByName = typeof name === "string",
1559 e4a6c3b8 Olga Brani
1560 e4a6c3b8 Olga Brani
    // We have to handle DOM nodes and JS objects differently because IE6-7
1561 e4a6c3b8 Olga Brani
    // can't GC object references properly across the DOM-JS boundary
1562 e4a6c3b8 Olga Brani
    isNode = elem.nodeType,
1563 e4a6c3b8 Olga Brani
1564 e4a6c3b8 Olga Brani
    // Only DOM nodes need the global jQuery cache; JS object data is
1565 e4a6c3b8 Olga Brani
    // attached directly to the object so GC can occur automatically
1566 e4a6c3b8 Olga Brani
    cache = isNode ? jQuery.cache : elem,
1567 e4a6c3b8 Olga Brani
1568 e4a6c3b8 Olga Brani
    // Only defining an ID for JS objects if its cache already exists allows
1569 e4a6c3b8 Olga Brani
    // the code to shortcut on the same path as a DOM node with no cache
1570 e4a6c3b8 Olga Brani
    id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
1571 e4a6c3b8 Olga Brani
1572 e4a6c3b8 Olga Brani
  // Avoid doing any more work than we need to when trying to get data on an
1573 e4a6c3b8 Olga Brani
  // object that has no data at all
1574 e4a6c3b8 Olga Brani
  if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
1575 e4a6c3b8 Olga Brani
    return;
1576 e4a6c3b8 Olga Brani
  }
1577 e4a6c3b8 Olga Brani
1578 e4a6c3b8 Olga Brani
  if ( !id ) {
1579 e4a6c3b8 Olga Brani
    // Only DOM nodes need a new unique ID for each element since their data
1580 e4a6c3b8 Olga Brani
    // ends up in the global cache
1581 e4a6c3b8 Olga Brani
    if ( isNode ) {
1582 e4a6c3b8 Olga Brani
      elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
1583 e4a6c3b8 Olga Brani
    } else {
1584 e4a6c3b8 Olga Brani
      id = internalKey;
1585 e4a6c3b8 Olga Brani
    }
1586 e4a6c3b8 Olga Brani
  }
1587 e4a6c3b8 Olga Brani
1588 e4a6c3b8 Olga Brani
  if ( !cache[ id ] ) {
1589 e4a6c3b8 Olga Brani
    cache[ id ] = {};
1590 e4a6c3b8 Olga Brani
1591 e4a6c3b8 Olga Brani
    // Avoids exposing jQuery metadata on plain JS objects when the object
1592 e4a6c3b8 Olga Brani
    // is serialized using JSON.stringify
1593 e4a6c3b8 Olga Brani
    if ( !isNode ) {
1594 e4a6c3b8 Olga Brani
      cache[ id ].toJSON = jQuery.noop;
1595 e4a6c3b8 Olga Brani
    }
1596 e4a6c3b8 Olga Brani
  }
1597 e4a6c3b8 Olga Brani
1598 e4a6c3b8 Olga Brani
  // An object can be passed to jQuery.data instead of a key/value pair; this gets
1599 e4a6c3b8 Olga Brani
  // shallow copied over onto the existing cache
1600 e4a6c3b8 Olga Brani
  if ( typeof name === "object" || typeof name === "function" ) {
1601 e4a6c3b8 Olga Brani
    if ( pvt ) {
1602 e4a6c3b8 Olga Brani
      cache[ id ] = jQuery.extend( cache[ id ], name );
1603 e4a6c3b8 Olga Brani
    } else {
1604 e4a6c3b8 Olga Brani
      cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1605 e4a6c3b8 Olga Brani
    }
1606 e4a6c3b8 Olga Brani
  }
1607 e4a6c3b8 Olga Brani
1608 e4a6c3b8 Olga Brani
  thisCache = cache[ id ];
1609 e4a6c3b8 Olga Brani
1610 e4a6c3b8 Olga Brani
  // jQuery data() is stored in a separate object inside the object's internal data
1611 e4a6c3b8 Olga Brani
  // cache in order to avoid key collisions between internal data and user-defined
1612 e4a6c3b8 Olga Brani
  // data.
1613 e4a6c3b8 Olga Brani
  if ( !pvt ) {
1614 e4a6c3b8 Olga Brani
    if ( !thisCache.data ) {
1615 e4a6c3b8 Olga Brani
      thisCache.data = {};
1616 e4a6c3b8 Olga Brani
    }
1617 e4a6c3b8 Olga Brani
1618 e4a6c3b8 Olga Brani
    thisCache = thisCache.data;
1619 e4a6c3b8 Olga Brani
  }
1620 e4a6c3b8 Olga Brani
1621 e4a6c3b8 Olga Brani
  if ( data !== undefined ) {
1622 e4a6c3b8 Olga Brani
    thisCache[ jQuery.camelCase( name ) ] = data;
1623 e4a6c3b8 Olga Brani
  }
1624 e4a6c3b8 Olga Brani
1625 e4a6c3b8 Olga Brani
  // Check for both converted-to-camel and non-converted data property names
1626 e4a6c3b8 Olga Brani
  // If a data property was specified
1627 e4a6c3b8 Olga Brani
  if ( getByName ) {
1628 e4a6c3b8 Olga Brani
1629 e4a6c3b8 Olga Brani
    // First Try to find as-is property data
1630 e4a6c3b8 Olga Brani
    ret = thisCache[ name ];
1631 e4a6c3b8 Olga Brani
1632 e4a6c3b8 Olga Brani
    // Test for null|undefined property data
1633 e4a6c3b8 Olga Brani
    if ( ret == null ) {
1634 e4a6c3b8 Olga Brani
1635 e4a6c3b8 Olga Brani
      // Try to find the camelCased property
1636 e4a6c3b8 Olga Brani
      ret = thisCache[ jQuery.camelCase( name ) ];
1637 e4a6c3b8 Olga Brani
    }
1638 e4a6c3b8 Olga Brani
  } else {
1639 e4a6c3b8 Olga Brani
    ret = thisCache;
1640 e4a6c3b8 Olga Brani
  }
1641 e4a6c3b8 Olga Brani
1642 e4a6c3b8 Olga Brani
  return ret;
1643 e4a6c3b8 Olga Brani
}
1644 e4a6c3b8 Olga Brani
1645 e4a6c3b8 Olga Brani
function internalRemoveData( elem, name, pvt ) {
1646 e4a6c3b8 Olga Brani
  if ( !jQuery.acceptData( elem ) ) {
1647 e4a6c3b8 Olga Brani
    return;
1648 e4a6c3b8 Olga Brani
  }
1649 e4a6c3b8 Olga Brani
1650 e4a6c3b8 Olga Brani
  var i, l, thisCache,
1651 e4a6c3b8 Olga Brani
    isNode = elem.nodeType,
1652 e4a6c3b8 Olga Brani
1653 e4a6c3b8 Olga Brani
    // See jQuery.data for more information
1654 e4a6c3b8 Olga Brani
    cache = isNode ? jQuery.cache : elem,
1655 e4a6c3b8 Olga Brani
    id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1656 e4a6c3b8 Olga Brani
1657 e4a6c3b8 Olga Brani
  // If there is already no cache entry for this object, there is no
1658 e4a6c3b8 Olga Brani
  // purpose in continuing
1659 e4a6c3b8 Olga Brani
  if ( !cache[ id ] ) {
1660 e4a6c3b8 Olga Brani
    return;
1661 e4a6c3b8 Olga Brani
  }
1662 e4a6c3b8 Olga Brani
1663 e4a6c3b8 Olga Brani
  if ( name ) {
1664 e4a6c3b8 Olga Brani
1665 e4a6c3b8 Olga Brani
    thisCache = pvt ? cache[ id ] : cache[ id ].data;
1666 e4a6c3b8 Olga Brani
1667 e4a6c3b8 Olga Brani
    if ( thisCache ) {
1668 e4a6c3b8 Olga Brani
1669 e4a6c3b8 Olga Brani
      // Support array or space separated string names for data keys
1670 e4a6c3b8 Olga Brani
      if ( !jQuery.isArray( name ) ) {
1671 e4a6c3b8 Olga Brani
1672 e4a6c3b8 Olga Brani
        // try the string as a key before any manipulation
1673 e4a6c3b8 Olga Brani
        if ( name in thisCache ) {
1674 e4a6c3b8 Olga Brani
          name = [ name ];
1675 e4a6c3b8 Olga Brani
        } else {
1676 e4a6c3b8 Olga Brani
1677 e4a6c3b8 Olga Brani
          // split the camel cased version by spaces unless a key with the spaces exists
1678 e4a6c3b8 Olga Brani
          name = jQuery.camelCase( name );
1679 e4a6c3b8 Olga Brani
          if ( name in thisCache ) {
1680 e4a6c3b8 Olga Brani
            name = [ name ];
1681 e4a6c3b8 Olga Brani
          } else {
1682 e4a6c3b8 Olga Brani
            name = name.split(" ");
1683 e4a6c3b8 Olga Brani
          }
1684 e4a6c3b8 Olga Brani
        }
1685 e4a6c3b8 Olga Brani
      } else {
1686 e4a6c3b8 Olga Brani
        // If "name" is an array of keys...
1687 e4a6c3b8 Olga Brani
        // When data is initially created, via ("key", "val") signature,
1688 e4a6c3b8 Olga Brani
        // keys will be converted to camelCase.
1689 e4a6c3b8 Olga Brani
        // Since there is no way to tell _how_ a key was added, remove
1690 e4a6c3b8 Olga Brani
        // both plain key and camelCase key. #12786
1691 e4a6c3b8 Olga Brani
        // This will only penalize the array argument path.
1692 e4a6c3b8 Olga Brani
        name = name.concat( jQuery.map( name, jQuery.camelCase ) );
1693 e4a6c3b8 Olga Brani
      }
1694 e4a6c3b8 Olga Brani
1695 e4a6c3b8 Olga Brani
      for ( i = 0, l = name.length; i < l; i++ ) {
1696 e4a6c3b8 Olga Brani
        delete thisCache[ name[i] ];
1697 e4a6c3b8 Olga Brani
      }
1698 e4a6c3b8 Olga Brani
1699 e4a6c3b8 Olga Brani
      // If there is no data left in the cache, we want to continue
1700 e4a6c3b8 Olga Brani
      // and let the cache object itself get destroyed
1701 e4a6c3b8 Olga Brani
      if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1702 e4a6c3b8 Olga Brani
        return;
1703 e4a6c3b8 Olga Brani
      }
1704 e4a6c3b8 Olga Brani
    }
1705 e4a6c3b8 Olga Brani
  }
1706 e4a6c3b8 Olga Brani
1707 e4a6c3b8 Olga Brani
  // See jQuery.data for more information
1708 e4a6c3b8 Olga Brani
  if ( !pvt ) {
1709 e4a6c3b8 Olga Brani
    delete cache[ id ].data;
1710 e4a6c3b8 Olga Brani
1711 e4a6c3b8 Olga Brani
    // Don't destroy the parent cache unless the internal data object
1712 e4a6c3b8 Olga Brani
    // had been the only thing left in it
1713 e4a6c3b8 Olga Brani
    if ( !isEmptyDataObject( cache[ id ] ) ) {
1714 e4a6c3b8 Olga Brani
      return;
1715 e4a6c3b8 Olga Brani
    }
1716 e4a6c3b8 Olga Brani
  }
1717 e4a6c3b8 Olga Brani
1718 e4a6c3b8 Olga Brani
  // Destroy the cache
1719 e4a6c3b8 Olga Brani
  if ( isNode ) {
1720 e4a6c3b8 Olga Brani
    jQuery.cleanData( [ elem ], true );
1721 e4a6c3b8 Olga Brani
1722 e4a6c3b8 Olga Brani
  // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
1723 e4a6c3b8 Olga Brani
  } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
1724 e4a6c3b8 Olga Brani
    delete cache[ id ];
1725 e4a6c3b8 Olga Brani
1726 e4a6c3b8 Olga Brani
  // When all else fails, null
1727 e4a6c3b8 Olga Brani
  } else {
1728 e4a6c3b8 Olga Brani
    cache[ id ] = null;
1729 e4a6c3b8 Olga Brani
  }
1730 e4a6c3b8 Olga Brani
}
1731 e4a6c3b8 Olga Brani
1732 e4a6c3b8 Olga Brani
jQuery.extend({
1733 e4a6c3b8 Olga Brani
  cache: {},
1734 e4a6c3b8 Olga Brani
1735 e4a6c3b8 Olga Brani
  // Unique for each copy of jQuery on the page
1736 e4a6c3b8 Olga Brani
  // Non-digits removed to match rinlinejQuery
1737 e4a6c3b8 Olga Brani
  expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
1738 e4a6c3b8 Olga Brani
1739 e4a6c3b8 Olga Brani
  // The following elements throw uncatchable exceptions if you
1740 e4a6c3b8 Olga Brani
  // attempt to add expando properties to them.
1741 e4a6c3b8 Olga Brani
  noData: {
1742 e4a6c3b8 Olga Brani
    "embed": true,
1743 e4a6c3b8 Olga Brani
    // Ban all objects except for Flash (which handle expandos)
1744 e4a6c3b8 Olga Brani
    "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1745 e4a6c3b8 Olga Brani
    "applet": true
1746 e4a6c3b8 Olga Brani
  },
1747 e4a6c3b8 Olga Brani
1748 e4a6c3b8 Olga Brani
  hasData: function( elem ) {
1749 e4a6c3b8 Olga Brani
    elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1750 e4a6c3b8 Olga Brani
    return !!elem && !isEmptyDataObject( elem );
1751 e4a6c3b8 Olga Brani
  },
1752 e4a6c3b8 Olga Brani
1753 e4a6c3b8 Olga Brani
  data: function( elem, name, data ) {
1754 e4a6c3b8 Olga Brani
    return internalData( elem, name, data );
1755 e4a6c3b8 Olga Brani
  },
1756 e4a6c3b8 Olga Brani
1757 e4a6c3b8 Olga Brani
  removeData: function( elem, name ) {
1758 e4a6c3b8 Olga Brani
    return internalRemoveData( elem, name );
1759 e4a6c3b8 Olga Brani
  },
1760 e4a6c3b8 Olga Brani
1761 e4a6c3b8 Olga Brani
  // For internal use only.
1762 e4a6c3b8 Olga Brani
  _data: function( elem, name, data ) {
1763 e4a6c3b8 Olga Brani
    return internalData( elem, name, data, true );
1764 e4a6c3b8 Olga Brani
  },
1765 e4a6c3b8 Olga Brani
1766 e4a6c3b8 Olga Brani
  _removeData: function( elem, name ) {
1767 e4a6c3b8 Olga Brani
    return internalRemoveData( elem, name, true );
1768 e4a6c3b8 Olga Brani
  },
1769 e4a6c3b8 Olga Brani
1770 e4a6c3b8 Olga Brani
  // A method for determining if a DOM node can handle the data expando
1771 e4a6c3b8 Olga Brani
  acceptData: function( elem ) {
1772 e4a6c3b8 Olga Brani
    // Do not set data on non-element because it will not be cleared (#8335).
1773 e4a6c3b8 Olga Brani
    if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
1774 e4a6c3b8 Olga Brani
      return false;
1775 e4a6c3b8 Olga Brani
    }
1776 e4a6c3b8 Olga Brani
1777 e4a6c3b8 Olga Brani
    var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
1778 e4a6c3b8 Olga Brani
1779 e4a6c3b8 Olga Brani
    // nodes accept data unless otherwise specified; rejection can be conditional
1780 e4a6c3b8 Olga Brani
    return !noData || noData !== true && elem.getAttribute("classid") === noData;
1781 e4a6c3b8 Olga Brani
  }
1782 e4a6c3b8 Olga Brani
});
1783 e4a6c3b8 Olga Brani
1784 e4a6c3b8 Olga Brani
jQuery.fn.extend({
1785 e4a6c3b8 Olga Brani
  data: function( key, value ) {
1786 e4a6c3b8 Olga Brani
    var attrs, name,
1787 e4a6c3b8 Olga Brani
      elem = this[0],
1788 e4a6c3b8 Olga Brani
      i = 0,
1789 e4a6c3b8 Olga Brani
      data = null;
1790 e4a6c3b8 Olga Brani
1791 e4a6c3b8 Olga Brani
    // Gets all values
1792 e4a6c3b8 Olga Brani
    if ( key === undefined ) {
1793 e4a6c3b8 Olga Brani
      if ( this.length ) {
1794 e4a6c3b8 Olga Brani
        data = jQuery.data( elem );
1795 e4a6c3b8 Olga Brani
1796 e4a6c3b8 Olga Brani
        if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
1797 e4a6c3b8 Olga Brani
          attrs = elem.attributes;
1798 e4a6c3b8 Olga Brani
          for ( ; i < attrs.length; i++ ) {
1799 e4a6c3b8 Olga Brani
            name = attrs[i].name;
1800 e4a6c3b8 Olga Brani
1801 e4a6c3b8 Olga Brani
            if ( !name.indexOf( "data-" ) ) {
1802 e4a6c3b8 Olga Brani
              name = jQuery.camelCase( name.slice(5) );
1803 e4a6c3b8 Olga Brani
1804 e4a6c3b8 Olga Brani
              dataAttr( elem, name, data[ name ] );
1805 e4a6c3b8 Olga Brani
            }
1806 e4a6c3b8 Olga Brani
          }
1807 e4a6c3b8 Olga Brani
          jQuery._data( elem, "parsedAttrs", true );
1808 e4a6c3b8 Olga Brani
        }
1809 e4a6c3b8 Olga Brani
      }
1810 e4a6c3b8 Olga Brani
1811 e4a6c3b8 Olga Brani
      return data;
1812 e4a6c3b8 Olga Brani
    }
1813 e4a6c3b8 Olga Brani
1814 e4a6c3b8 Olga Brani
    // Sets multiple values
1815 e4a6c3b8 Olga Brani
    if ( typeof key === "object" ) {
1816 e4a6c3b8 Olga Brani
      return this.each(function() {
1817 e4a6c3b8 Olga Brani
        jQuery.data( this, key );
1818 e4a6c3b8 Olga Brani
      });
1819 e4a6c3b8 Olga Brani
    }
1820 e4a6c3b8 Olga Brani
1821 e4a6c3b8 Olga Brani
    return jQuery.access( this, function( value ) {
1822 e4a6c3b8 Olga Brani
1823 e4a6c3b8 Olga Brani
      if ( value === undefined ) {
1824 e4a6c3b8 Olga Brani
        // Try to fetch any internally stored data first
1825 e4a6c3b8 Olga Brani
        return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
1826 e4a6c3b8 Olga Brani
      }
1827 e4a6c3b8 Olga Brani
1828 e4a6c3b8 Olga Brani
      this.each(function() {
1829 e4a6c3b8 Olga Brani
        jQuery.data( this, key, value );
1830 e4a6c3b8 Olga Brani
      });
1831 e4a6c3b8 Olga Brani
    }, null, value, arguments.length > 1, null, true );
1832 e4a6c3b8 Olga Brani
  },
1833 e4a6c3b8 Olga Brani
1834 e4a6c3b8 Olga Brani
  removeData: function( key ) {
1835 e4a6c3b8 Olga Brani
    return this.each(function() {
1836 e4a6c3b8 Olga Brani
      jQuery.removeData( this, key );
1837 e4a6c3b8 Olga Brani
    });
1838 e4a6c3b8 Olga Brani
  }
1839 e4a6c3b8 Olga Brani
});
1840 e4a6c3b8 Olga Brani
1841 e4a6c3b8 Olga Brani
function dataAttr( elem, key, data ) {
1842 e4a6c3b8 Olga Brani
  // If nothing was found internally, try to fetch any
1843 e4a6c3b8 Olga Brani
  // data from the HTML5 data-* attribute
1844 e4a6c3b8 Olga Brani
  if ( data === undefined && elem.nodeType === 1 ) {
1845 e4a6c3b8 Olga Brani
1846 e4a6c3b8 Olga Brani
    var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1847 e4a6c3b8 Olga Brani
1848 e4a6c3b8 Olga Brani
    data = elem.getAttribute( name );
1849 e4a6c3b8 Olga Brani
1850 e4a6c3b8 Olga Brani
    if ( typeof data === "string" ) {
1851 e4a6c3b8 Olga Brani
      try {
1852 e4a6c3b8 Olga Brani
        data = data === "true" ? true :
1853 e4a6c3b8 Olga Brani
          data === "false" ? false :
1854 e4a6c3b8 Olga Brani
          data === "null" ? null :
1855 e4a6c3b8 Olga Brani
          // Only convert to a number if it doesn't change the string
1856 e4a6c3b8 Olga Brani
          +data + "" === data ? +data :
1857 e4a6c3b8 Olga Brani
          rbrace.test( data ) ? jQuery.parseJSON( data ) :
1858 e4a6c3b8 Olga Brani
            data;
1859 e4a6c3b8 Olga Brani
      } catch( e ) {}
1860 e4a6c3b8 Olga Brani
1861 e4a6c3b8 Olga Brani
      // Make sure we set the data so it isn't changed later
1862 e4a6c3b8 Olga Brani
      jQuery.data( elem, key, data );
1863 e4a6c3b8 Olga Brani
1864 e4a6c3b8 Olga Brani
    } else {
1865 e4a6c3b8 Olga Brani
      data = undefined;
1866 e4a6c3b8 Olga Brani
    }
1867 e4a6c3b8 Olga Brani
  }
1868 e4a6c3b8 Olga Brani
1869 e4a6c3b8 Olga Brani
  return data;
1870 e4a6c3b8 Olga Brani
}
1871 e4a6c3b8 Olga Brani
1872 e4a6c3b8 Olga Brani
// checks a cache object for emptiness
1873 e4a6c3b8 Olga Brani
function isEmptyDataObject( obj ) {
1874 e4a6c3b8 Olga Brani
  var name;
1875 e4a6c3b8 Olga Brani
  for ( name in obj ) {
1876 e4a6c3b8 Olga Brani
1877 e4a6c3b8 Olga Brani
    // if the public data object is empty, the private is still empty
1878 e4a6c3b8 Olga Brani
    if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
1879 e4a6c3b8 Olga Brani
      continue;
1880 e4a6c3b8 Olga Brani
    }
1881 e4a6c3b8 Olga Brani
    if ( name !== "toJSON" ) {
1882 e4a6c3b8 Olga Brani
      return false;
1883 e4a6c3b8 Olga Brani
    }
1884 e4a6c3b8 Olga Brani
  }
1885 e4a6c3b8 Olga Brani
1886 e4a6c3b8 Olga Brani
  return true;
1887 e4a6c3b8 Olga Brani
}
1888 e4a6c3b8 Olga Brani
jQuery.extend({
1889 e4a6c3b8 Olga Brani
  queue: function( elem, type, data ) {
1890 e4a6c3b8 Olga Brani
    var queue;
1891 e4a6c3b8 Olga Brani
1892 e4a6c3b8 Olga Brani
    if ( elem ) {
1893 e4a6c3b8 Olga Brani
      type = ( type || "fx" ) + "queue";
1894 e4a6c3b8 Olga Brani
      queue = jQuery._data( elem, type );
1895 e4a6c3b8 Olga Brani
1896 e4a6c3b8 Olga Brani
      // Speed up dequeue by getting out quickly if this is just a lookup
1897 e4a6c3b8 Olga Brani
      if ( data ) {
1898 e4a6c3b8 Olga Brani
        if ( !queue || jQuery.isArray(data) ) {
1899 e4a6c3b8 Olga Brani
          queue = jQuery._data( elem, type, jQuery.makeArray(data) );
1900 e4a6c3b8 Olga Brani
        } else {
1901 e4a6c3b8 Olga Brani
          queue.push( data );
1902 e4a6c3b8 Olga Brani
        }
1903 e4a6c3b8 Olga Brani
      }
1904 e4a6c3b8 Olga Brani
      return queue || [];
1905 e4a6c3b8 Olga Brani
    }
1906 e4a6c3b8 Olga Brani
  },
1907 e4a6c3b8 Olga Brani
1908 e4a6c3b8 Olga Brani
  dequeue: function( elem, type ) {
1909 e4a6c3b8 Olga Brani
    type = type || "fx";
1910 e4a6c3b8 Olga Brani
1911 e4a6c3b8 Olga Brani
    var queue = jQuery.queue( elem, type ),
1912 e4a6c3b8 Olga Brani
      startLength = queue.length,
1913 e4a6c3b8 Olga Brani
      fn = queue.shift(),
1914 e4a6c3b8 Olga Brani
      hooks = jQuery._queueHooks( elem, type ),
1915 e4a6c3b8 Olga Brani
      next = function() {
1916 e4a6c3b8 Olga Brani
        jQuery.dequeue( elem, type );
1917 e4a6c3b8 Olga Brani
      };
1918 e4a6c3b8 Olga Brani
1919 e4a6c3b8 Olga Brani
    // If the fx queue is dequeued, always remove the progress sentinel
1920 e4a6c3b8 Olga Brani
    if ( fn === "inprogress" ) {
1921 e4a6c3b8 Olga Brani
      fn = queue.shift();
1922 e4a6c3b8 Olga Brani
      startLength--;
1923 e4a6c3b8 Olga Brani
    }
1924 e4a6c3b8 Olga Brani
1925 e4a6c3b8 Olga Brani
    hooks.cur = fn;
1926 e4a6c3b8 Olga Brani
    if ( fn ) {
1927 e4a6c3b8 Olga Brani
1928 e4a6c3b8 Olga Brani
      // Add a progress sentinel to prevent the fx queue from being
1929 e4a6c3b8 Olga Brani
      // automatically dequeued
1930 e4a6c3b8 Olga Brani
      if ( type === "fx" ) {
1931 e4a6c3b8 Olga Brani
        queue.unshift( "inprogress" );
1932 e4a6c3b8 Olga Brani
      }
1933 e4a6c3b8 Olga Brani
1934 e4a6c3b8 Olga Brani
      // clear up the last queue stop function
1935 e4a6c3b8 Olga Brani
      delete hooks.stop;
1936 e4a6c3b8 Olga Brani
      fn.call( elem, next, hooks );
1937 e4a6c3b8 Olga Brani
    }
1938 e4a6c3b8 Olga Brani
1939 e4a6c3b8 Olga Brani
    if ( !startLength && hooks ) {
1940 e4a6c3b8 Olga Brani
      hooks.empty.fire();
1941 e4a6c3b8 Olga Brani
    }
1942 e4a6c3b8 Olga Brani
  },
1943 e4a6c3b8 Olga Brani
1944 e4a6c3b8 Olga Brani
  // not intended for public consumption - generates a queueHooks object, or returns the current one
1945 e4a6c3b8 Olga Brani
  _queueHooks: function( elem, type ) {
1946 e4a6c3b8 Olga Brani
    var key = type + "queueHooks";
1947 e4a6c3b8 Olga Brani
    return jQuery._data( elem, key ) || jQuery._data( elem, key, {
1948 e4a6c3b8 Olga Brani
      empty: jQuery.Callbacks("once memory").add(function() {
1949 e4a6c3b8 Olga Brani
        jQuery._removeData( elem, type + "queue" );
1950 e4a6c3b8 Olga Brani
        jQuery._removeData( elem, key );
1951 e4a6c3b8 Olga Brani
      })
1952 e4a6c3b8 Olga Brani
    });
1953 e4a6c3b8 Olga Brani
  }
1954 e4a6c3b8 Olga Brani
});
1955 e4a6c3b8 Olga Brani
1956 e4a6c3b8 Olga Brani
jQuery.fn.extend({
1957 e4a6c3b8 Olga Brani
  queue: function( type, data ) {
1958 e4a6c3b8 Olga Brani
    var setter = 2;
1959 e4a6c3b8 Olga Brani
1960 e4a6c3b8 Olga Brani
    if ( typeof type !== "string" ) {
1961 e4a6c3b8 Olga Brani
      data = type;
1962 e4a6c3b8 Olga Brani
      type = "fx";
1963 e4a6c3b8 Olga Brani
      setter--;
1964 e4a6c3b8 Olga Brani
    }
1965 e4a6c3b8 Olga Brani
1966 e4a6c3b8 Olga Brani
    if ( arguments.length < setter ) {
1967 e4a6c3b8 Olga Brani
      return jQuery.queue( this[0], type );
1968 e4a6c3b8 Olga Brani
    }
1969 e4a6c3b8 Olga Brani
1970 e4a6c3b8 Olga Brani
    return data === undefined ?
1971 e4a6c3b8 Olga Brani
      this :
1972 e4a6c3b8 Olga Brani
      this.each(function() {
1973 e4a6c3b8 Olga Brani
        var queue = jQuery.queue( this, type, data );
1974 e4a6c3b8 Olga Brani
1975 e4a6c3b8 Olga Brani
        // ensure a hooks for this queue
1976 e4a6c3b8 Olga Brani
        jQuery._queueHooks( this, type );
1977 e4a6c3b8 Olga Brani
1978 e4a6c3b8 Olga Brani
        if ( type === "fx" && queue[0] !== "inprogress" ) {
1979 e4a6c3b8 Olga Brani
          jQuery.dequeue( this, type );
1980 e4a6c3b8 Olga Brani
        }
1981 e4a6c3b8 Olga Brani
      });
1982 e4a6c3b8 Olga Brani
  },
1983 e4a6c3b8 Olga Brani
  dequeue: function( type ) {
1984 e4a6c3b8 Olga Brani
    return this.each(function() {
1985 e4a6c3b8 Olga Brani
      jQuery.dequeue( this, type );
1986 e4a6c3b8 Olga Brani
    });
1987 e4a6c3b8 Olga Brani
  },
1988 e4a6c3b8 Olga Brani
  // Based off of the plugin by Clint Helfers, with permission.
1989 e4a6c3b8 Olga Brani
  // http://blindsignals.com/index.php/2009/07/jquery-delay/
1990 e4a6c3b8 Olga Brani
  delay: function( time, type ) {
1991 e4a6c3b8 Olga Brani
    time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
1992 e4a6c3b8 Olga Brani
    type = type || "fx";
1993 e4a6c3b8 Olga Brani
1994 e4a6c3b8 Olga Brani
    return this.queue( type, function( next, hooks ) {
1995 e4a6c3b8 Olga Brani
      var timeout = setTimeout( next, time );
1996 e4a6c3b8 Olga Brani
      hooks.stop = function() {
1997 e4a6c3b8 Olga Brani
        clearTimeout( timeout );
1998 e4a6c3b8 Olga Brani
      };
1999 e4a6c3b8 Olga Brani
    });
2000 e4a6c3b8 Olga Brani
  },
2001 e4a6c3b8 Olga Brani
  clearQueue: function( type ) {
2002 e4a6c3b8 Olga Brani
    return this.queue( type || "fx", [] );
2003 e4a6c3b8 Olga Brani
  },
2004 e4a6c3b8 Olga Brani
  // Get a promise resolved when queues of a certain type
2005 e4a6c3b8 Olga Brani
  // are emptied (fx is the type by default)
2006 e4a6c3b8 Olga Brani
  promise: function( type, obj ) {
2007 e4a6c3b8 Olga Brani
    var tmp,
2008 e4a6c3b8 Olga Brani
      count = 1,
2009 e4a6c3b8 Olga Brani
      defer = jQuery.Deferred(),
2010 e4a6c3b8 Olga Brani
      elements = this,
2011 e4a6c3b8 Olga Brani
      i = this.length,
2012 e4a6c3b8 Olga Brani
      resolve = function() {
2013 e4a6c3b8 Olga Brani
        if ( !( --count ) ) {
2014 e4a6c3b8 Olga Brani
          defer.resolveWith( elements, [ elements ] );
2015 e4a6c3b8 Olga Brani
        }
2016 e4a6c3b8 Olga Brani
      };
2017 e4a6c3b8 Olga Brani
2018 e4a6c3b8 Olga Brani
    if ( typeof type !== "string" ) {
2019 e4a6c3b8 Olga Brani
      obj = type;
2020 e4a6c3b8 Olga Brani
      type = undefined;
2021 e4a6c3b8 Olga Brani
    }
2022 e4a6c3b8 Olga Brani
    type = type || "fx";
2023 e4a6c3b8 Olga Brani
2024 e4a6c3b8 Olga Brani
    while( i-- ) {
2025 e4a6c3b8 Olga Brani
      tmp = jQuery._data( elements[ i ], type + "queueHooks" );
2026 e4a6c3b8 Olga Brani
      if ( tmp && tmp.empty ) {
2027 e4a6c3b8 Olga Brani
        count++;
2028 e4a6c3b8 Olga Brani
        tmp.empty.add( resolve );
2029 e4a6c3b8 Olga Brani
      }
2030 e4a6c3b8 Olga Brani
    }
2031 e4a6c3b8 Olga Brani
    resolve();
2032 e4a6c3b8 Olga Brani
    return defer.promise( obj );
2033 e4a6c3b8 Olga Brani
  }
2034 e4a6c3b8 Olga Brani
});
2035 e4a6c3b8 Olga Brani
var nodeHook, boolHook,
2036 e4a6c3b8 Olga Brani
  rclass = /[\t\r\n]/g,
2037 e4a6c3b8 Olga Brani
  rreturn = /\r/g,
2038 e4a6c3b8 Olga Brani
  rfocusable = /^(?:input|select|textarea|button|object)$/i,
2039 e4a6c3b8 Olga Brani
  rclickable = /^(?:a|area)$/i,
2040 e4a6c3b8 Olga Brani
  rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
2041 e4a6c3b8 Olga Brani
  ruseDefault = /^(?:checked|selected)$/i,
2042 e4a6c3b8 Olga Brani
  getSetAttribute = jQuery.support.getSetAttribute,
2043 e4a6c3b8 Olga Brani
  getSetInput = jQuery.support.input;
2044 e4a6c3b8 Olga Brani
2045 e4a6c3b8 Olga Brani
jQuery.fn.extend({
2046 e4a6c3b8 Olga Brani
  attr: function( name, value ) {
2047 e4a6c3b8 Olga Brani
    return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
2048 e4a6c3b8 Olga Brani
  },
2049 e4a6c3b8 Olga Brani
2050 e4a6c3b8 Olga Brani
  removeAttr: function( name ) {
2051 e4a6c3b8 Olga Brani
    return this.each(function() {
2052 e4a6c3b8 Olga Brani
      jQuery.removeAttr( this, name );
2053 e4a6c3b8 Olga Brani
    });
2054 e4a6c3b8 Olga Brani
  },
2055 e4a6c3b8 Olga Brani
2056 e4a6c3b8 Olga Brani
  prop: function( name, value ) {
2057 e4a6c3b8 Olga Brani
    return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
2058 e4a6c3b8 Olga Brani
  },
2059 e4a6c3b8 Olga Brani
2060 e4a6c3b8 Olga Brani
  removeProp: function( name ) {
2061 e4a6c3b8 Olga Brani
    name = jQuery.propFix[ name ] || name;
2062 e4a6c3b8 Olga Brani
    return this.each(function() {
2063 e4a6c3b8 Olga Brani
      // try/catch handles cases where IE balks (such as removing a property on window)
2064 e4a6c3b8 Olga Brani
      try {
2065 e4a6c3b8 Olga Brani
        this[ name ] = undefined;
2066 e4a6c3b8 Olga Brani
        delete this[ name ];
2067 e4a6c3b8 Olga Brani
      } catch( e ) {}
2068 e4a6c3b8 Olga Brani
    });
2069 e4a6c3b8 Olga Brani
  },
2070 e4a6c3b8 Olga Brani
2071 e4a6c3b8 Olga Brani
  addClass: function( value ) {
2072 e4a6c3b8 Olga Brani
    var classes, elem, cur, clazz, j,
2073 e4a6c3b8 Olga Brani
      i = 0,
2074 e4a6c3b8 Olga Brani
      len = this.length,
2075 e4a6c3b8 Olga Brani
      proceed = typeof value === "string" && value;
2076 e4a6c3b8 Olga Brani
2077 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( value ) ) {
2078 e4a6c3b8 Olga Brani
      return this.each(function( j ) {
2079 e4a6c3b8 Olga Brani
        jQuery( this ).addClass( value.call( this, j, this.className ) );
2080 e4a6c3b8 Olga Brani
      });
2081 e4a6c3b8 Olga Brani
    }
2082 e4a6c3b8 Olga Brani
2083 e4a6c3b8 Olga Brani
    if ( proceed ) {
2084 e4a6c3b8 Olga Brani
      // The disjunction here is for better compressibility (see removeClass)
2085 e4a6c3b8 Olga Brani
      classes = ( value || "" ).match( core_rnotwhite ) || [];
2086 e4a6c3b8 Olga Brani
2087 e4a6c3b8 Olga Brani
      for ( ; i < len; i++ ) {
2088 e4a6c3b8 Olga Brani
        elem = this[ i ];
2089 e4a6c3b8 Olga Brani
        cur = elem.nodeType === 1 && ( elem.className ?
2090 e4a6c3b8 Olga Brani
          ( " " + elem.className + " " ).replace( rclass, " " ) :
2091 e4a6c3b8 Olga Brani
          " "
2092 e4a6c3b8 Olga Brani
        );
2093 e4a6c3b8 Olga Brani
2094 e4a6c3b8 Olga Brani
        if ( cur ) {
2095 e4a6c3b8 Olga Brani
          j = 0;
2096 e4a6c3b8 Olga Brani
          while ( (clazz = classes[j++]) ) {
2097 e4a6c3b8 Olga Brani
            if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
2098 e4a6c3b8 Olga Brani
              cur += clazz + " ";
2099 e4a6c3b8 Olga Brani
            }
2100 e4a6c3b8 Olga Brani
          }
2101 e4a6c3b8 Olga Brani
          elem.className = jQuery.trim( cur );
2102 e4a6c3b8 Olga Brani
2103 e4a6c3b8 Olga Brani
        }
2104 e4a6c3b8 Olga Brani
      }
2105 e4a6c3b8 Olga Brani
    }
2106 e4a6c3b8 Olga Brani
2107 e4a6c3b8 Olga Brani
    return this;
2108 e4a6c3b8 Olga Brani
  },
2109 e4a6c3b8 Olga Brani
2110 e4a6c3b8 Olga Brani
  removeClass: function( value ) {
2111 e4a6c3b8 Olga Brani
    var classes, elem, cur, clazz, j,
2112 e4a6c3b8 Olga Brani
      i = 0,
2113 e4a6c3b8 Olga Brani
      len = this.length,
2114 e4a6c3b8 Olga Brani
      proceed = arguments.length === 0 || typeof value === "string" && value;
2115 e4a6c3b8 Olga Brani
2116 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( value ) ) {
2117 e4a6c3b8 Olga Brani
      return this.each(function( j ) {
2118 e4a6c3b8 Olga Brani
        jQuery( this ).removeClass( value.call( this, j, this.className ) );
2119 e4a6c3b8 Olga Brani
      });
2120 e4a6c3b8 Olga Brani
    }
2121 e4a6c3b8 Olga Brani
    if ( proceed ) {
2122 e4a6c3b8 Olga Brani
      classes = ( value || "" ).match( core_rnotwhite ) || [];
2123 e4a6c3b8 Olga Brani
2124 e4a6c3b8 Olga Brani
      for ( ; i < len; i++ ) {
2125 e4a6c3b8 Olga Brani
        elem = this[ i ];
2126 e4a6c3b8 Olga Brani
        // This expression is here for better compressibility (see addClass)
2127 e4a6c3b8 Olga Brani
        cur = elem.nodeType === 1 && ( elem.className ?
2128 e4a6c3b8 Olga Brani
          ( " " + elem.className + " " ).replace( rclass, " " ) :
2129 e4a6c3b8 Olga Brani
          ""
2130 e4a6c3b8 Olga Brani
        );
2131 e4a6c3b8 Olga Brani
2132 e4a6c3b8 Olga Brani
        if ( cur ) {
2133 e4a6c3b8 Olga Brani
          j = 0;
2134 e4a6c3b8 Olga Brani
          while ( (clazz = classes[j++]) ) {
2135 e4a6c3b8 Olga Brani
            // Remove *all* instances
2136 e4a6c3b8 Olga Brani
            while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
2137 e4a6c3b8 Olga Brani
              cur = cur.replace( " " + clazz + " ", " " );
2138 e4a6c3b8 Olga Brani
            }
2139 e4a6c3b8 Olga Brani
          }
2140 e4a6c3b8 Olga Brani
          elem.className = value ? jQuery.trim( cur ) : "";
2141 e4a6c3b8 Olga Brani
        }
2142 e4a6c3b8 Olga Brani
      }
2143 e4a6c3b8 Olga Brani
    }
2144 e4a6c3b8 Olga Brani
2145 e4a6c3b8 Olga Brani
    return this;
2146 e4a6c3b8 Olga Brani
  },
2147 e4a6c3b8 Olga Brani
2148 e4a6c3b8 Olga Brani
  toggleClass: function( value, stateVal ) {
2149 e4a6c3b8 Olga Brani
    var type = typeof value,
2150 e4a6c3b8 Olga Brani
      isBool = typeof stateVal === "boolean";
2151 e4a6c3b8 Olga Brani
2152 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( value ) ) {
2153 e4a6c3b8 Olga Brani
      return this.each(function( i ) {
2154 e4a6c3b8 Olga Brani
        jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2155 e4a6c3b8 Olga Brani
      });
2156 e4a6c3b8 Olga Brani
    }
2157 e4a6c3b8 Olga Brani
2158 e4a6c3b8 Olga Brani
    return this.each(function() {
2159 e4a6c3b8 Olga Brani
      if ( type === "string" ) {
2160 e4a6c3b8 Olga Brani
        // toggle individual class names
2161 e4a6c3b8 Olga Brani
        var className,
2162 e4a6c3b8 Olga Brani
          i = 0,
2163 e4a6c3b8 Olga Brani
          self = jQuery( this ),
2164 e4a6c3b8 Olga Brani
          state = stateVal,
2165 e4a6c3b8 Olga Brani
          classNames = value.match( core_rnotwhite ) || [];
2166 e4a6c3b8 Olga Brani
2167 e4a6c3b8 Olga Brani
        while ( (className = classNames[ i++ ]) ) {
2168 e4a6c3b8 Olga Brani
          // check each className given, space separated list
2169 e4a6c3b8 Olga Brani
          state = isBool ? state : !self.hasClass( className );
2170 e4a6c3b8 Olga Brani
          self[ state ? "addClass" : "removeClass" ]( className );
2171 e4a6c3b8 Olga Brani
        }
2172 e4a6c3b8 Olga Brani
2173 e4a6c3b8 Olga Brani
      // Toggle whole class name
2174 e4a6c3b8 Olga Brani
      } else if ( type === core_strundefined || type === "boolean" ) {
2175 e4a6c3b8 Olga Brani
        if ( this.className ) {
2176 e4a6c3b8 Olga Brani
          // store className if set
2177 e4a6c3b8 Olga Brani
          jQuery._data( this, "__className__", this.className );
2178 e4a6c3b8 Olga Brani
        }
2179 e4a6c3b8 Olga Brani
2180 e4a6c3b8 Olga Brani
        // If the element has a class name or if we're passed "false",
2181 e4a6c3b8 Olga Brani
        // then remove the whole classname (if there was one, the above saved it).
2182 e4a6c3b8 Olga Brani
        // Otherwise bring back whatever was previously saved (if anything),
2183 e4a6c3b8 Olga Brani
        // falling back to the empty string if nothing was stored.
2184 e4a6c3b8 Olga Brani
        this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2185 e4a6c3b8 Olga Brani
      }
2186 e4a6c3b8 Olga Brani
    });
2187 e4a6c3b8 Olga Brani
  },
2188 e4a6c3b8 Olga Brani
2189 e4a6c3b8 Olga Brani
  hasClass: function( selector ) {
2190 e4a6c3b8 Olga Brani
    var className = " " + selector + " ",
2191 e4a6c3b8 Olga Brani
      i = 0,
2192 e4a6c3b8 Olga Brani
      l = this.length;
2193 e4a6c3b8 Olga Brani
    for ( ; i < l; i++ ) {
2194 e4a6c3b8 Olga Brani
      if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
2195 e4a6c3b8 Olga Brani
        return true;
2196 e4a6c3b8 Olga Brani
      }
2197 e4a6c3b8 Olga Brani
    }
2198 e4a6c3b8 Olga Brani
2199 e4a6c3b8 Olga Brani
    return false;
2200 e4a6c3b8 Olga Brani
  },
2201 e4a6c3b8 Olga Brani
2202 e4a6c3b8 Olga Brani
  val: function( value ) {
2203 e4a6c3b8 Olga Brani
    var ret, hooks, isFunction,
2204 e4a6c3b8 Olga Brani
      elem = this[0];
2205 e4a6c3b8 Olga Brani
2206 e4a6c3b8 Olga Brani
    if ( !arguments.length ) {
2207 e4a6c3b8 Olga Brani
      if ( elem ) {
2208 e4a6c3b8 Olga Brani
        hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
2209 e4a6c3b8 Olga Brani
2210 e4a6c3b8 Olga Brani
        if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2211 e4a6c3b8 Olga Brani
          return ret;
2212 e4a6c3b8 Olga Brani
        }
2213 e4a6c3b8 Olga Brani
2214 e4a6c3b8 Olga Brani
        ret = elem.value;
2215 e4a6c3b8 Olga Brani
2216 e4a6c3b8 Olga Brani
        return typeof ret === "string" ?
2217 e4a6c3b8 Olga Brani
          // handle most common string cases
2218 e4a6c3b8 Olga Brani
          ret.replace(rreturn, "") :
2219 e4a6c3b8 Olga Brani
          // handle cases where value is null/undef or number
2220 e4a6c3b8 Olga Brani
          ret == null ? "" : ret;
2221 e4a6c3b8 Olga Brani
      }
2222 e4a6c3b8 Olga Brani
2223 e4a6c3b8 Olga Brani
      return;
2224 e4a6c3b8 Olga Brani
    }
2225 e4a6c3b8 Olga Brani
2226 e4a6c3b8 Olga Brani
    isFunction = jQuery.isFunction( value );
2227 e4a6c3b8 Olga Brani
2228 e4a6c3b8 Olga Brani
    return this.each(function( i ) {
2229 e4a6c3b8 Olga Brani
      var val,
2230 e4a6c3b8 Olga Brani
        self = jQuery(this);
2231 e4a6c3b8 Olga Brani
2232 e4a6c3b8 Olga Brani
      if ( this.nodeType !== 1 ) {
2233 e4a6c3b8 Olga Brani
        return;
2234 e4a6c3b8 Olga Brani
      }
2235 e4a6c3b8 Olga Brani
2236 e4a6c3b8 Olga Brani
      if ( isFunction ) {
2237 e4a6c3b8 Olga Brani
        val = value.call( this, i, self.val() );
2238 e4a6c3b8 Olga Brani
      } else {
2239 e4a6c3b8 Olga Brani
        val = value;
2240 e4a6c3b8 Olga Brani
      }
2241 e4a6c3b8 Olga Brani
2242 e4a6c3b8 Olga Brani
      // Treat null/undefined as ""; convert numbers to string
2243 e4a6c3b8 Olga Brani
      if ( val == null ) {
2244 e4a6c3b8 Olga Brani
        val = "";
2245 e4a6c3b8 Olga Brani
      } else if ( typeof val === "number" ) {
2246 e4a6c3b8 Olga Brani
        val += "";
2247 e4a6c3b8 Olga Brani
      } else if ( jQuery.isArray( val ) ) {
2248 e4a6c3b8 Olga Brani
        val = jQuery.map(val, function ( value ) {
2249 e4a6c3b8 Olga Brani
          return value == null ? "" : value + "";
2250 e4a6c3b8 Olga Brani
        });
2251 e4a6c3b8 Olga Brani
      }
2252 e4a6c3b8 Olga Brani
2253 e4a6c3b8 Olga Brani
      hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
2254 e4a6c3b8 Olga Brani
2255 e4a6c3b8 Olga Brani
      // If set returns undefined, fall back to normal setting
2256 e4a6c3b8 Olga Brani
      if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2257 e4a6c3b8 Olga Brani
        this.value = val;
2258 e4a6c3b8 Olga Brani
      }
2259 e4a6c3b8 Olga Brani
    });
2260 e4a6c3b8 Olga Brani
  }
2261 e4a6c3b8 Olga Brani
});
2262 e4a6c3b8 Olga Brani
2263 e4a6c3b8 Olga Brani
jQuery.extend({
2264 e4a6c3b8 Olga Brani
  valHooks: {
2265 e4a6c3b8 Olga Brani
    option: {
2266 e4a6c3b8 Olga Brani
      get: function( elem ) {
2267 e4a6c3b8 Olga Brani
        // attributes.value is undefined in Blackberry 4.7 but
2268 e4a6c3b8 Olga Brani
        // uses .value. See #6932
2269 e4a6c3b8 Olga Brani
        var val = elem.attributes.value;
2270 e4a6c3b8 Olga Brani
        return !val || val.specified ? elem.value : elem.text;
2271 e4a6c3b8 Olga Brani
      }
2272 e4a6c3b8 Olga Brani
    },
2273 e4a6c3b8 Olga Brani
    select: {
2274 e4a6c3b8 Olga Brani
      get: function( elem ) {
2275 e4a6c3b8 Olga Brani
        var value, option,
2276 e4a6c3b8 Olga Brani
          options = elem.options,
2277 e4a6c3b8 Olga Brani
          index = elem.selectedIndex,
2278 e4a6c3b8 Olga Brani
          one = elem.type === "select-one" || index < 0,
2279 e4a6c3b8 Olga Brani
          values = one ? null : [],
2280 e4a6c3b8 Olga Brani
          max = one ? index + 1 : options.length,
2281 e4a6c3b8 Olga Brani
          i = index < 0 ?
2282 e4a6c3b8 Olga Brani
            max :
2283 e4a6c3b8 Olga Brani
            one ? index : 0;
2284 e4a6c3b8 Olga Brani
2285 e4a6c3b8 Olga Brani
        // Loop through all the selected options
2286 e4a6c3b8 Olga Brani
        for ( ; i < max; i++ ) {
2287 e4a6c3b8 Olga Brani
          option = options[ i ];
2288 e4a6c3b8 Olga Brani
2289 e4a6c3b8 Olga Brani
          // oldIE doesn't update selected after form reset (#2551)
2290 e4a6c3b8 Olga Brani
          if ( ( option.selected || i === index ) &&
2291 e4a6c3b8 Olga Brani
              // Don't return options that are disabled or in a disabled optgroup
2292 e4a6c3b8 Olga Brani
              ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
2293 e4a6c3b8 Olga Brani
              ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
2294 e4a6c3b8 Olga Brani
2295 e4a6c3b8 Olga Brani
            // Get the specific value for the option
2296 e4a6c3b8 Olga Brani
            value = jQuery( option ).val();
2297 e4a6c3b8 Olga Brani
2298 e4a6c3b8 Olga Brani
            // We don't need an array for one selects
2299 e4a6c3b8 Olga Brani
            if ( one ) {
2300 e4a6c3b8 Olga Brani
              return value;
2301 e4a6c3b8 Olga Brani
            }
2302 e4a6c3b8 Olga Brani
2303 e4a6c3b8 Olga Brani
            // Multi-Selects return an array
2304 e4a6c3b8 Olga Brani
            values.push( value );
2305 e4a6c3b8 Olga Brani
          }
2306 e4a6c3b8 Olga Brani
        }
2307 e4a6c3b8 Olga Brani
2308 e4a6c3b8 Olga Brani
        return values;
2309 e4a6c3b8 Olga Brani
      },
2310 e4a6c3b8 Olga Brani
2311 e4a6c3b8 Olga Brani
      set: function( elem, value ) {
2312 e4a6c3b8 Olga Brani
        var values = jQuery.makeArray( value );
2313 e4a6c3b8 Olga Brani
2314 e4a6c3b8 Olga Brani
        jQuery(elem).find("option").each(function() {
2315 e4a6c3b8 Olga Brani
          this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2316 e4a6c3b8 Olga Brani
        });
2317 e4a6c3b8 Olga Brani
2318 e4a6c3b8 Olga Brani
        if ( !values.length ) {
2319 e4a6c3b8 Olga Brani
          elem.selectedIndex = -1;
2320 e4a6c3b8 Olga Brani
        }
2321 e4a6c3b8 Olga Brani
        return values;
2322 e4a6c3b8 Olga Brani
      }
2323 e4a6c3b8 Olga Brani
    }
2324 e4a6c3b8 Olga Brani
  },
2325 e4a6c3b8 Olga Brani
2326 e4a6c3b8 Olga Brani
  attr: function( elem, name, value ) {
2327 e4a6c3b8 Olga Brani
    var hooks, notxml, ret,
2328 e4a6c3b8 Olga Brani
      nType = elem.nodeType;
2329 e4a6c3b8 Olga Brani
2330 e4a6c3b8 Olga Brani
    // don't get/set attributes on text, comment and attribute nodes
2331 e4a6c3b8 Olga Brani
    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2332 e4a6c3b8 Olga Brani
      return;
2333 e4a6c3b8 Olga Brani
    }
2334 e4a6c3b8 Olga Brani
2335 e4a6c3b8 Olga Brani
    // Fallback to prop when attributes are not supported
2336 e4a6c3b8 Olga Brani
    if ( typeof elem.getAttribute === core_strundefined ) {
2337 e4a6c3b8 Olga Brani
      return jQuery.prop( elem, name, value );
2338 e4a6c3b8 Olga Brani
    }
2339 e4a6c3b8 Olga Brani
2340 e4a6c3b8 Olga Brani
    notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2341 e4a6c3b8 Olga Brani
2342 e4a6c3b8 Olga Brani
    // All attributes are lowercase
2343 e4a6c3b8 Olga Brani
    // Grab necessary hook if one is defined
2344 e4a6c3b8 Olga Brani
    if ( notxml ) {
2345 e4a6c3b8 Olga Brani
      name = name.toLowerCase();
2346 e4a6c3b8 Olga Brani
      hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2347 e4a6c3b8 Olga Brani
    }
2348 e4a6c3b8 Olga Brani
2349 e4a6c3b8 Olga Brani
    if ( value !== undefined ) {
2350 e4a6c3b8 Olga Brani
2351 e4a6c3b8 Olga Brani
      if ( value === null ) {
2352 e4a6c3b8 Olga Brani
        jQuery.removeAttr( elem, name );
2353 e4a6c3b8 Olga Brani
2354 e4a6c3b8 Olga Brani
      } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2355 e4a6c3b8 Olga Brani
        return ret;
2356 e4a6c3b8 Olga Brani
2357 e4a6c3b8 Olga Brani
      } else {
2358 e4a6c3b8 Olga Brani
        elem.setAttribute( name, value + "" );
2359 e4a6c3b8 Olga Brani
        return value;
2360 e4a6c3b8 Olga Brani
      }
2361 e4a6c3b8 Olga Brani
2362 e4a6c3b8 Olga Brani
    } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2363 e4a6c3b8 Olga Brani
      return ret;
2364 e4a6c3b8 Olga Brani
2365 e4a6c3b8 Olga Brani
    } else {
2366 e4a6c3b8 Olga Brani
2367 e4a6c3b8 Olga Brani
      // In IE9+, Flash objects don't have .getAttribute (#12945)
2368 e4a6c3b8 Olga Brani
      // Support: IE9+
2369 e4a6c3b8 Olga Brani
      if ( typeof elem.getAttribute !== core_strundefined ) {
2370 e4a6c3b8 Olga Brani
        ret =  elem.getAttribute( name );
2371 e4a6c3b8 Olga Brani
      }
2372 e4a6c3b8 Olga Brani
2373 e4a6c3b8 Olga Brani
      // Non-existent attributes return null, we normalize to undefined
2374 e4a6c3b8 Olga Brani
      return ret == null ?
2375 e4a6c3b8 Olga Brani
        undefined :
2376 e4a6c3b8 Olga Brani
        ret;
2377 e4a6c3b8 Olga Brani
    }
2378 e4a6c3b8 Olga Brani
  },
2379 e4a6c3b8 Olga Brani
2380 e4a6c3b8 Olga Brani
  removeAttr: function( elem, value ) {
2381 e4a6c3b8 Olga Brani
    var name, propName,
2382 e4a6c3b8 Olga Brani
      i = 0,
2383 e4a6c3b8 Olga Brani
      attrNames = value && value.match( core_rnotwhite );
2384 e4a6c3b8 Olga Brani
2385 e4a6c3b8 Olga Brani
    if ( attrNames && elem.nodeType === 1 ) {
2386 e4a6c3b8 Olga Brani
      while ( (name = attrNames[i++]) ) {
2387 e4a6c3b8 Olga Brani
        propName = jQuery.propFix[ name ] || name;
2388 e4a6c3b8 Olga Brani
2389 e4a6c3b8 Olga Brani
        // Boolean attributes get special treatment (#10870)
2390 e4a6c3b8 Olga Brani
        if ( rboolean.test( name ) ) {
2391 e4a6c3b8 Olga Brani
          // Set corresponding property to false for boolean attributes
2392 e4a6c3b8 Olga Brani
          // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
2393 e4a6c3b8 Olga Brani
          if ( !getSetAttribute && ruseDefault.test( name ) ) {
2394 e4a6c3b8 Olga Brani
            elem[ jQuery.camelCase( "default-" + name ) ] =
2395 e4a6c3b8 Olga Brani
              elem[ propName ] = false;
2396 e4a6c3b8 Olga Brani
          } else {
2397 e4a6c3b8 Olga Brani
            elem[ propName ] = false;
2398 e4a6c3b8 Olga Brani
          }
2399 e4a6c3b8 Olga Brani
2400 e4a6c3b8 Olga Brani
        // See #9699 for explanation of this approach (setting first, then removal)
2401 e4a6c3b8 Olga Brani
        } else {
2402 e4a6c3b8 Olga Brani
          jQuery.attr( elem, name, "" );
2403 e4a6c3b8 Olga Brani
        }
2404 e4a6c3b8 Olga Brani
2405 e4a6c3b8 Olga Brani
        elem.removeAttribute( getSetAttribute ? name : propName );
2406 e4a6c3b8 Olga Brani
      }
2407 e4a6c3b8 Olga Brani
    }
2408 e4a6c3b8 Olga Brani
  },
2409 e4a6c3b8 Olga Brani
2410 e4a6c3b8 Olga Brani
  attrHooks: {
2411 e4a6c3b8 Olga Brani
    type: {
2412 e4a6c3b8 Olga Brani
      set: function( elem, value ) {
2413 e4a6c3b8 Olga Brani
        if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2414 e4a6c3b8 Olga Brani
          // Setting the type on a radio button after the value resets the value in IE6-9
2415 e4a6c3b8 Olga Brani
          // Reset value to default in case type is set after value during creation
2416 e4a6c3b8 Olga Brani
          var val = elem.value;
2417 e4a6c3b8 Olga Brani
          elem.setAttribute( "type", value );
2418 e4a6c3b8 Olga Brani
          if ( val ) {
2419 e4a6c3b8 Olga Brani
            elem.value = val;
2420 e4a6c3b8 Olga Brani
          }
2421 e4a6c3b8 Olga Brani
          return value;
2422 e4a6c3b8 Olga Brani
        }
2423 e4a6c3b8 Olga Brani
      }
2424 e4a6c3b8 Olga Brani
    }
2425 e4a6c3b8 Olga Brani
  },
2426 e4a6c3b8 Olga Brani
2427 e4a6c3b8 Olga Brani
  propFix: {
2428 e4a6c3b8 Olga Brani
    tabindex: "tabIndex",
2429 e4a6c3b8 Olga Brani
    readonly: "readOnly",
2430 e4a6c3b8 Olga Brani
    "for": "htmlFor",
2431 e4a6c3b8 Olga Brani
    "class": "className",
2432 e4a6c3b8 Olga Brani
    maxlength: "maxLength",
2433 e4a6c3b8 Olga Brani
    cellspacing: "cellSpacing",
2434 e4a6c3b8 Olga Brani
    cellpadding: "cellPadding",
2435 e4a6c3b8 Olga Brani
    rowspan: "rowSpan",
2436 e4a6c3b8 Olga Brani
    colspan: "colSpan",
2437 e4a6c3b8 Olga Brani
    usemap: "useMap",
2438 e4a6c3b8 Olga Brani
    frameborder: "frameBorder",
2439 e4a6c3b8 Olga Brani
    contenteditable: "contentEditable"
2440 e4a6c3b8 Olga Brani
  },
2441 e4a6c3b8 Olga Brani
2442 e4a6c3b8 Olga Brani
  prop: function( elem, name, value ) {
2443 e4a6c3b8 Olga Brani
    var ret, hooks, notxml,
2444 e4a6c3b8 Olga Brani
      nType = elem.nodeType;
2445 e4a6c3b8 Olga Brani
2446 e4a6c3b8 Olga Brani
    // don't get/set properties on text, comment and attribute nodes
2447 e4a6c3b8 Olga Brani
    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2448 e4a6c3b8 Olga Brani
      return;
2449 e4a6c3b8 Olga Brani
    }
2450 e4a6c3b8 Olga Brani
2451 e4a6c3b8 Olga Brani
    notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2452 e4a6c3b8 Olga Brani
2453 e4a6c3b8 Olga Brani
    if ( notxml ) {
2454 e4a6c3b8 Olga Brani
      // Fix name and attach hooks
2455 e4a6c3b8 Olga Brani
      name = jQuery.propFix[ name ] || name;
2456 e4a6c3b8 Olga Brani
      hooks = jQuery.propHooks[ name ];
2457 e4a6c3b8 Olga Brani
    }
2458 e4a6c3b8 Olga Brani
2459 e4a6c3b8 Olga Brani
    if ( value !== undefined ) {
2460 e4a6c3b8 Olga Brani
      if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2461 e4a6c3b8 Olga Brani
        return ret;
2462 e4a6c3b8 Olga Brani
2463 e4a6c3b8 Olga Brani
      } else {
2464 e4a6c3b8 Olga Brani
        return ( elem[ name ] = value );
2465 e4a6c3b8 Olga Brani
      }
2466 e4a6c3b8 Olga Brani
2467 e4a6c3b8 Olga Brani
    } else {
2468 e4a6c3b8 Olga Brani
      if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2469 e4a6c3b8 Olga Brani
        return ret;
2470 e4a6c3b8 Olga Brani
2471 e4a6c3b8 Olga Brani
      } else {
2472 e4a6c3b8 Olga Brani
        return elem[ name ];
2473 e4a6c3b8 Olga Brani
      }
2474 e4a6c3b8 Olga Brani
    }
2475 e4a6c3b8 Olga Brani
  },
2476 e4a6c3b8 Olga Brani
2477 e4a6c3b8 Olga Brani
  propHooks: {
2478 e4a6c3b8 Olga Brani
    tabIndex: {
2479 e4a6c3b8 Olga Brani
      get: function( elem ) {
2480 e4a6c3b8 Olga Brani
        // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2481 e4a6c3b8 Olga Brani
        // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2482 e4a6c3b8 Olga Brani
        var attributeNode = elem.getAttributeNode("tabindex");
2483 e4a6c3b8 Olga Brani
2484 e4a6c3b8 Olga Brani
        return attributeNode && attributeNode.specified ?
2485 e4a6c3b8 Olga Brani
          parseInt( attributeNode.value, 10 ) :
2486 e4a6c3b8 Olga Brani
          rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2487 e4a6c3b8 Olga Brani
            0 :
2488 e4a6c3b8 Olga Brani
            undefined;
2489 e4a6c3b8 Olga Brani
      }
2490 e4a6c3b8 Olga Brani
    }
2491 e4a6c3b8 Olga Brani
  }
2492 e4a6c3b8 Olga Brani
});
2493 e4a6c3b8 Olga Brani
2494 e4a6c3b8 Olga Brani
// Hook for boolean attributes
2495 e4a6c3b8 Olga Brani
boolHook = {
2496 e4a6c3b8 Olga Brani
  get: function( elem, name ) {
2497 e4a6c3b8 Olga Brani
    var
2498 e4a6c3b8 Olga Brani
      // Use .prop to determine if this attribute is understood as boolean
2499 e4a6c3b8 Olga Brani
      prop = jQuery.prop( elem, name ),
2500 e4a6c3b8 Olga Brani
2501 e4a6c3b8 Olga Brani
      // Fetch it accordingly
2502 e4a6c3b8 Olga Brani
      attr = typeof prop === "boolean" && elem.getAttribute( name ),
2503 e4a6c3b8 Olga Brani
      detail = typeof prop === "boolean" ?
2504 e4a6c3b8 Olga Brani
2505 e4a6c3b8 Olga Brani
        getSetInput && getSetAttribute ?
2506 e4a6c3b8 Olga Brani
          attr != null :
2507 e4a6c3b8 Olga Brani
          // oldIE fabricates an empty string for missing boolean attributes
2508 e4a6c3b8 Olga Brani
          // and conflates checked/selected into attroperties
2509 e4a6c3b8 Olga Brani
          ruseDefault.test( name ) ?
2510 e4a6c3b8 Olga Brani
            elem[ jQuery.camelCase( "default-" + name ) ] :
2511 e4a6c3b8 Olga Brani
            !!attr :
2512 e4a6c3b8 Olga Brani
2513 e4a6c3b8 Olga Brani
        // fetch an attribute node for properties not recognized as boolean
2514 e4a6c3b8 Olga Brani
        elem.getAttributeNode( name );
2515 e4a6c3b8 Olga Brani
2516 e4a6c3b8 Olga Brani
    return detail && detail.value !== false ?
2517 e4a6c3b8 Olga Brani
      name.toLowerCase() :
2518 e4a6c3b8 Olga Brani
      undefined;
2519 e4a6c3b8 Olga Brani
  },
2520 e4a6c3b8 Olga Brani
  set: function( elem, value, name ) {
2521 e4a6c3b8 Olga Brani
    if ( value === false ) {
2522 e4a6c3b8 Olga Brani
      // Remove boolean attributes when set to false
2523 e4a6c3b8 Olga Brani
      jQuery.removeAttr( elem, name );
2524 e4a6c3b8 Olga Brani
    } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
2525 e4a6c3b8 Olga Brani
      // IE<8 needs the *property* name
2526 e4a6c3b8 Olga Brani
      elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
2527 e4a6c3b8 Olga Brani
2528 e4a6c3b8 Olga Brani
    // Use defaultChecked and defaultSelected for oldIE
2529 e4a6c3b8 Olga Brani
    } else {
2530 e4a6c3b8 Olga Brani
      elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
2531 e4a6c3b8 Olga Brani
    }
2532 e4a6c3b8 Olga Brani
2533 e4a6c3b8 Olga Brani
    return name;
2534 e4a6c3b8 Olga Brani
  }
2535 e4a6c3b8 Olga Brani
};
2536 e4a6c3b8 Olga Brani
2537 e4a6c3b8 Olga Brani
// fix oldIE value attroperty
2538 e4a6c3b8 Olga Brani
if ( !getSetInput || !getSetAttribute ) {
2539 e4a6c3b8 Olga Brani
  jQuery.attrHooks.value = {
2540 e4a6c3b8 Olga Brani
    get: function( elem, name ) {
2541 e4a6c3b8 Olga Brani
      var ret = elem.getAttributeNode( name );
2542 e4a6c3b8 Olga Brani
      return jQuery.nodeName( elem, "input" ) ?
2543 e4a6c3b8 Olga Brani
2544 e4a6c3b8 Olga Brani
        // Ignore the value *property* by using defaultValue
2545 e4a6c3b8 Olga Brani
        elem.defaultValue :
2546 e4a6c3b8 Olga Brani
2547 e4a6c3b8 Olga Brani
        ret && ret.specified ? ret.value : undefined;
2548 e4a6c3b8 Olga Brani
    },
2549 e4a6c3b8 Olga Brani
    set: function( elem, value, name ) {
2550 e4a6c3b8 Olga Brani
      if ( jQuery.nodeName( elem, "input" ) ) {
2551 e4a6c3b8 Olga Brani
        // Does not return so that setAttribute is also used
2552 e4a6c3b8 Olga Brani
        elem.defaultValue = value;
2553 e4a6c3b8 Olga Brani
      } else {
2554 e4a6c3b8 Olga Brani
        // Use nodeHook if defined (#1954); otherwise setAttribute is fine
2555 e4a6c3b8 Olga Brani
        return nodeHook && nodeHook.set( elem, value, name );
2556 e4a6c3b8 Olga Brani
      }
2557 e4a6c3b8 Olga Brani
    }
2558 e4a6c3b8 Olga Brani
  };
2559 e4a6c3b8 Olga Brani
}
2560 e4a6c3b8 Olga Brani
2561 e4a6c3b8 Olga Brani
// IE6/7 do not support getting/setting some attributes with get/setAttribute
2562 e4a6c3b8 Olga Brani
if ( !getSetAttribute ) {
2563 e4a6c3b8 Olga Brani
2564 e4a6c3b8 Olga Brani
  // Use this for any attribute in IE6/7
2565 e4a6c3b8 Olga Brani
  // This fixes almost every IE6/7 issue
2566 e4a6c3b8 Olga Brani
  nodeHook = jQuery.valHooks.button = {
2567 e4a6c3b8 Olga Brani
    get: function( elem, name ) {
2568 e4a6c3b8 Olga Brani
      var ret = elem.getAttributeNode( name );
2569 e4a6c3b8 Olga Brani
      return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
2570 e4a6c3b8 Olga Brani
        ret.value :
2571 e4a6c3b8 Olga Brani
        undefined;
2572 e4a6c3b8 Olga Brani
    },
2573 e4a6c3b8 Olga Brani
    set: function( elem, value, name ) {
2574 e4a6c3b8 Olga Brani
      // Set the existing or create a new attribute node
2575 e4a6c3b8 Olga Brani
      var ret = elem.getAttributeNode( name );
2576 e4a6c3b8 Olga Brani
      if ( !ret ) {
2577 e4a6c3b8 Olga Brani
        elem.setAttributeNode(
2578 e4a6c3b8 Olga Brani
          (ret = elem.ownerDocument.createAttribute( name ))
2579 e4a6c3b8 Olga Brani
        );
2580 e4a6c3b8 Olga Brani
      }
2581 e4a6c3b8 Olga Brani
2582 e4a6c3b8 Olga Brani
      ret.value = value += "";
2583 e4a6c3b8 Olga Brani
2584 e4a6c3b8 Olga Brani
      // Break association with cloned elements by also using setAttribute (#9646)
2585 e4a6c3b8 Olga Brani
      return name === "value" || value === elem.getAttribute( name ) ?
2586 e4a6c3b8 Olga Brani
        value :
2587 e4a6c3b8 Olga Brani
        undefined;
2588 e4a6c3b8 Olga Brani
    }
2589 e4a6c3b8 Olga Brani
  };
2590 e4a6c3b8 Olga Brani
2591 e4a6c3b8 Olga Brani
  // Set contenteditable to false on removals(#10429)
2592 e4a6c3b8 Olga Brani
  // Setting to empty string throws an error as an invalid value
2593 e4a6c3b8 Olga Brani
  jQuery.attrHooks.contenteditable = {
2594 e4a6c3b8 Olga Brani
    get: nodeHook.get,
2595 e4a6c3b8 Olga Brani
    set: function( elem, value, name ) {
2596 e4a6c3b8 Olga Brani
      nodeHook.set( elem, value === "" ? false : value, name );
2597 e4a6c3b8 Olga Brani
    }
2598 e4a6c3b8 Olga Brani
  };
2599 e4a6c3b8 Olga Brani
2600 e4a6c3b8 Olga Brani
  // Set width and height to auto instead of 0 on empty string( Bug #8150 )
2601 e4a6c3b8 Olga Brani
  // This is for removals
2602 e4a6c3b8 Olga Brani
  jQuery.each([ "width", "height" ], function( i, name ) {
2603 e4a6c3b8 Olga Brani
    jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2604 e4a6c3b8 Olga Brani
      set: function( elem, value ) {
2605 e4a6c3b8 Olga Brani
        if ( value === "" ) {
2606 e4a6c3b8 Olga Brani
          elem.setAttribute( name, "auto" );
2607 e4a6c3b8 Olga Brani
          return value;
2608 e4a6c3b8 Olga Brani
        }
2609 e4a6c3b8 Olga Brani
      }
2610 e4a6c3b8 Olga Brani
    });
2611 e4a6c3b8 Olga Brani
  });
2612 e4a6c3b8 Olga Brani
}
2613 e4a6c3b8 Olga Brani
2614 e4a6c3b8 Olga Brani
2615 e4a6c3b8 Olga Brani
// Some attributes require a special call on IE
2616 e4a6c3b8 Olga Brani
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2617 e4a6c3b8 Olga Brani
if ( !jQuery.support.hrefNormalized ) {
2618 e4a6c3b8 Olga Brani
  jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2619 e4a6c3b8 Olga Brani
    jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2620 e4a6c3b8 Olga Brani
      get: function( elem ) {
2621 e4a6c3b8 Olga Brani
        var ret = elem.getAttribute( name, 2 );
2622 e4a6c3b8 Olga Brani
        return ret == null ? undefined : ret;
2623 e4a6c3b8 Olga Brani
      }
2624 e4a6c3b8 Olga Brani
    });
2625 e4a6c3b8 Olga Brani
  });
2626 e4a6c3b8 Olga Brani
2627 e4a6c3b8 Olga Brani
  // href/src property should get the full normalized URL (#10299/#12915)
2628 e4a6c3b8 Olga Brani
  jQuery.each([ "href", "src" ], function( i, name ) {
2629 e4a6c3b8 Olga Brani
    jQuery.propHooks[ name ] = {
2630 e4a6c3b8 Olga Brani
      get: function( elem ) {
2631 e4a6c3b8 Olga Brani
        return elem.getAttribute( name, 4 );
2632 e4a6c3b8 Olga Brani
      }
2633 e4a6c3b8 Olga Brani
    };
2634 e4a6c3b8 Olga Brani
  });
2635 e4a6c3b8 Olga Brani
}
2636 e4a6c3b8 Olga Brani
2637 e4a6c3b8 Olga Brani
if ( !jQuery.support.style ) {
2638 e4a6c3b8 Olga Brani
  jQuery.attrHooks.style = {
2639 e4a6c3b8 Olga Brani
    get: function( elem ) {
2640 e4a6c3b8 Olga Brani
      // Return undefined in the case of empty string
2641 e4a6c3b8 Olga Brani
      // Note: IE uppercases css property names, but if we were to .toLowerCase()
2642 e4a6c3b8 Olga Brani
      // .cssText, that would destroy case senstitivity in URL's, like in "background"
2643 e4a6c3b8 Olga Brani
      return elem.style.cssText || undefined;
2644 e4a6c3b8 Olga Brani
    },
2645 e4a6c3b8 Olga Brani
    set: function( elem, value ) {
2646 e4a6c3b8 Olga Brani
      return ( elem.style.cssText = value + "" );
2647 e4a6c3b8 Olga Brani
    }
2648 e4a6c3b8 Olga Brani
  };
2649 e4a6c3b8 Olga Brani
}
2650 e4a6c3b8 Olga Brani
2651 e4a6c3b8 Olga Brani
// Safari mis-reports the default selected property of an option
2652 e4a6c3b8 Olga Brani
// Accessing the parent's selectedIndex property fixes it
2653 e4a6c3b8 Olga Brani
if ( !jQuery.support.optSelected ) {
2654 e4a6c3b8 Olga Brani
  jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2655 e4a6c3b8 Olga Brani
    get: function( elem ) {
2656 e4a6c3b8 Olga Brani
      var parent = elem.parentNode;
2657 e4a6c3b8 Olga Brani
2658 e4a6c3b8 Olga Brani
      if ( parent ) {
2659 e4a6c3b8 Olga Brani
        parent.selectedIndex;
2660 e4a6c3b8 Olga Brani
2661 e4a6c3b8 Olga Brani
        // Make sure that it also works with optgroups, see #5701
2662 e4a6c3b8 Olga Brani
        if ( parent.parentNode ) {
2663 e4a6c3b8 Olga Brani
          parent.parentNode.selectedIndex;
2664 e4a6c3b8 Olga Brani
        }
2665 e4a6c3b8 Olga Brani
      }
2666 e4a6c3b8 Olga Brani
      return null;
2667 e4a6c3b8 Olga Brani
    }
2668 e4a6c3b8 Olga Brani
  });
2669 e4a6c3b8 Olga Brani
}
2670 e4a6c3b8 Olga Brani
2671 e4a6c3b8 Olga Brani
// IE6/7 call enctype encoding
2672 e4a6c3b8 Olga Brani
if ( !jQuery.support.enctype ) {
2673 e4a6c3b8 Olga Brani
  jQuery.propFix.enctype = "encoding";
2674 e4a6c3b8 Olga Brani
}
2675 e4a6c3b8 Olga Brani
2676 e4a6c3b8 Olga Brani
// Radios and checkboxes getter/setter
2677 e4a6c3b8 Olga Brani
if ( !jQuery.support.checkOn ) {
2678 e4a6c3b8 Olga Brani
  jQuery.each([ "radio", "checkbox" ], function() {
2679 e4a6c3b8 Olga Brani
    jQuery.valHooks[ this ] = {
2680 e4a6c3b8 Olga Brani
      get: function( elem ) {
2681 e4a6c3b8 Olga Brani
        // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2682 e4a6c3b8 Olga Brani
        return elem.getAttribute("value") === null ? "on" : elem.value;
2683 e4a6c3b8 Olga Brani
      }
2684 e4a6c3b8 Olga Brani
    };
2685 e4a6c3b8 Olga Brani
  });
2686 e4a6c3b8 Olga Brani
}
2687 e4a6c3b8 Olga Brani
jQuery.each([ "radio", "checkbox" ], function() {
2688 e4a6c3b8 Olga Brani
  jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2689 e4a6c3b8 Olga Brani
    set: function( elem, value ) {
2690 e4a6c3b8 Olga Brani
      if ( jQuery.isArray( value ) ) {
2691 e4a6c3b8 Olga Brani
        return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2692 e4a6c3b8 Olga Brani
      }
2693 e4a6c3b8 Olga Brani
    }
2694 e4a6c3b8 Olga Brani
  });
2695 e4a6c3b8 Olga Brani
});
2696 e4a6c3b8 Olga Brani
var rformElems = /^(?:input|select|textarea)$/i,
2697 e4a6c3b8 Olga Brani
  rkeyEvent = /^key/,
2698 e4a6c3b8 Olga Brani
  rmouseEvent = /^(?:mouse|contextmenu)|click/,
2699 e4a6c3b8 Olga Brani
  rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
2700 e4a6c3b8 Olga Brani
  rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
2701 e4a6c3b8 Olga Brani
2702 e4a6c3b8 Olga Brani
function returnTrue() {
2703 e4a6c3b8 Olga Brani
  return true;
2704 e4a6c3b8 Olga Brani
}
2705 e4a6c3b8 Olga Brani
2706 e4a6c3b8 Olga Brani
function returnFalse() {
2707 e4a6c3b8 Olga Brani
  return false;
2708 e4a6c3b8 Olga Brani
}
2709 e4a6c3b8 Olga Brani
2710 e4a6c3b8 Olga Brani
/*
2711 e4a6c3b8 Olga Brani
 * Helper functions for managing events -- not part of the public interface.
2712 e4a6c3b8 Olga Brani
 * Props to Dean Edwards' addEvent library for many of the ideas.
2713 e4a6c3b8 Olga Brani
 */
2714 e4a6c3b8 Olga Brani
jQuery.event = {
2715 e4a6c3b8 Olga Brani
2716 e4a6c3b8 Olga Brani
  global: {},
2717 e4a6c3b8 Olga Brani
2718 e4a6c3b8 Olga Brani
  add: function( elem, types, handler, data, selector ) {
2719 e4a6c3b8 Olga Brani
    var tmp, events, t, handleObjIn,
2720 e4a6c3b8 Olga Brani
      special, eventHandle, handleObj,
2721 e4a6c3b8 Olga Brani
      handlers, type, namespaces, origType,
2722 e4a6c3b8 Olga Brani
      elemData = jQuery._data( elem );
2723 e4a6c3b8 Olga Brani
2724 e4a6c3b8 Olga Brani
    // Don't attach events to noData or text/comment nodes (but allow plain objects)
2725 e4a6c3b8 Olga Brani
    if ( !elemData ) {
2726 e4a6c3b8 Olga Brani
      return;
2727 e4a6c3b8 Olga Brani
    }
2728 e4a6c3b8 Olga Brani
2729 e4a6c3b8 Olga Brani
    // Caller can pass in an object of custom data in lieu of the handler
2730 e4a6c3b8 Olga Brani
    if ( handler.handler ) {
2731 e4a6c3b8 Olga Brani
      handleObjIn = handler;
2732 e4a6c3b8 Olga Brani
      handler = handleObjIn.handler;
2733 e4a6c3b8 Olga Brani
      selector = handleObjIn.selector;
2734 e4a6c3b8 Olga Brani
    }
2735 e4a6c3b8 Olga Brani
2736 e4a6c3b8 Olga Brani
    // Make sure that the handler has a unique ID, used to find/remove it later
2737 e4a6c3b8 Olga Brani
    if ( !handler.guid ) {
2738 e4a6c3b8 Olga Brani
      handler.guid = jQuery.guid++;
2739 e4a6c3b8 Olga Brani
    }
2740 e4a6c3b8 Olga Brani
2741 e4a6c3b8 Olga Brani
    // Init the element's event structure and main handler, if this is the first
2742 e4a6c3b8 Olga Brani
    if ( !(events = elemData.events) ) {
2743 e4a6c3b8 Olga Brani
      events = elemData.events = {};
2744 e4a6c3b8 Olga Brani
    }
2745 e4a6c3b8 Olga Brani
    if ( !(eventHandle = elemData.handle) ) {
2746 e4a6c3b8 Olga Brani
      eventHandle = elemData.handle = function( e ) {
2747 e4a6c3b8 Olga Brani
        // Discard the second event of a jQuery.event.trigger() and
2748 e4a6c3b8 Olga Brani
        // when an event is called after a page has unloaded
2749 e4a6c3b8 Olga Brani
        return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
2750 e4a6c3b8 Olga Brani
          jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2751 e4a6c3b8 Olga Brani
          undefined;
2752 e4a6c3b8 Olga Brani
      };
2753 e4a6c3b8 Olga Brani
      // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2754 e4a6c3b8 Olga Brani
      eventHandle.elem = elem;
2755 e4a6c3b8 Olga Brani
    }
2756 e4a6c3b8 Olga Brani
2757 e4a6c3b8 Olga Brani
    // Handle multiple events separated by a space
2758 e4a6c3b8 Olga Brani
    // jQuery(...).bind("mouseover mouseout", fn);
2759 e4a6c3b8 Olga Brani
    types = ( types || "" ).match( core_rnotwhite ) || [""];
2760 e4a6c3b8 Olga Brani
    t = types.length;
2761 e4a6c3b8 Olga Brani
    while ( t-- ) {
2762 e4a6c3b8 Olga Brani
      tmp = rtypenamespace.exec( types[t] ) || [];
2763 e4a6c3b8 Olga Brani
      type = origType = tmp[1];
2764 e4a6c3b8 Olga Brani
      namespaces = ( tmp[2] || "" ).split( "." ).sort();
2765 e4a6c3b8 Olga Brani
2766 e4a6c3b8 Olga Brani
      // If event changes its type, use the special event handlers for the changed type
2767 e4a6c3b8 Olga Brani
      special = jQuery.event.special[ type ] || {};
2768 e4a6c3b8 Olga Brani
2769 e4a6c3b8 Olga Brani
      // If selector defined, determine special event api type, otherwise given type
2770 e4a6c3b8 Olga Brani
      type = ( selector ? special.delegateType : special.bindType ) || type;
2771 e4a6c3b8 Olga Brani
2772 e4a6c3b8 Olga Brani
      // Update special based on newly reset type
2773 e4a6c3b8 Olga Brani
      special = jQuery.event.special[ type ] || {};
2774 e4a6c3b8 Olga Brani
2775 e4a6c3b8 Olga Brani
      // handleObj is passed to all event handlers
2776 e4a6c3b8 Olga Brani
      handleObj = jQuery.extend({
2777 e4a6c3b8 Olga Brani
        type: type,
2778 e4a6c3b8 Olga Brani
        origType: origType,
2779 e4a6c3b8 Olga Brani
        data: data,
2780 e4a6c3b8 Olga Brani
        handler: handler,
2781 e4a6c3b8 Olga Brani
        guid: handler.guid,
2782 e4a6c3b8 Olga Brani
        selector: selector,
2783 e4a6c3b8 Olga Brani
        needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
2784 e4a6c3b8 Olga Brani
        namespace: namespaces.join(".")
2785 e4a6c3b8 Olga Brani
      }, handleObjIn );
2786 e4a6c3b8 Olga Brani
2787 e4a6c3b8 Olga Brani
      // Init the event handler queue if we're the first
2788 e4a6c3b8 Olga Brani
      if ( !(handlers = events[ type ]) ) {
2789 e4a6c3b8 Olga Brani
        handlers = events[ type ] = [];
2790 e4a6c3b8 Olga Brani
        handlers.delegateCount = 0;
2791 e4a6c3b8 Olga Brani
2792 e4a6c3b8 Olga Brani
        // Only use addEventListener/attachEvent if the special events handler returns false
2793 e4a6c3b8 Olga Brani
        if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2794 e4a6c3b8 Olga Brani
          // Bind the global event handler to the element
2795 e4a6c3b8 Olga Brani
          if ( elem.addEventListener ) {
2796 e4a6c3b8 Olga Brani
            elem.addEventListener( type, eventHandle, false );
2797 e4a6c3b8 Olga Brani
2798 e4a6c3b8 Olga Brani
          } else if ( elem.attachEvent ) {
2799 e4a6c3b8 Olga Brani
            elem.attachEvent( "on" + type, eventHandle );
2800 e4a6c3b8 Olga Brani
          }
2801 e4a6c3b8 Olga Brani
        }
2802 e4a6c3b8 Olga Brani
      }
2803 e4a6c3b8 Olga Brani
2804 e4a6c3b8 Olga Brani
      if ( special.add ) {
2805 e4a6c3b8 Olga Brani
        special.add.call( elem, handleObj );
2806 e4a6c3b8 Olga Brani
2807 e4a6c3b8 Olga Brani
        if ( !handleObj.handler.guid ) {
2808 e4a6c3b8 Olga Brani
          handleObj.handler.guid = handler.guid;
2809 e4a6c3b8 Olga Brani
        }
2810 e4a6c3b8 Olga Brani
      }
2811 e4a6c3b8 Olga Brani
2812 e4a6c3b8 Olga Brani
      // Add to the element's handler list, delegates in front
2813 e4a6c3b8 Olga Brani
      if ( selector ) {
2814 e4a6c3b8 Olga Brani
        handlers.splice( handlers.delegateCount++, 0, handleObj );
2815 e4a6c3b8 Olga Brani
      } else {
2816 e4a6c3b8 Olga Brani
        handlers.push( handleObj );
2817 e4a6c3b8 Olga Brani
      }
2818 e4a6c3b8 Olga Brani
2819 e4a6c3b8 Olga Brani
      // Keep track of which events have ever been used, for event optimization
2820 e4a6c3b8 Olga Brani
      jQuery.event.global[ type ] = true;
2821 e4a6c3b8 Olga Brani
    }
2822 e4a6c3b8 Olga Brani
2823 e4a6c3b8 Olga Brani
    // Nullify elem to prevent memory leaks in IE
2824 e4a6c3b8 Olga Brani
    elem = null;
2825 e4a6c3b8 Olga Brani
  },
2826 e4a6c3b8 Olga Brani
2827 e4a6c3b8 Olga Brani
  // Detach an event or set of events from an element
2828 e4a6c3b8 Olga Brani
  remove: function( elem, types, handler, selector, mappedTypes ) {
2829 e4a6c3b8 Olga Brani
    var j, handleObj, tmp,
2830 e4a6c3b8 Olga Brani
      origCount, t, events,
2831 e4a6c3b8 Olga Brani
      special, handlers, type,
2832 e4a6c3b8 Olga Brani
      namespaces, origType,
2833 e4a6c3b8 Olga Brani
      elemData = jQuery.hasData( elem ) && jQuery._data( elem );
2834 e4a6c3b8 Olga Brani
2835 e4a6c3b8 Olga Brani
    if ( !elemData || !(events = elemData.events) ) {
2836 e4a6c3b8 Olga Brani
      return;
2837 e4a6c3b8 Olga Brani
    }
2838 e4a6c3b8 Olga Brani
2839 e4a6c3b8 Olga Brani
    // Once for each type.namespace in types; type may be omitted
2840 e4a6c3b8 Olga Brani
    types = ( types || "" ).match( core_rnotwhite ) || [""];
2841 e4a6c3b8 Olga Brani
    t = types.length;
2842 e4a6c3b8 Olga Brani
    while ( t-- ) {
2843 e4a6c3b8 Olga Brani
      tmp = rtypenamespace.exec( types[t] ) || [];
2844 e4a6c3b8 Olga Brani
      type = origType = tmp[1];
2845 e4a6c3b8 Olga Brani
      namespaces = ( tmp[2] || "" ).split( "." ).sort();
2846 e4a6c3b8 Olga Brani
2847 e4a6c3b8 Olga Brani
      // Unbind all events (on this namespace, if provided) for the element
2848 e4a6c3b8 Olga Brani
      if ( !type ) {
2849 e4a6c3b8 Olga Brani
        for ( type in events ) {
2850 e4a6c3b8 Olga Brani
          jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
2851 e4a6c3b8 Olga Brani
        }
2852 e4a6c3b8 Olga Brani
        continue;
2853 e4a6c3b8 Olga Brani
      }
2854 e4a6c3b8 Olga Brani
2855 e4a6c3b8 Olga Brani
      special = jQuery.event.special[ type ] || {};
2856 e4a6c3b8 Olga Brani
      type = ( selector ? special.delegateType : special.bindType ) || type;
2857 e4a6c3b8 Olga Brani
      handlers = events[ type ] || [];
2858 e4a6c3b8 Olga Brani
      tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
2859 e4a6c3b8 Olga Brani
2860 e4a6c3b8 Olga Brani
      // Remove matching events
2861 e4a6c3b8 Olga Brani
      origCount = j = handlers.length;
2862 e4a6c3b8 Olga Brani
      while ( j-- ) {
2863 e4a6c3b8 Olga Brani
        handleObj = handlers[ j ];
2864 e4a6c3b8 Olga Brani
2865 e4a6c3b8 Olga Brani
        if ( ( mappedTypes || origType === handleObj.origType ) &&
2866 e4a6c3b8 Olga Brani
          ( !handler || handler.guid === handleObj.guid ) &&
2867 e4a6c3b8 Olga Brani
          ( !tmp || tmp.test( handleObj.namespace ) ) &&
2868 e4a6c3b8 Olga Brani
          ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
2869 e4a6c3b8 Olga Brani
          handlers.splice( j, 1 );
2870 e4a6c3b8 Olga Brani
2871 e4a6c3b8 Olga Brani
          if ( handleObj.selector ) {
2872 e4a6c3b8 Olga Brani
            handlers.delegateCount--;
2873 e4a6c3b8 Olga Brani
          }
2874 e4a6c3b8 Olga Brani
          if ( special.remove ) {
2875 e4a6c3b8 Olga Brani
            special.remove.call( elem, handleObj );
2876 e4a6c3b8 Olga Brani
          }
2877 e4a6c3b8 Olga Brani
        }
2878 e4a6c3b8 Olga Brani
      }
2879 e4a6c3b8 Olga Brani
2880 e4a6c3b8 Olga Brani
      // Remove generic event handler if we removed something and no more handlers exist
2881 e4a6c3b8 Olga Brani
      // (avoids potential for endless recursion during removal of special event handlers)
2882 e4a6c3b8 Olga Brani
      if ( origCount && !handlers.length ) {
2883 e4a6c3b8 Olga Brani
        if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
2884 e4a6c3b8 Olga Brani
          jQuery.removeEvent( elem, type, elemData.handle );
2885 e4a6c3b8 Olga Brani
        }
2886 e4a6c3b8 Olga Brani
2887 e4a6c3b8 Olga Brani
        delete events[ type ];
2888 e4a6c3b8 Olga Brani
      }
2889 e4a6c3b8 Olga Brani
    }
2890 e4a6c3b8 Olga Brani
2891 e4a6c3b8 Olga Brani
    // Remove the expando if it's no longer used
2892 e4a6c3b8 Olga Brani
    if ( jQuery.isEmptyObject( events ) ) {
2893 e4a6c3b8 Olga Brani
      delete elemData.handle;
2894 e4a6c3b8 Olga Brani
2895 e4a6c3b8 Olga Brani
      // removeData also checks for emptiness and clears the expando if empty
2896 e4a6c3b8 Olga Brani
      // so use it instead of delete
2897 e4a6c3b8 Olga Brani
      jQuery._removeData( elem, "events" );
2898 e4a6c3b8 Olga Brani
    }
2899 e4a6c3b8 Olga Brani
  },
2900 e4a6c3b8 Olga Brani
2901 e4a6c3b8 Olga Brani
  trigger: function( event, data, elem, onlyHandlers ) {
2902 e4a6c3b8 Olga Brani
    var handle, ontype, cur,
2903 e4a6c3b8 Olga Brani
      bubbleType, special, tmp, i,
2904 e4a6c3b8 Olga Brani
      eventPath = [ elem || document ],
2905 e4a6c3b8 Olga Brani
      type = core_hasOwn.call( event, "type" ) ? event.type : event,
2906 e4a6c3b8 Olga Brani
      namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
2907 e4a6c3b8 Olga Brani
2908 e4a6c3b8 Olga Brani
    cur = tmp = elem = elem || document;
2909 e4a6c3b8 Olga Brani
2910 e4a6c3b8 Olga Brani
    // Don't do events on text and comment nodes
2911 e4a6c3b8 Olga Brani
    if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2912 e4a6c3b8 Olga Brani
      return;
2913 e4a6c3b8 Olga Brani
    }
2914 e4a6c3b8 Olga Brani
2915 e4a6c3b8 Olga Brani
    // focus/blur morphs to focusin/out; ensure we're not firing them right now
2916 e4a6c3b8 Olga Brani
    if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
2917 e4a6c3b8 Olga Brani
      return;
2918 e4a6c3b8 Olga Brani
    }
2919 e4a6c3b8 Olga Brani
2920 e4a6c3b8 Olga Brani
    if ( type.indexOf(".") >= 0 ) {
2921 e4a6c3b8 Olga Brani
      // Namespaced trigger; create a regexp to match event type in handle()
2922 e4a6c3b8 Olga Brani
      namespaces = type.split(".");
2923 e4a6c3b8 Olga Brani
      type = namespaces.shift();
2924 e4a6c3b8 Olga Brani
      namespaces.sort();
2925 e4a6c3b8 Olga Brani
    }
2926 e4a6c3b8 Olga Brani
    ontype = type.indexOf(":") < 0 && "on" + type;
2927 e4a6c3b8 Olga Brani
2928 e4a6c3b8 Olga Brani
    // Caller can pass in a jQuery.Event object, Object, or just an event type string
2929 e4a6c3b8 Olga Brani
    event = event[ jQuery.expando ] ?
2930 e4a6c3b8 Olga Brani
      event :
2931 e4a6c3b8 Olga Brani
      new jQuery.Event( type, typeof event === "object" && event );
2932 e4a6c3b8 Olga Brani
2933 e4a6c3b8 Olga Brani
    event.isTrigger = true;
2934 e4a6c3b8 Olga Brani
    event.namespace = namespaces.join(".");
2935 e4a6c3b8 Olga Brani
    event.namespace_re = event.namespace ?
2936 e4a6c3b8 Olga Brani
      new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
2937 e4a6c3b8 Olga Brani
      null;
2938 e4a6c3b8 Olga Brani
2939 e4a6c3b8 Olga Brani
    // Clean up the event in case it is being reused
2940 e4a6c3b8 Olga Brani
    event.result = undefined;
2941 e4a6c3b8 Olga Brani
    if ( !event.target ) {
2942 e4a6c3b8 Olga Brani
      event.target = elem;
2943 e4a6c3b8 Olga Brani
    }
2944 e4a6c3b8 Olga Brani
2945 e4a6c3b8 Olga Brani
    // Clone any incoming data and prepend the event, creating the handler arg list
2946 e4a6c3b8 Olga Brani
    data = data == null ?
2947 e4a6c3b8 Olga Brani
      [ event ] :
2948 e4a6c3b8 Olga Brani
      jQuery.makeArray( data, [ event ] );
2949 e4a6c3b8 Olga Brani
2950 e4a6c3b8 Olga Brani
    // Allow special events to draw outside the lines
2951 e4a6c3b8 Olga Brani
    special = jQuery.event.special[ type ] || {};
2952 e4a6c3b8 Olga Brani
    if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
2953 e4a6c3b8 Olga Brani
      return;
2954 e4a6c3b8 Olga Brani
    }
2955 e4a6c3b8 Olga Brani
2956 e4a6c3b8 Olga Brani
    // Determine event propagation path in advance, per W3C events spec (#9951)
2957 e4a6c3b8 Olga Brani
    // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
2958 e4a6c3b8 Olga Brani
    if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
2959 e4a6c3b8 Olga Brani
2960 e4a6c3b8 Olga Brani
      bubbleType = special.delegateType || type;
2961 e4a6c3b8 Olga Brani
      if ( !rfocusMorph.test( bubbleType + type ) ) {
2962 e4a6c3b8 Olga Brani
        cur = cur.parentNode;
2963 e4a6c3b8 Olga Brani
      }
2964 e4a6c3b8 Olga Brani
      for ( ; cur; cur = cur.parentNode ) {
2965 e4a6c3b8 Olga Brani
        eventPath.push( cur );
2966 e4a6c3b8 Olga Brani
        tmp = cur;
2967 e4a6c3b8 Olga Brani
      }
2968 e4a6c3b8 Olga Brani
2969 e4a6c3b8 Olga Brani
      // Only add window if we got to document (e.g., not plain obj or detached DOM)
2970 e4a6c3b8 Olga Brani
      if ( tmp === (elem.ownerDocument || document) ) {
2971 e4a6c3b8 Olga Brani
        eventPath.push( tmp.defaultView || tmp.parentWindow || window );
2972 e4a6c3b8 Olga Brani
      }
2973 e4a6c3b8 Olga Brani
    }
2974 e4a6c3b8 Olga Brani
2975 e4a6c3b8 Olga Brani
    // Fire handlers on the event path
2976 e4a6c3b8 Olga Brani
    i = 0;
2977 e4a6c3b8 Olga Brani
    while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
2978 e4a6c3b8 Olga Brani
2979 e4a6c3b8 Olga Brani
      event.type = i > 1 ?
2980 e4a6c3b8 Olga Brani
        bubbleType :
2981 e4a6c3b8 Olga Brani
        special.bindType || type;
2982 e4a6c3b8 Olga Brani
2983 e4a6c3b8 Olga Brani
      // jQuery handler
2984 e4a6c3b8 Olga Brani
      handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
2985 e4a6c3b8 Olga Brani
      if ( handle ) {
2986 e4a6c3b8 Olga Brani
        handle.apply( cur, data );
2987 e4a6c3b8 Olga Brani
      }
2988 e4a6c3b8 Olga Brani
2989 e4a6c3b8 Olga Brani
      // Native handler
2990 e4a6c3b8 Olga Brani
      handle = ontype && cur[ ontype ];
2991 e4a6c3b8 Olga Brani
      if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
2992 e4a6c3b8 Olga Brani
        event.preventDefault();
2993 e4a6c3b8 Olga Brani
      }
2994 e4a6c3b8 Olga Brani
    }
2995 e4a6c3b8 Olga Brani
    event.type = type;
2996 e4a6c3b8 Olga Brani
2997 e4a6c3b8 Olga Brani
    // If nobody prevented the default action, do it now
2998 e4a6c3b8 Olga Brani
    if ( !onlyHandlers && !event.isDefaultPrevented() ) {
2999 e4a6c3b8 Olga Brani
3000 e4a6c3b8 Olga Brani
      if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3001 e4a6c3b8 Olga Brani
        !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3002 e4a6c3b8 Olga Brani
3003 e4a6c3b8 Olga Brani
        // Call a native DOM method on the target with the same name name as the event.
3004 e4a6c3b8 Olga Brani
        // Can't use an .isFunction() check here because IE6/7 fails that test.
3005 e4a6c3b8 Olga Brani
        // Don't do default actions on window, that's where global variables be (#6170)
3006 e4a6c3b8 Olga Brani
        if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
3007 e4a6c3b8 Olga Brani
3008 e4a6c3b8 Olga Brani
          // Don't re-trigger an onFOO event when we call its FOO() method
3009 e4a6c3b8 Olga Brani
          tmp = elem[ ontype ];
3010 e4a6c3b8 Olga Brani
3011 e4a6c3b8 Olga Brani
          if ( tmp ) {
3012 e4a6c3b8 Olga Brani
            elem[ ontype ] = null;
3013 e4a6c3b8 Olga Brani
          }
3014 e4a6c3b8 Olga Brani
3015 e4a6c3b8 Olga Brani
          // Prevent re-triggering of the same event, since we already bubbled it above
3016 e4a6c3b8 Olga Brani
          jQuery.event.triggered = type;
3017 e4a6c3b8 Olga Brani
          try {
3018 e4a6c3b8 Olga Brani
            elem[ type ]();
3019 e4a6c3b8 Olga Brani
          } catch ( e ) {
3020 e4a6c3b8 Olga Brani
            // IE<9 dies on focus/blur to hidden element (#1486,#12518)
3021 e4a6c3b8 Olga Brani
            // only reproducible on winXP IE8 native, not IE9 in IE8 mode
3022 e4a6c3b8 Olga Brani
          }
3023 e4a6c3b8 Olga Brani
          jQuery.event.triggered = undefined;
3024 e4a6c3b8 Olga Brani
3025 e4a6c3b8 Olga Brani
          if ( tmp ) {
3026 e4a6c3b8 Olga Brani
            elem[ ontype ] = tmp;
3027 e4a6c3b8 Olga Brani
          }
3028 e4a6c3b8 Olga Brani
        }
3029 e4a6c3b8 Olga Brani
      }
3030 e4a6c3b8 Olga Brani
    }
3031 e4a6c3b8 Olga Brani
3032 e4a6c3b8 Olga Brani
    return event.result;
3033 e4a6c3b8 Olga Brani
  },
3034 e4a6c3b8 Olga Brani
3035 e4a6c3b8 Olga Brani
  dispatch: function( event ) {
3036 e4a6c3b8 Olga Brani
3037 e4a6c3b8 Olga Brani
    // Make a writable jQuery.Event from the native event object
3038 e4a6c3b8 Olga Brani
    event = jQuery.event.fix( event );
3039 e4a6c3b8 Olga Brani
3040 e4a6c3b8 Olga Brani
    var i, ret, handleObj, matched, j,
3041 e4a6c3b8 Olga Brani
      handlerQueue = [],
3042 e4a6c3b8 Olga Brani
      args = core_slice.call( arguments ),
3043 e4a6c3b8 Olga Brani
      handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
3044 e4a6c3b8 Olga Brani
      special = jQuery.event.special[ event.type ] || {};
3045 e4a6c3b8 Olga Brani
3046 e4a6c3b8 Olga Brani
    // Use the fix-ed jQuery.Event rather than the (read-only) native event
3047 e4a6c3b8 Olga Brani
    args[0] = event;
3048 e4a6c3b8 Olga Brani
    event.delegateTarget = this;
3049 e4a6c3b8 Olga Brani
3050 e4a6c3b8 Olga Brani
    // Call the preDispatch hook for the mapped type, and let it bail if desired
3051 e4a6c3b8 Olga Brani
    if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
3052 e4a6c3b8 Olga Brani
      return;
3053 e4a6c3b8 Olga Brani
    }
3054 e4a6c3b8 Olga Brani
3055 e4a6c3b8 Olga Brani
    // Determine handlers
3056 e4a6c3b8 Olga Brani
    handlerQueue = jQuery.event.handlers.call( this, event, handlers );
3057 e4a6c3b8 Olga Brani
3058 e4a6c3b8 Olga Brani
    // Run delegates first; they may want to stop propagation beneath us
3059 e4a6c3b8 Olga Brani
    i = 0;
3060 e4a6c3b8 Olga Brani
    while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
3061 e4a6c3b8 Olga Brani
      event.currentTarget = matched.elem;
3062 e4a6c3b8 Olga Brani
3063 e4a6c3b8 Olga Brani
      j = 0;
3064 e4a6c3b8 Olga Brani
      while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
3065 e4a6c3b8 Olga Brani
3066 e4a6c3b8 Olga Brani
        // Triggered event must either 1) have no namespace, or
3067 e4a6c3b8 Olga Brani
        // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3068 e4a6c3b8 Olga Brani
        if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
3069 e4a6c3b8 Olga Brani
3070 e4a6c3b8 Olga Brani
          event.handleObj = handleObj;
3071 e4a6c3b8 Olga Brani
          event.data = handleObj.data;
3072 e4a6c3b8 Olga Brani
3073 e4a6c3b8 Olga Brani
          ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
3074 e4a6c3b8 Olga Brani
              .apply( matched.elem, args );
3075 e4a6c3b8 Olga Brani
3076 e4a6c3b8 Olga Brani
          if ( ret !== undefined ) {
3077 e4a6c3b8 Olga Brani
            if ( (event.result = ret) === false ) {
3078 e4a6c3b8 Olga Brani
              event.preventDefault();
3079 e4a6c3b8 Olga Brani
              event.stopPropagation();
3080 e4a6c3b8 Olga Brani
            }
3081 e4a6c3b8 Olga Brani
          }
3082 e4a6c3b8 Olga Brani
        }
3083 e4a6c3b8 Olga Brani
      }
3084 e4a6c3b8 Olga Brani
    }
3085 e4a6c3b8 Olga Brani
3086 e4a6c3b8 Olga Brani
    // Call the postDispatch hook for the mapped type
3087 e4a6c3b8 Olga Brani
    if ( special.postDispatch ) {
3088 e4a6c3b8 Olga Brani
      special.postDispatch.call( this, event );
3089 e4a6c3b8 Olga Brani
    }
3090 e4a6c3b8 Olga Brani
3091 e4a6c3b8 Olga Brani
    return event.result;
3092 e4a6c3b8 Olga Brani
  },
3093 e4a6c3b8 Olga Brani
3094 e4a6c3b8 Olga Brani
  handlers: function( event, handlers ) {
3095 e4a6c3b8 Olga Brani
    var sel, handleObj, matches, i,
3096 e4a6c3b8 Olga Brani
      handlerQueue = [],
3097 e4a6c3b8 Olga Brani
      delegateCount = handlers.delegateCount,
3098 e4a6c3b8 Olga Brani
      cur = event.target;
3099 e4a6c3b8 Olga Brani
3100 e4a6c3b8 Olga Brani
    // Find delegate handlers
3101 e4a6c3b8 Olga Brani
    // Black-hole SVG <use> instance trees (#13180)
3102 e4a6c3b8 Olga Brani
    // Avoid non-left-click bubbling in Firefox (#3861)
3103 e4a6c3b8 Olga Brani
    if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
3104 e4a6c3b8 Olga Brani
3105 e4a6c3b8 Olga Brani
      for ( ; cur != this; cur = cur.parentNode || this ) {
3106 e4a6c3b8 Olga Brani
3107 e4a6c3b8 Olga Brani
        // Don't check non-elements (#13208)
3108 e4a6c3b8 Olga Brani
        // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
3109 e4a6c3b8 Olga Brani
        if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
3110 e4a6c3b8 Olga Brani
          matches = [];
3111 e4a6c3b8 Olga Brani
          for ( i = 0; i < delegateCount; i++ ) {
3112 e4a6c3b8 Olga Brani
            handleObj = handlers[ i ];
3113 e4a6c3b8 Olga Brani
3114 e4a6c3b8 Olga Brani
            // Don't conflict with Object.prototype properties (#13203)
3115 e4a6c3b8 Olga Brani
            sel = handleObj.selector + " ";
3116 e4a6c3b8 Olga Brani
3117 e4a6c3b8 Olga Brani
            if ( matches[ sel ] === undefined ) {
3118 e4a6c3b8 Olga Brani
              matches[ sel ] = handleObj.needsContext ?
3119 e4a6c3b8 Olga Brani
                jQuery( sel, this ).index( cur ) >= 0 :
3120 e4a6c3b8 Olga Brani
                jQuery.find( sel, this, null, [ cur ] ).length;
3121 e4a6c3b8 Olga Brani
            }
3122 e4a6c3b8 Olga Brani
            if ( matches[ sel ] ) {
3123 e4a6c3b8 Olga Brani
              matches.push( handleObj );
3124 e4a6c3b8 Olga Brani
            }
3125 e4a6c3b8 Olga Brani
          }
3126 e4a6c3b8 Olga Brani
          if ( matches.length ) {
3127 e4a6c3b8 Olga Brani
            handlerQueue.push({ elem: cur, handlers: matches });
3128 e4a6c3b8 Olga Brani
          }
3129 e4a6c3b8 Olga Brani
        }
3130 e4a6c3b8 Olga Brani
      }
3131 e4a6c3b8 Olga Brani
    }
3132 e4a6c3b8 Olga Brani
3133 e4a6c3b8 Olga Brani
    // Add the remaining (directly-bound) handlers
3134 e4a6c3b8 Olga Brani
    if ( delegateCount < handlers.length ) {
3135 e4a6c3b8 Olga Brani
      handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
3136 e4a6c3b8 Olga Brani
    }
3137 e4a6c3b8 Olga Brani
3138 e4a6c3b8 Olga Brani
    return handlerQueue;
3139 e4a6c3b8 Olga Brani
  },
3140 e4a6c3b8 Olga Brani
3141 e4a6c3b8 Olga Brani
  fix: function( event ) {
3142 e4a6c3b8 Olga Brani
    if ( event[ jQuery.expando ] ) {
3143 e4a6c3b8 Olga Brani
      return event;
3144 e4a6c3b8 Olga Brani
    }
3145 e4a6c3b8 Olga Brani
3146 e4a6c3b8 Olga Brani
    // Create a writable copy of the event object and normalize some properties
3147 e4a6c3b8 Olga Brani
    var i, prop, copy,
3148 e4a6c3b8 Olga Brani
      type = event.type,
3149 e4a6c3b8 Olga Brani
      originalEvent = event,
3150 e4a6c3b8 Olga Brani
      fixHook = this.fixHooks[ type ];
3151 e4a6c3b8 Olga Brani
3152 e4a6c3b8 Olga Brani
    if ( !fixHook ) {
3153 e4a6c3b8 Olga Brani
      this.fixHooks[ type ] = fixHook =
3154 e4a6c3b8 Olga Brani
        rmouseEvent.test( type ) ? this.mouseHooks :
3155 e4a6c3b8 Olga Brani
        rkeyEvent.test( type ) ? this.keyHooks :
3156 e4a6c3b8 Olga Brani
        {};
3157 e4a6c3b8 Olga Brani
    }
3158 e4a6c3b8 Olga Brani
    copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3159 e4a6c3b8 Olga Brani
3160 e4a6c3b8 Olga Brani
    event = new jQuery.Event( originalEvent );
3161 e4a6c3b8 Olga Brani
3162 e4a6c3b8 Olga Brani
    i = copy.length;
3163 e4a6c3b8 Olga Brani
    while ( i-- ) {
3164 e4a6c3b8 Olga Brani
      prop = copy[ i ];
3165 e4a6c3b8 Olga Brani
      event[ prop ] = originalEvent[ prop ];
3166 e4a6c3b8 Olga Brani
    }
3167 e4a6c3b8 Olga Brani
3168 e4a6c3b8 Olga Brani
    // Support: IE<9
3169 e4a6c3b8 Olga Brani
    // Fix target property (#1925)
3170 e4a6c3b8 Olga Brani
    if ( !event.target ) {
3171 e4a6c3b8 Olga Brani
      event.target = originalEvent.srcElement || document;
3172 e4a6c3b8 Olga Brani
    }
3173 e4a6c3b8 Olga Brani
3174 e4a6c3b8 Olga Brani
    // Support: Chrome 23+, Safari?
3175 e4a6c3b8 Olga Brani
    // Target should not be a text node (#504, #13143)
3176 e4a6c3b8 Olga Brani
    if ( event.target.nodeType === 3 ) {
3177 e4a6c3b8 Olga Brani
      event.target = event.target.parentNode;
3178 e4a6c3b8 Olga Brani
    }
3179 e4a6c3b8 Olga Brani
3180 e4a6c3b8 Olga Brani
    // Support: IE<9
3181 e4a6c3b8 Olga Brani
    // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
3182 e4a6c3b8 Olga Brani
    event.metaKey = !!event.metaKey;
3183 e4a6c3b8 Olga Brani
3184 e4a6c3b8 Olga Brani
    return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
3185 e4a6c3b8 Olga Brani
  },
3186 e4a6c3b8 Olga Brani
3187 e4a6c3b8 Olga Brani
  // Includes some event props shared by KeyEvent and MouseEvent
3188 e4a6c3b8 Olga Brani
  props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
3189 e4a6c3b8 Olga Brani
3190 e4a6c3b8 Olga Brani
  fixHooks: {},
3191 e4a6c3b8 Olga Brani
3192 e4a6c3b8 Olga Brani
  keyHooks: {
3193 e4a6c3b8 Olga Brani
    props: "char charCode key keyCode".split(" "),
3194 e4a6c3b8 Olga Brani
    filter: function( event, original ) {
3195 e4a6c3b8 Olga Brani
3196 e4a6c3b8 Olga Brani
      // Add which for key events
3197 e4a6c3b8 Olga Brani
      if ( event.which == null ) {
3198 e4a6c3b8 Olga Brani
        event.which = original.charCode != null ? original.charCode : original.keyCode;
3199 e4a6c3b8 Olga Brani
      }
3200 e4a6c3b8 Olga Brani
3201 e4a6c3b8 Olga Brani
      return event;
3202 e4a6c3b8 Olga Brani
    }
3203 e4a6c3b8 Olga Brani
  },
3204 e4a6c3b8 Olga Brani
3205 e4a6c3b8 Olga Brani
  mouseHooks: {
3206 e4a6c3b8 Olga Brani
    props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3207 e4a6c3b8 Olga Brani
    filter: function( event, original ) {
3208 e4a6c3b8 Olga Brani
      var body, eventDoc, doc,
3209 e4a6c3b8 Olga Brani
        button = original.button,
3210 e4a6c3b8 Olga Brani
        fromElement = original.fromElement;
3211 e4a6c3b8 Olga Brani
3212 e4a6c3b8 Olga Brani
      // Calculate pageX/Y if missing and clientX/Y available
3213 e4a6c3b8 Olga Brani
      if ( event.pageX == null && original.clientX != null ) {
3214 e4a6c3b8 Olga Brani
        eventDoc = event.target.ownerDocument || document;
3215 e4a6c3b8 Olga Brani
        doc = eventDoc.documentElement;
3216 e4a6c3b8 Olga Brani
        body = eventDoc.body;
3217 e4a6c3b8 Olga Brani
3218 e4a6c3b8 Olga Brani
        event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3219 e4a6c3b8 Olga Brani
        event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
3220 e4a6c3b8 Olga Brani
      }
3221 e4a6c3b8 Olga Brani
3222 e4a6c3b8 Olga Brani
      // Add relatedTarget, if necessary
3223 e4a6c3b8 Olga Brani
      if ( !event.relatedTarget && fromElement ) {
3224 e4a6c3b8 Olga Brani
        event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3225 e4a6c3b8 Olga Brani
      }
3226 e4a6c3b8 Olga Brani
3227 e4a6c3b8 Olga Brani
      // Add which for click: 1 === left; 2 === middle; 3 === right
3228 e4a6c3b8 Olga Brani
      // Note: button is not normalized, so don't use it
3229 e4a6c3b8 Olga Brani
      if ( !event.which && button !== undefined ) {
3230 e4a6c3b8 Olga Brani
        event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
3231 e4a6c3b8 Olga Brani
      }
3232 e4a6c3b8 Olga Brani
3233 e4a6c3b8 Olga Brani
      return event;
3234 e4a6c3b8 Olga Brani
    }
3235 e4a6c3b8 Olga Brani
  },
3236 e4a6c3b8 Olga Brani
3237 e4a6c3b8 Olga Brani
  special: {
3238 e4a6c3b8 Olga Brani
    load: {
3239 e4a6c3b8 Olga Brani
      // Prevent triggered image.load events from bubbling to window.load
3240 e4a6c3b8 Olga Brani
      noBubble: true
3241 e4a6c3b8 Olga Brani
    },
3242 e4a6c3b8 Olga Brani
    click: {
3243 e4a6c3b8 Olga Brani
      // For checkbox, fire native event so checked state will be right
3244 e4a6c3b8 Olga Brani
      trigger: function() {
3245 e4a6c3b8 Olga Brani
        if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
3246 e4a6c3b8 Olga Brani
          this.click();
3247 e4a6c3b8 Olga Brani
          return false;
3248 e4a6c3b8 Olga Brani
        }
3249 e4a6c3b8 Olga Brani
      }
3250 e4a6c3b8 Olga Brani
    },
3251 e4a6c3b8 Olga Brani
    focus: {
3252 e4a6c3b8 Olga Brani
      // Fire native event if possible so blur/focus sequence is correct
3253 e4a6c3b8 Olga Brani
      trigger: function() {
3254 e4a6c3b8 Olga Brani
        if ( this !== document.activeElement && this.focus ) {
3255 e4a6c3b8 Olga Brani
          try {
3256 e4a6c3b8 Olga Brani
            this.focus();
3257 e4a6c3b8 Olga Brani
            return false;
3258 e4a6c3b8 Olga Brani
          } catch ( e ) {
3259 e4a6c3b8 Olga Brani
            // Support: IE<9
3260 e4a6c3b8 Olga Brani
            // If we error on focus to hidden element (#1486, #12518),
3261 e4a6c3b8 Olga Brani
            // let .trigger() run the handlers
3262 e4a6c3b8 Olga Brani
          }
3263 e4a6c3b8 Olga Brani
        }
3264 e4a6c3b8 Olga Brani
      },
3265 e4a6c3b8 Olga Brani
      delegateType: "focusin"
3266 e4a6c3b8 Olga Brani
    },
3267 e4a6c3b8 Olga Brani
    blur: {
3268 e4a6c3b8 Olga Brani
      trigger: function() {
3269 e4a6c3b8 Olga Brani
        if ( this === document.activeElement && this.blur ) {
3270 e4a6c3b8 Olga Brani
          this.blur();
3271 e4a6c3b8 Olga Brani
          return false;
3272 e4a6c3b8 Olga Brani
        }
3273 e4a6c3b8 Olga Brani
      },
3274 e4a6c3b8 Olga Brani
      delegateType: "focusout"
3275 e4a6c3b8 Olga Brani
    },
3276 e4a6c3b8 Olga Brani
3277 e4a6c3b8 Olga Brani
    beforeunload: {
3278 e4a6c3b8 Olga Brani
      postDispatch: function( event ) {
3279 e4a6c3b8 Olga Brani
3280 e4a6c3b8 Olga Brani
        // Even when returnValue equals to undefined Firefox will still show alert
3281 e4a6c3b8 Olga Brani
        if ( event.result !== undefined ) {
3282 e4a6c3b8 Olga Brani
          event.originalEvent.returnValue = event.result;
3283 e4a6c3b8 Olga Brani
        }
3284 e4a6c3b8 Olga Brani
      }
3285 e4a6c3b8 Olga Brani
    }
3286 e4a6c3b8 Olga Brani
  },
3287 e4a6c3b8 Olga Brani
3288 e4a6c3b8 Olga Brani
  simulate: function( type, elem, event, bubble ) {
3289 e4a6c3b8 Olga Brani
    // Piggyback on a donor event to simulate a different one.
3290 e4a6c3b8 Olga Brani
    // Fake originalEvent to avoid donor's stopPropagation, but if the
3291 e4a6c3b8 Olga Brani
    // simulated event prevents default then we do the same on the donor.
3292 e4a6c3b8 Olga Brani
    var e = jQuery.extend(
3293 e4a6c3b8 Olga Brani
      new jQuery.Event(),
3294 e4a6c3b8 Olga Brani
      event,
3295 e4a6c3b8 Olga Brani
      { type: type,
3296 e4a6c3b8 Olga Brani
        isSimulated: true,
3297 e4a6c3b8 Olga Brani
        originalEvent: {}
3298 e4a6c3b8 Olga Brani
      }
3299 e4a6c3b8 Olga Brani
    );
3300 e4a6c3b8 Olga Brani
    if ( bubble ) {
3301 e4a6c3b8 Olga Brani
      jQuery.event.trigger( e, null, elem );
3302 e4a6c3b8 Olga Brani
    } else {
3303 e4a6c3b8 Olga Brani
      jQuery.event.dispatch.call( elem, e );
3304 e4a6c3b8 Olga Brani
    }
3305 e4a6c3b8 Olga Brani
    if ( e.isDefaultPrevented() ) {
3306 e4a6c3b8 Olga Brani
      event.preventDefault();
3307 e4a6c3b8 Olga Brani
    }
3308 e4a6c3b8 Olga Brani
  }
3309 e4a6c3b8 Olga Brani
};
3310 e4a6c3b8 Olga Brani
3311 e4a6c3b8 Olga Brani
jQuery.removeEvent = document.removeEventListener ?
3312 e4a6c3b8 Olga Brani
  function( elem, type, handle ) {
3313 e4a6c3b8 Olga Brani
    if ( elem.removeEventListener ) {
3314 e4a6c3b8 Olga Brani
      elem.removeEventListener( type, handle, false );
3315 e4a6c3b8 Olga Brani
    }
3316 e4a6c3b8 Olga Brani
  } :
3317 e4a6c3b8 Olga Brani
  function( elem, type, handle ) {
3318 e4a6c3b8 Olga Brani
    var name = "on" + type;
3319 e4a6c3b8 Olga Brani
3320 e4a6c3b8 Olga Brani
    if ( elem.detachEvent ) {
3321 e4a6c3b8 Olga Brani
3322 e4a6c3b8 Olga Brani
      // #8545, #7054, preventing memory leaks for custom events in IE6-8
3323 e4a6c3b8 Olga Brani
      // detachEvent needed property on element, by name of that event, to properly expose it to GC
3324 e4a6c3b8 Olga Brani
      if ( typeof elem[ name ] === core_strundefined ) {
3325 e4a6c3b8 Olga Brani
        elem[ name ] = null;
3326 e4a6c3b8 Olga Brani
      }
3327 e4a6c3b8 Olga Brani
3328 e4a6c3b8 Olga Brani
      elem.detachEvent( name, handle );
3329 e4a6c3b8 Olga Brani
    }
3330 e4a6c3b8 Olga Brani
  };
3331 e4a6c3b8 Olga Brani
3332 e4a6c3b8 Olga Brani
jQuery.Event = function( src, props ) {
3333 e4a6c3b8 Olga Brani
  // Allow instantiation without the 'new' keyword
3334 e4a6c3b8 Olga Brani
  if ( !(this instanceof jQuery.Event) ) {
3335 e4a6c3b8 Olga Brani
    return new jQuery.Event( src, props );
3336 e4a6c3b8 Olga Brani
  }
3337 e4a6c3b8 Olga Brani
3338 e4a6c3b8 Olga Brani
  // Event object
3339 e4a6c3b8 Olga Brani
  if ( src && src.type ) {
3340 e4a6c3b8 Olga Brani
    this.originalEvent = src;
3341 e4a6c3b8 Olga Brani
    this.type = src.type;
3342 e4a6c3b8 Olga Brani
3343 e4a6c3b8 Olga Brani
    // Events bubbling up the document may have been marked as prevented
3344 e4a6c3b8 Olga Brani
    // by a handler lower down the tree; reflect the correct value.
3345 e4a6c3b8 Olga Brani
    this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3346 e4a6c3b8 Olga Brani
      src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
3347 e4a6c3b8 Olga Brani
3348 e4a6c3b8 Olga Brani
  // Event type
3349 e4a6c3b8 Olga Brani
  } else {
3350 e4a6c3b8 Olga Brani
    this.type = src;
3351 e4a6c3b8 Olga Brani
  }
3352 e4a6c3b8 Olga Brani
3353 e4a6c3b8 Olga Brani
  // Put explicitly provided properties onto the event object
3354 e4a6c3b8 Olga Brani
  if ( props ) {
3355 e4a6c3b8 Olga Brani
    jQuery.extend( this, props );
3356 e4a6c3b8 Olga Brani
  }
3357 e4a6c3b8 Olga Brani
3358 e4a6c3b8 Olga Brani
  // Create a timestamp if incoming event doesn't have one
3359 e4a6c3b8 Olga Brani
  this.timeStamp = src && src.timeStamp || jQuery.now();
3360 e4a6c3b8 Olga Brani
3361 e4a6c3b8 Olga Brani
  // Mark it as fixed
3362 e4a6c3b8 Olga Brani
  this[ jQuery.expando ] = true;
3363 e4a6c3b8 Olga Brani
};
3364 e4a6c3b8 Olga Brani
3365 e4a6c3b8 Olga Brani
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3366 e4a6c3b8 Olga Brani
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3367 e4a6c3b8 Olga Brani
jQuery.Event.prototype = {
3368 e4a6c3b8 Olga Brani
  isDefaultPrevented: returnFalse,
3369 e4a6c3b8 Olga Brani
  isPropagationStopped: returnFalse,
3370 e4a6c3b8 Olga Brani
  isImmediatePropagationStopped: returnFalse,
3371 e4a6c3b8 Olga Brani
3372 e4a6c3b8 Olga Brani
  preventDefault: function() {
3373 e4a6c3b8 Olga Brani
    var e = this.originalEvent;
3374 e4a6c3b8 Olga Brani
3375 e4a6c3b8 Olga Brani
    this.isDefaultPrevented = returnTrue;
3376 e4a6c3b8 Olga Brani
    if ( !e ) {
3377 e4a6c3b8 Olga Brani
      return;
3378 e4a6c3b8 Olga Brani
    }
3379 e4a6c3b8 Olga Brani
3380 e4a6c3b8 Olga Brani
    // If preventDefault exists, run it on the original event
3381 e4a6c3b8 Olga Brani
    if ( e.preventDefault ) {
3382 e4a6c3b8 Olga Brani
      e.preventDefault();
3383 e4a6c3b8 Olga Brani
3384 e4a6c3b8 Olga Brani
    // Support: IE
3385 e4a6c3b8 Olga Brani
    // Otherwise set the returnValue property of the original event to false
3386 e4a6c3b8 Olga Brani
    } else {
3387 e4a6c3b8 Olga Brani
      e.returnValue = false;
3388 e4a6c3b8 Olga Brani
    }
3389 e4a6c3b8 Olga Brani
  },
3390 e4a6c3b8 Olga Brani
  stopPropagation: function() {
3391 e4a6c3b8 Olga Brani
    var e = this.originalEvent;
3392 e4a6c3b8 Olga Brani
3393 e4a6c3b8 Olga Brani
    this.isPropagationStopped = returnTrue;
3394 e4a6c3b8 Olga Brani
    if ( !e ) {
3395 e4a6c3b8 Olga Brani
      return;
3396 e4a6c3b8 Olga Brani
    }
3397 e4a6c3b8 Olga Brani
    // If stopPropagation exists, run it on the original event
3398 e4a6c3b8 Olga Brani
    if ( e.stopPropagation ) {
3399 e4a6c3b8 Olga Brani
      e.stopPropagation();
3400 e4a6c3b8 Olga Brani
    }
3401 e4a6c3b8 Olga Brani
3402 e4a6c3b8 Olga Brani
    // Support: IE
3403 e4a6c3b8 Olga Brani
    // Set the cancelBubble property of the original event to true
3404 e4a6c3b8 Olga Brani
    e.cancelBubble = true;
3405 e4a6c3b8 Olga Brani
  },
3406 e4a6c3b8 Olga Brani
  stopImmediatePropagation: function() {
3407 e4a6c3b8 Olga Brani
    this.isImmediatePropagationStopped = returnTrue;
3408 e4a6c3b8 Olga Brani
    this.stopPropagation();
3409 e4a6c3b8 Olga Brani
  }
3410 e4a6c3b8 Olga Brani
};
3411 e4a6c3b8 Olga Brani
3412 e4a6c3b8 Olga Brani
// Create mouseenter/leave events using mouseover/out and event-time checks
3413 e4a6c3b8 Olga Brani
jQuery.each({
3414 e4a6c3b8 Olga Brani
  mouseenter: "mouseover",
3415 e4a6c3b8 Olga Brani
  mouseleave: "mouseout"
3416 e4a6c3b8 Olga Brani
}, function( orig, fix ) {
3417 e4a6c3b8 Olga Brani
  jQuery.event.special[ orig ] = {
3418 e4a6c3b8 Olga Brani
    delegateType: fix,
3419 e4a6c3b8 Olga Brani
    bindType: fix,
3420 e4a6c3b8 Olga Brani
3421 e4a6c3b8 Olga Brani
    handle: function( event ) {
3422 e4a6c3b8 Olga Brani
      var ret,
3423 e4a6c3b8 Olga Brani
        target = this,
3424 e4a6c3b8 Olga Brani
        related = event.relatedTarget,
3425 e4a6c3b8 Olga Brani
        handleObj = event.handleObj;
3426 e4a6c3b8 Olga Brani
3427 e4a6c3b8 Olga Brani
      // For mousenter/leave call the handler if related is outside the target.
3428 e4a6c3b8 Olga Brani
      // NB: No relatedTarget if the mouse left/entered the browser window
3429 e4a6c3b8 Olga Brani
      if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
3430 e4a6c3b8 Olga Brani
        event.type = handleObj.origType;
3431 e4a6c3b8 Olga Brani
        ret = handleObj.handler.apply( this, arguments );
3432 e4a6c3b8 Olga Brani
        event.type = fix;
3433 e4a6c3b8 Olga Brani
      }
3434 e4a6c3b8 Olga Brani
      return ret;
3435 e4a6c3b8 Olga Brani
    }
3436 e4a6c3b8 Olga Brani
  };
3437 e4a6c3b8 Olga Brani
});
3438 e4a6c3b8 Olga Brani
3439 e4a6c3b8 Olga Brani
// IE submit delegation
3440 e4a6c3b8 Olga Brani
if ( !jQuery.support.submitBubbles ) {
3441 e4a6c3b8 Olga Brani
3442 e4a6c3b8 Olga Brani
  jQuery.event.special.submit = {
3443 e4a6c3b8 Olga Brani
    setup: function() {
3444 e4a6c3b8 Olga Brani
      // Only need this for delegated form submit events
3445 e4a6c3b8 Olga Brani
      if ( jQuery.nodeName( this, "form" ) ) {
3446 e4a6c3b8 Olga Brani
        return false;
3447 e4a6c3b8 Olga Brani
      }
3448 e4a6c3b8 Olga Brani
3449 e4a6c3b8 Olga Brani
      // Lazy-add a submit handler when a descendant form may potentially be submitted
3450 e4a6c3b8 Olga Brani
      jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3451 e4a6c3b8 Olga Brani
        // Node name check avoids a VML-related crash in IE (#9807)
3452 e4a6c3b8 Olga Brani
        var elem = e.target,
3453 e4a6c3b8 Olga Brani
          form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3454 e4a6c3b8 Olga Brani
        if ( form && !jQuery._data( form, "submitBubbles" ) ) {
3455 e4a6c3b8 Olga Brani
          jQuery.event.add( form, "submit._submit", function( event ) {
3456 e4a6c3b8 Olga Brani
            event._submit_bubble = true;
3457 e4a6c3b8 Olga Brani
          });
3458 e4a6c3b8 Olga Brani
          jQuery._data( form, "submitBubbles", true );
3459 e4a6c3b8 Olga Brani
        }
3460 e4a6c3b8 Olga Brani
      });
3461 e4a6c3b8 Olga Brani
      // return undefined since we don't need an event listener
3462 e4a6c3b8 Olga Brani
    },
3463 e4a6c3b8 Olga Brani
3464 e4a6c3b8 Olga Brani
    postDispatch: function( event ) {
3465 e4a6c3b8 Olga Brani
      // If form was submitted by the user, bubble the event up the tree
3466 e4a6c3b8 Olga Brani
      if ( event._submit_bubble ) {
3467 e4a6c3b8 Olga Brani
        delete event._submit_bubble;
3468 e4a6c3b8 Olga Brani
        if ( this.parentNode && !event.isTrigger ) {
3469 e4a6c3b8 Olga Brani
          jQuery.event.simulate( "submit", this.parentNode, event, true );
3470 e4a6c3b8 Olga Brani
        }
3471 e4a6c3b8 Olga Brani
      }
3472 e4a6c3b8 Olga Brani
    },
3473 e4a6c3b8 Olga Brani
3474 e4a6c3b8 Olga Brani
    teardown: function() {
3475 e4a6c3b8 Olga Brani
      // Only need this for delegated form submit events
3476 e4a6c3b8 Olga Brani
      if ( jQuery.nodeName( this, "form" ) ) {
3477 e4a6c3b8 Olga Brani
        return false;
3478 e4a6c3b8 Olga Brani
      }
3479 e4a6c3b8 Olga Brani
3480 e4a6c3b8 Olga Brani
      // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3481 e4a6c3b8 Olga Brani
      jQuery.event.remove( this, "._submit" );
3482 e4a6c3b8 Olga Brani
    }
3483 e4a6c3b8 Olga Brani
  };
3484 e4a6c3b8 Olga Brani
}
3485 e4a6c3b8 Olga Brani
3486 e4a6c3b8 Olga Brani
// IE change delegation and checkbox/radio fix
3487 e4a6c3b8 Olga Brani
if ( !jQuery.support.changeBubbles ) {
3488 e4a6c3b8 Olga Brani
3489 e4a6c3b8 Olga Brani
  jQuery.event.special.change = {
3490 e4a6c3b8 Olga Brani
3491 e4a6c3b8 Olga Brani
    setup: function() {
3492 e4a6c3b8 Olga Brani
3493 e4a6c3b8 Olga Brani
      if ( rformElems.test( this.nodeName ) ) {
3494 e4a6c3b8 Olga Brani
        // IE doesn't fire change on a check/radio until blur; trigger it on click
3495 e4a6c3b8 Olga Brani
        // after a propertychange. Eat the blur-change in special.change.handle.
3496 e4a6c3b8 Olga Brani
        // This still fires onchange a second time for check/radio after blur.
3497 e4a6c3b8 Olga Brani
        if ( this.type === "checkbox" || this.type === "radio" ) {
3498 e4a6c3b8 Olga Brani
          jQuery.event.add( this, "propertychange._change", function( event ) {
3499 e4a6c3b8 Olga Brani
            if ( event.originalEvent.propertyName === "checked" ) {
3500 e4a6c3b8 Olga Brani
              this._just_changed = true;
3501 e4a6c3b8 Olga Brani
            }
3502 e4a6c3b8 Olga Brani
          });
3503 e4a6c3b8 Olga Brani
          jQuery.event.add( this, "click._change", function( event ) {
3504 e4a6c3b8 Olga Brani
            if ( this._just_changed && !event.isTrigger ) {
3505 e4a6c3b8 Olga Brani
              this._just_changed = false;
3506 e4a6c3b8 Olga Brani
            }
3507 e4a6c3b8 Olga Brani
            // Allow triggered, simulated change events (#11500)
3508 e4a6c3b8 Olga Brani
            jQuery.event.simulate( "change", this, event, true );
3509 e4a6c3b8 Olga Brani
          });
3510 e4a6c3b8 Olga Brani
        }
3511 e4a6c3b8 Olga Brani
        return false;
3512 e4a6c3b8 Olga Brani
      }
3513 e4a6c3b8 Olga Brani
      // Delegated event; lazy-add a change handler on descendant inputs
3514 e4a6c3b8 Olga Brani
      jQuery.event.add( this, "beforeactivate._change", function( e ) {
3515 e4a6c3b8 Olga Brani
        var elem = e.target;
3516 e4a6c3b8 Olga Brani
3517 e4a6c3b8 Olga Brani
        if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
3518 e4a6c3b8 Olga Brani
          jQuery.event.add( elem, "change._change", function( event ) {
3519 e4a6c3b8 Olga Brani
            if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
3520 e4a6c3b8 Olga Brani
              jQuery.event.simulate( "change", this.parentNode, event, true );
3521 e4a6c3b8 Olga Brani
            }
3522 e4a6c3b8 Olga Brani
          });
3523 e4a6c3b8 Olga Brani
          jQuery._data( elem, "changeBubbles", true );
3524 e4a6c3b8 Olga Brani
        }
3525 e4a6c3b8 Olga Brani
      });
3526 e4a6c3b8 Olga Brani
    },
3527 e4a6c3b8 Olga Brani
3528 e4a6c3b8 Olga Brani
    handle: function( event ) {
3529 e4a6c3b8 Olga Brani
      var elem = event.target;
3530 e4a6c3b8 Olga Brani
3531 e4a6c3b8 Olga Brani
      // Swallow native change events from checkbox/radio, we already triggered them above
3532 e4a6c3b8 Olga Brani
      if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3533 e4a6c3b8 Olga Brani
        return event.handleObj.handler.apply( this, arguments );
3534 e4a6c3b8 Olga Brani
      }
3535 e4a6c3b8 Olga Brani
    },
3536 e4a6c3b8 Olga Brani
3537 e4a6c3b8 Olga Brani
    teardown: function() {
3538 e4a6c3b8 Olga Brani
      jQuery.event.remove( this, "._change" );
3539 e4a6c3b8 Olga Brani
3540 e4a6c3b8 Olga Brani
      return !rformElems.test( this.nodeName );
3541 e4a6c3b8 Olga Brani
    }
3542 e4a6c3b8 Olga Brani
  };
3543 e4a6c3b8 Olga Brani
}
3544 e4a6c3b8 Olga Brani
3545 e4a6c3b8 Olga Brani
// Create "bubbling" focus and blur events
3546 e4a6c3b8 Olga Brani
if ( !jQuery.support.focusinBubbles ) {
3547 e4a6c3b8 Olga Brani
  jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3548 e4a6c3b8 Olga Brani
3549 e4a6c3b8 Olga Brani
    // Attach a single capturing handler while someone wants focusin/focusout
3550 e4a6c3b8 Olga Brani
    var attaches = 0,
3551 e4a6c3b8 Olga Brani
      handler = function( event ) {
3552 e4a6c3b8 Olga Brani
        jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3553 e4a6c3b8 Olga Brani
      };
3554 e4a6c3b8 Olga Brani
3555 e4a6c3b8 Olga Brani
    jQuery.event.special[ fix ] = {
3556 e4a6c3b8 Olga Brani
      setup: function() {
3557 e4a6c3b8 Olga Brani
        if ( attaches++ === 0 ) {
3558 e4a6c3b8 Olga Brani
          document.addEventListener( orig, handler, true );
3559 e4a6c3b8 Olga Brani
        }
3560 e4a6c3b8 Olga Brani
      },
3561 e4a6c3b8 Olga Brani
      teardown: function() {
3562 e4a6c3b8 Olga Brani
        if ( --attaches === 0 ) {
3563 e4a6c3b8 Olga Brani
          document.removeEventListener( orig, handler, true );
3564 e4a6c3b8 Olga Brani
        }
3565 e4a6c3b8 Olga Brani
      }
3566 e4a6c3b8 Olga Brani
    };
3567 e4a6c3b8 Olga Brani
  });
3568 e4a6c3b8 Olga Brani
}
3569 e4a6c3b8 Olga Brani
3570 e4a6c3b8 Olga Brani
jQuery.fn.extend({
3571 e4a6c3b8 Olga Brani
3572 e4a6c3b8 Olga Brani
  on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3573 e4a6c3b8 Olga Brani
    var type, origFn;
3574 e4a6c3b8 Olga Brani
3575 e4a6c3b8 Olga Brani
    // Types can be a map of types/handlers
3576 e4a6c3b8 Olga Brani
    if ( typeof types === "object" ) {
3577 e4a6c3b8 Olga Brani
      // ( types-Object, selector, data )
3578 e4a6c3b8 Olga Brani
      if ( typeof selector !== "string" ) {
3579 e4a6c3b8 Olga Brani
        // ( types-Object, data )
3580 e4a6c3b8 Olga Brani
        data = data || selector;
3581 e4a6c3b8 Olga Brani
        selector = undefined;
3582 e4a6c3b8 Olga Brani
      }
3583 e4a6c3b8 Olga Brani
      for ( type in types ) {
3584 e4a6c3b8 Olga Brani
        this.on( type, selector, data, types[ type ], one );
3585 e4a6c3b8 Olga Brani
      }
3586 e4a6c3b8 Olga Brani
      return this;
3587 e4a6c3b8 Olga Brani
    }
3588 e4a6c3b8 Olga Brani
3589 e4a6c3b8 Olga Brani
    if ( data == null && fn == null ) {
3590 e4a6c3b8 Olga Brani
      // ( types, fn )
3591 e4a6c3b8 Olga Brani
      fn = selector;
3592 e4a6c3b8 Olga Brani
      data = selector = undefined;
3593 e4a6c3b8 Olga Brani
    } else if ( fn == null ) {
3594 e4a6c3b8 Olga Brani
      if ( typeof selector === "string" ) {
3595 e4a6c3b8 Olga Brani
        // ( types, selector, fn )
3596 e4a6c3b8 Olga Brani
        fn = data;
3597 e4a6c3b8 Olga Brani
        data = undefined;
3598 e4a6c3b8 Olga Brani
      } else {
3599 e4a6c3b8 Olga Brani
        // ( types, data, fn )
3600 e4a6c3b8 Olga Brani
        fn = data;
3601 e4a6c3b8 Olga Brani
        data = selector;
3602 e4a6c3b8 Olga Brani
        selector = undefined;
3603 e4a6c3b8 Olga Brani
      }
3604 e4a6c3b8 Olga Brani
    }
3605 e4a6c3b8 Olga Brani
    if ( fn === false ) {
3606 e4a6c3b8 Olga Brani
      fn = returnFalse;
3607 e4a6c3b8 Olga Brani
    } else if ( !fn ) {
3608 e4a6c3b8 Olga Brani
      return this;
3609 e4a6c3b8 Olga Brani
    }
3610 e4a6c3b8 Olga Brani
3611 e4a6c3b8 Olga Brani
    if ( one === 1 ) {
3612 e4a6c3b8 Olga Brani
      origFn = fn;
3613 e4a6c3b8 Olga Brani
      fn = function( event ) {
3614 e4a6c3b8 Olga Brani
        // Can use an empty set, since event contains the info
3615 e4a6c3b8 Olga Brani
        jQuery().off( event );
3616 e4a6c3b8 Olga Brani
        return origFn.apply( this, arguments );
3617 e4a6c3b8 Olga Brani
      };
3618 e4a6c3b8 Olga Brani
      // Use same guid so caller can remove using origFn
3619 e4a6c3b8 Olga Brani
      fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3620 e4a6c3b8 Olga Brani
    }
3621 e4a6c3b8 Olga Brani
    return this.each( function() {
3622 e4a6c3b8 Olga Brani
      jQuery.event.add( this, types, fn, data, selector );
3623 e4a6c3b8 Olga Brani
    });
3624 e4a6c3b8 Olga Brani
  },
3625 e4a6c3b8 Olga Brani
  one: function( types, selector, data, fn ) {
3626 e4a6c3b8 Olga Brani
    return this.on( types, selector, data, fn, 1 );
3627 e4a6c3b8 Olga Brani
  },
3628 e4a6c3b8 Olga Brani
  off: function( types, selector, fn ) {
3629 e4a6c3b8 Olga Brani
    var handleObj, type;
3630 e4a6c3b8 Olga Brani
    if ( types && types.preventDefault && types.handleObj ) {
3631 e4a6c3b8 Olga Brani
      // ( event )  dispatched jQuery.Event
3632 e4a6c3b8 Olga Brani
      handleObj = types.handleObj;
3633 e4a6c3b8 Olga Brani
      jQuery( types.delegateTarget ).off(
3634 e4a6c3b8 Olga Brani
        handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
3635 e4a6c3b8 Olga Brani
        handleObj.selector,
3636 e4a6c3b8 Olga Brani
        handleObj.handler
3637 e4a6c3b8 Olga Brani
      );
3638 e4a6c3b8 Olga Brani
      return this;
3639 e4a6c3b8 Olga Brani
    }
3640 e4a6c3b8 Olga Brani
    if ( typeof types === "object" ) {
3641 e4a6c3b8 Olga Brani
      // ( types-object [, selector] )
3642 e4a6c3b8 Olga Brani
      for ( type in types ) {
3643 e4a6c3b8 Olga Brani
        this.off( type, selector, types[ type ] );
3644 e4a6c3b8 Olga Brani
      }
3645 e4a6c3b8 Olga Brani
      return this;
3646 e4a6c3b8 Olga Brani
    }
3647 e4a6c3b8 Olga Brani
    if ( selector === false || typeof selector === "function" ) {
3648 e4a6c3b8 Olga Brani
      // ( types [, fn] )
3649 e4a6c3b8 Olga Brani
      fn = selector;
3650 e4a6c3b8 Olga Brani
      selector = undefined;
3651 e4a6c3b8 Olga Brani
    }
3652 e4a6c3b8 Olga Brani
    if ( fn === false ) {
3653 e4a6c3b8 Olga Brani
      fn = returnFalse;
3654 e4a6c3b8 Olga Brani
    }
3655 e4a6c3b8 Olga Brani
    return this.each(function() {
3656 e4a6c3b8 Olga Brani
      jQuery.event.remove( this, types, fn, selector );
3657 e4a6c3b8 Olga Brani
    });
3658 e4a6c3b8 Olga Brani
  },
3659 e4a6c3b8 Olga Brani
3660 e4a6c3b8 Olga Brani
  bind: function( types, data, fn ) {
3661 e4a6c3b8 Olga Brani
    return this.on( types, null, data, fn );
3662 e4a6c3b8 Olga Brani
  },
3663 e4a6c3b8 Olga Brani
  unbind: function( types, fn ) {
3664 e4a6c3b8 Olga Brani
    return this.off( types, null, fn );
3665 e4a6c3b8 Olga Brani
  },
3666 e4a6c3b8 Olga Brani
3667 e4a6c3b8 Olga Brani
  delegate: function( selector, types, data, fn ) {
3668 e4a6c3b8 Olga Brani
    return this.on( types, selector, data, fn );
3669 e4a6c3b8 Olga Brani
  },
3670 e4a6c3b8 Olga Brani
  undelegate: function( selector, types, fn ) {
3671 e4a6c3b8 Olga Brani
    // ( namespace ) or ( selector, types [, fn] )
3672 e4a6c3b8 Olga Brani
    return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
3673 e4a6c3b8 Olga Brani
  },
3674 e4a6c3b8 Olga Brani
3675 e4a6c3b8 Olga Brani
  trigger: function( type, data ) {
3676 e4a6c3b8 Olga Brani
    return this.each(function() {
3677 e4a6c3b8 Olga Brani
      jQuery.event.trigger( type, data, this );
3678 e4a6c3b8 Olga Brani
    });
3679 e4a6c3b8 Olga Brani
  },
3680 e4a6c3b8 Olga Brani
  triggerHandler: function( type, data ) {
3681 e4a6c3b8 Olga Brani
    var elem = this[0];
3682 e4a6c3b8 Olga Brani
    if ( elem ) {
3683 e4a6c3b8 Olga Brani
      return jQuery.event.trigger( type, data, elem, true );
3684 e4a6c3b8 Olga Brani
    }
3685 e4a6c3b8 Olga Brani
  }
3686 e4a6c3b8 Olga Brani
});
3687 e4a6c3b8 Olga Brani
/*!
3688 e4a6c3b8 Olga Brani
 * Sizzle CSS Selector Engine
3689 e4a6c3b8 Olga Brani
 * Copyright 2012 jQuery Foundation and other contributors
3690 e4a6c3b8 Olga Brani
 * Released under the MIT license
3691 e4a6c3b8 Olga Brani
 * http://sizzlejs.com/
3692 e4a6c3b8 Olga Brani
 */
3693 e4a6c3b8 Olga Brani
(function( window, undefined ) {
3694 e4a6c3b8 Olga Brani
3695 e4a6c3b8 Olga Brani
var i,
3696 e4a6c3b8 Olga Brani
  cachedruns,
3697 e4a6c3b8 Olga Brani
  Expr,
3698 e4a6c3b8 Olga Brani
  getText,
3699 e4a6c3b8 Olga Brani
  isXML,
3700 e4a6c3b8 Olga Brani
  compile,
3701 e4a6c3b8 Olga Brani
  hasDuplicate,
3702 e4a6c3b8 Olga Brani
  outermostContext,
3703 e4a6c3b8 Olga Brani
3704 e4a6c3b8 Olga Brani
  // Local document vars
3705 e4a6c3b8 Olga Brani
  setDocument,
3706 e4a6c3b8 Olga Brani
  document,
3707 e4a6c3b8 Olga Brani
  docElem,
3708 e4a6c3b8 Olga Brani
  documentIsXML,
3709 e4a6c3b8 Olga Brani
  rbuggyQSA,
3710 e4a6c3b8 Olga Brani
  rbuggyMatches,
3711 e4a6c3b8 Olga Brani
  matches,
3712 e4a6c3b8 Olga Brani
  contains,
3713 e4a6c3b8 Olga Brani
  sortOrder,
3714 e4a6c3b8 Olga Brani
3715 e4a6c3b8 Olga Brani
  // Instance-specific data
3716 e4a6c3b8 Olga Brani
  expando = "sizzle" + -(new Date()),
3717 e4a6c3b8 Olga Brani
  preferredDoc = window.document,
3718 e4a6c3b8 Olga Brani
  support = {},
3719 e4a6c3b8 Olga Brani
  dirruns = 0,
3720 e4a6c3b8 Olga Brani
  done = 0,
3721 e4a6c3b8 Olga Brani
  classCache = createCache(),
3722 e4a6c3b8 Olga Brani
  tokenCache = createCache(),
3723 e4a6c3b8 Olga Brani
  compilerCache = createCache(),
3724 e4a6c3b8 Olga Brani
3725 e4a6c3b8 Olga Brani
  // General-purpose constants
3726 e4a6c3b8 Olga Brani
  strundefined = typeof undefined,
3727 e4a6c3b8 Olga Brani
  MAX_NEGATIVE = 1 << 31,
3728 e4a6c3b8 Olga Brani
3729 e4a6c3b8 Olga Brani
  // Array methods
3730 e4a6c3b8 Olga Brani
  arr = [],
3731 e4a6c3b8 Olga Brani
  pop = arr.pop,
3732 e4a6c3b8 Olga Brani
  push = arr.push,
3733 e4a6c3b8 Olga Brani
  slice = arr.slice,
3734 e4a6c3b8 Olga Brani
  // Use a stripped-down indexOf if we can't use a native one
3735 e4a6c3b8 Olga Brani
  indexOf = arr.indexOf || function( elem ) {
3736 e4a6c3b8 Olga Brani
    var i = 0,
3737 e4a6c3b8 Olga Brani
      len = this.length;
3738 e4a6c3b8 Olga Brani
    for ( ; i < len; i++ ) {
3739 e4a6c3b8 Olga Brani
      if ( this[i] === elem ) {
3740 e4a6c3b8 Olga Brani
        return i;
3741 e4a6c3b8 Olga Brani
      }
3742 e4a6c3b8 Olga Brani
    }
3743 e4a6c3b8 Olga Brani
    return -1;
3744 e4a6c3b8 Olga Brani
  },
3745 e4a6c3b8 Olga Brani
3746 e4a6c3b8 Olga Brani
3747 e4a6c3b8 Olga Brani
  // Regular expressions
3748 e4a6c3b8 Olga Brani
3749 e4a6c3b8 Olga Brani
  // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
3750 e4a6c3b8 Olga Brani
  whitespace = "[\\x20\\t\\r\\n\\f]",
3751 e4a6c3b8 Olga Brani
  // http://www.w3.org/TR/css3-syntax/#characters
3752 e4a6c3b8 Olga Brani
  characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
3753 e4a6c3b8 Olga Brani
3754 e4a6c3b8 Olga Brani
  // Loosely modeled on CSS identifier characters
3755 e4a6c3b8 Olga Brani
  // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
3756 e4a6c3b8 Olga Brani
  // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
3757 e4a6c3b8 Olga Brani
  identifier = characterEncoding.replace( "w", "w#" ),
3758 e4a6c3b8 Olga Brani
3759 e4a6c3b8 Olga Brani
  // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
3760 e4a6c3b8 Olga Brani
  operators = "([*^$|!~]?=)",
3761 e4a6c3b8 Olga Brani
  attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
3762 e4a6c3b8 Olga Brani
    "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
3763 e4a6c3b8 Olga Brani
3764 e4a6c3b8 Olga Brani
  // Prefer arguments quoted,
3765 e4a6c3b8 Olga Brani
  //   then not containing pseudos/brackets,
3766 e4a6c3b8 Olga Brani
  //   then attribute selectors/non-parenthetical expressions,
3767 e4a6c3b8 Olga Brani
  //   then anything else
3768 e4a6c3b8 Olga Brani
  // These preferences are here to reduce the number of selectors
3769 e4a6c3b8 Olga Brani
  //   needing tokenize in the PSEUDO preFilter
3770 e4a6c3b8 Olga Brani
  pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
3771 e4a6c3b8 Olga Brani
3772 e4a6c3b8 Olga Brani
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
3773 e4a6c3b8 Olga Brani
  rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
3774 e4a6c3b8 Olga Brani
3775 e4a6c3b8 Olga Brani
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
3776 e4a6c3b8 Olga Brani
  rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
3777 e4a6c3b8 Olga Brani
  rpseudo = new RegExp( pseudos ),
3778 e4a6c3b8 Olga Brani
  ridentifier = new RegExp( "^" + identifier + "$" ),
3779 e4a6c3b8 Olga Brani
3780 e4a6c3b8 Olga Brani
  matchExpr = {
3781 e4a6c3b8 Olga Brani
    "ID": new RegExp( "^#(" + characterEncoding + ")" ),
3782 e4a6c3b8 Olga Brani
    "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
3783 e4a6c3b8 Olga Brani
    "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
3784 e4a6c3b8 Olga Brani
    "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
3785 e4a6c3b8 Olga Brani
    "ATTR": new RegExp( "^" + attributes ),
3786 e4a6c3b8 Olga Brani
    "PSEUDO": new RegExp( "^" + pseudos ),
3787 e4a6c3b8 Olga Brani
    "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
3788 e4a6c3b8 Olga Brani
      "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
3789 e4a6c3b8 Olga Brani
      "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
3790 e4a6c3b8 Olga Brani
    // For use in libraries implementing .is()
3791 e4a6c3b8 Olga Brani
    // We use this for POS matching in `select`
3792 e4a6c3b8 Olga Brani
    "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
3793 e4a6c3b8 Olga Brani
      whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
3794 e4a6c3b8 Olga Brani
  },
3795 e4a6c3b8 Olga Brani
3796 e4a6c3b8 Olga Brani
  rsibling = /[\x20\t\r\n\f]*[+~]/,
3797 e4a6c3b8 Olga Brani
3798 e4a6c3b8 Olga Brani
  rnative = /^[^{]+\{\s*\[native code/,
3799 e4a6c3b8 Olga Brani
3800 e4a6c3b8 Olga Brani
  // Easily-parseable/retrievable ID or TAG or CLASS selectors
3801 e4a6c3b8 Olga Brani
  rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
3802 e4a6c3b8 Olga Brani
3803 e4a6c3b8 Olga Brani
  rinputs = /^(?:input|select|textarea|button)$/i,
3804 e4a6c3b8 Olga Brani
  rheader = /^h\d$/i,
3805 e4a6c3b8 Olga Brani
3806 e4a6c3b8 Olga Brani
  rescape = /'|\\/g,
3807 e4a6c3b8 Olga Brani
  rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
3808 e4a6c3b8 Olga Brani
3809 e4a6c3b8 Olga Brani
  // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
3810 e4a6c3b8 Olga Brani
  runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
3811 e4a6c3b8 Olga Brani
  funescape = function( _, escaped ) {
3812 e4a6c3b8 Olga Brani
    var high = "0x" + escaped - 0x10000;
3813 e4a6c3b8 Olga Brani
    // NaN means non-codepoint
3814 e4a6c3b8 Olga Brani
    return high !== high ?
3815 e4a6c3b8 Olga Brani
      escaped :
3816 e4a6c3b8 Olga Brani
      // BMP codepoint
3817 e4a6c3b8 Olga Brani
      high < 0 ?
3818 e4a6c3b8 Olga Brani
        String.fromCharCode( high + 0x10000 ) :
3819 e4a6c3b8 Olga Brani
        // Supplemental Plane codepoint (surrogate pair)
3820 e4a6c3b8 Olga Brani
        String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
3821 e4a6c3b8 Olga Brani
  };
3822 e4a6c3b8 Olga Brani
3823 e4a6c3b8 Olga Brani
// Use a stripped-down slice if we can't use a native one
3824 e4a6c3b8 Olga Brani
try {
3825 e4a6c3b8 Olga Brani
  slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
3826 e4a6c3b8 Olga Brani
} catch ( e ) {
3827 e4a6c3b8 Olga Brani
  slice = function( i ) {
3828 e4a6c3b8 Olga Brani
    var elem,
3829 e4a6c3b8 Olga Brani
      results = [];
3830 e4a6c3b8 Olga Brani
    while ( (elem = this[i++]) ) {
3831 e4a6c3b8 Olga Brani
      results.push( elem );
3832 e4a6c3b8 Olga Brani
    }
3833 e4a6c3b8 Olga Brani
    return results;
3834 e4a6c3b8 Olga Brani
  };
3835 e4a6c3b8 Olga Brani
}
3836 e4a6c3b8 Olga Brani
3837 e4a6c3b8 Olga Brani
/**
3838 e4a6c3b8 Olga Brani
 * For feature detection
3839 e4a6c3b8 Olga Brani
 * @param {Function} fn The function to test for native support
3840 e4a6c3b8 Olga Brani
 */
3841 e4a6c3b8 Olga Brani
function isNative( fn ) {
3842 e4a6c3b8 Olga Brani
  return rnative.test( fn + "" );
3843 e4a6c3b8 Olga Brani
}
3844 e4a6c3b8 Olga Brani
3845 e4a6c3b8 Olga Brani
/**
3846 e4a6c3b8 Olga Brani
 * Create key-value caches of limited size
3847 e4a6c3b8 Olga Brani
 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
3848 e4a6c3b8 Olga Brani
 *  property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
3849 e4a6c3b8 Olga Brani
 *  deleting the oldest entry
3850 e4a6c3b8 Olga Brani
 */
3851 e4a6c3b8 Olga Brani
function createCache() {
3852 e4a6c3b8 Olga Brani
  var cache,
3853 e4a6c3b8 Olga Brani
    keys = [];
3854 e4a6c3b8 Olga Brani
3855 e4a6c3b8 Olga Brani
  return (cache = function( key, value ) {
3856 e4a6c3b8 Olga Brani
    // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
3857 e4a6c3b8 Olga Brani
    if ( keys.push( key += " " ) > Expr.cacheLength ) {
3858 e4a6c3b8 Olga Brani
      // Only keep the most recent entries
3859 e4a6c3b8 Olga Brani
      delete cache[ keys.shift() ];
3860 e4a6c3b8 Olga Brani
    }
3861 e4a6c3b8 Olga Brani
    return (cache[ key ] = value);
3862 e4a6c3b8 Olga Brani
  });
3863 e4a6c3b8 Olga Brani
}
3864 e4a6c3b8 Olga Brani
3865 e4a6c3b8 Olga Brani
/**
3866 e4a6c3b8 Olga Brani
 * Mark a function for special use by Sizzle
3867 e4a6c3b8 Olga Brani
 * @param {Function} fn The function to mark
3868 e4a6c3b8 Olga Brani
 */
3869 e4a6c3b8 Olga Brani
function markFunction( fn ) {
3870 e4a6c3b8 Olga Brani
  fn[ expando ] = true;
3871 e4a6c3b8 Olga Brani
  return fn;
3872 e4a6c3b8 Olga Brani
}
3873 e4a6c3b8 Olga Brani
3874 e4a6c3b8 Olga Brani
/**
3875 e4a6c3b8 Olga Brani
 * Support testing using an element
3876 e4a6c3b8 Olga Brani
 * @param {Function} fn Passed the created div and expects a boolean result
3877 e4a6c3b8 Olga Brani
 */
3878 e4a6c3b8 Olga Brani
function assert( fn ) {
3879 e4a6c3b8 Olga Brani
  var div = document.createElement("div");
3880 e4a6c3b8 Olga Brani
3881 e4a6c3b8 Olga Brani
  try {
3882 e4a6c3b8 Olga Brani
    return fn( div );
3883 e4a6c3b8 Olga Brani
  } catch (e) {
3884 e4a6c3b8 Olga Brani
    return false;
3885 e4a6c3b8 Olga Brani
  } finally {
3886 e4a6c3b8 Olga Brani
    // release memory in IE
3887 e4a6c3b8 Olga Brani
    div = null;
3888 e4a6c3b8 Olga Brani
  }
3889 e4a6c3b8 Olga Brani
}
3890 e4a6c3b8 Olga Brani
3891 e4a6c3b8 Olga Brani
function Sizzle( selector, context, results, seed ) {
3892 e4a6c3b8 Olga Brani
  var match, elem, m, nodeType,
3893 e4a6c3b8 Olga Brani
    // QSA vars
3894 e4a6c3b8 Olga Brani
    i, groups, old, nid, newContext, newSelector;
3895 e4a6c3b8 Olga Brani
3896 e4a6c3b8 Olga Brani
  if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
3897 e4a6c3b8 Olga Brani
    setDocument( context );
3898 e4a6c3b8 Olga Brani
  }
3899 e4a6c3b8 Olga Brani
3900 e4a6c3b8 Olga Brani
  context = context || document;
3901 e4a6c3b8 Olga Brani
  results = results || [];
3902 e4a6c3b8 Olga Brani
3903 e4a6c3b8 Olga Brani
  if ( !selector || typeof selector !== "string" ) {
3904 e4a6c3b8 Olga Brani
    return results;
3905 e4a6c3b8 Olga Brani
  }
3906 e4a6c3b8 Olga Brani
3907 e4a6c3b8 Olga Brani
  if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
3908 e4a6c3b8 Olga Brani
    return [];
3909 e4a6c3b8 Olga Brani
  }
3910 e4a6c3b8 Olga Brani
3911 e4a6c3b8 Olga Brani
  if ( !documentIsXML && !seed ) {
3912 e4a6c3b8 Olga Brani
3913 e4a6c3b8 Olga Brani
    // Shortcuts
3914 e4a6c3b8 Olga Brani
    if ( (match = rquickExpr.exec( selector )) ) {
3915 e4a6c3b8 Olga Brani
      // Speed-up: Sizzle("#ID")
3916 e4a6c3b8 Olga Brani
      if ( (m = match[1]) ) {
3917 e4a6c3b8 Olga Brani
        if ( nodeType === 9 ) {
3918 e4a6c3b8 Olga Brani
          elem = context.getElementById( m );
3919 e4a6c3b8 Olga Brani
          // Check parentNode to catch when Blackberry 4.6 returns
3920 e4a6c3b8 Olga Brani
          // nodes that are no longer in the document #6963
3921 e4a6c3b8 Olga Brani
          if ( elem && elem.parentNode ) {
3922 e4a6c3b8 Olga Brani
            // Handle the case where IE, Opera, and Webkit return items
3923 e4a6c3b8 Olga Brani
            // by name instead of ID
3924 e4a6c3b8 Olga Brani
            if ( elem.id === m ) {
3925 e4a6c3b8 Olga Brani
              results.push( elem );
3926 e4a6c3b8 Olga Brani
              return results;
3927 e4a6c3b8 Olga Brani
            }
3928 e4a6c3b8 Olga Brani
          } else {
3929 e4a6c3b8 Olga Brani
            return results;
3930 e4a6c3b8 Olga Brani
          }
3931 e4a6c3b8 Olga Brani
        } else {
3932 e4a6c3b8 Olga Brani
          // Context is not a document
3933 e4a6c3b8 Olga Brani
          if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
3934 e4a6c3b8 Olga Brani
            contains( context, elem ) && elem.id === m ) {
3935 e4a6c3b8 Olga Brani
            results.push( elem );
3936 e4a6c3b8 Olga Brani
            return results;
3937 e4a6c3b8 Olga Brani
          }
3938 e4a6c3b8 Olga Brani
        }
3939 e4a6c3b8 Olga Brani
3940 e4a6c3b8 Olga Brani
      // Speed-up: Sizzle("TAG")
3941 e4a6c3b8 Olga Brani
      } else if ( match[2] ) {
3942 e4a6c3b8 Olga Brani
        push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
3943 e4a6c3b8 Olga Brani
        return results;
3944 e4a6c3b8 Olga Brani
3945 e4a6c3b8 Olga Brani
      // Speed-up: Sizzle(".CLASS")
3946 e4a6c3b8 Olga Brani
      } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
3947 e4a6c3b8 Olga Brani
        push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
3948 e4a6c3b8 Olga Brani
        return results;
3949 e4a6c3b8 Olga Brani
      }
3950 e4a6c3b8 Olga Brani
    }
3951 e4a6c3b8 Olga Brani
3952 e4a6c3b8 Olga Brani
    // QSA path
3953 e4a6c3b8 Olga Brani
    if ( support.qsa && !rbuggyQSA.test(selector) ) {
3954 e4a6c3b8 Olga Brani
      old = true;
3955 e4a6c3b8 Olga Brani
      nid = expando;
3956 e4a6c3b8 Olga Brani
      newContext = context;
3957 e4a6c3b8 Olga Brani
      newSelector = nodeType === 9 && selector;
3958 e4a6c3b8 Olga Brani
3959 e4a6c3b8 Olga Brani
      // qSA works strangely on Element-rooted queries
3960 e4a6c3b8 Olga Brani
      // We can work around this by specifying an extra ID on the root
3961 e4a6c3b8 Olga Brani
      // and working up from there (Thanks to Andrew Dupont for the technique)
3962 e4a6c3b8 Olga Brani
      // IE 8 doesn't work on object elements
3963 e4a6c3b8 Olga Brani
      if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
3964 e4a6c3b8 Olga Brani
        groups = tokenize( selector );
3965 e4a6c3b8 Olga Brani
3966 e4a6c3b8 Olga Brani
        if ( (old = context.getAttribute("id")) ) {
3967 e4a6c3b8 Olga Brani
          nid = old.replace( rescape, "\\$&" );
3968 e4a6c3b8 Olga Brani
        } else {
3969 e4a6c3b8 Olga Brani
          context.setAttribute( "id", nid );
3970 e4a6c3b8 Olga Brani
        }
3971 e4a6c3b8 Olga Brani
        nid = "[id='" + nid + "'] ";
3972 e4a6c3b8 Olga Brani
3973 e4a6c3b8 Olga Brani
        i = groups.length;
3974 e4a6c3b8 Olga Brani
        while ( i-- ) {
3975 e4a6c3b8 Olga Brani
          groups[i] = nid + toSelector( groups[i] );
3976 e4a6c3b8 Olga Brani
        }
3977 e4a6c3b8 Olga Brani
        newContext = rsibling.test( selector ) && context.parentNode || context;
3978 e4a6c3b8 Olga Brani
        newSelector = groups.join(",");
3979 e4a6c3b8 Olga Brani
      }
3980 e4a6c3b8 Olga Brani
3981 e4a6c3b8 Olga Brani
      if ( newSelector ) {
3982 e4a6c3b8 Olga Brani
        try {
3983 e4a6c3b8 Olga Brani
          push.apply( results, slice.call( newContext.querySelectorAll(
3984 e4a6c3b8 Olga Brani
            newSelector
3985 e4a6c3b8 Olga Brani
          ), 0 ) );
3986 e4a6c3b8 Olga Brani
          return results;
3987 e4a6c3b8 Olga Brani
        } catch(qsaError) {
3988 e4a6c3b8 Olga Brani
        } finally {
3989 e4a6c3b8 Olga Brani
          if ( !old ) {
3990 e4a6c3b8 Olga Brani
            context.removeAttribute("id");
3991 e4a6c3b8 Olga Brani
          }
3992 e4a6c3b8 Olga Brani
        }
3993 e4a6c3b8 Olga Brani
      }
3994 e4a6c3b8 Olga Brani
    }
3995 e4a6c3b8 Olga Brani
  }
3996 e4a6c3b8 Olga Brani
3997 e4a6c3b8 Olga Brani
  // All others
3998 e4a6c3b8 Olga Brani
  return select( selector.replace( rtrim, "$1" ), context, results, seed );
3999 e4a6c3b8 Olga Brani
}
4000 e4a6c3b8 Olga Brani
4001 e4a6c3b8 Olga Brani
/**
4002 e4a6c3b8 Olga Brani
 * Detect xml
4003 e4a6c3b8 Olga Brani
 * @param {Element|Object} elem An element or a document
4004 e4a6c3b8 Olga Brani
 */
4005 e4a6c3b8 Olga Brani
isXML = Sizzle.isXML = function( elem ) {
4006 e4a6c3b8 Olga Brani
  // documentElement is verified for cases where it doesn't yet exist
4007 e4a6c3b8 Olga Brani
  // (such as loading iframes in IE - #4833)
4008 e4a6c3b8 Olga Brani
  var documentElement = elem && (elem.ownerDocument || elem).documentElement;
4009 e4a6c3b8 Olga Brani
  return documentElement ? documentElement.nodeName !== "HTML" : false;
4010 e4a6c3b8 Olga Brani
};
4011 e4a6c3b8 Olga Brani
4012 e4a6c3b8 Olga Brani
/**
4013 e4a6c3b8 Olga Brani
 * Sets document-related variables once based on the current document
4014 e4a6c3b8 Olga Brani
 * @param {Element|Object} [doc] An element or document object to use to set the document
4015 e4a6c3b8 Olga Brani
 * @returns {Object} Returns the current document
4016 e4a6c3b8 Olga Brani
 */
4017 e4a6c3b8 Olga Brani
setDocument = Sizzle.setDocument = function( node ) {
4018 e4a6c3b8 Olga Brani
  var doc = node ? node.ownerDocument || node : preferredDoc;
4019 e4a6c3b8 Olga Brani
4020 e4a6c3b8 Olga Brani
  // If no document and documentElement is available, return
4021 e4a6c3b8 Olga Brani
  if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
4022 e4a6c3b8 Olga Brani
    return document;
4023 e4a6c3b8 Olga Brani
  }
4024 e4a6c3b8 Olga Brani
4025 e4a6c3b8 Olga Brani
  // Set our document
4026 e4a6c3b8 Olga Brani
  document = doc;
4027 e4a6c3b8 Olga Brani
  docElem = doc.documentElement;
4028 e4a6c3b8 Olga Brani
4029 e4a6c3b8 Olga Brani
  // Support tests
4030 e4a6c3b8 Olga Brani
  documentIsXML = isXML( doc );
4031 e4a6c3b8 Olga Brani
4032 e4a6c3b8 Olga Brani
  // Check if getElementsByTagName("*") returns only elements
4033 e4a6c3b8 Olga Brani
  support.tagNameNoComments = assert(function( div ) {
4034 e4a6c3b8 Olga Brani
    div.appendChild( doc.createComment("") );
4035 e4a6c3b8 Olga Brani
    return !div.getElementsByTagName("*").length;
4036 e4a6c3b8 Olga Brani
  });
4037 e4a6c3b8 Olga Brani
4038 e4a6c3b8 Olga Brani
  // Check if attributes should be retrieved by attribute nodes
4039 e4a6c3b8 Olga Brani
  support.attributes = assert(function( div ) {
4040 e4a6c3b8 Olga Brani
    div.innerHTML = "<select></select>";
4041 e4a6c3b8 Olga Brani
    var type = typeof div.lastChild.getAttribute("multiple");
4042 e4a6c3b8 Olga Brani
    // IE8 returns a string for some attributes even when not present
4043 e4a6c3b8 Olga Brani
    return type !== "boolean" && type !== "string";
4044 e4a6c3b8 Olga Brani
  });
4045 e4a6c3b8 Olga Brani
4046 e4a6c3b8 Olga Brani
  // Check if getElementsByClassName can be trusted
4047 e4a6c3b8 Olga Brani
  support.getByClassName = assert(function( div ) {
4048 e4a6c3b8 Olga Brani
    // Opera can't find a second classname (in 9.6)
4049 e4a6c3b8 Olga Brani
    div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
4050 e4a6c3b8 Olga Brani
    if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
4051 e4a6c3b8 Olga Brani
      return false;
4052 e4a6c3b8 Olga Brani
    }
4053 e4a6c3b8 Olga Brani
4054 e4a6c3b8 Olga Brani
    // Safari 3.2 caches class attributes and doesn't catch changes
4055 e4a6c3b8 Olga Brani
    div.lastChild.className = "e";
4056 e4a6c3b8 Olga Brani
    return div.getElementsByClassName("e").length === 2;
4057 e4a6c3b8 Olga Brani
  });
4058 e4a6c3b8 Olga Brani
4059 e4a6c3b8 Olga Brani
  // Check if getElementById returns elements by name
4060 e4a6c3b8 Olga Brani
  // Check if getElementsByName privileges form controls or returns elements by ID
4061 e4a6c3b8 Olga Brani
  support.getByName = assert(function( div ) {
4062 e4a6c3b8 Olga Brani
    // Inject content
4063 e4a6c3b8 Olga Brani
    div.id = expando + 0;
4064 e4a6c3b8 Olga Brani
    div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
4065 e4a6c3b8 Olga Brani
    docElem.insertBefore( div, docElem.firstChild );
4066 e4a6c3b8 Olga Brani
4067 e4a6c3b8 Olga Brani
    // Test
4068 e4a6c3b8 Olga Brani
    var pass = doc.getElementsByName &&
4069 e4a6c3b8 Olga Brani
      // buggy browsers will return fewer than the correct 2
4070 e4a6c3b8 Olga Brani
      doc.getElementsByName( expando ).length === 2 +
4071 e4a6c3b8 Olga Brani
      // buggy browsers will return more than the correct 0
4072 e4a6c3b8 Olga Brani
      doc.getElementsByName( expando + 0 ).length;
4073 e4a6c3b8 Olga Brani
    support.getIdNotName = !doc.getElementById( expando );
4074 e4a6c3b8 Olga Brani
4075 e4a6c3b8 Olga Brani
    // Cleanup
4076 e4a6c3b8 Olga Brani
    docElem.removeChild( div );
4077 e4a6c3b8 Olga Brani
4078 e4a6c3b8 Olga Brani
    return pass;
4079 e4a6c3b8 Olga Brani
  });
4080 e4a6c3b8 Olga Brani
4081 e4a6c3b8 Olga Brani
  // IE6/7 return modified attributes
4082 e4a6c3b8 Olga Brani
  Expr.attrHandle = assert(function( div ) {
4083 e4a6c3b8 Olga Brani
    div.innerHTML = "<a href='#'></a>";
4084 e4a6c3b8 Olga Brani
    return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
4085 e4a6c3b8 Olga Brani
      div.firstChild.getAttribute("href") === "#";
4086 e4a6c3b8 Olga Brani
  }) ?
4087 e4a6c3b8 Olga Brani
    {} :
4088 e4a6c3b8 Olga Brani
    {
4089 e4a6c3b8 Olga Brani
      "href": function( elem ) {
4090 e4a6c3b8 Olga Brani
        return elem.getAttribute( "href", 2 );
4091 e4a6c3b8 Olga Brani
      },
4092 e4a6c3b8 Olga Brani
      "type": function( elem ) {
4093 e4a6c3b8 Olga Brani
        return elem.getAttribute("type");
4094 e4a6c3b8 Olga Brani
      }
4095 e4a6c3b8 Olga Brani
    };
4096 e4a6c3b8 Olga Brani
4097 e4a6c3b8 Olga Brani
  // ID find and filter
4098 e4a6c3b8 Olga Brani
  if ( support.getIdNotName ) {
4099 e4a6c3b8 Olga Brani
    Expr.find["ID"] = function( id, context ) {
4100 e4a6c3b8 Olga Brani
      if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
4101 e4a6c3b8 Olga Brani
        var m = context.getElementById( id );
4102 e4a6c3b8 Olga Brani
        // Check parentNode to catch when Blackberry 4.6 returns
4103 e4a6c3b8 Olga Brani
        // nodes that are no longer in the document #6963
4104 e4a6c3b8 Olga Brani
        return m && m.parentNode ? [m] : [];
4105 e4a6c3b8 Olga Brani
      }
4106 e4a6c3b8 Olga Brani
    };
4107 e4a6c3b8 Olga Brani
    Expr.filter["ID"] = function( id ) {
4108 e4a6c3b8 Olga Brani
      var attrId = id.replace( runescape, funescape );
4109 e4a6c3b8 Olga Brani
      return function( elem ) {
4110 e4a6c3b8 Olga Brani
        return elem.getAttribute("id") === attrId;
4111 e4a6c3b8 Olga Brani
      };
4112 e4a6c3b8 Olga Brani
    };
4113 e4a6c3b8 Olga Brani
  } else {
4114 e4a6c3b8 Olga Brani
    Expr.find["ID"] = function( id, context ) {
4115 e4a6c3b8 Olga Brani
      if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
4116 e4a6c3b8 Olga Brani
        var m = context.getElementById( id );
4117 e4a6c3b8 Olga Brani
4118 e4a6c3b8 Olga Brani
        return m ?
4119 e4a6c3b8 Olga Brani
          m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
4120 e4a6c3b8 Olga Brani
            [m] :
4121 e4a6c3b8 Olga Brani
            undefined :
4122 e4a6c3b8 Olga Brani
          [];
4123 e4a6c3b8 Olga Brani
      }
4124 e4a6c3b8 Olga Brani
    };
4125 e4a6c3b8 Olga Brani
    Expr.filter["ID"] =  function( id ) {
4126 e4a6c3b8 Olga Brani
      var attrId = id.replace( runescape, funescape );
4127 e4a6c3b8 Olga Brani
      return function( elem ) {
4128 e4a6c3b8 Olga Brani
        var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
4129 e4a6c3b8 Olga Brani
        return node && node.value === attrId;
4130 e4a6c3b8 Olga Brani
      };
4131 e4a6c3b8 Olga Brani
    };
4132 e4a6c3b8 Olga Brani
  }
4133 e4a6c3b8 Olga Brani
4134 e4a6c3b8 Olga Brani
  // Tag
4135 e4a6c3b8 Olga Brani
  Expr.find["TAG"] = support.tagNameNoComments ?
4136 e4a6c3b8 Olga Brani
    function( tag, context ) {
4137 e4a6c3b8 Olga Brani
      if ( typeof context.getElementsByTagName !== strundefined ) {
4138 e4a6c3b8 Olga Brani
        return context.getElementsByTagName( tag );
4139 e4a6c3b8 Olga Brani
      }
4140 e4a6c3b8 Olga Brani
    } :
4141 e4a6c3b8 Olga Brani
    function( tag, context ) {
4142 e4a6c3b8 Olga Brani
      var elem,
4143 e4a6c3b8 Olga Brani
        tmp = [],
4144 e4a6c3b8 Olga Brani
        i = 0,
4145 e4a6c3b8 Olga Brani
        results = context.getElementsByTagName( tag );
4146 e4a6c3b8 Olga Brani
4147 e4a6c3b8 Olga Brani
      // Filter out possible comments
4148 e4a6c3b8 Olga Brani
      if ( tag === "*" ) {
4149 e4a6c3b8 Olga Brani
        while ( (elem = results[i++]) ) {
4150 e4a6c3b8 Olga Brani
          if ( elem.nodeType === 1 ) {
4151 e4a6c3b8 Olga Brani
            tmp.push( elem );
4152 e4a6c3b8 Olga Brani
          }
4153 e4a6c3b8 Olga Brani
        }
4154 e4a6c3b8 Olga Brani
4155 e4a6c3b8 Olga Brani
        return tmp;
4156 e4a6c3b8 Olga Brani
      }
4157 e4a6c3b8 Olga Brani
      return results;
4158 e4a6c3b8 Olga Brani
    };
4159 e4a6c3b8 Olga Brani
4160 e4a6c3b8 Olga Brani
  // Name
4161 e4a6c3b8 Olga Brani
  Expr.find["NAME"] = support.getByName && function( tag, context ) {
4162 e4a6c3b8 Olga Brani
    if ( typeof context.getElementsByName !== strundefined ) {
4163 e4a6c3b8 Olga Brani
      return context.getElementsByName( name );
4164 e4a6c3b8 Olga Brani
    }
4165 e4a6c3b8 Olga Brani
  };
4166 e4a6c3b8 Olga Brani
4167 e4a6c3b8 Olga Brani
  // Class
4168 e4a6c3b8 Olga Brani
  Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
4169 e4a6c3b8 Olga Brani
    if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
4170 e4a6c3b8 Olga Brani
      return context.getElementsByClassName( className );
4171 e4a6c3b8 Olga Brani
    }
4172 e4a6c3b8 Olga Brani
  };
4173 e4a6c3b8 Olga Brani
4174 e4a6c3b8 Olga Brani
  // QSA and matchesSelector support
4175 e4a6c3b8 Olga Brani
4176 e4a6c3b8 Olga Brani
  // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
4177 e4a6c3b8 Olga Brani
  rbuggyMatches = [];
4178 e4a6c3b8 Olga Brani
4179 e4a6c3b8 Olga Brani
  // qSa(:focus) reports false when true (Chrome 21),
4180 e4a6c3b8 Olga Brani
  // no need to also add to buggyMatches since matches checks buggyQSA
4181 e4a6c3b8 Olga Brani
  // A support test would require too much code (would include document ready)
4182 e4a6c3b8 Olga Brani
  rbuggyQSA = [ ":focus" ];
4183 e4a6c3b8 Olga Brani
4184 e4a6c3b8 Olga Brani
  if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
4185 e4a6c3b8 Olga Brani
    // Build QSA regex
4186 e4a6c3b8 Olga Brani
    // Regex strategy adopted from Diego Perini
4187 e4a6c3b8 Olga Brani
    assert(function( div ) {
4188 e4a6c3b8 Olga Brani
      // Select is set to empty string on purpose
4189 e4a6c3b8 Olga Brani
      // This is to test IE's treatment of not explictly
4190 e4a6c3b8 Olga Brani
      // setting a boolean content attribute,
4191 e4a6c3b8 Olga Brani
      // since its presence should be enough
4192 e4a6c3b8 Olga Brani
      // http://bugs.jquery.com/ticket/12359
4193 e4a6c3b8 Olga Brani
      div.innerHTML = "<select><option selected=''></option></select>";
4194 e4a6c3b8 Olga Brani
4195 e4a6c3b8 Olga Brani
      // IE8 - Some boolean attributes are not treated correctly
4196 e4a6c3b8 Olga Brani
      if ( !div.querySelectorAll("[selected]").length ) {
4197 e4a6c3b8 Olga Brani
        rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
4198 e4a6c3b8 Olga Brani
      }
4199 e4a6c3b8 Olga Brani
4200 e4a6c3b8 Olga Brani
      // Webkit/Opera - :checked should return selected option elements
4201 e4a6c3b8 Olga Brani
      // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
4202 e4a6c3b8 Olga Brani
      // IE8 throws error here and will not see later tests
4203 e4a6c3b8 Olga Brani
      if ( !div.querySelectorAll(":checked").length ) {
4204 e4a6c3b8 Olga Brani
        rbuggyQSA.push(":checked");
4205 e4a6c3b8 Olga Brani
      }
4206 e4a6c3b8 Olga Brani
    });
4207 e4a6c3b8 Olga Brani
4208 e4a6c3b8 Olga Brani
    assert(function( div ) {
4209 e4a6c3b8 Olga Brani
4210 e4a6c3b8 Olga Brani
      // Opera 10-12/IE8 - ^= $= *= and empty values
4211 e4a6c3b8 Olga Brani
      // Should not select anything
4212 e4a6c3b8 Olga Brani
      div.innerHTML = "<input type='hidden' i=''/>";
4213 e4a6c3b8 Olga Brani
      if ( div.querySelectorAll("[i^='']").length ) {
4214 e4a6c3b8 Olga Brani
        rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
4215 e4a6c3b8 Olga Brani
      }
4216 e4a6c3b8 Olga Brani
4217 e4a6c3b8 Olga Brani
      // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
4218 e4a6c3b8 Olga Brani
      // IE8 throws error here and will not see later tests
4219 e4a6c3b8 Olga Brani
      if ( !div.querySelectorAll(":enabled").length ) {
4220 e4a6c3b8 Olga Brani
        rbuggyQSA.push( ":enabled", ":disabled" );
4221 e4a6c3b8 Olga Brani
      }
4222 e4a6c3b8 Olga Brani
4223 e4a6c3b8 Olga Brani
      // Opera 10-11 does not throw on post-comma invalid pseudos
4224 e4a6c3b8 Olga Brani
      div.querySelectorAll("*,:x");
4225 e4a6c3b8 Olga Brani
      rbuggyQSA.push(",.*:");
4226 e4a6c3b8 Olga Brani
    });
4227 e4a6c3b8 Olga Brani
  }
4228 e4a6c3b8 Olga Brani
4229 e4a6c3b8 Olga Brani
  if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
4230 e4a6c3b8 Olga Brani
    docElem.mozMatchesSelector ||
4231 e4a6c3b8 Olga Brani
    docElem.webkitMatchesSelector ||
4232 e4a6c3b8 Olga Brani
    docElem.oMatchesSelector ||
4233 e4a6c3b8 Olga Brani
    docElem.msMatchesSelector) )) ) {
4234 e4a6c3b8 Olga Brani
4235 e4a6c3b8 Olga Brani
    assert(function( div ) {
4236 e4a6c3b8 Olga Brani
      // Check to see if it's possible to do matchesSelector
4237 e4a6c3b8 Olga Brani
      // on a disconnected node (IE 9)
4238 e4a6c3b8 Olga Brani
      support.disconnectedMatch = matches.call( div, "div" );
4239 e4a6c3b8 Olga Brani
4240 e4a6c3b8 Olga Brani
      // This should fail with an exception
4241 e4a6c3b8 Olga Brani
      // Gecko does not error, returns false instead
4242 e4a6c3b8 Olga Brani
      matches.call( div, "[s!='']:x" );
4243 e4a6c3b8 Olga Brani
      rbuggyMatches.push( "!=", pseudos );
4244 e4a6c3b8 Olga Brani
    });
4245 e4a6c3b8 Olga Brani
  }
4246 e4a6c3b8 Olga Brani
4247 e4a6c3b8 Olga Brani
  rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
4248 e4a6c3b8 Olga Brani
  rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
4249 e4a6c3b8 Olga Brani
4250 e4a6c3b8 Olga Brani
  // Element contains another
4251 e4a6c3b8 Olga Brani
  // Purposefully does not implement inclusive descendent
4252 e4a6c3b8 Olga Brani
  // As in, an element does not contain itself
4253 e4a6c3b8 Olga Brani
  contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
4254 e4a6c3b8 Olga Brani
    function( a, b ) {
4255 e4a6c3b8 Olga Brani
      var adown = a.nodeType === 9 ? a.documentElement : a,
4256 e4a6c3b8 Olga Brani
        bup = b && b.parentNode;
4257 e4a6c3b8 Olga Brani
      return a === bup || !!( bup && bup.nodeType === 1 && (
4258 e4a6c3b8 Olga Brani
        adown.contains ?
4259 e4a6c3b8 Olga Brani
          adown.contains( bup ) :
4260 e4a6c3b8 Olga Brani
          a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
4261 e4a6c3b8 Olga Brani
      ));
4262 e4a6c3b8 Olga Brani
    } :
4263 e4a6c3b8 Olga Brani
    function( a, b ) {
4264 e4a6c3b8 Olga Brani
      if ( b ) {
4265 e4a6c3b8 Olga Brani
        while ( (b = b.parentNode) ) {
4266 e4a6c3b8 Olga Brani
          if ( b === a ) {
4267 e4a6c3b8 Olga Brani
            return true;
4268 e4a6c3b8 Olga Brani
          }
4269 e4a6c3b8 Olga Brani
        }
4270 e4a6c3b8 Olga Brani
      }
4271 e4a6c3b8 Olga Brani
      return false;
4272 e4a6c3b8 Olga Brani
    };
4273 e4a6c3b8 Olga Brani
4274 e4a6c3b8 Olga Brani
  // Document order sorting
4275 e4a6c3b8 Olga Brani
  sortOrder = docElem.compareDocumentPosition ?
4276 e4a6c3b8 Olga Brani
  function( a, b ) {
4277 e4a6c3b8 Olga Brani
    var compare;
4278 e4a6c3b8 Olga Brani
4279 e4a6c3b8 Olga Brani
    if ( a === b ) {
4280 e4a6c3b8 Olga Brani
      hasDuplicate = true;
4281 e4a6c3b8 Olga Brani
      return 0;
4282 e4a6c3b8 Olga Brani
    }
4283 e4a6c3b8 Olga Brani
4284 e4a6c3b8 Olga Brani
    if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
4285 e4a6c3b8 Olga Brani
      if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
4286 e4a6c3b8 Olga Brani
        if ( a === doc || contains( preferredDoc, a ) ) {
4287 e4a6c3b8 Olga Brani
          return -1;
4288 e4a6c3b8 Olga Brani
        }
4289 e4a6c3b8 Olga Brani
        if ( b === doc || contains( preferredDoc, b ) ) {
4290 e4a6c3b8 Olga Brani
          return 1;
4291 e4a6c3b8 Olga Brani
        }
4292 e4a6c3b8 Olga Brani
        return 0;
4293 e4a6c3b8 Olga Brani
      }
4294 e4a6c3b8 Olga Brani
      return compare & 4 ? -1 : 1;
4295 e4a6c3b8 Olga Brani
    }
4296 e4a6c3b8 Olga Brani
4297 e4a6c3b8 Olga Brani
    return a.compareDocumentPosition ? -1 : 1;
4298 e4a6c3b8 Olga Brani
  } :
4299 e4a6c3b8 Olga Brani
  function( a, b ) {
4300 e4a6c3b8 Olga Brani
    var cur,
4301 e4a6c3b8 Olga Brani
      i = 0,
4302 e4a6c3b8 Olga Brani
      aup = a.parentNode,
4303 e4a6c3b8 Olga Brani
      bup = b.parentNode,
4304 e4a6c3b8 Olga Brani
      ap = [ a ],
4305 e4a6c3b8 Olga Brani
      bp = [ b ];
4306 e4a6c3b8 Olga Brani
4307 e4a6c3b8 Olga Brani
    // Exit early if the nodes are identical
4308 e4a6c3b8 Olga Brani
    if ( a === b ) {
4309 e4a6c3b8 Olga Brani
      hasDuplicate = true;
4310 e4a6c3b8 Olga Brani
      return 0;
4311 e4a6c3b8 Olga Brani
4312 e4a6c3b8 Olga Brani
    // Parentless nodes are either documents or disconnected
4313 e4a6c3b8 Olga Brani
    } else if ( !aup || !bup ) {
4314 e4a6c3b8 Olga Brani
      return a === doc ? -1 :
4315 e4a6c3b8 Olga Brani
        b === doc ? 1 :
4316 e4a6c3b8 Olga Brani
        aup ? -1 :
4317 e4a6c3b8 Olga Brani
        bup ? 1 :
4318 e4a6c3b8 Olga Brani
        0;
4319 e4a6c3b8 Olga Brani
4320 e4a6c3b8 Olga Brani
    // If the nodes are siblings, we can do a quick check
4321 e4a6c3b8 Olga Brani
    } else if ( aup === bup ) {
4322 e4a6c3b8 Olga Brani
      return siblingCheck( a, b );
4323 e4a6c3b8 Olga Brani
    }
4324 e4a6c3b8 Olga Brani
4325 e4a6c3b8 Olga Brani
    // Otherwise we need full lists of their ancestors for comparison
4326 e4a6c3b8 Olga Brani
    cur = a;
4327 e4a6c3b8 Olga Brani
    while ( (cur = cur.parentNode) ) {
4328 e4a6c3b8 Olga Brani
      ap.unshift( cur );
4329 e4a6c3b8 Olga Brani
    }
4330 e4a6c3b8 Olga Brani
    cur = b;
4331 e4a6c3b8 Olga Brani
    while ( (cur = cur.parentNode) ) {
4332 e4a6c3b8 Olga Brani
      bp.unshift( cur );
4333 e4a6c3b8 Olga Brani
    }
4334 e4a6c3b8 Olga Brani
4335 e4a6c3b8 Olga Brani
    // Walk down the tree looking for a discrepancy
4336 e4a6c3b8 Olga Brani
    while ( ap[i] === bp[i] ) {
4337 e4a6c3b8 Olga Brani
      i++;
4338 e4a6c3b8 Olga Brani
    }
4339 e4a6c3b8 Olga Brani
4340 e4a6c3b8 Olga Brani
    return i ?
4341 e4a6c3b8 Olga Brani
      // Do a sibling check if the nodes have a common ancestor
4342 e4a6c3b8 Olga Brani
      siblingCheck( ap[i], bp[i] ) :
4343 e4a6c3b8 Olga Brani
4344 e4a6c3b8 Olga Brani
      // Otherwise nodes in our document sort first
4345 e4a6c3b8 Olga Brani
      ap[i] === preferredDoc ? -1 :
4346 e4a6c3b8 Olga Brani
      bp[i] === preferredDoc ? 1 :
4347 e4a6c3b8 Olga Brani
      0;
4348 e4a6c3b8 Olga Brani
  };
4349 e4a6c3b8 Olga Brani
4350 e4a6c3b8 Olga Brani
  // Always assume the presence of duplicates if sort doesn't
4351 e4a6c3b8 Olga Brani
  // pass them to our comparison function (as in Google Chrome).
4352 e4a6c3b8 Olga Brani
  hasDuplicate = false;
4353 e4a6c3b8 Olga Brani
  [0, 0].sort( sortOrder );
4354 e4a6c3b8 Olga Brani
  support.detectDuplicates = hasDuplicate;
4355 e4a6c3b8 Olga Brani
4356 e4a6c3b8 Olga Brani
  return document;
4357 e4a6c3b8 Olga Brani
};
4358 e4a6c3b8 Olga Brani
4359 e4a6c3b8 Olga Brani
Sizzle.matches = function( expr, elements ) {
4360 e4a6c3b8 Olga Brani
  return Sizzle( expr, null, null, elements );
4361 e4a6c3b8 Olga Brani
};
4362 e4a6c3b8 Olga Brani
4363 e4a6c3b8 Olga Brani
Sizzle.matchesSelector = function( elem, expr ) {
4364 e4a6c3b8 Olga Brani
  // Set document vars if needed
4365 e4a6c3b8 Olga Brani
  if ( ( elem.ownerDocument || elem ) !== document ) {
4366 e4a6c3b8 Olga Brani
    setDocument( elem );
4367 e4a6c3b8 Olga Brani
  }
4368 e4a6c3b8 Olga Brani
4369 e4a6c3b8 Olga Brani
  // Make sure that attribute selectors are quoted
4370 e4a6c3b8 Olga Brani
  expr = expr.replace( rattributeQuotes, "='$1']" );
4371 e4a6c3b8 Olga Brani
4372 e4a6c3b8 Olga Brani
  // rbuggyQSA always contains :focus, so no need for an existence check
4373 e4a6c3b8 Olga Brani
  if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
4374 e4a6c3b8 Olga Brani
    try {
4375 e4a6c3b8 Olga Brani
      var ret = matches.call( elem, expr );
4376 e4a6c3b8 Olga Brani
4377 e4a6c3b8 Olga Brani
      // IE 9's matchesSelector returns false on disconnected nodes
4378 e4a6c3b8 Olga Brani
      if ( ret || support.disconnectedMatch ||
4379 e4a6c3b8 Olga Brani
          // As well, disconnected nodes are said to be in a document
4380 e4a6c3b8 Olga Brani
          // fragment in IE 9
4381 e4a6c3b8 Olga Brani
          elem.document && elem.document.nodeType !== 11 ) {
4382 e4a6c3b8 Olga Brani
        return ret;
4383 e4a6c3b8 Olga Brani
      }
4384 e4a6c3b8 Olga Brani
    } catch(e) {}
4385 e4a6c3b8 Olga Brani
  }
4386 e4a6c3b8 Olga Brani
4387 e4a6c3b8 Olga Brani
  return Sizzle( expr, document, null, [elem] ).length > 0;
4388 e4a6c3b8 Olga Brani
};
4389 e4a6c3b8 Olga Brani
4390 e4a6c3b8 Olga Brani
Sizzle.contains = function( context, elem ) {
4391 e4a6c3b8 Olga Brani
  // Set document vars if needed
4392 e4a6c3b8 Olga Brani
  if ( ( context.ownerDocument || context ) !== document ) {
4393 e4a6c3b8 Olga Brani
    setDocument( context );
4394 e4a6c3b8 Olga Brani
  }
4395 e4a6c3b8 Olga Brani
  return contains( context, elem );
4396 e4a6c3b8 Olga Brani
};
4397 e4a6c3b8 Olga Brani
4398 e4a6c3b8 Olga Brani
Sizzle.attr = function( elem, name ) {
4399 e4a6c3b8 Olga Brani
  var val;
4400 e4a6c3b8 Olga Brani
4401 e4a6c3b8 Olga Brani
  // Set document vars if needed
4402 e4a6c3b8 Olga Brani
  if ( ( elem.ownerDocument || elem ) !== document ) {
4403 e4a6c3b8 Olga Brani
    setDocument( elem );
4404 e4a6c3b8 Olga Brani
  }
4405 e4a6c3b8 Olga Brani
4406 e4a6c3b8 Olga Brani
  if ( !documentIsXML ) {
4407 e4a6c3b8 Olga Brani
    name = name.toLowerCase();
4408 e4a6c3b8 Olga Brani
  }
4409 e4a6c3b8 Olga Brani
  if ( (val = Expr.attrHandle[ name ]) ) {
4410 e4a6c3b8 Olga Brani
    return val( elem );
4411 e4a6c3b8 Olga Brani
  }
4412 e4a6c3b8 Olga Brani
  if ( documentIsXML || support.attributes ) {
4413 e4a6c3b8 Olga Brani
    return elem.getAttribute( name );
4414 e4a6c3b8 Olga Brani
  }
4415 e4a6c3b8 Olga Brani
  return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
4416 e4a6c3b8 Olga Brani
    name :
4417 e4a6c3b8 Olga Brani
    val && val.specified ? val.value : null;
4418 e4a6c3b8 Olga Brani
};
4419 e4a6c3b8 Olga Brani
4420 e4a6c3b8 Olga Brani
Sizzle.error = function( msg ) {
4421 e4a6c3b8 Olga Brani
  throw new Error( "Syntax error, unrecognized expression: " + msg );
4422 e4a6c3b8 Olga Brani
};
4423 e4a6c3b8 Olga Brani
4424 e4a6c3b8 Olga Brani
// Document sorting and removing duplicates
4425 e4a6c3b8 Olga Brani
Sizzle.uniqueSort = function( results ) {
4426 e4a6c3b8 Olga Brani
  var elem,
4427 e4a6c3b8 Olga Brani
    duplicates = [],
4428 e4a6c3b8 Olga Brani
    i = 1,
4429 e4a6c3b8 Olga Brani
    j = 0;
4430 e4a6c3b8 Olga Brani
4431 e4a6c3b8 Olga Brani
  // Unless we *know* we can detect duplicates, assume their presence
4432 e4a6c3b8 Olga Brani
  hasDuplicate = !support.detectDuplicates;
4433 e4a6c3b8 Olga Brani
  results.sort( sortOrder );
4434 e4a6c3b8 Olga Brani
4435 e4a6c3b8 Olga Brani
  if ( hasDuplicate ) {
4436 e4a6c3b8 Olga Brani
    for ( ; (elem = results[i]); i++ ) {
4437 e4a6c3b8 Olga Brani
      if ( elem === results[ i - 1 ] ) {
4438 e4a6c3b8 Olga Brani
        j = duplicates.push( i );
4439 e4a6c3b8 Olga Brani
      }
4440 e4a6c3b8 Olga Brani
    }
4441 e4a6c3b8 Olga Brani
    while ( j-- ) {
4442 e4a6c3b8 Olga Brani
      results.splice( duplicates[ j ], 1 );
4443 e4a6c3b8 Olga Brani
    }
4444 e4a6c3b8 Olga Brani
  }
4445 e4a6c3b8 Olga Brani
4446 e4a6c3b8 Olga Brani
  return results;
4447 e4a6c3b8 Olga Brani
};
4448 e4a6c3b8 Olga Brani
4449 e4a6c3b8 Olga Brani
function siblingCheck( a, b ) {
4450 e4a6c3b8 Olga Brani
  var cur = b && a,
4451 e4a6c3b8 Olga Brani
    diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
4452 e4a6c3b8 Olga Brani
4453 e4a6c3b8 Olga Brani
  // Use IE sourceIndex if available on both nodes
4454 e4a6c3b8 Olga Brani
  if ( diff ) {
4455 e4a6c3b8 Olga Brani
    return diff;
4456 e4a6c3b8 Olga Brani
  }
4457 e4a6c3b8 Olga Brani
4458 e4a6c3b8 Olga Brani
  // Check if b follows a
4459 e4a6c3b8 Olga Brani
  if ( cur ) {
4460 e4a6c3b8 Olga Brani
    while ( (cur = cur.nextSibling) ) {
4461 e4a6c3b8 Olga Brani
      if ( cur === b ) {
4462 e4a6c3b8 Olga Brani
        return -1;
4463 e4a6c3b8 Olga Brani
      }
4464 e4a6c3b8 Olga Brani
    }
4465 e4a6c3b8 Olga Brani
  }
4466 e4a6c3b8 Olga Brani
4467 e4a6c3b8 Olga Brani
  return a ? 1 : -1;
4468 e4a6c3b8 Olga Brani
}
4469 e4a6c3b8 Olga Brani
4470 e4a6c3b8 Olga Brani
// Returns a function to use in pseudos for input types
4471 e4a6c3b8 Olga Brani
function createInputPseudo( type ) {
4472 e4a6c3b8 Olga Brani
  return function( elem ) {
4473 e4a6c3b8 Olga Brani
    var name = elem.nodeName.toLowerCase();
4474 e4a6c3b8 Olga Brani
    return name === "input" && elem.type === type;
4475 e4a6c3b8 Olga Brani
  };
4476 e4a6c3b8 Olga Brani
}
4477 e4a6c3b8 Olga Brani
4478 e4a6c3b8 Olga Brani
// Returns a function to use in pseudos for buttons
4479 e4a6c3b8 Olga Brani
function createButtonPseudo( type ) {
4480 e4a6c3b8 Olga Brani
  return function( elem ) {
4481 e4a6c3b8 Olga Brani
    var name = elem.nodeName.toLowerCase();
4482 e4a6c3b8 Olga Brani
    return (name === "input" || name === "button") && elem.type === type;
4483 e4a6c3b8 Olga Brani
  };
4484 e4a6c3b8 Olga Brani
}
4485 e4a6c3b8 Olga Brani
4486 e4a6c3b8 Olga Brani
// Returns a function to use in pseudos for positionals
4487 e4a6c3b8 Olga Brani
function createPositionalPseudo( fn ) {
4488 e4a6c3b8 Olga Brani
  return markFunction(function( argument ) {
4489 e4a6c3b8 Olga Brani
    argument = +argument;
4490 e4a6c3b8 Olga Brani
    return markFunction(function( seed, matches ) {
4491 e4a6c3b8 Olga Brani
      var j,
4492 e4a6c3b8 Olga Brani
        matchIndexes = fn( [], seed.length, argument ),
4493 e4a6c3b8 Olga Brani
        i = matchIndexes.length;
4494 e4a6c3b8 Olga Brani
4495 e4a6c3b8 Olga Brani
      // Match elements found at the specified indexes
4496 e4a6c3b8 Olga Brani
      while ( i-- ) {
4497 e4a6c3b8 Olga Brani
        if ( seed[ (j = matchIndexes[i]) ] ) {
4498 e4a6c3b8 Olga Brani
          seed[j] = !(matches[j] = seed[j]);
4499 e4a6c3b8 Olga Brani
        }
4500 e4a6c3b8 Olga Brani
      }
4501 e4a6c3b8 Olga Brani
    });
4502 e4a6c3b8 Olga Brani
  });
4503 e4a6c3b8 Olga Brani
}
4504 e4a6c3b8 Olga Brani
4505 e4a6c3b8 Olga Brani
/**
4506 e4a6c3b8 Olga Brani
 * Utility function for retrieving the text value of an array of DOM nodes
4507 e4a6c3b8 Olga Brani
 * @param {Array|Element} elem
4508 e4a6c3b8 Olga Brani
 */
4509 e4a6c3b8 Olga Brani
getText = Sizzle.getText = function( elem ) {
4510 e4a6c3b8 Olga Brani
  var node,
4511 e4a6c3b8 Olga Brani
    ret = "",
4512 e4a6c3b8 Olga Brani
    i = 0,
4513 e4a6c3b8 Olga Brani
    nodeType = elem.nodeType;
4514 e4a6c3b8 Olga Brani
4515 e4a6c3b8 Olga Brani
  if ( !nodeType ) {
4516 e4a6c3b8 Olga Brani
    // If no nodeType, this is expected to be an array
4517 e4a6c3b8 Olga Brani
    for ( ; (node = elem[i]); i++ ) {
4518 e4a6c3b8 Olga Brani
      // Do not traverse comment nodes
4519 e4a6c3b8 Olga Brani
      ret += getText( node );
4520 e4a6c3b8 Olga Brani
    }
4521 e4a6c3b8 Olga Brani
  } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
4522 e4a6c3b8 Olga Brani
    // Use textContent for elements
4523 e4a6c3b8 Olga Brani
    // innerText usage removed for consistency of new lines (see #11153)
4524 e4a6c3b8 Olga Brani
    if ( typeof elem.textContent === "string" ) {
4525 e4a6c3b8 Olga Brani
      return elem.textContent;
4526 e4a6c3b8 Olga Brani
    } else {
4527 e4a6c3b8 Olga Brani
      // Traverse its children
4528 e4a6c3b8 Olga Brani
      for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
4529 e4a6c3b8 Olga Brani
        ret += getText( elem );
4530 e4a6c3b8 Olga Brani
      }
4531 e4a6c3b8 Olga Brani
    }
4532 e4a6c3b8 Olga Brani
  } else if ( nodeType === 3 || nodeType === 4 ) {
4533 e4a6c3b8 Olga Brani
    return elem.nodeValue;
4534 e4a6c3b8 Olga Brani
  }
4535 e4a6c3b8 Olga Brani
  // Do not include comment or processing instruction nodes
4536 e4a6c3b8 Olga Brani
4537 e4a6c3b8 Olga Brani
  return ret;
4538 e4a6c3b8 Olga Brani
};
4539 e4a6c3b8 Olga Brani
4540 e4a6c3b8 Olga Brani
Expr = Sizzle.selectors = {
4541 e4a6c3b8 Olga Brani
4542 e4a6c3b8 Olga Brani
  // Can be adjusted by the user
4543 e4a6c3b8 Olga Brani
  cacheLength: 50,
4544 e4a6c3b8 Olga Brani
4545 e4a6c3b8 Olga Brani
  createPseudo: markFunction,
4546 e4a6c3b8 Olga Brani
4547 e4a6c3b8 Olga Brani
  match: matchExpr,
4548 e4a6c3b8 Olga Brani
4549 e4a6c3b8 Olga Brani
  find: {},
4550 e4a6c3b8 Olga Brani
4551 e4a6c3b8 Olga Brani
  relative: {
4552 e4a6c3b8 Olga Brani
    ">": { dir: "parentNode", first: true },
4553 e4a6c3b8 Olga Brani
    " ": { dir: "parentNode" },
4554 e4a6c3b8 Olga Brani
    "+": { dir: "previousSibling", first: true },
4555 e4a6c3b8 Olga Brani
    "~": { dir: "previousSibling" }
4556 e4a6c3b8 Olga Brani
  },
4557 e4a6c3b8 Olga Brani
4558 e4a6c3b8 Olga Brani
  preFilter: {
4559 e4a6c3b8 Olga Brani
    "ATTR": function( match ) {
4560 e4a6c3b8 Olga Brani
      match[1] = match[1].replace( runescape, funescape );
4561 e4a6c3b8 Olga Brani
4562 e4a6c3b8 Olga Brani
      // Move the given value to match[3] whether quoted or unquoted
4563 e4a6c3b8 Olga Brani
      match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
4564 e4a6c3b8 Olga Brani
4565 e4a6c3b8 Olga Brani
      if ( match[2] === "~=" ) {
4566 e4a6c3b8 Olga Brani
        match[3] = " " + match[3] + " ";
4567 e4a6c3b8 Olga Brani
      }
4568 e4a6c3b8 Olga Brani
4569 e4a6c3b8 Olga Brani
      return match.slice( 0, 4 );
4570 e4a6c3b8 Olga Brani
    },
4571 e4a6c3b8 Olga Brani
4572 e4a6c3b8 Olga Brani
    "CHILD": function( match ) {
4573 e4a6c3b8 Olga Brani
      /* matches from matchExpr["CHILD"]
4574 e4a6c3b8 Olga Brani
        1 type (only|nth|...)
4575 e4a6c3b8 Olga Brani
        2 what (child|of-type)
4576 e4a6c3b8 Olga Brani
        3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
4577 e4a6c3b8 Olga Brani
        4 xn-component of xn+y argument ([+-]?\d*n|)
4578 e4a6c3b8 Olga Brani
        5 sign of xn-component
4579 e4a6c3b8 Olga Brani
        6 x of xn-component
4580 e4a6c3b8 Olga Brani
        7 sign of y-component
4581 e4a6c3b8 Olga Brani
        8 y of y-component
4582 e4a6c3b8 Olga Brani
      */
4583 e4a6c3b8 Olga Brani
      match[1] = match[1].toLowerCase();
4584 e4a6c3b8 Olga Brani
4585 e4a6c3b8 Olga Brani
      if ( match[1].slice( 0, 3 ) === "nth" ) {
4586 e4a6c3b8 Olga Brani
        // nth-* requires argument
4587 e4a6c3b8 Olga Brani
        if ( !match[3] ) {
4588 e4a6c3b8 Olga Brani
          Sizzle.error( match[0] );
4589 e4a6c3b8 Olga Brani
        }
4590 e4a6c3b8 Olga Brani
4591 e4a6c3b8 Olga Brani
        // numeric x and y parameters for Expr.filter.CHILD
4592 e4a6c3b8 Olga Brani
        // remember that false/true cast respectively to 0/1
4593 e4a6c3b8 Olga Brani
        match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
4594 e4a6c3b8 Olga Brani
        match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
4595 e4a6c3b8 Olga Brani
4596 e4a6c3b8 Olga Brani
      // other types prohibit arguments
4597 e4a6c3b8 Olga Brani
      } else if ( match[3] ) {
4598 e4a6c3b8 Olga Brani
        Sizzle.error( match[0] );
4599 e4a6c3b8 Olga Brani
      }
4600 e4a6c3b8 Olga Brani
4601 e4a6c3b8 Olga Brani
      return match;
4602 e4a6c3b8 Olga Brani
    },
4603 e4a6c3b8 Olga Brani
4604 e4a6c3b8 Olga Brani
    "PSEUDO": function( match ) {
4605 e4a6c3b8 Olga Brani
      var excess,
4606 e4a6c3b8 Olga Brani
        unquoted = !match[5] && match[2];
4607 e4a6c3b8 Olga Brani
4608 e4a6c3b8 Olga Brani
      if ( matchExpr["CHILD"].test( match[0] ) ) {
4609 e4a6c3b8 Olga Brani
        return null;
4610 e4a6c3b8 Olga Brani
      }
4611 e4a6c3b8 Olga Brani
4612 e4a6c3b8 Olga Brani
      // Accept quoted arguments as-is
4613 e4a6c3b8 Olga Brani
      if ( match[4] ) {
4614 e4a6c3b8 Olga Brani
        match[2] = match[4];
4615 e4a6c3b8 Olga Brani
4616 e4a6c3b8 Olga Brani
      // Strip excess characters from unquoted arguments
4617 e4a6c3b8 Olga Brani
      } else if ( unquoted && rpseudo.test( unquoted ) &&
4618 e4a6c3b8 Olga Brani
        // Get excess from tokenize (recursively)
4619 e4a6c3b8 Olga Brani
        (excess = tokenize( unquoted, true )) &&
4620 e4a6c3b8 Olga Brani
        // advance to the next closing parenthesis
4621 e4a6c3b8 Olga Brani
        (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
4622 e4a6c3b8 Olga Brani
4623 e4a6c3b8 Olga Brani
        // excess is a negative index
4624 e4a6c3b8 Olga Brani
        match[0] = match[0].slice( 0, excess );
4625 e4a6c3b8 Olga Brani
        match[2] = unquoted.slice( 0, excess );
4626 e4a6c3b8 Olga Brani
      }
4627 e4a6c3b8 Olga Brani
4628 e4a6c3b8 Olga Brani
      // Return only captures needed by the pseudo filter method (type and argument)
4629 e4a6c3b8 Olga Brani
      return match.slice( 0, 3 );
4630 e4a6c3b8 Olga Brani
    }
4631 e4a6c3b8 Olga Brani
  },
4632 e4a6c3b8 Olga Brani
4633 e4a6c3b8 Olga Brani
  filter: {
4634 e4a6c3b8 Olga Brani
4635 e4a6c3b8 Olga Brani
    "TAG": function( nodeName ) {
4636 e4a6c3b8 Olga Brani
      if ( nodeName === "*" ) {
4637 e4a6c3b8 Olga Brani
        return function() { return true; };
4638 e4a6c3b8 Olga Brani
      }
4639 e4a6c3b8 Olga Brani
4640 e4a6c3b8 Olga Brani
      nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
4641 e4a6c3b8 Olga Brani
      return function( elem ) {
4642 e4a6c3b8 Olga Brani
        return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
4643 e4a6c3b8 Olga Brani
      };
4644 e4a6c3b8 Olga Brani
    },
4645 e4a6c3b8 Olga Brani
4646 e4a6c3b8 Olga Brani
    "CLASS": function( className ) {
4647 e4a6c3b8 Olga Brani
      var pattern = classCache[ className + " " ];
4648 e4a6c3b8 Olga Brani
4649 e4a6c3b8 Olga Brani
      return pattern ||
4650 e4a6c3b8 Olga Brani
        (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
4651 e4a6c3b8 Olga Brani
        classCache( className, function( elem ) {
4652 e4a6c3b8 Olga Brani
          return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
4653 e4a6c3b8 Olga Brani
        });
4654 e4a6c3b8 Olga Brani
    },
4655 e4a6c3b8 Olga Brani
4656 e4a6c3b8 Olga Brani
    "ATTR": function( name, operator, check ) {
4657 e4a6c3b8 Olga Brani
      return function( elem ) {
4658 e4a6c3b8 Olga Brani
        var result = Sizzle.attr( elem, name );
4659 e4a6c3b8 Olga Brani
4660 e4a6c3b8 Olga Brani
        if ( result == null ) {
4661 e4a6c3b8 Olga Brani
          return operator === "!=";
4662 e4a6c3b8 Olga Brani
        }
4663 e4a6c3b8 Olga Brani
        if ( !operator ) {
4664 e4a6c3b8 Olga Brani
          return true;
4665 e4a6c3b8 Olga Brani
        }
4666 e4a6c3b8 Olga Brani
4667 e4a6c3b8 Olga Brani
        result += "";
4668 e4a6c3b8 Olga Brani
4669 e4a6c3b8 Olga Brani
        return operator === "=" ? result === check :
4670 e4a6c3b8 Olga Brani
          operator === "!=" ? result !== check :
4671 e4a6c3b8 Olga Brani
          operator === "^=" ? check && result.indexOf( check ) === 0 :
4672 e4a6c3b8 Olga Brani
          operator === "*=" ? check && result.indexOf( check ) > -1 :
4673 e4a6c3b8 Olga Brani
          operator === "$=" ? check && result.slice( -check.length ) === check :
4674 e4a6c3b8 Olga Brani
          operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
4675 e4a6c3b8 Olga Brani
          operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
4676 e4a6c3b8 Olga Brani
          false;
4677 e4a6c3b8 Olga Brani
      };
4678 e4a6c3b8 Olga Brani
    },
4679 e4a6c3b8 Olga Brani
4680 e4a6c3b8 Olga Brani
    "CHILD": function( type, what, argument, first, last ) {
4681 e4a6c3b8 Olga Brani
      var simple = type.slice( 0, 3 ) !== "nth",
4682 e4a6c3b8 Olga Brani
        forward = type.slice( -4 ) !== "last",
4683 e4a6c3b8 Olga Brani
        ofType = what === "of-type";
4684 e4a6c3b8 Olga Brani
4685 e4a6c3b8 Olga Brani
      return first === 1 && last === 0 ?
4686 e4a6c3b8 Olga Brani
4687 e4a6c3b8 Olga Brani
        // Shortcut for :nth-*(n)
4688 e4a6c3b8 Olga Brani
        function( elem ) {
4689 e4a6c3b8 Olga Brani
          return !!elem.parentNode;
4690 e4a6c3b8 Olga Brani
        } :
4691 e4a6c3b8 Olga Brani
4692 e4a6c3b8 Olga Brani
        function( elem, context, xml ) {
4693 e4a6c3b8 Olga Brani
          var cache, outerCache, node, diff, nodeIndex, start,
4694 e4a6c3b8 Olga Brani
            dir = simple !== forward ? "nextSibling" : "previousSibling",
4695 e4a6c3b8 Olga Brani
            parent = elem.parentNode,
4696 e4a6c3b8 Olga Brani
            name = ofType && elem.nodeName.toLowerCase(),
4697 e4a6c3b8 Olga Brani
            useCache = !xml && !ofType;
4698 e4a6c3b8 Olga Brani
4699 e4a6c3b8 Olga Brani
          if ( parent ) {
4700 e4a6c3b8 Olga Brani
4701 e4a6c3b8 Olga Brani
            // :(first|last|only)-(child|of-type)
4702 e4a6c3b8 Olga Brani
            if ( simple ) {
4703 e4a6c3b8 Olga Brani
              while ( dir ) {
4704 e4a6c3b8 Olga Brani
                node = elem;
4705 e4a6c3b8 Olga Brani
                while ( (node = node[ dir ]) ) {
4706 e4a6c3b8 Olga Brani
                  if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
4707 e4a6c3b8 Olga Brani
                    return false;
4708 e4a6c3b8 Olga Brani
                  }
4709 e4a6c3b8 Olga Brani
                }
4710 e4a6c3b8 Olga Brani
                // Reverse direction for :only-* (if we haven't yet done so)
4711 e4a6c3b8 Olga Brani
                start = dir = type === "only" && !start && "nextSibling";
4712 e4a6c3b8 Olga Brani
              }
4713 e4a6c3b8 Olga Brani
              return true;
4714 e4a6c3b8 Olga Brani
            }
4715 e4a6c3b8 Olga Brani
4716 e4a6c3b8 Olga Brani
            start = [ forward ? parent.firstChild : parent.lastChild ];
4717 e4a6c3b8 Olga Brani
4718 e4a6c3b8 Olga Brani
            // non-xml :nth-child(...) stores cache data on `parent`
4719 e4a6c3b8 Olga Brani
            if ( forward && useCache ) {
4720 e4a6c3b8 Olga Brani
              // Seek `elem` from a previously-cached index
4721 e4a6c3b8 Olga Brani
              outerCache = parent[ expando ] || (parent[ expando ] = {});
4722 e4a6c3b8 Olga Brani
              cache = outerCache[ type ] || [];
4723 e4a6c3b8 Olga Brani
              nodeIndex = cache[0] === dirruns && cache[1];
4724 e4a6c3b8 Olga Brani
              diff = cache[0] === dirruns && cache[2];
4725 e4a6c3b8 Olga Brani
              node = nodeIndex && parent.childNodes[ nodeIndex ];
4726 e4a6c3b8 Olga Brani
4727 e4a6c3b8 Olga Brani
              while ( (node = ++nodeIndex && node && node[ dir ] ||
4728 e4a6c3b8 Olga Brani
4729 e4a6c3b8 Olga Brani
                // Fallback to seeking `elem` from the start
4730 e4a6c3b8 Olga Brani
                (diff = nodeIndex = 0) || start.pop()) ) {
4731 e4a6c3b8 Olga Brani
4732 e4a6c3b8 Olga Brani
                // When found, cache indexes on `parent` and break
4733 e4a6c3b8 Olga Brani
                if ( node.nodeType === 1 && ++diff && node === elem ) {
4734 e4a6c3b8 Olga Brani
                  outerCache[ type ] = [ dirruns, nodeIndex, diff ];
4735 e4a6c3b8 Olga Brani
                  break;
4736 e4a6c3b8 Olga Brani
                }
4737 e4a6c3b8 Olga Brani
              }
4738 e4a6c3b8 Olga Brani
4739 e4a6c3b8 Olga Brani
            // Use previously-cached element index if available
4740 e4a6c3b8 Olga Brani
            } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
4741 e4a6c3b8 Olga Brani
              diff = cache[1];
4742 e4a6c3b8 Olga Brani
4743 e4a6c3b8 Olga Brani
            // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
4744 e4a6c3b8 Olga Brani
            } else {
4745 e4a6c3b8 Olga Brani
              // Use the same loop as above to seek `elem` from the start
4746 e4a6c3b8 Olga Brani
              while ( (node = ++nodeIndex && node && node[ dir ] ||
4747 e4a6c3b8 Olga Brani
                (diff = nodeIndex = 0) || start.pop()) ) {
4748 e4a6c3b8 Olga Brani
4749 e4a6c3b8 Olga Brani
                if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
4750 e4a6c3b8 Olga Brani
                  // Cache the index of each encountered element
4751 e4a6c3b8 Olga Brani
                  if ( useCache ) {
4752 e4a6c3b8 Olga Brani
                    (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
4753 e4a6c3b8 Olga Brani
                  }
4754 e4a6c3b8 Olga Brani
4755 e4a6c3b8 Olga Brani
                  if ( node === elem ) {
4756 e4a6c3b8 Olga Brani
                    break;
4757 e4a6c3b8 Olga Brani
                  }
4758 e4a6c3b8 Olga Brani
                }
4759 e4a6c3b8 Olga Brani
              }
4760 e4a6c3b8 Olga Brani
            }
4761 e4a6c3b8 Olga Brani
4762 e4a6c3b8 Olga Brani
            // Incorporate the offset, then check against cycle size
4763 e4a6c3b8 Olga Brani
            diff -= last;
4764 e4a6c3b8 Olga Brani
            return diff === first || ( diff % first === 0 && diff / first >= 0 );
4765 e4a6c3b8 Olga Brani
          }
4766 e4a6c3b8 Olga Brani
        };
4767 e4a6c3b8 Olga Brani
    },
4768 e4a6c3b8 Olga Brani
4769 e4a6c3b8 Olga Brani
    "PSEUDO": function( pseudo, argument ) {
4770 e4a6c3b8 Olga Brani
      // pseudo-class names are case-insensitive
4771 e4a6c3b8 Olga Brani
      // http://www.w3.org/TR/selectors/#pseudo-classes
4772 e4a6c3b8 Olga Brani
      // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
4773 e4a6c3b8 Olga Brani
      // Remember that setFilters inherits from pseudos
4774 e4a6c3b8 Olga Brani
      var args,
4775 e4a6c3b8 Olga Brani
        fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
4776 e4a6c3b8 Olga Brani
          Sizzle.error( "unsupported pseudo: " + pseudo );
4777 e4a6c3b8 Olga Brani
4778 e4a6c3b8 Olga Brani
      // The user may use createPseudo to indicate that
4779 e4a6c3b8 Olga Brani
      // arguments are needed to create the filter function
4780 e4a6c3b8 Olga Brani
      // just as Sizzle does
4781 e4a6c3b8 Olga Brani
      if ( fn[ expando ] ) {
4782 e4a6c3b8 Olga Brani
        return fn( argument );
4783 e4a6c3b8 Olga Brani
      }
4784 e4a6c3b8 Olga Brani
4785 e4a6c3b8 Olga Brani
      // But maintain support for old signatures
4786 e4a6c3b8 Olga Brani
      if ( fn.length > 1 ) {
4787 e4a6c3b8 Olga Brani
        args = [ pseudo, pseudo, "", argument ];
4788 e4a6c3b8 Olga Brani
        return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
4789 e4a6c3b8 Olga Brani
          markFunction(function( seed, matches ) {
4790 e4a6c3b8 Olga Brani
            var idx,
4791 e4a6c3b8 Olga Brani
              matched = fn( seed, argument ),
4792 e4a6c3b8 Olga Brani
              i = matched.length;
4793 e4a6c3b8 Olga Brani
            while ( i-- ) {
4794 e4a6c3b8 Olga Brani
              idx = indexOf.call( seed, matched[i] );
4795 e4a6c3b8 Olga Brani
              seed[ idx ] = !( matches[ idx ] = matched[i] );
4796 e4a6c3b8 Olga Brani
            }
4797 e4a6c3b8 Olga Brani
          }) :
4798 e4a6c3b8 Olga Brani
          function( elem ) {
4799 e4a6c3b8 Olga Brani
            return fn( elem, 0, args );
4800 e4a6c3b8 Olga Brani
          };
4801 e4a6c3b8 Olga Brani
      }
4802 e4a6c3b8 Olga Brani
4803 e4a6c3b8 Olga Brani
      return fn;
4804 e4a6c3b8 Olga Brani
    }
4805 e4a6c3b8 Olga Brani
  },
4806 e4a6c3b8 Olga Brani
4807 e4a6c3b8 Olga Brani
  pseudos: {
4808 e4a6c3b8 Olga Brani
    // Potentially complex pseudos
4809 e4a6c3b8 Olga Brani
    "not": markFunction(function( selector ) {
4810 e4a6c3b8 Olga Brani
      // Trim the selector passed to compile
4811 e4a6c3b8 Olga Brani
      // to avoid treating leading and trailing
4812 e4a6c3b8 Olga Brani
      // spaces as combinators
4813 e4a6c3b8 Olga Brani
      var input = [],
4814 e4a6c3b8 Olga Brani
        results = [],
4815 e4a6c3b8 Olga Brani
        matcher = compile( selector.replace( rtrim, "$1" ) );
4816 e4a6c3b8 Olga Brani
4817 e4a6c3b8 Olga Brani
      return matcher[ expando ] ?
4818 e4a6c3b8 Olga Brani
        markFunction(function( seed, matches, context, xml ) {
4819 e4a6c3b8 Olga Brani
          var elem,
4820 e4a6c3b8 Olga Brani
            unmatched = matcher( seed, null, xml, [] ),
4821 e4a6c3b8 Olga Brani
            i = seed.length;
4822 e4a6c3b8 Olga Brani
4823 e4a6c3b8 Olga Brani
          // Match elements unmatched by `matcher`
4824 e4a6c3b8 Olga Brani
          while ( i-- ) {
4825 e4a6c3b8 Olga Brani
            if ( (elem = unmatched[i]) ) {
4826 e4a6c3b8 Olga Brani
              seed[i] = !(matches[i] = elem);
4827 e4a6c3b8 Olga Brani
            }
4828 e4a6c3b8 Olga Brani
          }
4829 e4a6c3b8 Olga Brani
        }) :
4830 e4a6c3b8 Olga Brani
        function( elem, context, xml ) {
4831 e4a6c3b8 Olga Brani
          input[0] = elem;
4832 e4a6c3b8 Olga Brani
          matcher( input, null, xml, results );
4833 e4a6c3b8 Olga Brani
          return !results.pop();
4834 e4a6c3b8 Olga Brani
        };
4835 e4a6c3b8 Olga Brani
    }),
4836 e4a6c3b8 Olga Brani
4837 e4a6c3b8 Olga Brani
    "has": markFunction(function( selector ) {
4838 e4a6c3b8 Olga Brani
      return function( elem ) {
4839 e4a6c3b8 Olga Brani
        return Sizzle( selector, elem ).length > 0;
4840 e4a6c3b8 Olga Brani
      };
4841 e4a6c3b8 Olga Brani
    }),
4842 e4a6c3b8 Olga Brani
4843 e4a6c3b8 Olga Brani
    "contains": markFunction(function( text ) {
4844 e4a6c3b8 Olga Brani
      return function( elem ) {
4845 e4a6c3b8 Olga Brani
        return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
4846 e4a6c3b8 Olga Brani
      };
4847 e4a6c3b8 Olga Brani
    }),
4848 e4a6c3b8 Olga Brani
4849 e4a6c3b8 Olga Brani
    // "Whether an element is represented by a :lang() selector
4850 e4a6c3b8 Olga Brani
    // is based solely on the element's language value
4851 e4a6c3b8 Olga Brani
    // being equal to the identifier C,
4852 e4a6c3b8 Olga Brani
    // or beginning with the identifier C immediately followed by "-".
4853 e4a6c3b8 Olga Brani
    // The matching of C against the element's language value is performed case-insensitively.
4854 e4a6c3b8 Olga Brani
    // The identifier C does not have to be a valid language name."
4855 e4a6c3b8 Olga Brani
    // http://www.w3.org/TR/selectors/#lang-pseudo
4856 e4a6c3b8 Olga Brani
    "lang": markFunction( function( lang ) {
4857 e4a6c3b8 Olga Brani
      // lang value must be a valid identifider
4858 e4a6c3b8 Olga Brani
      if ( !ridentifier.test(lang || "") ) {
4859 e4a6c3b8 Olga Brani
        Sizzle.error( "unsupported lang: " + lang );
4860 e4a6c3b8 Olga Brani
      }
4861 e4a6c3b8 Olga Brani
      lang = lang.replace( runescape, funescape ).toLowerCase();
4862 e4a6c3b8 Olga Brani
      return function( elem ) {
4863 e4a6c3b8 Olga Brani
        var elemLang;
4864 e4a6c3b8 Olga Brani
        do {
4865 e4a6c3b8 Olga Brani
          if ( (elemLang = documentIsXML ?
4866 e4a6c3b8 Olga Brani
            elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
4867 e4a6c3b8 Olga Brani
            elem.lang) ) {
4868 e4a6c3b8 Olga Brani
4869 e4a6c3b8 Olga Brani
            elemLang = elemLang.toLowerCase();
4870 e4a6c3b8 Olga Brani
            return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
4871 e4a6c3b8 Olga Brani
          }
4872 e4a6c3b8 Olga Brani
        } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
4873 e4a6c3b8 Olga Brani
        return false;
4874 e4a6c3b8 Olga Brani
      };
4875 e4a6c3b8 Olga Brani
    }),
4876 e4a6c3b8 Olga Brani
4877 e4a6c3b8 Olga Brani
    // Miscellaneous
4878 e4a6c3b8 Olga Brani
    "target": function( elem ) {
4879 e4a6c3b8 Olga Brani
      var hash = window.location && window.location.hash;
4880 e4a6c3b8 Olga Brani
      return hash && hash.slice( 1 ) === elem.id;
4881 e4a6c3b8 Olga Brani
    },
4882 e4a6c3b8 Olga Brani
4883 e4a6c3b8 Olga Brani
    "root": function( elem ) {
4884 e4a6c3b8 Olga Brani
      return elem === docElem;
4885 e4a6c3b8 Olga Brani
    },
4886 e4a6c3b8 Olga Brani
4887 e4a6c3b8 Olga Brani
    "focus": function( elem ) {
4888 e4a6c3b8 Olga Brani
      return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
4889 e4a6c3b8 Olga Brani
    },
4890 e4a6c3b8 Olga Brani
4891 e4a6c3b8 Olga Brani
    // Boolean properties
4892 e4a6c3b8 Olga Brani
    "enabled": function( elem ) {
4893 e4a6c3b8 Olga Brani
      return elem.disabled === false;
4894 e4a6c3b8 Olga Brani
    },
4895 e4a6c3b8 Olga Brani
4896 e4a6c3b8 Olga Brani
    "disabled": function( elem ) {
4897 e4a6c3b8 Olga Brani
      return elem.disabled === true;
4898 e4a6c3b8 Olga Brani
    },
4899 e4a6c3b8 Olga Brani
4900 e4a6c3b8 Olga Brani
    "checked": function( elem ) {
4901 e4a6c3b8 Olga Brani
      // In CSS3, :checked should return both checked and selected elements
4902 e4a6c3b8 Olga Brani
      // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
4903 e4a6c3b8 Olga Brani
      var nodeName = elem.nodeName.toLowerCase();
4904 e4a6c3b8 Olga Brani
      return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
4905 e4a6c3b8 Olga Brani
    },
4906 e4a6c3b8 Olga Brani
4907 e4a6c3b8 Olga Brani
    "selected": function( elem ) {
4908 e4a6c3b8 Olga Brani
      // Accessing this property makes selected-by-default
4909 e4a6c3b8 Olga Brani
      // options in Safari work properly
4910 e4a6c3b8 Olga Brani
      if ( elem.parentNode ) {
4911 e4a6c3b8 Olga Brani
        elem.parentNode.selectedIndex;
4912 e4a6c3b8 Olga Brani
      }
4913 e4a6c3b8 Olga Brani
4914 e4a6c3b8 Olga Brani
      return elem.selected === true;
4915 e4a6c3b8 Olga Brani
    },
4916 e4a6c3b8 Olga Brani
4917 e4a6c3b8 Olga Brani
    // Contents
4918 e4a6c3b8 Olga Brani
    "empty": function( elem ) {
4919 e4a6c3b8 Olga Brani
      // http://www.w3.org/TR/selectors/#empty-pseudo
4920 e4a6c3b8 Olga Brani
      // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
4921 e4a6c3b8 Olga Brani
      //   not comment, processing instructions, or others
4922 e4a6c3b8 Olga Brani
      // Thanks to Diego Perini for the nodeName shortcut
4923 e4a6c3b8 Olga Brani
      //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
4924 e4a6c3b8 Olga Brani
      for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
4925 e4a6c3b8 Olga Brani
        if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
4926 e4a6c3b8 Olga Brani
          return false;
4927 e4a6c3b8 Olga Brani
        }
4928 e4a6c3b8 Olga Brani
      }
4929 e4a6c3b8 Olga Brani
      return true;
4930 e4a6c3b8 Olga Brani
    },
4931 e4a6c3b8 Olga Brani
4932 e4a6c3b8 Olga Brani
    "parent": function( elem ) {
4933 e4a6c3b8 Olga Brani
      return !Expr.pseudos["empty"]( elem );
4934 e4a6c3b8 Olga Brani
    },
4935 e4a6c3b8 Olga Brani
4936 e4a6c3b8 Olga Brani
    // Element/input types
4937 e4a6c3b8 Olga Brani
    "header": function( elem ) {
4938 e4a6c3b8 Olga Brani
      return rheader.test( elem.nodeName );
4939 e4a6c3b8 Olga Brani
    },
4940 e4a6c3b8 Olga Brani
4941 e4a6c3b8 Olga Brani
    "input": function( elem ) {
4942 e4a6c3b8 Olga Brani
      return rinputs.test( elem.nodeName );
4943 e4a6c3b8 Olga Brani
    },
4944 e4a6c3b8 Olga Brani
4945 e4a6c3b8 Olga Brani
    "button": function( elem ) {
4946 e4a6c3b8 Olga Brani
      var name = elem.nodeName.toLowerCase();
4947 e4a6c3b8 Olga Brani
      return name === "input" && elem.type === "button" || name === "button";
4948 e4a6c3b8 Olga Brani
    },
4949 e4a6c3b8 Olga Brani
4950 e4a6c3b8 Olga Brani
    "text": function( elem ) {
4951 e4a6c3b8 Olga Brani
      var attr;
4952 e4a6c3b8 Olga Brani
      // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
4953 e4a6c3b8 Olga Brani
      // use getAttribute instead to test this case
4954 e4a6c3b8 Olga Brani
      return elem.nodeName.toLowerCase() === "input" &&
4955 e4a6c3b8 Olga Brani
        elem.type === "text" &&
4956 e4a6c3b8 Olga Brani
        ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
4957 e4a6c3b8 Olga Brani
    },
4958 e4a6c3b8 Olga Brani
4959 e4a6c3b8 Olga Brani
    // Position-in-collection
4960 e4a6c3b8 Olga Brani
    "first": createPositionalPseudo(function() {
4961 e4a6c3b8 Olga Brani
      return [ 0 ];
4962 e4a6c3b8 Olga Brani
    }),
4963 e4a6c3b8 Olga Brani
4964 e4a6c3b8 Olga Brani
    "last": createPositionalPseudo(function( matchIndexes, length ) {
4965 e4a6c3b8 Olga Brani
      return [ length - 1 ];
4966 e4a6c3b8 Olga Brani
    }),
4967 e4a6c3b8 Olga Brani
4968 e4a6c3b8 Olga Brani
    "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
4969 e4a6c3b8 Olga Brani
      return [ argument < 0 ? argument + length : argument ];
4970 e4a6c3b8 Olga Brani
    }),
4971 e4a6c3b8 Olga Brani
4972 e4a6c3b8 Olga Brani
    "even": createPositionalPseudo(function( matchIndexes, length ) {
4973 e4a6c3b8 Olga Brani
      var i = 0;
4974 e4a6c3b8 Olga Brani
      for ( ; i < length; i += 2 ) {
4975 e4a6c3b8 Olga Brani
        matchIndexes.push( i );
4976 e4a6c3b8 Olga Brani
      }
4977 e4a6c3b8 Olga Brani
      return matchIndexes;
4978 e4a6c3b8 Olga Brani
    }),
4979 e4a6c3b8 Olga Brani
4980 e4a6c3b8 Olga Brani
    "odd": createPositionalPseudo(function( matchIndexes, length ) {
4981 e4a6c3b8 Olga Brani
      var i = 1;
4982 e4a6c3b8 Olga Brani
      for ( ; i < length; i += 2 ) {
4983 e4a6c3b8 Olga Brani
        matchIndexes.push( i );
4984 e4a6c3b8 Olga Brani
      }
4985 e4a6c3b8 Olga Brani
      return matchIndexes;
4986 e4a6c3b8 Olga Brani
    }),
4987 e4a6c3b8 Olga Brani
4988 e4a6c3b8 Olga Brani
    "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
4989 e4a6c3b8 Olga Brani
      var i = argument < 0 ? argument + length : argument;
4990 e4a6c3b8 Olga Brani
      for ( ; --i >= 0; ) {
4991 e4a6c3b8 Olga Brani
        matchIndexes.push( i );
4992 e4a6c3b8 Olga Brani
      }
4993 e4a6c3b8 Olga Brani
      return matchIndexes;
4994 e4a6c3b8 Olga Brani
    }),
4995 e4a6c3b8 Olga Brani
4996 e4a6c3b8 Olga Brani
    "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
4997 e4a6c3b8 Olga Brani
      var i = argument < 0 ? argument + length : argument;
4998 e4a6c3b8 Olga Brani
      for ( ; ++i < length; ) {
4999 e4a6c3b8 Olga Brani
        matchIndexes.push( i );
5000 e4a6c3b8 Olga Brani
      }
5001 e4a6c3b8 Olga Brani
      return matchIndexes;
5002 e4a6c3b8 Olga Brani
    })
5003 e4a6c3b8 Olga Brani
  }
5004 e4a6c3b8 Olga Brani
};
5005 e4a6c3b8 Olga Brani
5006 e4a6c3b8 Olga Brani
// Add button/input type pseudos
5007 e4a6c3b8 Olga Brani
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
5008 e4a6c3b8 Olga Brani
  Expr.pseudos[ i ] = createInputPseudo( i );
5009 e4a6c3b8 Olga Brani
}
5010 e4a6c3b8 Olga Brani
for ( i in { submit: true, reset: true } ) {
5011 e4a6c3b8 Olga Brani
  Expr.pseudos[ i ] = createButtonPseudo( i );
5012 e4a6c3b8 Olga Brani
}
5013 e4a6c3b8 Olga Brani
5014 e4a6c3b8 Olga Brani
function tokenize( selector, parseOnly ) {
5015 e4a6c3b8 Olga Brani
  var matched, match, tokens, type,
5016 e4a6c3b8 Olga Brani
    soFar, groups, preFilters,
5017 e4a6c3b8 Olga Brani
    cached = tokenCache[ selector + " " ];
5018 e4a6c3b8 Olga Brani
5019 e4a6c3b8 Olga Brani
  if ( cached ) {
5020 e4a6c3b8 Olga Brani
    return parseOnly ? 0 : cached.slice( 0 );
5021 e4a6c3b8 Olga Brani
  }
5022 e4a6c3b8 Olga Brani
5023 e4a6c3b8 Olga Brani
  soFar = selector;
5024 e4a6c3b8 Olga Brani
  groups = [];
5025 e4a6c3b8 Olga Brani
  preFilters = Expr.preFilter;
5026 e4a6c3b8 Olga Brani
5027 e4a6c3b8 Olga Brani
  while ( soFar ) {
5028 e4a6c3b8 Olga Brani
5029 e4a6c3b8 Olga Brani
    // Comma and first run
5030 e4a6c3b8 Olga Brani
    if ( !matched || (match = rcomma.exec( soFar )) ) {
5031 e4a6c3b8 Olga Brani
      if ( match ) {
5032 e4a6c3b8 Olga Brani
        // Don't consume trailing commas as valid
5033 e4a6c3b8 Olga Brani
        soFar = soFar.slice( match[0].length ) || soFar;
5034 e4a6c3b8 Olga Brani
      }
5035 e4a6c3b8 Olga Brani
      groups.push( tokens = [] );
5036 e4a6c3b8 Olga Brani
    }
5037 e4a6c3b8 Olga Brani
5038 e4a6c3b8 Olga Brani
    matched = false;
5039 e4a6c3b8 Olga Brani
5040 e4a6c3b8 Olga Brani
    // Combinators
5041 e4a6c3b8 Olga Brani
    if ( (match = rcombinators.exec( soFar )) ) {
5042 e4a6c3b8 Olga Brani
      matched = match.shift();
5043 e4a6c3b8 Olga Brani
      tokens.push( {
5044 e4a6c3b8 Olga Brani
        value: matched,
5045 e4a6c3b8 Olga Brani
        // Cast descendant combinators to space
5046 e4a6c3b8 Olga Brani
        type: match[0].replace( rtrim, " " )
5047 e4a6c3b8 Olga Brani
      } );
5048 e4a6c3b8 Olga Brani
      soFar = soFar.slice( matched.length );
5049 e4a6c3b8 Olga Brani
    }
5050 e4a6c3b8 Olga Brani
5051 e4a6c3b8 Olga Brani
    // Filters
5052 e4a6c3b8 Olga Brani
    for ( type in Expr.filter ) {
5053 e4a6c3b8 Olga Brani
      if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
5054 e4a6c3b8 Olga Brani
        (match = preFilters[ type ]( match ))) ) {
5055 e4a6c3b8 Olga Brani
        matched = match.shift();
5056 e4a6c3b8 Olga Brani
        tokens.push( {
5057 e4a6c3b8 Olga Brani
          value: matched,
5058 e4a6c3b8 Olga Brani
          type: type,
5059 e4a6c3b8 Olga Brani
          matches: match
5060 e4a6c3b8 Olga Brani
        } );
5061 e4a6c3b8 Olga Brani
        soFar = soFar.slice( matched.length );
5062 e4a6c3b8 Olga Brani
      }
5063 e4a6c3b8 Olga Brani
    }
5064 e4a6c3b8 Olga Brani
5065 e4a6c3b8 Olga Brani
    if ( !matched ) {
5066 e4a6c3b8 Olga Brani
      break;
5067 e4a6c3b8 Olga Brani
    }
5068 e4a6c3b8 Olga Brani
  }
5069 e4a6c3b8 Olga Brani
5070 e4a6c3b8 Olga Brani
  // Return the length of the invalid excess
5071 e4a6c3b8 Olga Brani
  // if we're just parsing
5072 e4a6c3b8 Olga Brani
  // Otherwise, throw an error or return tokens
5073 e4a6c3b8 Olga Brani
  return parseOnly ?
5074 e4a6c3b8 Olga Brani
    soFar.length :
5075 e4a6c3b8 Olga Brani
    soFar ?
5076 e4a6c3b8 Olga Brani
      Sizzle.error( selector ) :
5077 e4a6c3b8 Olga Brani
      // Cache the tokens
5078 e4a6c3b8 Olga Brani
      tokenCache( selector, groups ).slice( 0 );
5079 e4a6c3b8 Olga Brani
}
5080 e4a6c3b8 Olga Brani
5081 e4a6c3b8 Olga Brani
function toSelector( tokens ) {
5082 e4a6c3b8 Olga Brani
  var i = 0,
5083 e4a6c3b8 Olga Brani
    len = tokens.length,
5084 e4a6c3b8 Olga Brani
    selector = "";
5085 e4a6c3b8 Olga Brani
  for ( ; i < len; i++ ) {
5086 e4a6c3b8 Olga Brani
    selector += tokens[i].value;
5087 e4a6c3b8 Olga Brani
  }
5088 e4a6c3b8 Olga Brani
  return selector;
5089 e4a6c3b8 Olga Brani
}
5090 e4a6c3b8 Olga Brani
5091 e4a6c3b8 Olga Brani
function addCombinator( matcher, combinator, base ) {
5092 e4a6c3b8 Olga Brani
  var dir = combinator.dir,
5093 e4a6c3b8 Olga Brani
    checkNonElements = base && dir === "parentNode",
5094 e4a6c3b8 Olga Brani
    doneName = done++;
5095 e4a6c3b8 Olga Brani
5096 e4a6c3b8 Olga Brani
  return combinator.first ?
5097 e4a6c3b8 Olga Brani
    // Check against closest ancestor/preceding element
5098 e4a6c3b8 Olga Brani
    function( elem, context, xml ) {
5099 e4a6c3b8 Olga Brani
      while ( (elem = elem[ dir ]) ) {
5100 e4a6c3b8 Olga Brani
        if ( elem.nodeType === 1 || checkNonElements ) {
5101 e4a6c3b8 Olga Brani
          return matcher( elem, context, xml );
5102 e4a6c3b8 Olga Brani
        }
5103 e4a6c3b8 Olga Brani
      }
5104 e4a6c3b8 Olga Brani
    } :
5105 e4a6c3b8 Olga Brani
5106 e4a6c3b8 Olga Brani
    // Check against all ancestor/preceding elements
5107 e4a6c3b8 Olga Brani
    function( elem, context, xml ) {
5108 e4a6c3b8 Olga Brani
      var data, cache, outerCache,
5109 e4a6c3b8 Olga Brani
        dirkey = dirruns + " " + doneName;
5110 e4a6c3b8 Olga Brani
5111 e4a6c3b8 Olga Brani
      // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
5112 e4a6c3b8 Olga Brani
      if ( xml ) {
5113 e4a6c3b8 Olga Brani
        while ( (elem = elem[ dir ]) ) {
5114 e4a6c3b8 Olga Brani
          if ( elem.nodeType === 1 || checkNonElements ) {
5115 e4a6c3b8 Olga Brani
            if ( matcher( elem, context, xml ) ) {
5116 e4a6c3b8 Olga Brani
              return true;
5117 e4a6c3b8 Olga Brani
            }
5118 e4a6c3b8 Olga Brani
          }
5119 e4a6c3b8 Olga Brani
        }
5120 e4a6c3b8 Olga Brani
      } else {
5121 e4a6c3b8 Olga Brani
        while ( (elem = elem[ dir ]) ) {
5122 e4a6c3b8 Olga Brani
          if ( elem.nodeType === 1 || checkNonElements ) {
5123 e4a6c3b8 Olga Brani
            outerCache = elem[ expando ] || (elem[ expando ] = {});
5124 e4a6c3b8 Olga Brani
            if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
5125 e4a6c3b8 Olga Brani
              if ( (data = cache[1]) === true || data === cachedruns ) {
5126 e4a6c3b8 Olga Brani
                return data === true;
5127 e4a6c3b8 Olga Brani
              }
5128 e4a6c3b8 Olga Brani
            } else {
5129 e4a6c3b8 Olga Brani
              cache = outerCache[ dir ] = [ dirkey ];
5130 e4a6c3b8 Olga Brani
              cache[1] = matcher( elem, context, xml ) || cachedruns;
5131 e4a6c3b8 Olga Brani
              if ( cache[1] === true ) {
5132 e4a6c3b8 Olga Brani
                return true;
5133 e4a6c3b8 Olga Brani
              }
5134 e4a6c3b8 Olga Brani
            }
5135 e4a6c3b8 Olga Brani
          }
5136 e4a6c3b8 Olga Brani
        }
5137 e4a6c3b8 Olga Brani
      }
5138 e4a6c3b8 Olga Brani
    };
5139 e4a6c3b8 Olga Brani
}
5140 e4a6c3b8 Olga Brani
5141 e4a6c3b8 Olga Brani
function elementMatcher( matchers ) {
5142 e4a6c3b8 Olga Brani
  return matchers.length > 1 ?
5143 e4a6c3b8 Olga Brani
    function( elem, context, xml ) {
5144 e4a6c3b8 Olga Brani
      var i = matchers.length;
5145 e4a6c3b8 Olga Brani
      while ( i-- ) {
5146 e4a6c3b8 Olga Brani
        if ( !matchers[i]( elem, context, xml ) ) {
5147 e4a6c3b8 Olga Brani
          return false;
5148 e4a6c3b8 Olga Brani
        }
5149 e4a6c3b8 Olga Brani
      }
5150 e4a6c3b8 Olga Brani
      return true;
5151 e4a6c3b8 Olga Brani
    } :
5152 e4a6c3b8 Olga Brani
    matchers[0];
5153 e4a6c3b8 Olga Brani
}
5154 e4a6c3b8 Olga Brani
5155 e4a6c3b8 Olga Brani
function condense( unmatched, map, filter, context, xml ) {
5156 e4a6c3b8 Olga Brani
  var elem,
5157 e4a6c3b8 Olga Brani
    newUnmatched = [],
5158 e4a6c3b8 Olga Brani
    i = 0,
5159 e4a6c3b8 Olga Brani
    len = unmatched.length,
5160 e4a6c3b8 Olga Brani
    mapped = map != null;
5161 e4a6c3b8 Olga Brani
5162 e4a6c3b8 Olga Brani
  for ( ; i < len; i++ ) {
5163 e4a6c3b8 Olga Brani
    if ( (elem = unmatched[i]) ) {
5164 e4a6c3b8 Olga Brani
      if ( !filter || filter( elem, context, xml ) ) {
5165 e4a6c3b8 Olga Brani
        newUnmatched.push( elem );
5166 e4a6c3b8 Olga Brani
        if ( mapped ) {
5167 e4a6c3b8 Olga Brani
          map.push( i );
5168 e4a6c3b8 Olga Brani
        }
5169 e4a6c3b8 Olga Brani
      }
5170 e4a6c3b8 Olga Brani
    }
5171 e4a6c3b8 Olga Brani
  }
5172 e4a6c3b8 Olga Brani
5173 e4a6c3b8 Olga Brani
  return newUnmatched;
5174 e4a6c3b8 Olga Brani
}
5175 e4a6c3b8 Olga Brani
5176 e4a6c3b8 Olga Brani
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
5177 e4a6c3b8 Olga Brani
  if ( postFilter && !postFilter[ expando ] ) {
5178 e4a6c3b8 Olga Brani
    postFilter = setMatcher( postFilter );
5179 e4a6c3b8 Olga Brani
  }
5180 e4a6c3b8 Olga Brani
  if ( postFinder && !postFinder[ expando ] ) {
5181 e4a6c3b8 Olga Brani
    postFinder = setMatcher( postFinder, postSelector );
5182 e4a6c3b8 Olga Brani
  }
5183 e4a6c3b8 Olga Brani
  return markFunction(function( seed, results, context, xml ) {
5184 e4a6c3b8 Olga Brani
    var temp, i, elem,
5185 e4a6c3b8 Olga Brani
      preMap = [],
5186 e4a6c3b8 Olga Brani
      postMap = [],
5187 e4a6c3b8 Olga Brani
      preexisting = results.length,
5188 e4a6c3b8 Olga Brani
5189 e4a6c3b8 Olga Brani
      // Get initial elements from seed or context
5190 e4a6c3b8 Olga Brani
      elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
5191 e4a6c3b8 Olga Brani
5192 e4a6c3b8 Olga Brani
      // Prefilter to get matcher input, preserving a map for seed-results synchronization
5193 e4a6c3b8 Olga Brani
      matcherIn = preFilter && ( seed || !selector ) ?
5194 e4a6c3b8 Olga Brani
        condense( elems, preMap, preFilter, context, xml ) :
5195 e4a6c3b8 Olga Brani
        elems,
5196 e4a6c3b8 Olga Brani
5197 e4a6c3b8 Olga Brani
      matcherOut = matcher ?
5198 e4a6c3b8 Olga Brani
        // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
5199 e4a6c3b8 Olga Brani
        postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
5200 e4a6c3b8 Olga Brani
5201 e4a6c3b8 Olga Brani
          // ...intermediate processing is necessary
5202 e4a6c3b8 Olga Brani
          [] :
5203 e4a6c3b8 Olga Brani
5204 e4a6c3b8 Olga Brani
          // ...otherwise use results directly
5205 e4a6c3b8 Olga Brani
          results :
5206 e4a6c3b8 Olga Brani
        matcherIn;
5207 e4a6c3b8 Olga Brani
5208 e4a6c3b8 Olga Brani
    // Find primary matches
5209 e4a6c3b8 Olga Brani
    if ( matcher ) {
5210 e4a6c3b8 Olga Brani
      matcher( matcherIn, matcherOut, context, xml );
5211 e4a6c3b8 Olga Brani
    }
5212 e4a6c3b8 Olga Brani
5213 e4a6c3b8 Olga Brani
    // Apply postFilter
5214 e4a6c3b8 Olga Brani
    if ( postFilter ) {
5215 e4a6c3b8 Olga Brani
      temp = condense( matcherOut, postMap );
5216 e4a6c3b8 Olga Brani
      postFilter( temp, [], context, xml );
5217 e4a6c3b8 Olga Brani
5218 e4a6c3b8 Olga Brani
      // Un-match failing elements by moving them back to matcherIn
5219 e4a6c3b8 Olga Brani
      i = temp.length;
5220 e4a6c3b8 Olga Brani
      while ( i-- ) {
5221 e4a6c3b8 Olga Brani
        if ( (elem = temp[i]) ) {
5222 e4a6c3b8 Olga Brani
          matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
5223 e4a6c3b8 Olga Brani
        }
5224 e4a6c3b8 Olga Brani
      }
5225 e4a6c3b8 Olga Brani
    }
5226 e4a6c3b8 Olga Brani
5227 e4a6c3b8 Olga Brani
    if ( seed ) {
5228 e4a6c3b8 Olga Brani
      if ( postFinder || preFilter ) {
5229 e4a6c3b8 Olga Brani
        if ( postFinder ) {
5230 e4a6c3b8 Olga Brani
          // Get the final matcherOut by condensing this intermediate into postFinder contexts
5231 e4a6c3b8 Olga Brani
          temp = [];
5232 e4a6c3b8 Olga Brani
          i = matcherOut.length;
5233 e4a6c3b8 Olga Brani
          while ( i-- ) {
5234 e4a6c3b8 Olga Brani
            if ( (elem = matcherOut[i]) ) {
5235 e4a6c3b8 Olga Brani
              // Restore matcherIn since elem is not yet a final match
5236 e4a6c3b8 Olga Brani
              temp.push( (matcherIn[i] = elem) );
5237 e4a6c3b8 Olga Brani
            }
5238 e4a6c3b8 Olga Brani
          }
5239 e4a6c3b8 Olga Brani
          postFinder( null, (matcherOut = []), temp, xml );
5240 e4a6c3b8 Olga Brani
        }
5241 e4a6c3b8 Olga Brani
5242 e4a6c3b8 Olga Brani
        // Move matched elements from seed to results to keep them synchronized
5243 e4a6c3b8 Olga Brani
        i = matcherOut.length;
5244 e4a6c3b8 Olga Brani
        while ( i-- ) {
5245 e4a6c3b8 Olga Brani
          if ( (elem = matcherOut[i]) &&
5246 e4a6c3b8 Olga Brani
            (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
5247 e4a6c3b8 Olga Brani
5248 e4a6c3b8 Olga Brani
            seed[temp] = !(results[temp] = elem);
5249 e4a6c3b8 Olga Brani
          }
5250 e4a6c3b8 Olga Brani
        }
5251 e4a6c3b8 Olga Brani
      }
5252 e4a6c3b8 Olga Brani
5253 e4a6c3b8 Olga Brani
    // Add elements to results, through postFinder if defined
5254 e4a6c3b8 Olga Brani
    } else {
5255 e4a6c3b8 Olga Brani
      matcherOut = condense(
5256 e4a6c3b8 Olga Brani
        matcherOut === results ?
5257 e4a6c3b8 Olga Brani
          matcherOut.splice( preexisting, matcherOut.length ) :
5258 e4a6c3b8 Olga Brani
          matcherOut
5259 e4a6c3b8 Olga Brani
      );
5260 e4a6c3b8 Olga Brani
      if ( postFinder ) {
5261 e4a6c3b8 Olga Brani
        postFinder( null, results, matcherOut, xml );
5262 e4a6c3b8 Olga Brani
      } else {
5263 e4a6c3b8 Olga Brani
        push.apply( results, matcherOut );
5264 e4a6c3b8 Olga Brani
      }
5265 e4a6c3b8 Olga Brani
    }
5266 e4a6c3b8 Olga Brani
  });
5267 e4a6c3b8 Olga Brani
}
5268 e4a6c3b8 Olga Brani
5269 e4a6c3b8 Olga Brani
function matcherFromTokens( tokens ) {
5270 e4a6c3b8 Olga Brani
  var checkContext, matcher, j,
5271 e4a6c3b8 Olga Brani
    len = tokens.length,
5272 e4a6c3b8 Olga Brani
    leadingRelative = Expr.relative[ tokens[0].type ],
5273 e4a6c3b8 Olga Brani
    implicitRelative = leadingRelative || Expr.relative[" "],
5274 e4a6c3b8 Olga Brani
    i = leadingRelative ? 1 : 0,
5275 e4a6c3b8 Olga Brani
5276 e4a6c3b8 Olga Brani
    // The foundational matcher ensures that elements are reachable from top-level context(s)
5277 e4a6c3b8 Olga Brani
    matchContext = addCombinator( function( elem ) {
5278 e4a6c3b8 Olga Brani
      return elem === checkContext;
5279 e4a6c3b8 Olga Brani
    }, implicitRelative, true ),
5280 e4a6c3b8 Olga Brani
    matchAnyContext = addCombinator( function( elem ) {
5281 e4a6c3b8 Olga Brani
      return indexOf.call( checkContext, elem ) > -1;
5282 e4a6c3b8 Olga Brani
    }, implicitRelative, true ),
5283 e4a6c3b8 Olga Brani
    matchers = [ function( elem, context, xml ) {
5284 e4a6c3b8 Olga Brani
      return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
5285 e4a6c3b8 Olga Brani
        (checkContext = context).nodeType ?
5286 e4a6c3b8 Olga Brani
          matchContext( elem, context, xml ) :
5287 e4a6c3b8 Olga Brani
          matchAnyContext( elem, context, xml ) );
5288 e4a6c3b8 Olga Brani
    } ];
5289 e4a6c3b8 Olga Brani
5290 e4a6c3b8 Olga Brani
  for ( ; i < len; i++ ) {
5291 e4a6c3b8 Olga Brani
    if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
5292 e4a6c3b8 Olga Brani
      matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
5293 e4a6c3b8 Olga Brani
    } else {
5294 e4a6c3b8 Olga Brani
      matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
5295 e4a6c3b8 Olga Brani
5296 e4a6c3b8 Olga Brani
      // Return special upon seeing a positional matcher
5297 e4a6c3b8 Olga Brani
      if ( matcher[ expando ] ) {
5298 e4a6c3b8 Olga Brani
        // Find the next relative operator (if any) for proper handling
5299 e4a6c3b8 Olga Brani
        j = ++i;
5300 e4a6c3b8 Olga Brani
        for ( ; j < len; j++ ) {
5301 e4a6c3b8 Olga Brani
          if ( Expr.relative[ tokens[j].type ] ) {
5302 e4a6c3b8 Olga Brani
            break;
5303 e4a6c3b8 Olga Brani
          }
5304 e4a6c3b8 Olga Brani
        }
5305 e4a6c3b8 Olga Brani
        return setMatcher(
5306 e4a6c3b8 Olga Brani
          i > 1 && elementMatcher( matchers ),
5307 e4a6c3b8 Olga Brani
          i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
5308 e4a6c3b8 Olga Brani
          matcher,
5309 e4a6c3b8 Olga Brani
          i < j && matcherFromTokens( tokens.slice( i, j ) ),
5310 e4a6c3b8 Olga Brani
          j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
5311 e4a6c3b8 Olga Brani
          j < len && toSelector( tokens )
5312 e4a6c3b8 Olga Brani
        );
5313 e4a6c3b8 Olga Brani
      }
5314 e4a6c3b8 Olga Brani
      matchers.push( matcher );
5315 e4a6c3b8 Olga Brani
    }
5316 e4a6c3b8 Olga Brani
  }
5317 e4a6c3b8 Olga Brani
5318 e4a6c3b8 Olga Brani
  return elementMatcher( matchers );
5319 e4a6c3b8 Olga Brani
}
5320 e4a6c3b8 Olga Brani
5321 e4a6c3b8 Olga Brani
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
5322 e4a6c3b8 Olga Brani
  // A counter to specify which element is currently being matched
5323 e4a6c3b8 Olga Brani
  var matcherCachedRuns = 0,
5324 e4a6c3b8 Olga Brani
    bySet = setMatchers.length > 0,
5325 e4a6c3b8 Olga Brani
    byElement = elementMatchers.length > 0,
5326 e4a6c3b8 Olga Brani
    superMatcher = function( seed, context, xml, results, expandContext ) {
5327 e4a6c3b8 Olga Brani
      var elem, j, matcher,
5328 e4a6c3b8 Olga Brani
        setMatched = [],
5329 e4a6c3b8 Olga Brani
        matchedCount = 0,
5330 e4a6c3b8 Olga Brani
        i = "0",
5331 e4a6c3b8 Olga Brani
        unmatched = seed && [],
5332 e4a6c3b8 Olga Brani
        outermost = expandContext != null,
5333 e4a6c3b8 Olga Brani
        contextBackup = outermostContext,
5334 e4a6c3b8 Olga Brani
        // We must always have either seed elements or context
5335 e4a6c3b8 Olga Brani
        elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
5336 e4a6c3b8 Olga Brani
        // Use integer dirruns iff this is the outermost matcher
5337 e4a6c3b8 Olga Brani
        dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
5338 e4a6c3b8 Olga Brani
5339 e4a6c3b8 Olga Brani
      if ( outermost ) {
5340 e4a6c3b8 Olga Brani
        outermostContext = context !== document && context;
5341 e4a6c3b8 Olga Brani
        cachedruns = matcherCachedRuns;
5342 e4a6c3b8 Olga Brani
      }
5343 e4a6c3b8 Olga Brani
5344 e4a6c3b8 Olga Brani
      // Add elements passing elementMatchers directly to results
5345 e4a6c3b8 Olga Brani
      // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
5346 e4a6c3b8 Olga Brani
      for ( ; (elem = elems[i]) != null; i++ ) {
5347 e4a6c3b8 Olga Brani
        if ( byElement && elem ) {
5348 e4a6c3b8 Olga Brani
          j = 0;
5349 e4a6c3b8 Olga Brani
          while ( (matcher = elementMatchers[j++]) ) {
5350 e4a6c3b8 Olga Brani
            if ( matcher( elem, context, xml ) ) {
5351 e4a6c3b8 Olga Brani
              results.push( elem );
5352 e4a6c3b8 Olga Brani
              break;
5353 e4a6c3b8 Olga Brani
            }
5354 e4a6c3b8 Olga Brani
          }
5355 e4a6c3b8 Olga Brani
          if ( outermost ) {
5356 e4a6c3b8 Olga Brani
            dirruns = dirrunsUnique;
5357 e4a6c3b8 Olga Brani
            cachedruns = ++matcherCachedRuns;
5358 e4a6c3b8 Olga Brani
          }
5359 e4a6c3b8 Olga Brani
        }
5360 e4a6c3b8 Olga Brani
5361 e4a6c3b8 Olga Brani
        // Track unmatched elements for set filters
5362 e4a6c3b8 Olga Brani
        if ( bySet ) {
5363 e4a6c3b8 Olga Brani
          // They will have gone through all possible matchers
5364 e4a6c3b8 Olga Brani
          if ( (elem = !matcher && elem) ) {
5365 e4a6c3b8 Olga Brani
            matchedCount--;
5366 e4a6c3b8 Olga Brani
          }
5367 e4a6c3b8 Olga Brani
5368 e4a6c3b8 Olga Brani
          // Lengthen the array for every element, matched or not
5369 e4a6c3b8 Olga Brani
          if ( seed ) {
5370 e4a6c3b8 Olga Brani
            unmatched.push( elem );
5371 e4a6c3b8 Olga Brani
          }
5372 e4a6c3b8 Olga Brani
        }
5373 e4a6c3b8 Olga Brani
      }
5374 e4a6c3b8 Olga Brani
5375 e4a6c3b8 Olga Brani
      // Apply set filters to unmatched elements
5376 e4a6c3b8 Olga Brani
      matchedCount += i;
5377 e4a6c3b8 Olga Brani
      if ( bySet && i !== matchedCount ) {
5378 e4a6c3b8 Olga Brani
        j = 0;
5379 e4a6c3b8 Olga Brani
        while ( (matcher = setMatchers[j++]) ) {
5380 e4a6c3b8 Olga Brani
          matcher( unmatched, setMatched, context, xml );
5381 e4a6c3b8 Olga Brani
        }
5382 e4a6c3b8 Olga Brani
5383 e4a6c3b8 Olga Brani
        if ( seed ) {
5384 e4a6c3b8 Olga Brani
          // Reintegrate element matches to eliminate the need for sorting
5385 e4a6c3b8 Olga Brani
          if ( matchedCount > 0 ) {
5386 e4a6c3b8 Olga Brani
            while ( i-- ) {
5387 e4a6c3b8 Olga Brani
              if ( !(unmatched[i] || setMatched[i]) ) {
5388 e4a6c3b8 Olga Brani
                setMatched[i] = pop.call( results );
5389 e4a6c3b8 Olga Brani
              }
5390 e4a6c3b8 Olga Brani
            }
5391 e4a6c3b8 Olga Brani
          }
5392 e4a6c3b8 Olga Brani
5393 e4a6c3b8 Olga Brani
          // Discard index placeholder values to get only actual matches
5394 e4a6c3b8 Olga Brani
          setMatched = condense( setMatched );
5395 e4a6c3b8 Olga Brani
        }
5396 e4a6c3b8 Olga Brani
5397 e4a6c3b8 Olga Brani
        // Add matches to results
5398 e4a6c3b8 Olga Brani
        push.apply( results, setMatched );
5399 e4a6c3b8 Olga Brani
5400 e4a6c3b8 Olga Brani
        // Seedless set matches succeeding multiple successful matchers stipulate sorting
5401 e4a6c3b8 Olga Brani
        if ( outermost && !seed && setMatched.length > 0 &&
5402 e4a6c3b8 Olga Brani
          ( matchedCount + setMatchers.length ) > 1 ) {
5403 e4a6c3b8 Olga Brani
5404 e4a6c3b8 Olga Brani
          Sizzle.uniqueSort( results );
5405 e4a6c3b8 Olga Brani
        }
5406 e4a6c3b8 Olga Brani
      }
5407 e4a6c3b8 Olga Brani
5408 e4a6c3b8 Olga Brani
      // Override manipulation of globals by nested matchers
5409 e4a6c3b8 Olga Brani
      if ( outermost ) {
5410 e4a6c3b8 Olga Brani
        dirruns = dirrunsUnique;
5411 e4a6c3b8 Olga Brani
        outermostContext = contextBackup;
5412 e4a6c3b8 Olga Brani
      }
5413 e4a6c3b8 Olga Brani
5414 e4a6c3b8 Olga Brani
      return unmatched;
5415 e4a6c3b8 Olga Brani
    };
5416 e4a6c3b8 Olga Brani
5417 e4a6c3b8 Olga Brani
  return bySet ?
5418 e4a6c3b8 Olga Brani
    markFunction( superMatcher ) :
5419 e4a6c3b8 Olga Brani
    superMatcher;
5420 e4a6c3b8 Olga Brani
}
5421 e4a6c3b8 Olga Brani
5422 e4a6c3b8 Olga Brani
compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
5423 e4a6c3b8 Olga Brani
  var i,
5424 e4a6c3b8 Olga Brani
    setMatchers = [],
5425 e4a6c3b8 Olga Brani
    elementMatchers = [],
5426 e4a6c3b8 Olga Brani
    cached = compilerCache[ selector + " " ];
5427 e4a6c3b8 Olga Brani
5428 e4a6c3b8 Olga Brani
  if ( !cached ) {
5429 e4a6c3b8 Olga Brani
    // Generate a function of recursive functions that can be used to check each element
5430 e4a6c3b8 Olga Brani
    if ( !group ) {
5431 e4a6c3b8 Olga Brani
      group = tokenize( selector );
5432 e4a6c3b8 Olga Brani
    }
5433 e4a6c3b8 Olga Brani
    i = group.length;
5434 e4a6c3b8 Olga Brani
    while ( i-- ) {
5435 e4a6c3b8 Olga Brani
      cached = matcherFromTokens( group[i] );
5436 e4a6c3b8 Olga Brani
      if ( cached[ expando ] ) {
5437 e4a6c3b8 Olga Brani
        setMatchers.push( cached );
5438 e4a6c3b8 Olga Brani
      } else {
5439 e4a6c3b8 Olga Brani
        elementMatchers.push( cached );
5440 e4a6c3b8 Olga Brani
      }
5441 e4a6c3b8 Olga Brani
    }
5442 e4a6c3b8 Olga Brani
5443 e4a6c3b8 Olga Brani
    // Cache the compiled function
5444 e4a6c3b8 Olga Brani
    cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
5445 e4a6c3b8 Olga Brani
  }
5446 e4a6c3b8 Olga Brani
  return cached;
5447 e4a6c3b8 Olga Brani
};
5448 e4a6c3b8 Olga Brani
5449 e4a6c3b8 Olga Brani
function multipleContexts( selector, contexts, results ) {
5450 e4a6c3b8 Olga Brani
  var i = 0,
5451 e4a6c3b8 Olga Brani
    len = contexts.length;
5452 e4a6c3b8 Olga Brani
  for ( ; i < len; i++ ) {
5453 e4a6c3b8 Olga Brani
    Sizzle( selector, contexts[i], results );
5454 e4a6c3b8 Olga Brani
  }
5455 e4a6c3b8 Olga Brani
  return results;
5456 e4a6c3b8 Olga Brani
}
5457 e4a6c3b8 Olga Brani
5458 e4a6c3b8 Olga Brani
function select( selector, context, results, seed ) {
5459 e4a6c3b8 Olga Brani
  var i, tokens, token, type, find,
5460 e4a6c3b8 Olga Brani
    match = tokenize( selector );
5461 e4a6c3b8 Olga Brani
5462 e4a6c3b8 Olga Brani
  if ( !seed ) {
5463 e4a6c3b8 Olga Brani
    // Try to minimize operations if there is only one group
5464 e4a6c3b8 Olga Brani
    if ( match.length === 1 ) {
5465 e4a6c3b8 Olga Brani
5466 e4a6c3b8 Olga Brani
      // Take a shortcut and set the context if the root selector is an ID
5467 e4a6c3b8 Olga Brani
      tokens = match[0] = match[0].slice( 0 );
5468 e4a6c3b8 Olga Brani
      if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
5469 e4a6c3b8 Olga Brani
          context.nodeType === 9 && !documentIsXML &&
5470 e4a6c3b8 Olga Brani
          Expr.relative[ tokens[1].type ] ) {
5471 e4a6c3b8 Olga Brani
5472 e4a6c3b8 Olga Brani
        context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
5473 e4a6c3b8 Olga Brani
        if ( !context ) {
5474 e4a6c3b8 Olga Brani
          return results;
5475 e4a6c3b8 Olga Brani
        }
5476 e4a6c3b8 Olga Brani
5477 e4a6c3b8 Olga Brani
        selector = selector.slice( tokens.shift().value.length );
5478 e4a6c3b8 Olga Brani
      }
5479 e4a6c3b8 Olga Brani
5480 e4a6c3b8 Olga Brani
      // Fetch a seed set for right-to-left matching
5481 e4a6c3b8 Olga Brani
      i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
5482 e4a6c3b8 Olga Brani
      while ( i-- ) {
5483 e4a6c3b8 Olga Brani
        token = tokens[i];
5484 e4a6c3b8 Olga Brani
5485 e4a6c3b8 Olga Brani
        // Abort if we hit a combinator
5486 e4a6c3b8 Olga Brani
        if ( Expr.relative[ (type = token.type) ] ) {
5487 e4a6c3b8 Olga Brani
          break;
5488 e4a6c3b8 Olga Brani
        }
5489 e4a6c3b8 Olga Brani
        if ( (find = Expr.find[ type ]) ) {
5490 e4a6c3b8 Olga Brani
          // Search, expanding context for leading sibling combinators
5491 e4a6c3b8 Olga Brani
          if ( (seed = find(
5492 e4a6c3b8 Olga Brani
            token.matches[0].replace( runescape, funescape ),
5493 e4a6c3b8 Olga Brani
            rsibling.test( tokens[0].type ) && context.parentNode || context
5494 e4a6c3b8 Olga Brani
          )) ) {
5495 e4a6c3b8 Olga Brani
5496 e4a6c3b8 Olga Brani
            // If seed is empty or no tokens remain, we can return early
5497 e4a6c3b8 Olga Brani
            tokens.splice( i, 1 );
5498 e4a6c3b8 Olga Brani
            selector = seed.length && toSelector( tokens );
5499 e4a6c3b8 Olga Brani
            if ( !selector ) {
5500 e4a6c3b8 Olga Brani
              push.apply( results, slice.call( seed, 0 ) );
5501 e4a6c3b8 Olga Brani
              return results;
5502 e4a6c3b8 Olga Brani
            }
5503 e4a6c3b8 Olga Brani
5504 e4a6c3b8 Olga Brani
            break;
5505 e4a6c3b8 Olga Brani
          }
5506 e4a6c3b8 Olga Brani
        }
5507 e4a6c3b8 Olga Brani
      }
5508 e4a6c3b8 Olga Brani
    }
5509 e4a6c3b8 Olga Brani
  }
5510 e4a6c3b8 Olga Brani
5511 e4a6c3b8 Olga Brani
  // Compile and execute a filtering function
5512 e4a6c3b8 Olga Brani
  // Provide `match` to avoid retokenization if we modified the selector above
5513 e4a6c3b8 Olga Brani
  compile( selector, match )(
5514 e4a6c3b8 Olga Brani
    seed,
5515 e4a6c3b8 Olga Brani
    context,
5516 e4a6c3b8 Olga Brani
    documentIsXML,
5517 e4a6c3b8 Olga Brani
    results,
5518 e4a6c3b8 Olga Brani
    rsibling.test( selector )
5519 e4a6c3b8 Olga Brani
  );
5520 e4a6c3b8 Olga Brani
  return results;
5521 e4a6c3b8 Olga Brani
}
5522 e4a6c3b8 Olga Brani
5523 e4a6c3b8 Olga Brani
// Deprecated
5524 e4a6c3b8 Olga Brani
Expr.pseudos["nth"] = Expr.pseudos["eq"];
5525 e4a6c3b8 Olga Brani
5526 e4a6c3b8 Olga Brani
// Easy API for creating new setFilters
5527 e4a6c3b8 Olga Brani
function setFilters() {}
5528 e4a6c3b8 Olga Brani
Expr.filters = setFilters.prototype = Expr.pseudos;
5529 e4a6c3b8 Olga Brani
Expr.setFilters = new setFilters();
5530 e4a6c3b8 Olga Brani
5531 e4a6c3b8 Olga Brani
// Initialize with the default document
5532 e4a6c3b8 Olga Brani
setDocument();
5533 e4a6c3b8 Olga Brani
5534 e4a6c3b8 Olga Brani
// Override sizzle attribute retrieval
5535 e4a6c3b8 Olga Brani
Sizzle.attr = jQuery.attr;
5536 e4a6c3b8 Olga Brani
jQuery.find = Sizzle;
5537 e4a6c3b8 Olga Brani
jQuery.expr = Sizzle.selectors;
5538 e4a6c3b8 Olga Brani
jQuery.expr[":"] = jQuery.expr.pseudos;
5539 e4a6c3b8 Olga Brani
jQuery.unique = Sizzle.uniqueSort;
5540 e4a6c3b8 Olga Brani
jQuery.text = Sizzle.getText;
5541 e4a6c3b8 Olga Brani
jQuery.isXMLDoc = Sizzle.isXML;
5542 e4a6c3b8 Olga Brani
jQuery.contains = Sizzle.contains;
5543 e4a6c3b8 Olga Brani
5544 e4a6c3b8 Olga Brani
5545 e4a6c3b8 Olga Brani
})( window );
5546 e4a6c3b8 Olga Brani
var runtil = /Until$/,
5547 e4a6c3b8 Olga Brani
  rparentsprev = /^(?:parents|prev(?:Until|All))/,
5548 e4a6c3b8 Olga Brani
  isSimple = /^.[^:#\[\.,]*$/,
5549 e4a6c3b8 Olga Brani
  rneedsContext = jQuery.expr.match.needsContext,
5550 e4a6c3b8 Olga Brani
  // methods guaranteed to produce a unique set when starting from a unique set
5551 e4a6c3b8 Olga Brani
  guaranteedUnique = {
5552 e4a6c3b8 Olga Brani
    children: true,
5553 e4a6c3b8 Olga Brani
    contents: true,
5554 e4a6c3b8 Olga Brani
    next: true,
5555 e4a6c3b8 Olga Brani
    prev: true
5556 e4a6c3b8 Olga Brani
  };
5557 e4a6c3b8 Olga Brani
5558 e4a6c3b8 Olga Brani
jQuery.fn.extend({
5559 e4a6c3b8 Olga Brani
  find: function( selector ) {
5560 e4a6c3b8 Olga Brani
    var i, ret, self,
5561 e4a6c3b8 Olga Brani
      len = this.length;
5562 e4a6c3b8 Olga Brani
5563 e4a6c3b8 Olga Brani
    if ( typeof selector !== "string" ) {
5564 e4a6c3b8 Olga Brani
      self = this;
5565 e4a6c3b8 Olga Brani
      return this.pushStack( jQuery( selector ).filter(function() {
5566 e4a6c3b8 Olga Brani
        for ( i = 0; i < len; i++ ) {
5567 e4a6c3b8 Olga Brani
          if ( jQuery.contains( self[ i ], this ) ) {
5568 e4a6c3b8 Olga Brani
            return true;
5569 e4a6c3b8 Olga Brani
          }
5570 e4a6c3b8 Olga Brani
        }
5571 e4a6c3b8 Olga Brani
      }) );
5572 e4a6c3b8 Olga Brani
    }
5573 e4a6c3b8 Olga Brani
5574 e4a6c3b8 Olga Brani
    ret = [];
5575 e4a6c3b8 Olga Brani
    for ( i = 0; i < len; i++ ) {
5576 e4a6c3b8 Olga Brani
      jQuery.find( selector, this[ i ], ret );
5577 e4a6c3b8 Olga Brani
    }
5578 e4a6c3b8 Olga Brani
5579 e4a6c3b8 Olga Brani
    // Needed because $( selector, context ) becomes $( context ).find( selector )
5580 e4a6c3b8 Olga Brani
    ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
5581 e4a6c3b8 Olga Brani
    ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
5582 e4a6c3b8 Olga Brani
    return ret;
5583 e4a6c3b8 Olga Brani
  },
5584 e4a6c3b8 Olga Brani
5585 e4a6c3b8 Olga Brani
  has: function( target ) {
5586 e4a6c3b8 Olga Brani
    var i,
5587 e4a6c3b8 Olga Brani
      targets = jQuery( target, this ),
5588 e4a6c3b8 Olga Brani
      len = targets.length;
5589 e4a6c3b8 Olga Brani
5590 e4a6c3b8 Olga Brani
    return this.filter(function() {
5591 e4a6c3b8 Olga Brani
      for ( i = 0; i < len; i++ ) {
5592 e4a6c3b8 Olga Brani
        if ( jQuery.contains( this, targets[i] ) ) {
5593 e4a6c3b8 Olga Brani
          return true;
5594 e4a6c3b8 Olga Brani
        }
5595 e4a6c3b8 Olga Brani
      }
5596 e4a6c3b8 Olga Brani
    });
5597 e4a6c3b8 Olga Brani
  },
5598 e4a6c3b8 Olga Brani
5599 e4a6c3b8 Olga Brani
  not: function( selector ) {
5600 e4a6c3b8 Olga Brani
    return this.pushStack( winnow(this, selector, false) );
5601 e4a6c3b8 Olga Brani
  },
5602 e4a6c3b8 Olga Brani
5603 e4a6c3b8 Olga Brani
  filter: function( selector ) {
5604 e4a6c3b8 Olga Brani
    return this.pushStack( winnow(this, selector, true) );
5605 e4a6c3b8 Olga Brani
  },
5606 e4a6c3b8 Olga Brani
5607 e4a6c3b8 Olga Brani
  is: function( selector ) {
5608 e4a6c3b8 Olga Brani
    return !!selector && (
5609 e4a6c3b8 Olga Brani
      typeof selector === "string" ?
5610 e4a6c3b8 Olga Brani
        // If this is a positional/relative selector, check membership in the returned set
5611 e4a6c3b8 Olga Brani
        // so $("p:first").is("p:last") won't return true for a doc with two "p".
5612 e4a6c3b8 Olga Brani
        rneedsContext.test( selector ) ?
5613 e4a6c3b8 Olga Brani
          jQuery( selector, this.context ).index( this[0] ) >= 0 :
5614 e4a6c3b8 Olga Brani
          jQuery.filter( selector, this ).length > 0 :
5615 e4a6c3b8 Olga Brani
        this.filter( selector ).length > 0 );
5616 e4a6c3b8 Olga Brani
  },
5617 e4a6c3b8 Olga Brani
5618 e4a6c3b8 Olga Brani
  closest: function( selectors, context ) {
5619 e4a6c3b8 Olga Brani
    var cur,
5620 e4a6c3b8 Olga Brani
      i = 0,
5621 e4a6c3b8 Olga Brani
      l = this.length,
5622 e4a6c3b8 Olga Brani
      ret = [],
5623 e4a6c3b8 Olga Brani
      pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
5624 e4a6c3b8 Olga Brani
        jQuery( selectors, context || this.context ) :
5625 e4a6c3b8 Olga Brani
        0;
5626 e4a6c3b8 Olga Brani
5627 e4a6c3b8 Olga Brani
    for ( ; i < l; i++ ) {
5628 e4a6c3b8 Olga Brani
      cur = this[i];
5629 e4a6c3b8 Olga Brani
5630 e4a6c3b8 Olga Brani
      while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
5631 e4a6c3b8 Olga Brani
        if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5632 e4a6c3b8 Olga Brani
          ret.push( cur );
5633 e4a6c3b8 Olga Brani
          break;
5634 e4a6c3b8 Olga Brani
        }
5635 e4a6c3b8 Olga Brani
        cur = cur.parentNode;
5636 e4a6c3b8 Olga Brani
      }
5637 e4a6c3b8 Olga Brani
    }
5638 e4a6c3b8 Olga Brani
5639 e4a6c3b8 Olga Brani
    return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
5640 e4a6c3b8 Olga Brani
  },
5641 e4a6c3b8 Olga Brani
5642 e4a6c3b8 Olga Brani
  // Determine the position of an element within
5643 e4a6c3b8 Olga Brani
  // the matched set of elements
5644 e4a6c3b8 Olga Brani
  index: function( elem ) {
5645 e4a6c3b8 Olga Brani
5646 e4a6c3b8 Olga Brani
    // No argument, return index in parent
5647 e4a6c3b8 Olga Brani
    if ( !elem ) {
5648 e4a6c3b8 Olga Brani
      return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
5649 e4a6c3b8 Olga Brani
    }
5650 e4a6c3b8 Olga Brani
5651 e4a6c3b8 Olga Brani
    // index in selector
5652 e4a6c3b8 Olga Brani
    if ( typeof elem === "string" ) {
5653 e4a6c3b8 Olga Brani
      return jQuery.inArray( this[0], jQuery( elem ) );
5654 e4a6c3b8 Olga Brani
    }
5655 e4a6c3b8 Olga Brani
5656 e4a6c3b8 Olga Brani
    // Locate the position of the desired element
5657 e4a6c3b8 Olga Brani
    return jQuery.inArray(
5658 e4a6c3b8 Olga Brani
      // If it receives a jQuery object, the first element is used
5659 e4a6c3b8 Olga Brani
      elem.jquery ? elem[0] : elem, this );
5660 e4a6c3b8 Olga Brani
  },
5661 e4a6c3b8 Olga Brani
5662 e4a6c3b8 Olga Brani
  add: function( selector, context ) {
5663 e4a6c3b8 Olga Brani
    var set = typeof selector === "string" ?
5664 e4a6c3b8 Olga Brani
        jQuery( selector, context ) :
5665 e4a6c3b8 Olga Brani
        jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5666 e4a6c3b8 Olga Brani
      all = jQuery.merge( this.get(), set );
5667 e4a6c3b8 Olga Brani
5668 e4a6c3b8 Olga Brani
    return this.pushStack( jQuery.unique(all) );
5669 e4a6c3b8 Olga Brani
  },
5670 e4a6c3b8 Olga Brani
5671 e4a6c3b8 Olga Brani
  addBack: function( selector ) {
5672 e4a6c3b8 Olga Brani
    return this.add( selector == null ?
5673 e4a6c3b8 Olga Brani
      this.prevObject : this.prevObject.filter(selector)
5674 e4a6c3b8 Olga Brani
    );
5675 e4a6c3b8 Olga Brani
  }
5676 e4a6c3b8 Olga Brani
});
5677 e4a6c3b8 Olga Brani
5678 e4a6c3b8 Olga Brani
jQuery.fn.andSelf = jQuery.fn.addBack;
5679 e4a6c3b8 Olga Brani
5680 e4a6c3b8 Olga Brani
function sibling( cur, dir ) {
5681 e4a6c3b8 Olga Brani
  do {
5682 e4a6c3b8 Olga Brani
    cur = cur[ dir ];
5683 e4a6c3b8 Olga Brani
  } while ( cur && cur.nodeType !== 1 );
5684 e4a6c3b8 Olga Brani
5685 e4a6c3b8 Olga Brani
  return cur;
5686 e4a6c3b8 Olga Brani
}
5687 e4a6c3b8 Olga Brani
5688 e4a6c3b8 Olga Brani
jQuery.each({
5689 e4a6c3b8 Olga Brani
  parent: function( elem ) {
5690 e4a6c3b8 Olga Brani
    var parent = elem.parentNode;
5691 e4a6c3b8 Olga Brani
    return parent && parent.nodeType !== 11 ? parent : null;
5692 e4a6c3b8 Olga Brani
  },
5693 e4a6c3b8 Olga Brani
  parents: function( elem ) {
5694 e4a6c3b8 Olga Brani
    return jQuery.dir( elem, "parentNode" );
5695 e4a6c3b8 Olga Brani
  },
5696 e4a6c3b8 Olga Brani
  parentsUntil: function( elem, i, until ) {
5697 e4a6c3b8 Olga Brani
    return jQuery.dir( elem, "parentNode", until );
5698 e4a6c3b8 Olga Brani
  },
5699 e4a6c3b8 Olga Brani
  next: function( elem ) {
5700 e4a6c3b8 Olga Brani
    return sibling( elem, "nextSibling" );
5701 e4a6c3b8 Olga Brani
  },
5702 e4a6c3b8 Olga Brani
  prev: function( elem ) {
5703 e4a6c3b8 Olga Brani
    return sibling( elem, "previousSibling" );
5704 e4a6c3b8 Olga Brani
  },
5705 e4a6c3b8 Olga Brani
  nextAll: function( elem ) {
5706 e4a6c3b8 Olga Brani
    return jQuery.dir( elem, "nextSibling" );
5707 e4a6c3b8 Olga Brani
  },
5708 e4a6c3b8 Olga Brani
  prevAll: function( elem ) {
5709 e4a6c3b8 Olga Brani
    return jQuery.dir( elem, "previousSibling" );
5710 e4a6c3b8 Olga Brani
  },
5711 e4a6c3b8 Olga Brani
  nextUntil: function( elem, i, until ) {
5712 e4a6c3b8 Olga Brani
    return jQuery.dir( elem, "nextSibling", until );
5713 e4a6c3b8 Olga Brani
  },
5714 e4a6c3b8 Olga Brani
  prevUntil: function( elem, i, until ) {
5715 e4a6c3b8 Olga Brani
    return jQuery.dir( elem, "previousSibling", until );
5716 e4a6c3b8 Olga Brani
  },
5717 e4a6c3b8 Olga Brani
  siblings: function( elem ) {
5718 e4a6c3b8 Olga Brani
    return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
5719 e4a6c3b8 Olga Brani
  },
5720 e4a6c3b8 Olga Brani
  children: function( elem ) {
5721 e4a6c3b8 Olga Brani
    return jQuery.sibling( elem.firstChild );
5722 e4a6c3b8 Olga Brani
  },
5723 e4a6c3b8 Olga Brani
  contents: function( elem ) {
5724 e4a6c3b8 Olga Brani
    return jQuery.nodeName( elem, "iframe" ) ?
5725 e4a6c3b8 Olga Brani
      elem.contentDocument || elem.contentWindow.document :
5726 e4a6c3b8 Olga Brani
      jQuery.merge( [], elem.childNodes );
5727 e4a6c3b8 Olga Brani
  }
5728 e4a6c3b8 Olga Brani
}, function( name, fn ) {
5729 e4a6c3b8 Olga Brani
  jQuery.fn[ name ] = function( until, selector ) {
5730 e4a6c3b8 Olga Brani
    var ret = jQuery.map( this, fn, until );
5731 e4a6c3b8 Olga Brani
5732 e4a6c3b8 Olga Brani
    if ( !runtil.test( name ) ) {
5733 e4a6c3b8 Olga Brani
      selector = until;
5734 e4a6c3b8 Olga Brani
    }
5735 e4a6c3b8 Olga Brani
5736 e4a6c3b8 Olga Brani
    if ( selector && typeof selector === "string" ) {
5737 e4a6c3b8 Olga Brani
      ret = jQuery.filter( selector, ret );
5738 e4a6c3b8 Olga Brani
    }
5739 e4a6c3b8 Olga Brani
5740 e4a6c3b8 Olga Brani
    ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5741 e4a6c3b8 Olga Brani
5742 e4a6c3b8 Olga Brani
    if ( this.length > 1 && rparentsprev.test( name ) ) {
5743 e4a6c3b8 Olga Brani
      ret = ret.reverse();
5744 e4a6c3b8 Olga Brani
    }
5745 e4a6c3b8 Olga Brani
5746 e4a6c3b8 Olga Brani
    return this.pushStack( ret );
5747 e4a6c3b8 Olga Brani
  };
5748 e4a6c3b8 Olga Brani
});
5749 e4a6c3b8 Olga Brani
5750 e4a6c3b8 Olga Brani
jQuery.extend({
5751 e4a6c3b8 Olga Brani
  filter: function( expr, elems, not ) {
5752 e4a6c3b8 Olga Brani
    if ( not ) {
5753 e4a6c3b8 Olga Brani
      expr = ":not(" + expr + ")";
5754 e4a6c3b8 Olga Brani
    }
5755 e4a6c3b8 Olga Brani
5756 e4a6c3b8 Olga Brani
    return elems.length === 1 ?
5757 e4a6c3b8 Olga Brani
      jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5758 e4a6c3b8 Olga Brani
      jQuery.find.matches(expr, elems);
5759 e4a6c3b8 Olga Brani
  },
5760 e4a6c3b8 Olga Brani
5761 e4a6c3b8 Olga Brani
  dir: function( elem, dir, until ) {
5762 e4a6c3b8 Olga Brani
    var matched = [],
5763 e4a6c3b8 Olga Brani
      cur = elem[ dir ];
5764 e4a6c3b8 Olga Brani
5765 e4a6c3b8 Olga Brani
    while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5766 e4a6c3b8 Olga Brani
      if ( cur.nodeType === 1 ) {
5767 e4a6c3b8 Olga Brani
        matched.push( cur );
5768 e4a6c3b8 Olga Brani
      }
5769 e4a6c3b8 Olga Brani
      cur = cur[dir];
5770 e4a6c3b8 Olga Brani
    }
5771 e4a6c3b8 Olga Brani
    return matched;
5772 e4a6c3b8 Olga Brani
  },
5773 e4a6c3b8 Olga Brani
5774 e4a6c3b8 Olga Brani
  sibling: function( n, elem ) {
5775 e4a6c3b8 Olga Brani
    var r = [];
5776 e4a6c3b8 Olga Brani
5777 e4a6c3b8 Olga Brani
    for ( ; n; n = n.nextSibling ) {
5778 e4a6c3b8 Olga Brani
      if ( n.nodeType === 1 && n !== elem ) {
5779 e4a6c3b8 Olga Brani
        r.push( n );
5780 e4a6c3b8 Olga Brani
      }
5781 e4a6c3b8 Olga Brani
    }
5782 e4a6c3b8 Olga Brani
5783 e4a6c3b8 Olga Brani
    return r;
5784 e4a6c3b8 Olga Brani
  }
5785 e4a6c3b8 Olga Brani
});
5786 e4a6c3b8 Olga Brani
5787 e4a6c3b8 Olga Brani
// Implement the identical functionality for filter and not
5788 e4a6c3b8 Olga Brani
function winnow( elements, qualifier, keep ) {
5789 e4a6c3b8 Olga Brani
5790 e4a6c3b8 Olga Brani
  // Can't pass null or undefined to indexOf in Firefox 4
5791 e4a6c3b8 Olga Brani
  // Set to 0 to skip string check
5792 e4a6c3b8 Olga Brani
  qualifier = qualifier || 0;
5793 e4a6c3b8 Olga Brani
5794 e4a6c3b8 Olga Brani
  if ( jQuery.isFunction( qualifier ) ) {
5795 e4a6c3b8 Olga Brani
    return jQuery.grep(elements, function( elem, i ) {
5796 e4a6c3b8 Olga Brani
      var retVal = !!qualifier.call( elem, i, elem );
5797 e4a6c3b8 Olga Brani
      return retVal === keep;
5798 e4a6c3b8 Olga Brani
    });
5799 e4a6c3b8 Olga Brani
5800 e4a6c3b8 Olga Brani
  } else if ( qualifier.nodeType ) {
5801 e4a6c3b8 Olga Brani
    return jQuery.grep(elements, function( elem ) {
5802 e4a6c3b8 Olga Brani
      return ( elem === qualifier ) === keep;
5803 e4a6c3b8 Olga Brani
    });
5804 e4a6c3b8 Olga Brani
5805 e4a6c3b8 Olga Brani
  } else if ( typeof qualifier === "string" ) {
5806 e4a6c3b8 Olga Brani
    var filtered = jQuery.grep(elements, function( elem ) {
5807 e4a6c3b8 Olga Brani
      return elem.nodeType === 1;
5808 e4a6c3b8 Olga Brani
    });
5809 e4a6c3b8 Olga Brani
5810 e4a6c3b8 Olga Brani
    if ( isSimple.test( qualifier ) ) {
5811 e4a6c3b8 Olga Brani
      return jQuery.filter(qualifier, filtered, !keep);
5812 e4a6c3b8 Olga Brani
    } else {
5813 e4a6c3b8 Olga Brani
      qualifier = jQuery.filter( qualifier, filtered );
5814 e4a6c3b8 Olga Brani
    }
5815 e4a6c3b8 Olga Brani
  }
5816 e4a6c3b8 Olga Brani
5817 e4a6c3b8 Olga Brani
  return jQuery.grep(elements, function( elem ) {
5818 e4a6c3b8 Olga Brani
    return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
5819 e4a6c3b8 Olga Brani
  });
5820 e4a6c3b8 Olga Brani
}
5821 e4a6c3b8 Olga Brani
function createSafeFragment( document ) {
5822 e4a6c3b8 Olga Brani
  var list = nodeNames.split( "|" ),
5823 e4a6c3b8 Olga Brani
    safeFrag = document.createDocumentFragment();
5824 e4a6c3b8 Olga Brani
5825 e4a6c3b8 Olga Brani
  if ( safeFrag.createElement ) {
5826 e4a6c3b8 Olga Brani
    while ( list.length ) {
5827 e4a6c3b8 Olga Brani
      safeFrag.createElement(
5828 e4a6c3b8 Olga Brani
        list.pop()
5829 e4a6c3b8 Olga Brani
      );
5830 e4a6c3b8 Olga Brani
    }
5831 e4a6c3b8 Olga Brani
  }
5832 e4a6c3b8 Olga Brani
  return safeFrag;
5833 e4a6c3b8 Olga Brani
}
5834 e4a6c3b8 Olga Brani
5835 e4a6c3b8 Olga Brani
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
5836 e4a6c3b8 Olga Brani
    "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
5837 e4a6c3b8 Olga Brani
  rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5838 e4a6c3b8 Olga Brani
  rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
5839 e4a6c3b8 Olga Brani
  rleadingWhitespace = /^\s+/,
5840 e4a6c3b8 Olga Brani
  rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
5841 e4a6c3b8 Olga Brani
  rtagName = /<([\w:]+)/,
5842 e4a6c3b8 Olga Brani
  rtbody = /<tbody/i,
5843 e4a6c3b8 Olga Brani
  rhtml = /<|&#?\w+;/,
5844 e4a6c3b8 Olga Brani
  rnoInnerhtml = /<(?:script|style|link)/i,
5845 e4a6c3b8 Olga Brani
  manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
5846 e4a6c3b8 Olga Brani
  // checked="checked" or checked
5847 e4a6c3b8 Olga Brani
  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5848 e4a6c3b8 Olga Brani
  rscriptType = /^$|\/(?:java|ecma)script/i,
5849 e4a6c3b8 Olga Brani
  rscriptTypeMasked = /^true\/(.*)/,
5850 e4a6c3b8 Olga Brani
  rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
5851 e4a6c3b8 Olga Brani
5852 e4a6c3b8 Olga Brani
  // We have to close these tags to support XHTML (#13200)
5853 e4a6c3b8 Olga Brani
  wrapMap = {
5854 e4a6c3b8 Olga Brani
    option: [ 1, "<select multiple='multiple'>", "</select>" ],
5855 e4a6c3b8 Olga Brani
    legend: [ 1, "<fieldset>", "</fieldset>" ],
5856 e4a6c3b8 Olga Brani
    area: [ 1, "<map>", "</map>" ],
5857 e4a6c3b8 Olga Brani
    param: [ 1, "<object>", "</object>" ],
5858 e4a6c3b8 Olga Brani
    thead: [ 1, "<table>", "</table>" ],
5859 e4a6c3b8 Olga Brani
    tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5860 e4a6c3b8 Olga Brani
    col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5861 e4a6c3b8 Olga Brani
    td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5862 e4a6c3b8 Olga Brani
5863 e4a6c3b8 Olga Brani
    // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
5864 e4a6c3b8 Olga Brani
    // unless wrapped in a div with non-breaking characters in front of it.
5865 e4a6c3b8 Olga Brani
    _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
5866 e4a6c3b8 Olga Brani
  },
5867 e4a6c3b8 Olga Brani
  safeFragment = createSafeFragment( document ),
5868 e4a6c3b8 Olga Brani
  fragmentDiv = safeFragment.appendChild( document.createElement("div") );
5869 e4a6c3b8 Olga Brani
5870 e4a6c3b8 Olga Brani
wrapMap.optgroup = wrapMap.option;
5871 e4a6c3b8 Olga Brani
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5872 e4a6c3b8 Olga Brani
wrapMap.th = wrapMap.td;
5873 e4a6c3b8 Olga Brani
5874 e4a6c3b8 Olga Brani
jQuery.fn.extend({
5875 e4a6c3b8 Olga Brani
  text: function( value ) {
5876 e4a6c3b8 Olga Brani
    return jQuery.access( this, function( value ) {
5877 e4a6c3b8 Olga Brani
      return value === undefined ?
5878 e4a6c3b8 Olga Brani
        jQuery.text( this ) :
5879 e4a6c3b8 Olga Brani
        this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
5880 e4a6c3b8 Olga Brani
    }, null, value, arguments.length );
5881 e4a6c3b8 Olga Brani
  },
5882 e4a6c3b8 Olga Brani
5883 e4a6c3b8 Olga Brani
  wrapAll: function( html ) {
5884 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( html ) ) {
5885 e4a6c3b8 Olga Brani
      return this.each(function(i) {
5886 e4a6c3b8 Olga Brani
        jQuery(this).wrapAll( html.call(this, i) );
5887 e4a6c3b8 Olga Brani
      });
5888 e4a6c3b8 Olga Brani
    }
5889 e4a6c3b8 Olga Brani
5890 e4a6c3b8 Olga Brani
    if ( this[0] ) {
5891 e4a6c3b8 Olga Brani
      // The elements to wrap the target around
5892 e4a6c3b8 Olga Brani
      var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5893 e4a6c3b8 Olga Brani
5894 e4a6c3b8 Olga Brani
      if ( this[0].parentNode ) {
5895 e4a6c3b8 Olga Brani
        wrap.insertBefore( this[0] );
5896 e4a6c3b8 Olga Brani
      }
5897 e4a6c3b8 Olga Brani
5898 e4a6c3b8 Olga Brani
      wrap.map(function() {
5899 e4a6c3b8 Olga Brani
        var elem = this;
5900 e4a6c3b8 Olga Brani
5901 e4a6c3b8 Olga Brani
        while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5902 e4a6c3b8 Olga Brani
          elem = elem.firstChild;
5903 e4a6c3b8 Olga Brani
        }
5904 e4a6c3b8 Olga Brani
5905 e4a6c3b8 Olga Brani
        return elem;
5906 e4a6c3b8 Olga Brani
      }).append( this );
5907 e4a6c3b8 Olga Brani
    }
5908 e4a6c3b8 Olga Brani
5909 e4a6c3b8 Olga Brani
    return this;
5910 e4a6c3b8 Olga Brani
  },
5911 e4a6c3b8 Olga Brani
5912 e4a6c3b8 Olga Brani
  wrapInner: function( html ) {
5913 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( html ) ) {
5914 e4a6c3b8 Olga Brani
      return this.each(function(i) {
5915 e4a6c3b8 Olga Brani
        jQuery(this).wrapInner( html.call(this, i) );
5916 e4a6c3b8 Olga Brani
      });
5917 e4a6c3b8 Olga Brani
    }
5918 e4a6c3b8 Olga Brani
5919 e4a6c3b8 Olga Brani
    return this.each(function() {
5920 e4a6c3b8 Olga Brani
      var self = jQuery( this ),
5921 e4a6c3b8 Olga Brani
        contents = self.contents();
5922 e4a6c3b8 Olga Brani
5923 e4a6c3b8 Olga Brani
      if ( contents.length ) {
5924 e4a6c3b8 Olga Brani
        contents.wrapAll( html );
5925 e4a6c3b8 Olga Brani
5926 e4a6c3b8 Olga Brani
      } else {
5927 e4a6c3b8 Olga Brani
        self.append( html );
5928 e4a6c3b8 Olga Brani
      }
5929 e4a6c3b8 Olga Brani
    });
5930 e4a6c3b8 Olga Brani
  },
5931 e4a6c3b8 Olga Brani
5932 e4a6c3b8 Olga Brani
  wrap: function( html ) {
5933 e4a6c3b8 Olga Brani
    var isFunction = jQuery.isFunction( html );
5934 e4a6c3b8 Olga Brani
5935 e4a6c3b8 Olga Brani
    return this.each(function(i) {
5936 e4a6c3b8 Olga Brani
      jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
5937 e4a6c3b8 Olga Brani
    });
5938 e4a6c3b8 Olga Brani
  },
5939 e4a6c3b8 Olga Brani
5940 e4a6c3b8 Olga Brani
  unwrap: function() {
5941 e4a6c3b8 Olga Brani
    return this.parent().each(function() {
5942 e4a6c3b8 Olga Brani
      if ( !jQuery.nodeName( this, "body" ) ) {
5943 e4a6c3b8 Olga Brani
        jQuery( this ).replaceWith( this.childNodes );
5944 e4a6c3b8 Olga Brani
      }
5945 e4a6c3b8 Olga Brani
    }).end();
5946 e4a6c3b8 Olga Brani
  },
5947 e4a6c3b8 Olga Brani
5948 e4a6c3b8 Olga Brani
  append: function() {
5949 e4a6c3b8 Olga Brani
    return this.domManip(arguments, true, function( elem ) {
5950 e4a6c3b8 Olga Brani
      if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5951 e4a6c3b8 Olga Brani
        this.appendChild( elem );
5952 e4a6c3b8 Olga Brani
      }
5953 e4a6c3b8 Olga Brani
    });
5954 e4a6c3b8 Olga Brani
  },
5955 e4a6c3b8 Olga Brani
5956 e4a6c3b8 Olga Brani
  prepend: function() {
5957 e4a6c3b8 Olga Brani
    return this.domManip(arguments, true, function( elem ) {
5958 e4a6c3b8 Olga Brani
      if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5959 e4a6c3b8 Olga Brani
        this.insertBefore( elem, this.firstChild );
5960 e4a6c3b8 Olga Brani
      }
5961 e4a6c3b8 Olga Brani
    });
5962 e4a6c3b8 Olga Brani
  },
5963 e4a6c3b8 Olga Brani
5964 e4a6c3b8 Olga Brani
  before: function() {
5965 e4a6c3b8 Olga Brani
    return this.domManip( arguments, false, function( elem ) {
5966 e4a6c3b8 Olga Brani
      if ( this.parentNode ) {
5967 e4a6c3b8 Olga Brani
        this.parentNode.insertBefore( elem, this );
5968 e4a6c3b8 Olga Brani
      }
5969 e4a6c3b8 Olga Brani
    });
5970 e4a6c3b8 Olga Brani
  },
5971 e4a6c3b8 Olga Brani
5972 e4a6c3b8 Olga Brani
  after: function() {
5973 e4a6c3b8 Olga Brani
    return this.domManip( arguments, false, function( elem ) {
5974 e4a6c3b8 Olga Brani
      if ( this.parentNode ) {
5975 e4a6c3b8 Olga Brani
        this.parentNode.insertBefore( elem, this.nextSibling );
5976 e4a6c3b8 Olga Brani
      }
5977 e4a6c3b8 Olga Brani
    });
5978 e4a6c3b8 Olga Brani
  },
5979 e4a6c3b8 Olga Brani
5980 e4a6c3b8 Olga Brani
  // keepData is for internal use only--do not document
5981 e4a6c3b8 Olga Brani
  remove: function( selector, keepData ) {
5982 e4a6c3b8 Olga Brani
    var elem,
5983 e4a6c3b8 Olga Brani
      i = 0;
5984 e4a6c3b8 Olga Brani
5985 e4a6c3b8 Olga Brani
    for ( ; (elem = this[i]) != null; i++ ) {
5986 e4a6c3b8 Olga Brani
      if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
5987 e4a6c3b8 Olga Brani
        if ( !keepData && elem.nodeType === 1 ) {
5988 e4a6c3b8 Olga Brani
          jQuery.cleanData( getAll( elem ) );
5989 e4a6c3b8 Olga Brani
        }
5990 e4a6c3b8 Olga Brani
5991 e4a6c3b8 Olga Brani
        if ( elem.parentNode ) {
5992 e4a6c3b8 Olga Brani
          if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
5993 e4a6c3b8 Olga Brani
            setGlobalEval( getAll( elem, "script" ) );
5994 e4a6c3b8 Olga Brani
          }
5995 e4a6c3b8 Olga Brani
          elem.parentNode.removeChild( elem );
5996 e4a6c3b8 Olga Brani
        }
5997 e4a6c3b8 Olga Brani
      }
5998 e4a6c3b8 Olga Brani
    }
5999 e4a6c3b8 Olga Brani
6000 e4a6c3b8 Olga Brani
    return this;
6001 e4a6c3b8 Olga Brani
  },
6002 e4a6c3b8 Olga Brani
6003 e4a6c3b8 Olga Brani
  empty: function() {
6004 e4a6c3b8 Olga Brani
    var elem,
6005 e4a6c3b8 Olga Brani
      i = 0;
6006 e4a6c3b8 Olga Brani
6007 e4a6c3b8 Olga Brani
    for ( ; (elem = this[i]) != null; i++ ) {
6008 e4a6c3b8 Olga Brani
      // Remove element nodes and prevent memory leaks
6009 e4a6c3b8 Olga Brani
      if ( elem.nodeType === 1 ) {
6010 e4a6c3b8 Olga Brani
        jQuery.cleanData( getAll( elem, false ) );
6011 e4a6c3b8 Olga Brani
      }
6012 e4a6c3b8 Olga Brani
6013 e4a6c3b8 Olga Brani
      // Remove any remaining nodes
6014 e4a6c3b8 Olga Brani
      while ( elem.firstChild ) {
6015 e4a6c3b8 Olga Brani
        elem.removeChild( elem.firstChild );
6016 e4a6c3b8 Olga Brani
      }
6017 e4a6c3b8 Olga Brani
6018 e4a6c3b8 Olga Brani
      // If this is a select, ensure that it displays empty (#12336)
6019 e4a6c3b8 Olga Brani
      // Support: IE<9
6020 e4a6c3b8 Olga Brani
      if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
6021 e4a6c3b8 Olga Brani
        elem.options.length = 0;
6022 e4a6c3b8 Olga Brani
      }
6023 e4a6c3b8 Olga Brani
    }
6024 e4a6c3b8 Olga Brani
6025 e4a6c3b8 Olga Brani
    return this;
6026 e4a6c3b8 Olga Brani
  },
6027 e4a6c3b8 Olga Brani
6028 e4a6c3b8 Olga Brani
  clone: function( dataAndEvents, deepDataAndEvents ) {
6029 e4a6c3b8 Olga Brani
    dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6030 e4a6c3b8 Olga Brani
    deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6031 e4a6c3b8 Olga Brani
6032 e4a6c3b8 Olga Brani
    return this.map( function () {
6033 e4a6c3b8 Olga Brani
      return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6034 e4a6c3b8 Olga Brani
    });
6035 e4a6c3b8 Olga Brani
  },
6036 e4a6c3b8 Olga Brani
6037 e4a6c3b8 Olga Brani
  html: function( value ) {
6038 e4a6c3b8 Olga Brani
    return jQuery.access( this, function( value ) {
6039 e4a6c3b8 Olga Brani
      var elem = this[0] || {},
6040 e4a6c3b8 Olga Brani
        i = 0,
6041 e4a6c3b8 Olga Brani
        l = this.length;
6042 e4a6c3b8 Olga Brani
6043 e4a6c3b8 Olga Brani
      if ( value === undefined ) {
6044 e4a6c3b8 Olga Brani
        return elem.nodeType === 1 ?
6045 e4a6c3b8 Olga Brani
          elem.innerHTML.replace( rinlinejQuery, "" ) :
6046 e4a6c3b8 Olga Brani
          undefined;
6047 e4a6c3b8 Olga Brani
      }
6048 e4a6c3b8 Olga Brani
6049 e4a6c3b8 Olga Brani
      // See if we can take a shortcut and just use innerHTML
6050 e4a6c3b8 Olga Brani
      if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6051 e4a6c3b8 Olga Brani
        ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
6052 e4a6c3b8 Olga Brani
        ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
6053 e4a6c3b8 Olga Brani
        !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
6054 e4a6c3b8 Olga Brani
6055 e4a6c3b8 Olga Brani
        value = value.replace( rxhtmlTag, "<$1></$2>" );
6056 e4a6c3b8 Olga Brani
6057 e4a6c3b8 Olga Brani
        try {
6058 e4a6c3b8 Olga Brani
          for (; i < l; i++ ) {
6059 e4a6c3b8 Olga Brani
            // Remove element nodes and prevent memory leaks
6060 e4a6c3b8 Olga Brani
            elem = this[i] || {};
6061 e4a6c3b8 Olga Brani
            if ( elem.nodeType === 1 ) {
6062 e4a6c3b8 Olga Brani
              jQuery.cleanData( getAll( elem, false ) );
6063 e4a6c3b8 Olga Brani
              elem.innerHTML = value;
6064 e4a6c3b8 Olga Brani
            }
6065 e4a6c3b8 Olga Brani
          }
6066 e4a6c3b8 Olga Brani
6067 e4a6c3b8 Olga Brani
          elem = 0;
6068 e4a6c3b8 Olga Brani
6069 e4a6c3b8 Olga Brani
        // If using innerHTML throws an exception, use the fallback method
6070 e4a6c3b8 Olga Brani
        } catch(e) {}
6071 e4a6c3b8 Olga Brani
      }
6072 e4a6c3b8 Olga Brani
6073 e4a6c3b8 Olga Brani
      if ( elem ) {
6074 e4a6c3b8 Olga Brani
        this.empty().append( value );
6075 e4a6c3b8 Olga Brani
      }
6076 e4a6c3b8 Olga Brani
    }, null, value, arguments.length );
6077 e4a6c3b8 Olga Brani
  },
6078 e4a6c3b8 Olga Brani
6079 e4a6c3b8 Olga Brani
  replaceWith: function( value ) {
6080 e4a6c3b8 Olga Brani
    var isFunc = jQuery.isFunction( value );
6081 e4a6c3b8 Olga Brani
6082 e4a6c3b8 Olga Brani
    // Make sure that the elements are removed from the DOM before they are inserted
6083 e4a6c3b8 Olga Brani
    // this can help fix replacing a parent with child elements
6084 e4a6c3b8 Olga Brani
    if ( !isFunc && typeof value !== "string" ) {
6085 e4a6c3b8 Olga Brani
      value = jQuery( value ).not( this ).detach();
6086 e4a6c3b8 Olga Brani
    }
6087 e4a6c3b8 Olga Brani
6088 e4a6c3b8 Olga Brani
    return this.domManip( [ value ], true, function( elem ) {
6089 e4a6c3b8 Olga Brani
      var next = this.nextSibling,
6090 e4a6c3b8 Olga Brani
        parent = this.parentNode;
6091 e4a6c3b8 Olga Brani
6092 e4a6c3b8 Olga Brani
      if ( parent ) {
6093 e4a6c3b8 Olga Brani
        jQuery( this ).remove();
6094 e4a6c3b8 Olga Brani
        parent.insertBefore( elem, next );
6095 e4a6c3b8 Olga Brani
      }
6096 e4a6c3b8 Olga Brani
    });
6097 e4a6c3b8 Olga Brani
  },
6098 e4a6c3b8 Olga Brani
6099 e4a6c3b8 Olga Brani
  detach: function( selector ) {
6100 e4a6c3b8 Olga Brani
    return this.remove( selector, true );
6101 e4a6c3b8 Olga Brani
  },
6102 e4a6c3b8 Olga Brani
6103 e4a6c3b8 Olga Brani
  domManip: function( args, table, callback ) {
6104 e4a6c3b8 Olga Brani
6105 e4a6c3b8 Olga Brani
    // Flatten any nested arrays
6106 e4a6c3b8 Olga Brani
    args = core_concat.apply( [], args );
6107 e4a6c3b8 Olga Brani
6108 e4a6c3b8 Olga Brani
    var first, node, hasScripts,
6109 e4a6c3b8 Olga Brani
      scripts, doc, fragment,
6110 e4a6c3b8 Olga Brani
      i = 0,
6111 e4a6c3b8 Olga Brani
      l = this.length,
6112 e4a6c3b8 Olga Brani
      set = this,
6113 e4a6c3b8 Olga Brani
      iNoClone = l - 1,
6114 e4a6c3b8 Olga Brani
      value = args[0],
6115 e4a6c3b8 Olga Brani
      isFunction = jQuery.isFunction( value );
6116 e4a6c3b8 Olga Brani
6117 e4a6c3b8 Olga Brani
    // We can't cloneNode fragments that contain checked, in WebKit
6118 e4a6c3b8 Olga Brani
    if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
6119 e4a6c3b8 Olga Brani
      return this.each(function( index ) {
6120 e4a6c3b8 Olga Brani
        var self = set.eq( index );
6121 e4a6c3b8 Olga Brani
        if ( isFunction ) {
6122 e4a6c3b8 Olga Brani
          args[0] = value.call( this, index, table ? self.html() : undefined );
6123 e4a6c3b8 Olga Brani
        }
6124 e4a6c3b8 Olga Brani
        self.domManip( args, table, callback );
6125 e4a6c3b8 Olga Brani
      });
6126 e4a6c3b8 Olga Brani
    }
6127 e4a6c3b8 Olga Brani
6128 e4a6c3b8 Olga Brani
    if ( l ) {
6129 e4a6c3b8 Olga Brani
      fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
6130 e4a6c3b8 Olga Brani
      first = fragment.firstChild;
6131 e4a6c3b8 Olga Brani
6132 e4a6c3b8 Olga Brani
      if ( fragment.childNodes.length === 1 ) {
6133 e4a6c3b8 Olga Brani
        fragment = first;
6134 e4a6c3b8 Olga Brani
      }
6135 e4a6c3b8 Olga Brani
6136 e4a6c3b8 Olga Brani
      if ( first ) {
6137 e4a6c3b8 Olga Brani
        table = table && jQuery.nodeName( first, "tr" );
6138 e4a6c3b8 Olga Brani
        scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
6139 e4a6c3b8 Olga Brani
        hasScripts = scripts.length;
6140 e4a6c3b8 Olga Brani
6141 e4a6c3b8 Olga Brani
        // Use the original fragment for the last item instead of the first because it can end up
6142 e4a6c3b8 Olga Brani
        // being emptied incorrectly in certain situations (#8070).
6143 e4a6c3b8 Olga Brani
        for ( ; i < l; i++ ) {
6144 e4a6c3b8 Olga Brani
          node = fragment;
6145 e4a6c3b8 Olga Brani
6146 e4a6c3b8 Olga Brani
          if ( i !== iNoClone ) {
6147 e4a6c3b8 Olga Brani
            node = jQuery.clone( node, true, true );
6148 e4a6c3b8 Olga Brani
6149 e4a6c3b8 Olga Brani
            // Keep references to cloned scripts for later restoration
6150 e4a6c3b8 Olga Brani
            if ( hasScripts ) {
6151 e4a6c3b8 Olga Brani
              jQuery.merge( scripts, getAll( node, "script" ) );
6152 e4a6c3b8 Olga Brani
            }
6153 e4a6c3b8 Olga Brani
          }
6154 e4a6c3b8 Olga Brani
6155 e4a6c3b8 Olga Brani
          callback.call(
6156 e4a6c3b8 Olga Brani
            table && jQuery.nodeName( this[i], "table" ) ?
6157 e4a6c3b8 Olga Brani
              findOrAppend( this[i], "tbody" ) :
6158 e4a6c3b8 Olga Brani
              this[i],
6159 e4a6c3b8 Olga Brani
            node,
6160 e4a6c3b8 Olga Brani
            i
6161 e4a6c3b8 Olga Brani
          );
6162 e4a6c3b8 Olga Brani
        }
6163 e4a6c3b8 Olga Brani
6164 e4a6c3b8 Olga Brani
        if ( hasScripts ) {
6165 e4a6c3b8 Olga Brani
          doc = scripts[ scripts.length - 1 ].ownerDocument;
6166 e4a6c3b8 Olga Brani
6167 e4a6c3b8 Olga Brani
          // Reenable scripts
6168 e4a6c3b8 Olga Brani
          jQuery.map( scripts, restoreScript );
6169 e4a6c3b8 Olga Brani
6170 e4a6c3b8 Olga Brani
          // Evaluate executable scripts on first document insertion
6171 e4a6c3b8 Olga Brani
          for ( i = 0; i < hasScripts; i++ ) {
6172 e4a6c3b8 Olga Brani
            node = scripts[ i ];
6173 e4a6c3b8 Olga Brani
            if ( rscriptType.test( node.type || "" ) &&
6174 e4a6c3b8 Olga Brani
              !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
6175 e4a6c3b8 Olga Brani
6176 e4a6c3b8 Olga Brani
              if ( node.src ) {
6177 e4a6c3b8 Olga Brani
                // Hope ajax is available...
6178 e4a6c3b8 Olga Brani
                jQuery.ajax({
6179 e4a6c3b8 Olga Brani
                  url: node.src,
6180 e4a6c3b8 Olga Brani
                  type: "GET",
6181 e4a6c3b8 Olga Brani
                  dataType: "script",
6182 e4a6c3b8 Olga Brani
                  async: false,
6183 e4a6c3b8 Olga Brani
                  global: false,
6184 e4a6c3b8 Olga Brani
                  "throws": true
6185 e4a6c3b8 Olga Brani
                });
6186 e4a6c3b8 Olga Brani
              } else {
6187 e4a6c3b8 Olga Brani
                jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
6188 e4a6c3b8 Olga Brani
              }
6189 e4a6c3b8 Olga Brani
            }
6190 e4a6c3b8 Olga Brani
          }
6191 e4a6c3b8 Olga Brani
        }
6192 e4a6c3b8 Olga Brani
6193 e4a6c3b8 Olga Brani
        // Fix #11809: Avoid leaking memory
6194 e4a6c3b8 Olga Brani
        fragment = first = null;
6195 e4a6c3b8 Olga Brani
      }
6196 e4a6c3b8 Olga Brani
    }
6197 e4a6c3b8 Olga Brani
6198 e4a6c3b8 Olga Brani
    return this;
6199 e4a6c3b8 Olga Brani
  }
6200 e4a6c3b8 Olga Brani
});
6201 e4a6c3b8 Olga Brani
6202 e4a6c3b8 Olga Brani
function findOrAppend( elem, tag ) {
6203 e4a6c3b8 Olga Brani
  return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
6204 e4a6c3b8 Olga Brani
}
6205 e4a6c3b8 Olga Brani
6206 e4a6c3b8 Olga Brani
// Replace/restore the type attribute of script elements for safe DOM manipulation
6207 e4a6c3b8 Olga Brani
function disableScript( elem ) {
6208 e4a6c3b8 Olga Brani
  var attr = elem.getAttributeNode("type");
6209 e4a6c3b8 Olga Brani
  elem.type = ( attr && attr.specified ) + "/" + elem.type;
6210 e4a6c3b8 Olga Brani
  return elem;
6211 e4a6c3b8 Olga Brani
}
6212 e4a6c3b8 Olga Brani
function restoreScript( elem ) {
6213 e4a6c3b8 Olga Brani
  var match = rscriptTypeMasked.exec( elem.type );
6214 e4a6c3b8 Olga Brani
  if ( match ) {
6215 e4a6c3b8 Olga Brani
    elem.type = match[1];
6216 e4a6c3b8 Olga Brani
  } else {
6217 e4a6c3b8 Olga Brani
    elem.removeAttribute("type");
6218 e4a6c3b8 Olga Brani
  }
6219 e4a6c3b8 Olga Brani
  return elem;
6220 e4a6c3b8 Olga Brani
}
6221 e4a6c3b8 Olga Brani
6222 e4a6c3b8 Olga Brani
// Mark scripts as having already been evaluated
6223 e4a6c3b8 Olga Brani
function setGlobalEval( elems, refElements ) {
6224 e4a6c3b8 Olga Brani
  var elem,
6225 e4a6c3b8 Olga Brani
    i = 0;
6226 e4a6c3b8 Olga Brani
  for ( ; (elem = elems[i]) != null; i++ ) {
6227 e4a6c3b8 Olga Brani
    jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
6228 e4a6c3b8 Olga Brani
  }
6229 e4a6c3b8 Olga Brani
}
6230 e4a6c3b8 Olga Brani
6231 e4a6c3b8 Olga Brani
function cloneCopyEvent( src, dest ) {
6232 e4a6c3b8 Olga Brani
6233 e4a6c3b8 Olga Brani
  if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6234 e4a6c3b8 Olga Brani
    return;
6235 e4a6c3b8 Olga Brani
  }
6236 e4a6c3b8 Olga Brani
6237 e4a6c3b8 Olga Brani
  var type, i, l,
6238 e4a6c3b8 Olga Brani
    oldData = jQuery._data( src ),
6239 e4a6c3b8 Olga Brani
    curData = jQuery._data( dest, oldData ),
6240 e4a6c3b8 Olga Brani
    events = oldData.events;
6241 e4a6c3b8 Olga Brani
6242 e4a6c3b8 Olga Brani
  if ( events ) {
6243 e4a6c3b8 Olga Brani
    delete curData.handle;
6244 e4a6c3b8 Olga Brani
    curData.events = {};
6245 e4a6c3b8 Olga Brani
6246 e4a6c3b8 Olga Brani
    for ( type in events ) {
6247 e4a6c3b8 Olga Brani
      for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6248 e4a6c3b8 Olga Brani
        jQuery.event.add( dest, type, events[ type ][ i ] );
6249 e4a6c3b8 Olga Brani
      }
6250 e4a6c3b8 Olga Brani
    }
6251 e4a6c3b8 Olga Brani
  }
6252 e4a6c3b8 Olga Brani
6253 e4a6c3b8 Olga Brani
  // make the cloned public data object a copy from the original
6254 e4a6c3b8 Olga Brani
  if ( curData.data ) {
6255 e4a6c3b8 Olga Brani
    curData.data = jQuery.extend( {}, curData.data );
6256 e4a6c3b8 Olga Brani
  }
6257 e4a6c3b8 Olga Brani
}
6258 e4a6c3b8 Olga Brani
6259 e4a6c3b8 Olga Brani
function fixCloneNodeIssues( src, dest ) {
6260 e4a6c3b8 Olga Brani
  var nodeName, e, data;
6261 e4a6c3b8 Olga Brani
6262 e4a6c3b8 Olga Brani
  // We do not need to do anything for non-Elements
6263 e4a6c3b8 Olga Brani
  if ( dest.nodeType !== 1 ) {
6264 e4a6c3b8 Olga Brani
    return;
6265 e4a6c3b8 Olga Brani
  }
6266 e4a6c3b8 Olga Brani
6267 e4a6c3b8 Olga Brani
  nodeName = dest.nodeName.toLowerCase();
6268 e4a6c3b8 Olga Brani
6269 e4a6c3b8 Olga Brani
  // IE6-8 copies events bound via attachEvent when using cloneNode.
6270 e4a6c3b8 Olga Brani
  if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
6271 e4a6c3b8 Olga Brani
    data = jQuery._data( dest );
6272 e4a6c3b8 Olga Brani
6273 e4a6c3b8 Olga Brani
    for ( e in data.events ) {
6274 e4a6c3b8 Olga Brani
      jQuery.removeEvent( dest, e, data.handle );
6275 e4a6c3b8 Olga Brani
    }
6276 e4a6c3b8 Olga Brani
6277 e4a6c3b8 Olga Brani
    // Event data gets referenced instead of copied if the expando gets copied too
6278 e4a6c3b8 Olga Brani
    dest.removeAttribute( jQuery.expando );
6279 e4a6c3b8 Olga Brani
  }
6280 e4a6c3b8 Olga Brani
6281 e4a6c3b8 Olga Brani
  // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
6282 e4a6c3b8 Olga Brani
  if ( nodeName === "script" && dest.text !== src.text ) {
6283 e4a6c3b8 Olga Brani
    disableScript( dest ).text = src.text;
6284 e4a6c3b8 Olga Brani
    restoreScript( dest );
6285 e4a6c3b8 Olga Brani
6286 e4a6c3b8 Olga Brani
  // IE6-10 improperly clones children of object elements using classid.
6287 e4a6c3b8 Olga Brani
  // IE10 throws NoModificationAllowedError if parent is null, #12132.
6288 e4a6c3b8 Olga Brani
  } else if ( nodeName === "object" ) {
6289 e4a6c3b8 Olga Brani
    if ( dest.parentNode ) {
6290 e4a6c3b8 Olga Brani
      dest.outerHTML = src.outerHTML;
6291 e4a6c3b8 Olga Brani
    }
6292 e4a6c3b8 Olga Brani
6293 e4a6c3b8 Olga Brani
    // This path appears unavoidable for IE9. When cloning an object
6294 e4a6c3b8 Olga Brani
    // element in IE9, the outerHTML strategy above is not sufficient.
6295 e4a6c3b8 Olga Brani
    // If the src has innerHTML and the destination does not,
6296 e4a6c3b8 Olga Brani
    // copy the src.innerHTML into the dest.innerHTML. #10324
6297 e4a6c3b8 Olga Brani
    if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
6298 e4a6c3b8 Olga Brani
      dest.innerHTML = src.innerHTML;
6299 e4a6c3b8 Olga Brani
    }
6300 e4a6c3b8 Olga Brani
6301 e4a6c3b8 Olga Brani
  } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
6302 e4a6c3b8 Olga Brani
    // IE6-8 fails to persist the checked state of a cloned checkbox
6303 e4a6c3b8 Olga Brani
    // or radio button. Worse, IE6-7 fail to give the cloned element
6304 e4a6c3b8 Olga Brani
    // a checked appearance if the defaultChecked value isn't also set
6305 e4a6c3b8 Olga Brani
6306 e4a6c3b8 Olga Brani
    dest.defaultChecked = dest.checked = src.checked;
6307 e4a6c3b8 Olga Brani
6308 e4a6c3b8 Olga Brani
    // IE6-7 get confused and end up setting the value of a cloned
6309 e4a6c3b8 Olga Brani
    // checkbox/radio button to an empty string instead of "on"
6310 e4a6c3b8 Olga Brani
    if ( dest.value !== src.value ) {
6311 e4a6c3b8 Olga Brani
      dest.value = src.value;
6312 e4a6c3b8 Olga Brani
    }
6313 e4a6c3b8 Olga Brani
6314 e4a6c3b8 Olga Brani
  // IE6-8 fails to return the selected option to the default selected
6315 e4a6c3b8 Olga Brani
  // state when cloning options
6316 e4a6c3b8 Olga Brani
  } else if ( nodeName === "option" ) {
6317 e4a6c3b8 Olga Brani
    dest.defaultSelected = dest.selected = src.defaultSelected;
6318 e4a6c3b8 Olga Brani
6319 e4a6c3b8 Olga Brani
  // IE6-8 fails to set the defaultValue to the correct value when
6320 e4a6c3b8 Olga Brani
  // cloning other types of input fields
6321 e4a6c3b8 Olga Brani
  } else if ( nodeName === "input" || nodeName === "textarea" ) {
6322 e4a6c3b8 Olga Brani
    dest.defaultValue = src.defaultValue;
6323 e4a6c3b8 Olga Brani
  }
6324 e4a6c3b8 Olga Brani
}
6325 e4a6c3b8 Olga Brani
6326 e4a6c3b8 Olga Brani
jQuery.each({
6327 e4a6c3b8 Olga Brani
  appendTo: "append",
6328 e4a6c3b8 Olga Brani
  prependTo: "prepend",
6329 e4a6c3b8 Olga Brani
  insertBefore: "before",
6330 e4a6c3b8 Olga Brani
  insertAfter: "after",
6331 e4a6c3b8 Olga Brani
  replaceAll: "replaceWith"
6332 e4a6c3b8 Olga Brani
}, function( name, original ) {
6333 e4a6c3b8 Olga Brani
  jQuery.fn[ name ] = function( selector ) {
6334 e4a6c3b8 Olga Brani
    var elems,
6335 e4a6c3b8 Olga Brani
      i = 0,
6336 e4a6c3b8 Olga Brani
      ret = [],
6337 e4a6c3b8 Olga Brani
      insert = jQuery( selector ),
6338 e4a6c3b8 Olga Brani
      last = insert.length - 1;
6339 e4a6c3b8 Olga Brani
6340 e4a6c3b8 Olga Brani
    for ( ; i <= last; i++ ) {
6341 e4a6c3b8 Olga Brani
      elems = i === last ? this : this.clone(true);
6342 e4a6c3b8 Olga Brani
      jQuery( insert[i] )[ original ]( elems );
6343 e4a6c3b8 Olga Brani
6344 e4a6c3b8 Olga Brani
      // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6345 e4a6c3b8 Olga Brani
      core_push.apply( ret, elems.get() );
6346 e4a6c3b8 Olga Brani
    }
6347 e4a6c3b8 Olga Brani
6348 e4a6c3b8 Olga Brani
    return this.pushStack( ret );
6349 e4a6c3b8 Olga Brani
  };
6350 e4a6c3b8 Olga Brani
});
6351 e4a6c3b8 Olga Brani
6352 e4a6c3b8 Olga Brani
function getAll( context, tag ) {
6353 e4a6c3b8 Olga Brani
  var elems, elem,
6354 e4a6c3b8 Olga Brani
    i = 0,
6355 e4a6c3b8 Olga Brani
    found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
6356 e4a6c3b8 Olga Brani
      typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
6357 e4a6c3b8 Olga Brani
      undefined;
6358 e4a6c3b8 Olga Brani
6359 e4a6c3b8 Olga Brani
  if ( !found ) {
6360 e4a6c3b8 Olga Brani
    for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
6361 e4a6c3b8 Olga Brani
      if ( !tag || jQuery.nodeName( elem, tag ) ) {
6362 e4a6c3b8 Olga Brani
        found.push( elem );
6363 e4a6c3b8 Olga Brani
      } else {
6364 e4a6c3b8 Olga Brani
        jQuery.merge( found, getAll( elem, tag ) );
6365 e4a6c3b8 Olga Brani
      }
6366 e4a6c3b8 Olga Brani
    }
6367 e4a6c3b8 Olga Brani
  }
6368 e4a6c3b8 Olga Brani
6369 e4a6c3b8 Olga Brani
  return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
6370 e4a6c3b8 Olga Brani
    jQuery.merge( [ context ], found ) :
6371 e4a6c3b8 Olga Brani
    found;
6372 e4a6c3b8 Olga Brani
}
6373 e4a6c3b8 Olga Brani
6374 e4a6c3b8 Olga Brani
// Used in buildFragment, fixes the defaultChecked property
6375 e4a6c3b8 Olga Brani
function fixDefaultChecked( elem ) {
6376 e4a6c3b8 Olga Brani
  if ( manipulation_rcheckableType.test( elem.type ) ) {
6377 e4a6c3b8 Olga Brani
    elem.defaultChecked = elem.checked;
6378 e4a6c3b8 Olga Brani
  }
6379 e4a6c3b8 Olga Brani
}
6380 e4a6c3b8 Olga Brani
6381 e4a6c3b8 Olga Brani
jQuery.extend({
6382 e4a6c3b8 Olga Brani
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6383 e4a6c3b8 Olga Brani
    var destElements, node, clone, i, srcElements,
6384 e4a6c3b8 Olga Brani
      inPage = jQuery.contains( elem.ownerDocument, elem );
6385 e4a6c3b8 Olga Brani
6386 e4a6c3b8 Olga Brani
    if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
6387 e4a6c3b8 Olga Brani
      clone = elem.cloneNode( true );
6388 e4a6c3b8 Olga Brani
6389 e4a6c3b8 Olga Brani
    // IE<=8 does not properly clone detached, unknown element nodes
6390 e4a6c3b8 Olga Brani
    } else {
6391 e4a6c3b8 Olga Brani
      fragmentDiv.innerHTML = elem.outerHTML;
6392 e4a6c3b8 Olga Brani
      fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
6393 e4a6c3b8 Olga Brani
    }
6394 e4a6c3b8 Olga Brani
6395 e4a6c3b8 Olga Brani
    if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6396 e4a6c3b8 Olga Brani
        (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6397 e4a6c3b8 Olga Brani
6398 e4a6c3b8 Olga Brani
      // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
6399 e4a6c3b8 Olga Brani
      destElements = getAll( clone );
6400 e4a6c3b8 Olga Brani
      srcElements = getAll( elem );
6401 e4a6c3b8 Olga Brani
6402 e4a6c3b8 Olga Brani
      // Fix all IE cloning issues
6403 e4a6c3b8 Olga Brani
      for ( i = 0; (node = srcElements[i]) != null; ++i ) {
6404 e4a6c3b8 Olga Brani
        // Ensure that the destination node is not null; Fixes #9587
6405 e4a6c3b8 Olga Brani
        if ( destElements[i] ) {
6406 e4a6c3b8 Olga Brani
          fixCloneNodeIssues( node, destElements[i] );
6407 e4a6c3b8 Olga Brani
        }
6408 e4a6c3b8 Olga Brani
      }
6409 e4a6c3b8 Olga Brani
    }
6410 e4a6c3b8 Olga Brani
6411 e4a6c3b8 Olga Brani
    // Copy the events from the original to the clone
6412 e4a6c3b8 Olga Brani
    if ( dataAndEvents ) {
6413 e4a6c3b8 Olga Brani
      if ( deepDataAndEvents ) {
6414 e4a6c3b8 Olga Brani
        srcElements = srcElements || getAll( elem );
6415 e4a6c3b8 Olga Brani
        destElements = destElements || getAll( clone );
6416 e4a6c3b8 Olga Brani
6417 e4a6c3b8 Olga Brani
        for ( i = 0; (node = srcElements[i]) != null; i++ ) {
6418 e4a6c3b8 Olga Brani
          cloneCopyEvent( node, destElements[i] );
6419 e4a6c3b8 Olga Brani
        }
6420 e4a6c3b8 Olga Brani
      } else {
6421 e4a6c3b8 Olga Brani
        cloneCopyEvent( elem, clone );
6422 e4a6c3b8 Olga Brani
      }
6423 e4a6c3b8 Olga Brani
    }
6424 e4a6c3b8 Olga Brani
6425 e4a6c3b8 Olga Brani
    // Preserve script evaluation history
6426 e4a6c3b8 Olga Brani
    destElements = getAll( clone, "script" );
6427 e4a6c3b8 Olga Brani
    if ( destElements.length > 0 ) {
6428 e4a6c3b8 Olga Brani
      setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6429 e4a6c3b8 Olga Brani
    }
6430 e4a6c3b8 Olga Brani
6431 e4a6c3b8 Olga Brani
    destElements = srcElements = node = null;
6432 e4a6c3b8 Olga Brani
6433 e4a6c3b8 Olga Brani
    // Return the cloned set
6434 e4a6c3b8 Olga Brani
    return clone;
6435 e4a6c3b8 Olga Brani
  },
6436 e4a6c3b8 Olga Brani
6437 e4a6c3b8 Olga Brani
  buildFragment: function( elems, context, scripts, selection ) {
6438 e4a6c3b8 Olga Brani
    var j, elem, contains,
6439 e4a6c3b8 Olga Brani
      tmp, tag, tbody, wrap,
6440 e4a6c3b8 Olga Brani
      l = elems.length,
6441 e4a6c3b8 Olga Brani
6442 e4a6c3b8 Olga Brani
      // Ensure a safe fragment
6443 e4a6c3b8 Olga Brani
      safe = createSafeFragment( context ),
6444 e4a6c3b8 Olga Brani
6445 e4a6c3b8 Olga Brani
      nodes = [],
6446 e4a6c3b8 Olga Brani
      i = 0;
6447 e4a6c3b8 Olga Brani
6448 e4a6c3b8 Olga Brani
    for ( ; i < l; i++ ) {
6449 e4a6c3b8 Olga Brani
      elem = elems[ i ];
6450 e4a6c3b8 Olga Brani
6451 e4a6c3b8 Olga Brani
      if ( elem || elem === 0 ) {
6452 e4a6c3b8 Olga Brani
6453 e4a6c3b8 Olga Brani
        // Add nodes directly
6454 e4a6c3b8 Olga Brani
        if ( jQuery.type( elem ) === "object" ) {
6455 e4a6c3b8 Olga Brani
          jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
6456 e4a6c3b8 Olga Brani
6457 e4a6c3b8 Olga Brani
        // Convert non-html into a text node
6458 e4a6c3b8 Olga Brani
        } else if ( !rhtml.test( elem ) ) {
6459 e4a6c3b8 Olga Brani
          nodes.push( context.createTextNode( elem ) );
6460 e4a6c3b8 Olga Brani
6461 e4a6c3b8 Olga Brani
        // Convert html into DOM nodes
6462 e4a6c3b8 Olga Brani
        } else {
6463 e4a6c3b8 Olga Brani
          tmp = tmp || safe.appendChild( context.createElement("div") );
6464 e4a6c3b8 Olga Brani
6465 e4a6c3b8 Olga Brani
          // Deserialize a standard representation
6466 e4a6c3b8 Olga Brani
          tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
6467 e4a6c3b8 Olga Brani
          wrap = wrapMap[ tag ] || wrapMap._default;
6468 e4a6c3b8 Olga Brani
6469 e4a6c3b8 Olga Brani
          tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
6470 e4a6c3b8 Olga Brani
6471 e4a6c3b8 Olga Brani
          // Descend through wrappers to the right content
6472 e4a6c3b8 Olga Brani
          j = wrap[0];
6473 e4a6c3b8 Olga Brani
          while ( j-- ) {
6474 e4a6c3b8 Olga Brani
            tmp = tmp.lastChild;
6475 e4a6c3b8 Olga Brani
          }
6476 e4a6c3b8 Olga Brani
6477 e4a6c3b8 Olga Brani
          // Manually add leading whitespace removed by IE
6478 e4a6c3b8 Olga Brani
          if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6479 e4a6c3b8 Olga Brani
            nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
6480 e4a6c3b8 Olga Brani
          }
6481 e4a6c3b8 Olga Brani
6482 e4a6c3b8 Olga Brani
          // Remove IE's autoinserted <tbody> from table fragments
6483 e4a6c3b8 Olga Brani
          if ( !jQuery.support.tbody ) {
6484 e4a6c3b8 Olga Brani
6485 e4a6c3b8 Olga Brani
            // String was a <table>, *may* have spurious <tbody>
6486 e4a6c3b8 Olga Brani
            elem = tag === "table" && !rtbody.test( elem ) ?
6487 e4a6c3b8 Olga Brani
              tmp.firstChild :
6488 e4a6c3b8 Olga Brani
6489 e4a6c3b8 Olga Brani
              // String was a bare <thead> or <tfoot>
6490 e4a6c3b8 Olga Brani
              wrap[1] === "<table>" && !rtbody.test( elem ) ?
6491 e4a6c3b8 Olga Brani
                tmp :
6492 e4a6c3b8 Olga Brani
                0;
6493 e4a6c3b8 Olga Brani
6494 e4a6c3b8 Olga Brani
            j = elem && elem.childNodes.length;
6495 e4a6c3b8 Olga Brani
            while ( j-- ) {
6496 e4a6c3b8 Olga Brani
              if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
6497 e4a6c3b8 Olga Brani
                elem.removeChild( tbody );
6498 e4a6c3b8 Olga Brani
              }
6499 e4a6c3b8 Olga Brani
            }
6500 e4a6c3b8 Olga Brani
          }
6501 e4a6c3b8 Olga Brani
6502 e4a6c3b8 Olga Brani
          jQuery.merge( nodes, tmp.childNodes );
6503 e4a6c3b8 Olga Brani
6504 e4a6c3b8 Olga Brani
          // Fix #12392 for WebKit and IE > 9
6505 e4a6c3b8 Olga Brani
          tmp.textContent = "";
6506 e4a6c3b8 Olga Brani
6507 e4a6c3b8 Olga Brani
          // Fix #12392 for oldIE
6508 e4a6c3b8 Olga Brani
          while ( tmp.firstChild ) {
6509 e4a6c3b8 Olga Brani
            tmp.removeChild( tmp.firstChild );
6510 e4a6c3b8 Olga Brani
          }
6511 e4a6c3b8 Olga Brani
6512 e4a6c3b8 Olga Brani
          // Remember the top-level container for proper cleanup
6513 e4a6c3b8 Olga Brani
          tmp = safe.lastChild;
6514 e4a6c3b8 Olga Brani
        }
6515 e4a6c3b8 Olga Brani
      }
6516 e4a6c3b8 Olga Brani
    }
6517 e4a6c3b8 Olga Brani
6518 e4a6c3b8 Olga Brani
    // Fix #11356: Clear elements from fragment
6519 e4a6c3b8 Olga Brani
    if ( tmp ) {
6520 e4a6c3b8 Olga Brani
      safe.removeChild( tmp );
6521 e4a6c3b8 Olga Brani
    }
6522 e4a6c3b8 Olga Brani
6523 e4a6c3b8 Olga Brani
    // Reset defaultChecked for any radios and checkboxes
6524 e4a6c3b8 Olga Brani
    // about to be appended to the DOM in IE 6/7 (#8060)
6525 e4a6c3b8 Olga Brani
    if ( !jQuery.support.appendChecked ) {
6526 e4a6c3b8 Olga Brani
      jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
6527 e4a6c3b8 Olga Brani
    }
6528 e4a6c3b8 Olga Brani
6529 e4a6c3b8 Olga Brani
    i = 0;
6530 e4a6c3b8 Olga Brani
    while ( (elem = nodes[ i++ ]) ) {
6531 e4a6c3b8 Olga Brani
6532 e4a6c3b8 Olga Brani
      // #4087 - If origin and destination elements are the same, and this is
6533 e4a6c3b8 Olga Brani
      // that element, do not do anything
6534 e4a6c3b8 Olga Brani
      if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
6535 e4a6c3b8 Olga Brani
        continue;
6536 e4a6c3b8 Olga Brani
      }
6537 e4a6c3b8 Olga Brani
6538 e4a6c3b8 Olga Brani
      contains = jQuery.contains( elem.ownerDocument, elem );
6539 e4a6c3b8 Olga Brani
6540 e4a6c3b8 Olga Brani
      // Append to fragment
6541 e4a6c3b8 Olga Brani
      tmp = getAll( safe.appendChild( elem ), "script" );
6542 e4a6c3b8 Olga Brani
6543 e4a6c3b8 Olga Brani
      // Preserve script evaluation history
6544 e4a6c3b8 Olga Brani
      if ( contains ) {
6545 e4a6c3b8 Olga Brani
        setGlobalEval( tmp );
6546 e4a6c3b8 Olga Brani
      }
6547 e4a6c3b8 Olga Brani
6548 e4a6c3b8 Olga Brani
      // Capture executables
6549 e4a6c3b8 Olga Brani
      if ( scripts ) {
6550 e4a6c3b8 Olga Brani
        j = 0;
6551 e4a6c3b8 Olga Brani
        while ( (elem = tmp[ j++ ]) ) {
6552 e4a6c3b8 Olga Brani
          if ( rscriptType.test( elem.type || "" ) ) {
6553 e4a6c3b8 Olga Brani
            scripts.push( elem );
6554 e4a6c3b8 Olga Brani
          }
6555 e4a6c3b8 Olga Brani
        }
6556 e4a6c3b8 Olga Brani
      }
6557 e4a6c3b8 Olga Brani
    }
6558 e4a6c3b8 Olga Brani
6559 e4a6c3b8 Olga Brani
    tmp = null;
6560 e4a6c3b8 Olga Brani
6561 e4a6c3b8 Olga Brani
    return safe;
6562 e4a6c3b8 Olga Brani
  },
6563 e4a6c3b8 Olga Brani
6564 e4a6c3b8 Olga Brani
  cleanData: function( elems, /* internal */ acceptData ) {
6565 e4a6c3b8 Olga Brani
    var elem, type, id, data,
6566 e4a6c3b8 Olga Brani
      i = 0,
6567 e4a6c3b8 Olga Brani
      internalKey = jQuery.expando,
6568 e4a6c3b8 Olga Brani
      cache = jQuery.cache,
6569 e4a6c3b8 Olga Brani
      deleteExpando = jQuery.support.deleteExpando,
6570 e4a6c3b8 Olga Brani
      special = jQuery.event.special;
6571 e4a6c3b8 Olga Brani
6572 e4a6c3b8 Olga Brani
    for ( ; (elem = elems[i]) != null; i++ ) {
6573 e4a6c3b8 Olga Brani
6574 e4a6c3b8 Olga Brani
      if ( acceptData || jQuery.acceptData( elem ) ) {
6575 e4a6c3b8 Olga Brani
6576 e4a6c3b8 Olga Brani
        id = elem[ internalKey ];
6577 e4a6c3b8 Olga Brani
        data = id && cache[ id ];
6578 e4a6c3b8 Olga Brani
6579 e4a6c3b8 Olga Brani
        if ( data ) {
6580 e4a6c3b8 Olga Brani
          if ( data.events ) {
6581 e4a6c3b8 Olga Brani
            for ( type in data.events ) {
6582 e4a6c3b8 Olga Brani
              if ( special[ type ] ) {
6583 e4a6c3b8 Olga Brani
                jQuery.event.remove( elem, type );
6584 e4a6c3b8 Olga Brani
6585 e4a6c3b8 Olga Brani
              // This is a shortcut to avoid jQuery.event.remove's overhead
6586 e4a6c3b8 Olga Brani
              } else {
6587 e4a6c3b8 Olga Brani
                jQuery.removeEvent( elem, type, data.handle );
6588 e4a6c3b8 Olga Brani
              }
6589 e4a6c3b8 Olga Brani
            }
6590 e4a6c3b8 Olga Brani
          }
6591 e4a6c3b8 Olga Brani
6592 e4a6c3b8 Olga Brani
          // Remove cache only if it was not already removed by jQuery.event.remove
6593 e4a6c3b8 Olga Brani
          if ( cache[ id ] ) {
6594 e4a6c3b8 Olga Brani
6595 e4a6c3b8 Olga Brani
            delete cache[ id ];
6596 e4a6c3b8 Olga Brani
6597 e4a6c3b8 Olga Brani
            // IE does not allow us to delete expando properties from nodes,
6598 e4a6c3b8 Olga Brani
            // nor does it have a removeAttribute function on Document nodes;
6599 e4a6c3b8 Olga Brani
            // we must handle all of these cases
6600 e4a6c3b8 Olga Brani
            if ( deleteExpando ) {
6601 e4a6c3b8 Olga Brani
              delete elem[ internalKey ];
6602 e4a6c3b8 Olga Brani
6603 e4a6c3b8 Olga Brani
            } else if ( typeof elem.removeAttribute !== core_strundefined ) {
6604 e4a6c3b8 Olga Brani
              elem.removeAttribute( internalKey );
6605 e4a6c3b8 Olga Brani
6606 e4a6c3b8 Olga Brani
            } else {
6607 e4a6c3b8 Olga Brani
              elem[ internalKey ] = null;
6608 e4a6c3b8 Olga Brani
            }
6609 e4a6c3b8 Olga Brani
6610 e4a6c3b8 Olga Brani
            core_deletedIds.push( id );
6611 e4a6c3b8 Olga Brani
          }
6612 e4a6c3b8 Olga Brani
        }
6613 e4a6c3b8 Olga Brani
      }
6614 e4a6c3b8 Olga Brani
    }
6615 e4a6c3b8 Olga Brani
  }
6616 e4a6c3b8 Olga Brani
});
6617 e4a6c3b8 Olga Brani
var iframe, getStyles, curCSS,
6618 e4a6c3b8 Olga Brani
  ralpha = /alpha\([^)]*\)/i,
6619 e4a6c3b8 Olga Brani
  ropacity = /opacity\s*=\s*([^)]*)/,
6620 e4a6c3b8 Olga Brani
  rposition = /^(top|right|bottom|left)$/,
6621 e4a6c3b8 Olga Brani
  // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
6622 e4a6c3b8 Olga Brani
  // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6623 e4a6c3b8 Olga Brani
  rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6624 e4a6c3b8 Olga Brani
  rmargin = /^margin/,
6625 e4a6c3b8 Olga Brani
  rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
6626 e4a6c3b8 Olga Brani
  rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
6627 e4a6c3b8 Olga Brani
  rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
6628 e4a6c3b8 Olga Brani
  elemdisplay = { BODY: "block" },
6629 e4a6c3b8 Olga Brani
6630 e4a6c3b8 Olga Brani
  cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6631 e4a6c3b8 Olga Brani
  cssNormalTransform = {
6632 e4a6c3b8 Olga Brani
    letterSpacing: 0,
6633 e4a6c3b8 Olga Brani
    fontWeight: 400
6634 e4a6c3b8 Olga Brani
  },
6635 e4a6c3b8 Olga Brani
6636 e4a6c3b8 Olga Brani
  cssExpand = [ "Top", "Right", "Bottom", "Left" ],
6637 e4a6c3b8 Olga Brani
  cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
6638 e4a6c3b8 Olga Brani
6639 e4a6c3b8 Olga Brani
// return a css property mapped to a potentially vendor prefixed property
6640 e4a6c3b8 Olga Brani
function vendorPropName( style, name ) {
6641 e4a6c3b8 Olga Brani
6642 e4a6c3b8 Olga Brani
  // shortcut for names that are not vendor prefixed
6643 e4a6c3b8 Olga Brani
  if ( name in style ) {
6644 e4a6c3b8 Olga Brani
    return name;
6645 e4a6c3b8 Olga Brani
  }
6646 e4a6c3b8 Olga Brani
6647 e4a6c3b8 Olga Brani
  // check for vendor prefixed names
6648 e4a6c3b8 Olga Brani
  var capName = name.charAt(0).toUpperCase() + name.slice(1),
6649 e4a6c3b8 Olga Brani
    origName = name,
6650 e4a6c3b8 Olga Brani
    i = cssPrefixes.length;
6651 e4a6c3b8 Olga Brani
6652 e4a6c3b8 Olga Brani
  while ( i-- ) {
6653 e4a6c3b8 Olga Brani
    name = cssPrefixes[ i ] + capName;
6654 e4a6c3b8 Olga Brani
    if ( name in style ) {
6655 e4a6c3b8 Olga Brani
      return name;
6656 e4a6c3b8 Olga Brani
    }
6657 e4a6c3b8 Olga Brani
  }
6658 e4a6c3b8 Olga Brani
6659 e4a6c3b8 Olga Brani
  return origName;
6660 e4a6c3b8 Olga Brani
}
6661 e4a6c3b8 Olga Brani
6662 e4a6c3b8 Olga Brani
function isHidden( elem, el ) {
6663 e4a6c3b8 Olga Brani
  // isHidden might be called from jQuery#filter function;
6664 e4a6c3b8 Olga Brani
  // in that case, element will be second argument
6665 e4a6c3b8 Olga Brani
  elem = el || elem;
6666 e4a6c3b8 Olga Brani
  return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
6667 e4a6c3b8 Olga Brani
}
6668 e4a6c3b8 Olga Brani
6669 e4a6c3b8 Olga Brani
function showHide( elements, show ) {
6670 e4a6c3b8 Olga Brani
  var display, elem, hidden,
6671 e4a6c3b8 Olga Brani
    values = [],
6672 e4a6c3b8 Olga Brani
    index = 0,
6673 e4a6c3b8 Olga Brani
    length = elements.length;
6674 e4a6c3b8 Olga Brani
6675 e4a6c3b8 Olga Brani
  for ( ; index < length; index++ ) {
6676 e4a6c3b8 Olga Brani
    elem = elements[ index ];
6677 e4a6c3b8 Olga Brani
    if ( !elem.style ) {
6678 e4a6c3b8 Olga Brani
      continue;
6679 e4a6c3b8 Olga Brani
    }
6680 e4a6c3b8 Olga Brani
6681 e4a6c3b8 Olga Brani
    values[ index ] = jQuery._data( elem, "olddisplay" );
6682 e4a6c3b8 Olga Brani
    display = elem.style.display;
6683 e4a6c3b8 Olga Brani
    if ( show ) {
6684 e4a6c3b8 Olga Brani
      // Reset the inline display of this element to learn if it is
6685 e4a6c3b8 Olga Brani
      // being hidden by cascaded rules or not
6686 e4a6c3b8 Olga Brani
      if ( !values[ index ] && display === "none" ) {
6687 e4a6c3b8 Olga Brani
        elem.style.display = "";
6688 e4a6c3b8 Olga Brani
      }
6689 e4a6c3b8 Olga Brani
6690 e4a6c3b8 Olga Brani
      // Set elements which have been overridden with display: none
6691 e4a6c3b8 Olga Brani
      // in a stylesheet to whatever the default browser style is
6692 e4a6c3b8 Olga Brani
      // for such an element
6693 e4a6c3b8 Olga Brani
      if ( elem.style.display === "" && isHidden( elem ) ) {
6694 e4a6c3b8 Olga Brani
        values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
6695 e4a6c3b8 Olga Brani
      }
6696 e4a6c3b8 Olga Brani
    } else {
6697 e4a6c3b8 Olga Brani
6698 e4a6c3b8 Olga Brani
      if ( !values[ index ] ) {
6699 e4a6c3b8 Olga Brani
        hidden = isHidden( elem );
6700 e4a6c3b8 Olga Brani
6701 e4a6c3b8 Olga Brani
        if ( display && display !== "none" || !hidden ) {
6702 e4a6c3b8 Olga Brani
          jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
6703 e4a6c3b8 Olga Brani
        }
6704 e4a6c3b8 Olga Brani
      }
6705 e4a6c3b8 Olga Brani
    }
6706 e4a6c3b8 Olga Brani
  }
6707 e4a6c3b8 Olga Brani
6708 e4a6c3b8 Olga Brani
  // Set the display of most of the elements in a second loop
6709 e4a6c3b8 Olga Brani
  // to avoid the constant reflow
6710 e4a6c3b8 Olga Brani
  for ( index = 0; index < length; index++ ) {
6711 e4a6c3b8 Olga Brani
    elem = elements[ index ];
6712 e4a6c3b8 Olga Brani
    if ( !elem.style ) {
6713 e4a6c3b8 Olga Brani
      continue;
6714 e4a6c3b8 Olga Brani
    }
6715 e4a6c3b8 Olga Brani
    if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
6716 e4a6c3b8 Olga Brani
      elem.style.display = show ? values[ index ] || "" : "none";
6717 e4a6c3b8 Olga Brani
    }
6718 e4a6c3b8 Olga Brani
  }
6719 e4a6c3b8 Olga Brani
6720 e4a6c3b8 Olga Brani
  return elements;
6721 e4a6c3b8 Olga Brani
}
6722 e4a6c3b8 Olga Brani
6723 e4a6c3b8 Olga Brani
jQuery.fn.extend({
6724 e4a6c3b8 Olga Brani
  css: function( name, value ) {
6725 e4a6c3b8 Olga Brani
    return jQuery.access( this, function( elem, name, value ) {
6726 e4a6c3b8 Olga Brani
      var len, styles,
6727 e4a6c3b8 Olga Brani
        map = {},
6728 e4a6c3b8 Olga Brani
        i = 0;
6729 e4a6c3b8 Olga Brani
6730 e4a6c3b8 Olga Brani
      if ( jQuery.isArray( name ) ) {
6731 e4a6c3b8 Olga Brani
        styles = getStyles( elem );
6732 e4a6c3b8 Olga Brani
        len = name.length;
6733 e4a6c3b8 Olga Brani
6734 e4a6c3b8 Olga Brani
        for ( ; i < len; i++ ) {
6735 e4a6c3b8 Olga Brani
          map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6736 e4a6c3b8 Olga Brani
        }
6737 e4a6c3b8 Olga Brani
6738 e4a6c3b8 Olga Brani
        return map;
6739 e4a6c3b8 Olga Brani
      }
6740 e4a6c3b8 Olga Brani
6741 e4a6c3b8 Olga Brani
      return value !== undefined ?
6742 e4a6c3b8 Olga Brani
        jQuery.style( elem, name, value ) :
6743 e4a6c3b8 Olga Brani
        jQuery.css( elem, name );
6744 e4a6c3b8 Olga Brani
    }, name, value, arguments.length > 1 );
6745 e4a6c3b8 Olga Brani
  },
6746 e4a6c3b8 Olga Brani
  show: function() {
6747 e4a6c3b8 Olga Brani
    return showHide( this, true );
6748 e4a6c3b8 Olga Brani
  },
6749 e4a6c3b8 Olga Brani
  hide: function() {
6750 e4a6c3b8 Olga Brani
    return showHide( this );
6751 e4a6c3b8 Olga Brani
  },
6752 e4a6c3b8 Olga Brani
  toggle: function( state ) {
6753 e4a6c3b8 Olga Brani
    var bool = typeof state === "boolean";
6754 e4a6c3b8 Olga Brani
6755 e4a6c3b8 Olga Brani
    return this.each(function() {
6756 e4a6c3b8 Olga Brani
      if ( bool ? state : isHidden( this ) ) {
6757 e4a6c3b8 Olga Brani
        jQuery( this ).show();
6758 e4a6c3b8 Olga Brani
      } else {
6759 e4a6c3b8 Olga Brani
        jQuery( this ).hide();
6760 e4a6c3b8 Olga Brani
      }
6761 e4a6c3b8 Olga Brani
    });
6762 e4a6c3b8 Olga Brani
  }
6763 e4a6c3b8 Olga Brani
});
6764 e4a6c3b8 Olga Brani
6765 e4a6c3b8 Olga Brani
jQuery.extend({
6766 e4a6c3b8 Olga Brani
  // Add in style property hooks for overriding the default
6767 e4a6c3b8 Olga Brani
  // behavior of getting and setting a style property
6768 e4a6c3b8 Olga Brani
  cssHooks: {
6769 e4a6c3b8 Olga Brani
    opacity: {
6770 e4a6c3b8 Olga Brani
      get: function( elem, computed ) {
6771 e4a6c3b8 Olga Brani
        if ( computed ) {
6772 e4a6c3b8 Olga Brani
          // We should always get a number back from opacity
6773 e4a6c3b8 Olga Brani
          var ret = curCSS( elem, "opacity" );
6774 e4a6c3b8 Olga Brani
          return ret === "" ? "1" : ret;
6775 e4a6c3b8 Olga Brani
        }
6776 e4a6c3b8 Olga Brani
      }
6777 e4a6c3b8 Olga Brani
    }
6778 e4a6c3b8 Olga Brani
  },
6779 e4a6c3b8 Olga Brani
6780 e4a6c3b8 Olga Brani
  // Exclude the following css properties to add px
6781 e4a6c3b8 Olga Brani
  cssNumber: {
6782 e4a6c3b8 Olga Brani
    "columnCount": true,
6783 e4a6c3b8 Olga Brani
    "fillOpacity": true,
6784 e4a6c3b8 Olga Brani
    "fontWeight": true,
6785 e4a6c3b8 Olga Brani
    "lineHeight": true,
6786 e4a6c3b8 Olga Brani
    "opacity": true,
6787 e4a6c3b8 Olga Brani
    "orphans": true,
6788 e4a6c3b8 Olga Brani
    "widows": true,
6789 e4a6c3b8 Olga Brani
    "zIndex": true,
6790 e4a6c3b8 Olga Brani
    "zoom": true
6791 e4a6c3b8 Olga Brani
  },
6792 e4a6c3b8 Olga Brani
6793 e4a6c3b8 Olga Brani
  // Add in properties whose names you wish to fix before
6794 e4a6c3b8 Olga Brani
  // setting or getting the value
6795 e4a6c3b8 Olga Brani
  cssProps: {
6796 e4a6c3b8 Olga Brani
    // normalize float css property
6797 e4a6c3b8 Olga Brani
    "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6798 e4a6c3b8 Olga Brani
  },
6799 e4a6c3b8 Olga Brani
6800 e4a6c3b8 Olga Brani
  // Get and set the style property on a DOM Node
6801 e4a6c3b8 Olga Brani
  style: function( elem, name, value, extra ) {
6802 e4a6c3b8 Olga Brani
    // Don't set styles on text and comment nodes
6803 e4a6c3b8 Olga Brani
    if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6804 e4a6c3b8 Olga Brani
      return;
6805 e4a6c3b8 Olga Brani
    }
6806 e4a6c3b8 Olga Brani
6807 e4a6c3b8 Olga Brani
    // Make sure that we're working with the right name
6808 e4a6c3b8 Olga Brani
    var ret, type, hooks,
6809 e4a6c3b8 Olga Brani
      origName = jQuery.camelCase( name ),
6810 e4a6c3b8 Olga Brani
      style = elem.style;
6811 e4a6c3b8 Olga Brani
6812 e4a6c3b8 Olga Brani
    name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
6813 e4a6c3b8 Olga Brani
6814 e4a6c3b8 Olga Brani
    // gets hook for the prefixed version
6815 e4a6c3b8 Olga Brani
    // followed by the unprefixed version
6816 e4a6c3b8 Olga Brani
    hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6817 e4a6c3b8 Olga Brani
6818 e4a6c3b8 Olga Brani
    // Check if we're setting a value
6819 e4a6c3b8 Olga Brani
    if ( value !== undefined ) {
6820 e4a6c3b8 Olga Brani
      type = typeof value;
6821 e4a6c3b8 Olga Brani
6822 e4a6c3b8 Olga Brani
      // convert relative number strings (+= or -=) to relative numbers. #7345
6823 e4a6c3b8 Olga Brani
      if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6824 e4a6c3b8 Olga Brani
        value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
6825 e4a6c3b8 Olga Brani
        // Fixes bug #9237
6826 e4a6c3b8 Olga Brani
        type = "number";
6827 e4a6c3b8 Olga Brani
      }
6828 e4a6c3b8 Olga Brani
6829 e4a6c3b8 Olga Brani
      // Make sure that NaN and null values aren't set. See: #7116
6830 e4a6c3b8 Olga Brani
      if ( value == null || type === "number" && isNaN( value ) ) {
6831 e4a6c3b8 Olga Brani
        return;
6832 e4a6c3b8 Olga Brani
      }
6833 e4a6c3b8 Olga Brani
6834 e4a6c3b8 Olga Brani
      // If a number was passed in, add 'px' to the (except for certain CSS properties)
6835 e4a6c3b8 Olga Brani
      if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6836 e4a6c3b8 Olga Brani
        value += "px";
6837 e4a6c3b8 Olga Brani
      }
6838 e4a6c3b8 Olga Brani
6839 e4a6c3b8 Olga Brani
      // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
6840 e4a6c3b8 Olga Brani
      // but it would mean to define eight (for every problematic property) identical functions
6841 e4a6c3b8 Olga Brani
      if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
6842 e4a6c3b8 Olga Brani
        style[ name ] = "inherit";
6843 e4a6c3b8 Olga Brani
      }
6844 e4a6c3b8 Olga Brani
6845 e4a6c3b8 Olga Brani
      // If a hook was provided, use that value, otherwise just set the specified value
6846 e4a6c3b8 Olga Brani
      if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
6847 e4a6c3b8 Olga Brani
6848 e4a6c3b8 Olga Brani
        // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6849 e4a6c3b8 Olga Brani
        // Fixes bug #5509
6850 e4a6c3b8 Olga Brani
        try {
6851 e4a6c3b8 Olga Brani
          style[ name ] = value;
6852 e4a6c3b8 Olga Brani
        } catch(e) {}
6853 e4a6c3b8 Olga Brani
      }
6854 e4a6c3b8 Olga Brani
6855 e4a6c3b8 Olga Brani
    } else {
6856 e4a6c3b8 Olga Brani
      // If a hook was provided get the non-computed value from there
6857 e4a6c3b8 Olga Brani
      if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6858 e4a6c3b8 Olga Brani
        return ret;
6859 e4a6c3b8 Olga Brani
      }
6860 e4a6c3b8 Olga Brani
6861 e4a6c3b8 Olga Brani
      // Otherwise just get the value from the style object
6862 e4a6c3b8 Olga Brani
      return style[ name ];
6863 e4a6c3b8 Olga Brani
    }
6864 e4a6c3b8 Olga Brani
  },
6865 e4a6c3b8 Olga Brani
6866 e4a6c3b8 Olga Brani
  css: function( elem, name, extra, styles ) {
6867 e4a6c3b8 Olga Brani
    var num, val, hooks,
6868 e4a6c3b8 Olga Brani
      origName = jQuery.camelCase( name );
6869 e4a6c3b8 Olga Brani
6870 e4a6c3b8 Olga Brani
    // Make sure that we're working with the right name
6871 e4a6c3b8 Olga Brani
    name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
6872 e4a6c3b8 Olga Brani
6873 e4a6c3b8 Olga Brani
    // gets hook for the prefixed version
6874 e4a6c3b8 Olga Brani
    // followed by the unprefixed version
6875 e4a6c3b8 Olga Brani
    hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6876 e4a6c3b8 Olga Brani
6877 e4a6c3b8 Olga Brani
    // If a hook was provided get the computed value from there
6878 e4a6c3b8 Olga Brani
    if ( hooks && "get" in hooks ) {
6879 e4a6c3b8 Olga Brani
      val = hooks.get( elem, true, extra );
6880 e4a6c3b8 Olga Brani
    }
6881 e4a6c3b8 Olga Brani
6882 e4a6c3b8 Olga Brani
    // Otherwise, if a way to get the computed value exists, use that
6883 e4a6c3b8 Olga Brani
    if ( val === undefined ) {
6884 e4a6c3b8 Olga Brani
      val = curCSS( elem, name, styles );
6885 e4a6c3b8 Olga Brani
    }
6886 e4a6c3b8 Olga Brani
6887 e4a6c3b8 Olga Brani
    //convert "normal" to computed value
6888 e4a6c3b8 Olga Brani
    if ( val === "normal" && name in cssNormalTransform ) {
6889 e4a6c3b8 Olga Brani
      val = cssNormalTransform[ name ];
6890 e4a6c3b8 Olga Brani
    }
6891 e4a6c3b8 Olga Brani
6892 e4a6c3b8 Olga Brani
    // Return, converting to number if forced or a qualifier was provided and val looks numeric
6893 e4a6c3b8 Olga Brani
    if ( extra === "" || extra ) {
6894 e4a6c3b8 Olga Brani
      num = parseFloat( val );
6895 e4a6c3b8 Olga Brani
      return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
6896 e4a6c3b8 Olga Brani
    }
6897 e4a6c3b8 Olga Brani
    return val;
6898 e4a6c3b8 Olga Brani
  },
6899 e4a6c3b8 Olga Brani
6900 e4a6c3b8 Olga Brani
  // A method for quickly swapping in/out CSS properties to get correct calculations
6901 e4a6c3b8 Olga Brani
  swap: function( elem, options, callback, args ) {
6902 e4a6c3b8 Olga Brani
    var ret, name,
6903 e4a6c3b8 Olga Brani
      old = {};
6904 e4a6c3b8 Olga Brani
6905 e4a6c3b8 Olga Brani
    // Remember the old values, and insert the new ones
6906 e4a6c3b8 Olga Brani
    for ( name in options ) {
6907 e4a6c3b8 Olga Brani
      old[ name ] = elem.style[ name ];
6908 e4a6c3b8 Olga Brani
      elem.style[ name ] = options[ name ];
6909 e4a6c3b8 Olga Brani
    }
6910 e4a6c3b8 Olga Brani
6911 e4a6c3b8 Olga Brani
    ret = callback.apply( elem, args || [] );
6912 e4a6c3b8 Olga Brani
6913 e4a6c3b8 Olga Brani
    // Revert the old values
6914 e4a6c3b8 Olga Brani
    for ( name in options ) {
6915 e4a6c3b8 Olga Brani
      elem.style[ name ] = old[ name ];
6916 e4a6c3b8 Olga Brani
    }
6917 e4a6c3b8 Olga Brani
6918 e4a6c3b8 Olga Brani
    return ret;
6919 e4a6c3b8 Olga Brani
  }
6920 e4a6c3b8 Olga Brani
});
6921 e4a6c3b8 Olga Brani
6922 e4a6c3b8 Olga Brani
// NOTE: we've included the "window" in window.getComputedStyle
6923 e4a6c3b8 Olga Brani
// because jsdom on node.js will break without it.
6924 e4a6c3b8 Olga Brani
if ( window.getComputedStyle ) {
6925 e4a6c3b8 Olga Brani
  getStyles = function( elem ) {
6926 e4a6c3b8 Olga Brani
    return window.getComputedStyle( elem, null );
6927 e4a6c3b8 Olga Brani
  };
6928 e4a6c3b8 Olga Brani
6929 e4a6c3b8 Olga Brani
  curCSS = function( elem, name, _computed ) {
6930 e4a6c3b8 Olga Brani
    var width, minWidth, maxWidth,
6931 e4a6c3b8 Olga Brani
      computed = _computed || getStyles( elem ),
6932 e4a6c3b8 Olga Brani
6933 e4a6c3b8 Olga Brani
      // getPropertyValue is only needed for .css('filter') in IE9, see #12537
6934 e4a6c3b8 Olga Brani
      ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
6935 e4a6c3b8 Olga Brani
      style = elem.style;
6936 e4a6c3b8 Olga Brani
6937 e4a6c3b8 Olga Brani
    if ( computed ) {
6938 e4a6c3b8 Olga Brani
6939 e4a6c3b8 Olga Brani
      if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6940 e4a6c3b8 Olga Brani
        ret = jQuery.style( elem, name );
6941 e4a6c3b8 Olga Brani
      }
6942 e4a6c3b8 Olga Brani
6943 e4a6c3b8 Olga Brani
      // A tribute to the "awesome hack by Dean Edwards"
6944 e4a6c3b8 Olga Brani
      // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
6945 e4a6c3b8 Olga Brani
      // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
6946 e4a6c3b8 Olga Brani
      // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
6947 e4a6c3b8 Olga Brani
      if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6948 e4a6c3b8 Olga Brani
6949 e4a6c3b8 Olga Brani
        // Remember the original values
6950 e4a6c3b8 Olga Brani
        width = style.width;
6951 e4a6c3b8 Olga Brani
        minWidth = style.minWidth;
6952 e4a6c3b8 Olga Brani
        maxWidth = style.maxWidth;
6953 e4a6c3b8 Olga Brani
6954 e4a6c3b8 Olga Brani
        // Put in the new values to get a computed value out
6955 e4a6c3b8 Olga Brani
        style.minWidth = style.maxWidth = style.width = ret;
6956 e4a6c3b8 Olga Brani
        ret = computed.width;
6957 e4a6c3b8 Olga Brani
6958 e4a6c3b8 Olga Brani
        // Revert the changed values
6959 e4a6c3b8 Olga Brani
        style.width = width;
6960 e4a6c3b8 Olga Brani
        style.minWidth = minWidth;
6961 e4a6c3b8 Olga Brani
        style.maxWidth = maxWidth;
6962 e4a6c3b8 Olga Brani
      }
6963 e4a6c3b8 Olga Brani
    }
6964 e4a6c3b8 Olga Brani
6965 e4a6c3b8 Olga Brani
    return ret;
6966 e4a6c3b8 Olga Brani
  };
6967 e4a6c3b8 Olga Brani
} else if ( document.documentElement.currentStyle ) {
6968 e4a6c3b8 Olga Brani
  getStyles = function( elem ) {
6969 e4a6c3b8 Olga Brani
    return elem.currentStyle;
6970 e4a6c3b8 Olga Brani
  };
6971 e4a6c3b8 Olga Brani
6972 e4a6c3b8 Olga Brani
  curCSS = function( elem, name, _computed ) {
6973 e4a6c3b8 Olga Brani
    var left, rs, rsLeft,
6974 e4a6c3b8 Olga Brani
      computed = _computed || getStyles( elem ),
6975 e4a6c3b8 Olga Brani
      ret = computed ? computed[ name ] : undefined,
6976 e4a6c3b8 Olga Brani
      style = elem.style;
6977 e4a6c3b8 Olga Brani
6978 e4a6c3b8 Olga Brani
    // Avoid setting ret to empty string here
6979 e4a6c3b8 Olga Brani
    // so we don't default to auto
6980 e4a6c3b8 Olga Brani
    if ( ret == null && style && style[ name ] ) {
6981 e4a6c3b8 Olga Brani
      ret = style[ name ];
6982 e4a6c3b8 Olga Brani
    }
6983 e4a6c3b8 Olga Brani
6984 e4a6c3b8 Olga Brani
    // From the awesome hack by Dean Edwards
6985 e4a6c3b8 Olga Brani
    // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6986 e4a6c3b8 Olga Brani
6987 e4a6c3b8 Olga Brani
    // If we're not dealing with a regular pixel number
6988 e4a6c3b8 Olga Brani
    // but a number that has a weird ending, we need to convert it to pixels
6989 e4a6c3b8 Olga Brani
    // but not position css attributes, as those are proportional to the parent element instead
6990 e4a6c3b8 Olga Brani
    // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
6991 e4a6c3b8 Olga Brani
    if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
6992 e4a6c3b8 Olga Brani
6993 e4a6c3b8 Olga Brani
      // Remember the original values
6994 e4a6c3b8 Olga Brani
      left = style.left;
6995 e4a6c3b8 Olga Brani
      rs = elem.runtimeStyle;
6996 e4a6c3b8 Olga Brani
      rsLeft = rs && rs.left;
6997 e4a6c3b8 Olga Brani
6998 e4a6c3b8 Olga Brani
      // Put in the new values to get a computed value out
6999 e4a6c3b8 Olga Brani
      if ( rsLeft ) {
7000 e4a6c3b8 Olga Brani
        rs.left = elem.currentStyle.left;
7001 e4a6c3b8 Olga Brani
      }
7002 e4a6c3b8 Olga Brani
      style.left = name === "fontSize" ? "1em" : ret;
7003 e4a6c3b8 Olga Brani
      ret = style.pixelLeft + "px";
7004 e4a6c3b8 Olga Brani
7005 e4a6c3b8 Olga Brani
      // Revert the changed values
7006 e4a6c3b8 Olga Brani
      style.left = left;
7007 e4a6c3b8 Olga Brani
      if ( rsLeft ) {
7008 e4a6c3b8 Olga Brani
        rs.left = rsLeft;
7009 e4a6c3b8 Olga Brani
      }
7010 e4a6c3b8 Olga Brani
    }
7011 e4a6c3b8 Olga Brani
7012 e4a6c3b8 Olga Brani
    return ret === "" ? "auto" : ret;
7013 e4a6c3b8 Olga Brani
  };
7014 e4a6c3b8 Olga Brani
}
7015 e4a6c3b8 Olga Brani
7016 e4a6c3b8 Olga Brani
function setPositiveNumber( elem, value, subtract ) {
7017 e4a6c3b8 Olga Brani
  var matches = rnumsplit.exec( value );
7018 e4a6c3b8 Olga Brani
  return matches ?
7019 e4a6c3b8 Olga Brani
    // Guard against undefined "subtract", e.g., when used as in cssHooks
7020 e4a6c3b8 Olga Brani
    Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
7021 e4a6c3b8 Olga Brani
    value;
7022 e4a6c3b8 Olga Brani
}
7023 e4a6c3b8 Olga Brani
7024 e4a6c3b8 Olga Brani
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
7025 e4a6c3b8 Olga Brani
  var i = extra === ( isBorderBox ? "border" : "content" ) ?
7026 e4a6c3b8 Olga Brani
    // If we already have the right measurement, avoid augmentation
7027 e4a6c3b8 Olga Brani
    4 :
7028 e4a6c3b8 Olga Brani
    // Otherwise initialize for horizontal or vertical properties
7029 e4a6c3b8 Olga Brani
    name === "width" ? 1 : 0,
7030 e4a6c3b8 Olga Brani
7031 e4a6c3b8 Olga Brani
    val = 0;
7032 e4a6c3b8 Olga Brani
7033 e4a6c3b8 Olga Brani
  for ( ; i < 4; i += 2 ) {
7034 e4a6c3b8 Olga Brani
    // both box models exclude margin, so add it if we want it
7035 e4a6c3b8 Olga Brani
    if ( extra === "margin" ) {
7036 e4a6c3b8 Olga Brani
      val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
7037 e4a6c3b8 Olga Brani
    }
7038 e4a6c3b8 Olga Brani
7039 e4a6c3b8 Olga Brani
    if ( isBorderBox ) {
7040 e4a6c3b8 Olga Brani
      // border-box includes padding, so remove it if we want content
7041 e4a6c3b8 Olga Brani
      if ( extra === "content" ) {
7042 e4a6c3b8 Olga Brani
        val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
7043 e4a6c3b8 Olga Brani
      }
7044 e4a6c3b8 Olga Brani
7045 e4a6c3b8 Olga Brani
      // at this point, extra isn't border nor margin, so remove border
7046 e4a6c3b8 Olga Brani
      if ( extra !== "margin" ) {
7047 e4a6c3b8 Olga Brani
        val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
7048 e4a6c3b8 Olga Brani
      }
7049 e4a6c3b8 Olga Brani
    } else {
7050 e4a6c3b8 Olga Brani
      // at this point, extra isn't content, so add padding
7051 e4a6c3b8 Olga Brani
      val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
7052 e4a6c3b8 Olga Brani
7053 e4a6c3b8 Olga Brani
      // at this point, extra isn't content nor padding, so add border
7054 e4a6c3b8 Olga Brani
      if ( extra !== "padding" ) {
7055 e4a6c3b8 Olga Brani
        val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
7056 e4a6c3b8 Olga Brani
      }
7057 e4a6c3b8 Olga Brani
    }
7058 e4a6c3b8 Olga Brani
  }
7059 e4a6c3b8 Olga Brani
7060 e4a6c3b8 Olga Brani
  return val;
7061 e4a6c3b8 Olga Brani
}
7062 e4a6c3b8 Olga Brani
7063 e4a6c3b8 Olga Brani
function getWidthOrHeight( elem, name, extra ) {
7064 e4a6c3b8 Olga Brani
7065 e4a6c3b8 Olga Brani
  // Start with offset property, which is equivalent to the border-box value
7066 e4a6c3b8 Olga Brani
  var valueIsBorderBox = true,
7067 e4a6c3b8 Olga Brani
    val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
7068 e4a6c3b8 Olga Brani
    styles = getStyles( elem ),
7069 e4a6c3b8 Olga Brani
    isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
7070 e4a6c3b8 Olga Brani
7071 e4a6c3b8 Olga Brani
  // some non-html elements return undefined for offsetWidth, so check for null/undefined
7072 e4a6c3b8 Olga Brani
  // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
7073 e4a6c3b8 Olga Brani
  // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
7074 e4a6c3b8 Olga Brani
  if ( val <= 0 || val == null ) {
7075 e4a6c3b8 Olga Brani
    // Fall back to computed then uncomputed css if necessary
7076 e4a6c3b8 Olga Brani
    val = curCSS( elem, name, styles );
7077 e4a6c3b8 Olga Brani
    if ( val < 0 || val == null ) {
7078 e4a6c3b8 Olga Brani
      val = elem.style[ name ];
7079 e4a6c3b8 Olga Brani
    }
7080 e4a6c3b8 Olga Brani
7081 e4a6c3b8 Olga Brani
    // Computed unit is not pixels. Stop here and return.
7082 e4a6c3b8 Olga Brani
    if ( rnumnonpx.test(val) ) {
7083 e4a6c3b8 Olga Brani
      return val;
7084 e4a6c3b8 Olga Brani
    }
7085 e4a6c3b8 Olga Brani
7086 e4a6c3b8 Olga Brani
    // we need the check for style in case a browser which returns unreliable values
7087 e4a6c3b8 Olga Brani
    // for getComputedStyle silently falls back to the reliable elem.style
7088 e4a6c3b8 Olga Brani
    valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
7089 e4a6c3b8 Olga Brani
7090 e4a6c3b8 Olga Brani
    // Normalize "", auto, and prepare for extra
7091 e4a6c3b8 Olga Brani
    val = parseFloat( val ) || 0;
7092 e4a6c3b8 Olga Brani
  }
7093 e4a6c3b8 Olga Brani
7094 e4a6c3b8 Olga Brani
  // use the active box-sizing model to add/subtract irrelevant styles
7095 e4a6c3b8 Olga Brani
  return ( val +
7096 e4a6c3b8 Olga Brani
    augmentWidthOrHeight(
7097 e4a6c3b8 Olga Brani
      elem,
7098 e4a6c3b8 Olga Brani
      name,
7099 e4a6c3b8 Olga Brani
      extra || ( isBorderBox ? "border" : "content" ),
7100 e4a6c3b8 Olga Brani
      valueIsBorderBox,
7101 e4a6c3b8 Olga Brani
      styles
7102 e4a6c3b8 Olga Brani
    )
7103 e4a6c3b8 Olga Brani
  ) + "px";
7104 e4a6c3b8 Olga Brani
}
7105 e4a6c3b8 Olga Brani
7106 e4a6c3b8 Olga Brani
// Try to determine the default display value of an element
7107 e4a6c3b8 Olga Brani
function css_defaultDisplay( nodeName ) {
7108 e4a6c3b8 Olga Brani
  var doc = document,
7109 e4a6c3b8 Olga Brani
    display = elemdisplay[ nodeName ];
7110 e4a6c3b8 Olga Brani
7111 e4a6c3b8 Olga Brani
  if ( !display ) {
7112 e4a6c3b8 Olga Brani
    display = actualDisplay( nodeName, doc );
7113 e4a6c3b8 Olga Brani
7114 e4a6c3b8 Olga Brani
    // If the simple way fails, read from inside an iframe
7115 e4a6c3b8 Olga Brani
    if ( display === "none" || !display ) {
7116 e4a6c3b8 Olga Brani
      // Use the already-created iframe if possible
7117 e4a6c3b8 Olga Brani
      iframe = ( iframe ||
7118 e4a6c3b8 Olga Brani
        jQuery("<iframe frameborder='0' width='0' height='0'/>")
7119 e4a6c3b8 Olga Brani
        .css( "cssText", "display:block !important" )
7120 e4a6c3b8 Olga Brani
      ).appendTo( doc.documentElement );
7121 e4a6c3b8 Olga Brani
7122 e4a6c3b8 Olga Brani
      // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
7123 e4a6c3b8 Olga Brani
      doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
7124 e4a6c3b8 Olga Brani
      doc.write("<!doctype html><html><body>");
7125 e4a6c3b8 Olga Brani
      doc.close();
7126 e4a6c3b8 Olga Brani
7127 e4a6c3b8 Olga Brani
      display = actualDisplay( nodeName, doc );
7128 e4a6c3b8 Olga Brani
      iframe.detach();
7129 e4a6c3b8 Olga Brani
    }
7130 e4a6c3b8 Olga Brani
7131 e4a6c3b8 Olga Brani
    // Store the correct default display
7132 e4a6c3b8 Olga Brani
    elemdisplay[ nodeName ] = display;
7133 e4a6c3b8 Olga Brani
  }
7134 e4a6c3b8 Olga Brani
7135 e4a6c3b8 Olga Brani
  return display;
7136 e4a6c3b8 Olga Brani
}
7137 e4a6c3b8 Olga Brani
7138 e4a6c3b8 Olga Brani
// Called ONLY from within css_defaultDisplay
7139 e4a6c3b8 Olga Brani
function actualDisplay( name, doc ) {
7140 e4a6c3b8 Olga Brani
  var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
7141 e4a6c3b8 Olga Brani
    display = jQuery.css( elem[0], "display" );
7142 e4a6c3b8 Olga Brani
  elem.remove();
7143 e4a6c3b8 Olga Brani
  return display;
7144 e4a6c3b8 Olga Brani
}
7145 e4a6c3b8 Olga Brani
7146 e4a6c3b8 Olga Brani
jQuery.each([ "height", "width" ], function( i, name ) {
7147 e4a6c3b8 Olga Brani
  jQuery.cssHooks[ name ] = {
7148 e4a6c3b8 Olga Brani
    get: function( elem, computed, extra ) {
7149 e4a6c3b8 Olga Brani
      if ( computed ) {
7150 e4a6c3b8 Olga Brani
        // certain elements can have dimension info if we invisibly show them
7151 e4a6c3b8 Olga Brani
        // however, it must have a current display style that would benefit from this
7152 e4a6c3b8 Olga Brani
        return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
7153 e4a6c3b8 Olga Brani
          jQuery.swap( elem, cssShow, function() {
7154 e4a6c3b8 Olga Brani
            return getWidthOrHeight( elem, name, extra );
7155 e4a6c3b8 Olga Brani
          }) :
7156 e4a6c3b8 Olga Brani
          getWidthOrHeight( elem, name, extra );
7157 e4a6c3b8 Olga Brani
      }
7158 e4a6c3b8 Olga Brani
    },
7159 e4a6c3b8 Olga Brani
7160 e4a6c3b8 Olga Brani
    set: function( elem, value, extra ) {
7161 e4a6c3b8 Olga Brani
      var styles = extra && getStyles( elem );
7162 e4a6c3b8 Olga Brani
      return setPositiveNumber( elem, value, extra ?
7163 e4a6c3b8 Olga Brani
        augmentWidthOrHeight(
7164 e4a6c3b8 Olga Brani
          elem,
7165 e4a6c3b8 Olga Brani
          name,
7166 e4a6c3b8 Olga Brani
          extra,
7167 e4a6c3b8 Olga Brani
          jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
7168 e4a6c3b8 Olga Brani
          styles
7169 e4a6c3b8 Olga Brani
        ) : 0
7170 e4a6c3b8 Olga Brani
      );
7171 e4a6c3b8 Olga Brani
    }
7172 e4a6c3b8 Olga Brani
  };
7173 e4a6c3b8 Olga Brani
});
7174 e4a6c3b8 Olga Brani
7175 e4a6c3b8 Olga Brani
if ( !jQuery.support.opacity ) {
7176 e4a6c3b8 Olga Brani
  jQuery.cssHooks.opacity = {
7177 e4a6c3b8 Olga Brani
    get: function( elem, computed ) {
7178 e4a6c3b8 Olga Brani
      // IE uses filters for opacity
7179 e4a6c3b8 Olga Brani
      return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
7180 e4a6c3b8 Olga Brani
        ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
7181 e4a6c3b8 Olga Brani
        computed ? "1" : "";
7182 e4a6c3b8 Olga Brani
    },
7183 e4a6c3b8 Olga Brani
7184 e4a6c3b8 Olga Brani
    set: function( elem, value ) {
7185 e4a6c3b8 Olga Brani
      var style = elem.style,
7186 e4a6c3b8 Olga Brani
        currentStyle = elem.currentStyle,
7187 e4a6c3b8 Olga Brani
        opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
7188 e4a6c3b8 Olga Brani
        filter = currentStyle && currentStyle.filter || style.filter || "";
7189 e4a6c3b8 Olga Brani
7190 e4a6c3b8 Olga Brani
      // IE has trouble with opacity if it does not have layout
7191 e4a6c3b8 Olga Brani
      // Force it by setting the zoom level
7192 e4a6c3b8 Olga Brani
      style.zoom = 1;
7193 e4a6c3b8 Olga Brani
7194 e4a6c3b8 Olga Brani
      // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
7195 e4a6c3b8 Olga Brani
      // if value === "", then remove inline opacity #12685
7196 e4a6c3b8 Olga Brani
      if ( ( value >= 1 || value === "" ) &&
7197 e4a6c3b8 Olga Brani
          jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
7198 e4a6c3b8 Olga Brani
          style.removeAttribute ) {
7199 e4a6c3b8 Olga Brani
7200 e4a6c3b8 Olga Brani
        // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
7201 e4a6c3b8 Olga Brani
        // if "filter:" is present at all, clearType is disabled, we want to avoid this
7202 e4a6c3b8 Olga Brani
        // style.removeAttribute is IE Only, but so apparently is this code path...
7203 e4a6c3b8 Olga Brani
        style.removeAttribute( "filter" );
7204 e4a6c3b8 Olga Brani
7205 e4a6c3b8 Olga Brani
        // if there is no filter style applied in a css rule or unset inline opacity, we are done
7206 e4a6c3b8 Olga Brani
        if ( value === "" || currentStyle && !currentStyle.filter ) {
7207 e4a6c3b8 Olga Brani
          return;
7208 e4a6c3b8 Olga Brani
        }
7209 e4a6c3b8 Olga Brani
      }
7210 e4a6c3b8 Olga Brani
7211 e4a6c3b8 Olga Brani
      // otherwise, set new filter values
7212 e4a6c3b8 Olga Brani
      style.filter = ralpha.test( filter ) ?
7213 e4a6c3b8 Olga Brani
        filter.replace( ralpha, opacity ) :
7214 e4a6c3b8 Olga Brani
        filter + " " + opacity;
7215 e4a6c3b8 Olga Brani
    }
7216 e4a6c3b8 Olga Brani
  };
7217 e4a6c3b8 Olga Brani
}
7218 e4a6c3b8 Olga Brani
7219 e4a6c3b8 Olga Brani
// These hooks cannot be added until DOM ready because the support test
7220 e4a6c3b8 Olga Brani
// for it is not run until after DOM ready
7221 e4a6c3b8 Olga Brani
jQuery(function() {
7222 e4a6c3b8 Olga Brani
  if ( !jQuery.support.reliableMarginRight ) {
7223 e4a6c3b8 Olga Brani
    jQuery.cssHooks.marginRight = {
7224 e4a6c3b8 Olga Brani
      get: function( elem, computed ) {
7225 e4a6c3b8 Olga Brani
        if ( computed ) {
7226 e4a6c3b8 Olga Brani
          // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
7227 e4a6c3b8 Olga Brani
          // Work around by temporarily setting element display to inline-block
7228 e4a6c3b8 Olga Brani
          return jQuery.swap( elem, { "display": "inline-block" },
7229 e4a6c3b8 Olga Brani
            curCSS, [ elem, "marginRight" ] );
7230 e4a6c3b8 Olga Brani
        }
7231 e4a6c3b8 Olga Brani
      }
7232 e4a6c3b8 Olga Brani
    };
7233 e4a6c3b8 Olga Brani
  }
7234 e4a6c3b8 Olga Brani
7235 e4a6c3b8 Olga Brani
  // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
7236 e4a6c3b8 Olga Brani
  // getComputedStyle returns percent when specified for top/left/bottom/right
7237 e4a6c3b8 Olga Brani
  // rather than make the css module depend on the offset module, we just check for it here
7238 e4a6c3b8 Olga Brani
  if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
7239 e4a6c3b8 Olga Brani
    jQuery.each( [ "top", "left" ], function( i, prop ) {
7240 e4a6c3b8 Olga Brani
      jQuery.cssHooks[ prop ] = {
7241 e4a6c3b8 Olga Brani
        get: function( elem, computed ) {
7242 e4a6c3b8 Olga Brani
          if ( computed ) {
7243 e4a6c3b8 Olga Brani
            computed = curCSS( elem, prop );
7244 e4a6c3b8 Olga Brani
            // if curCSS returns percentage, fallback to offset
7245 e4a6c3b8 Olga Brani
            return rnumnonpx.test( computed ) ?
7246 e4a6c3b8 Olga Brani
              jQuery( elem ).position()[ prop ] + "px" :
7247 e4a6c3b8 Olga Brani
              computed;
7248 e4a6c3b8 Olga Brani
          }
7249 e4a6c3b8 Olga Brani
        }
7250 e4a6c3b8 Olga Brani
      };
7251 e4a6c3b8 Olga Brani
    });
7252 e4a6c3b8 Olga Brani
  }
7253 e4a6c3b8 Olga Brani
7254 e4a6c3b8 Olga Brani
});
7255 e4a6c3b8 Olga Brani
7256 e4a6c3b8 Olga Brani
if ( jQuery.expr && jQuery.expr.filters ) {
7257 e4a6c3b8 Olga Brani
  jQuery.expr.filters.hidden = function( elem ) {
7258 e4a6c3b8 Olga Brani
    // Support: Opera <= 12.12
7259 e4a6c3b8 Olga Brani
    // Opera reports offsetWidths and offsetHeights less than zero on some elements
7260 e4a6c3b8 Olga Brani
    return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
7261 e4a6c3b8 Olga Brani
      (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
7262 e4a6c3b8 Olga Brani
  };
7263 e4a6c3b8 Olga Brani
7264 e4a6c3b8 Olga Brani
  jQuery.expr.filters.visible = function( elem ) {
7265 e4a6c3b8 Olga Brani
    return !jQuery.expr.filters.hidden( elem );
7266 e4a6c3b8 Olga Brani
  };
7267 e4a6c3b8 Olga Brani
}
7268 e4a6c3b8 Olga Brani
7269 e4a6c3b8 Olga Brani
// These hooks are used by animate to expand properties
7270 e4a6c3b8 Olga Brani
jQuery.each({
7271 e4a6c3b8 Olga Brani
  margin: "",
7272 e4a6c3b8 Olga Brani
  padding: "",
7273 e4a6c3b8 Olga Brani
  border: "Width"
7274 e4a6c3b8 Olga Brani
}, function( prefix, suffix ) {
7275 e4a6c3b8 Olga Brani
  jQuery.cssHooks[ prefix + suffix ] = {
7276 e4a6c3b8 Olga Brani
    expand: function( value ) {
7277 e4a6c3b8 Olga Brani
      var i = 0,
7278 e4a6c3b8 Olga Brani
        expanded = {},
7279 e4a6c3b8 Olga Brani
7280 e4a6c3b8 Olga Brani
        // assumes a single number if not a string
7281 e4a6c3b8 Olga Brani
        parts = typeof value === "string" ? value.split(" ") : [ value ];
7282 e4a6c3b8 Olga Brani
7283 e4a6c3b8 Olga Brani
      for ( ; i < 4; i++ ) {
7284 e4a6c3b8 Olga Brani
        expanded[ prefix + cssExpand[ i ] + suffix ] =
7285 e4a6c3b8 Olga Brani
          parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7286 e4a6c3b8 Olga Brani
      }
7287 e4a6c3b8 Olga Brani
7288 e4a6c3b8 Olga Brani
      return expanded;
7289 e4a6c3b8 Olga Brani
    }
7290 e4a6c3b8 Olga Brani
  };
7291 e4a6c3b8 Olga Brani
7292 e4a6c3b8 Olga Brani
  if ( !rmargin.test( prefix ) ) {
7293 e4a6c3b8 Olga Brani
    jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7294 e4a6c3b8 Olga Brani
  }
7295 e4a6c3b8 Olga Brani
});
7296 e4a6c3b8 Olga Brani
var r20 = /%20/g,
7297 e4a6c3b8 Olga Brani
  rbracket = /\[\]$/,
7298 e4a6c3b8 Olga Brani
  rCRLF = /\r?\n/g,
7299 e4a6c3b8 Olga Brani
  rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
7300 e4a6c3b8 Olga Brani
  rsubmittable = /^(?:input|select|textarea|keygen)/i;
7301 e4a6c3b8 Olga Brani
7302 e4a6c3b8 Olga Brani
jQuery.fn.extend({
7303 e4a6c3b8 Olga Brani
  serialize: function() {
7304 e4a6c3b8 Olga Brani
    return jQuery.param( this.serializeArray() );
7305 e4a6c3b8 Olga Brani
  },
7306 e4a6c3b8 Olga Brani
  serializeArray: function() {
7307 e4a6c3b8 Olga Brani
    return this.map(function(){
7308 e4a6c3b8 Olga Brani
      // Can add propHook for "elements" to filter or add form elements
7309 e4a6c3b8 Olga Brani
      var elements = jQuery.prop( this, "elements" );
7310 e4a6c3b8 Olga Brani
      return elements ? jQuery.makeArray( elements ) : this;
7311 e4a6c3b8 Olga Brani
    })
7312 e4a6c3b8 Olga Brani
    .filter(function(){
7313 e4a6c3b8 Olga Brani
      var type = this.type;
7314 e4a6c3b8 Olga Brani
      // Use .is(":disabled") so that fieldset[disabled] works
7315 e4a6c3b8 Olga Brani
      return this.name && !jQuery( this ).is( ":disabled" ) &&
7316 e4a6c3b8 Olga Brani
        rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
7317 e4a6c3b8 Olga Brani
        ( this.checked || !manipulation_rcheckableType.test( type ) );
7318 e4a6c3b8 Olga Brani
    })
7319 e4a6c3b8 Olga Brani
    .map(function( i, elem ){
7320 e4a6c3b8 Olga Brani
      var val = jQuery( this ).val();
7321 e4a6c3b8 Olga Brani
7322 e4a6c3b8 Olga Brani
      return val == null ?
7323 e4a6c3b8 Olga Brani
        null :
7324 e4a6c3b8 Olga Brani
        jQuery.isArray( val ) ?
7325 e4a6c3b8 Olga Brani
          jQuery.map( val, function( val ){
7326 e4a6c3b8 Olga Brani
            return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7327 e4a6c3b8 Olga Brani
          }) :
7328 e4a6c3b8 Olga Brani
          { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7329 e4a6c3b8 Olga Brani
    }).get();
7330 e4a6c3b8 Olga Brani
  }
7331 e4a6c3b8 Olga Brani
});
7332 e4a6c3b8 Olga Brani
7333 e4a6c3b8 Olga Brani
//Serialize an array of form elements or a set of
7334 e4a6c3b8 Olga Brani
//key/values into a query string
7335 e4a6c3b8 Olga Brani
jQuery.param = function( a, traditional ) {
7336 e4a6c3b8 Olga Brani
  var prefix,
7337 e4a6c3b8 Olga Brani
    s = [],
7338 e4a6c3b8 Olga Brani
    add = function( key, value ) {
7339 e4a6c3b8 Olga Brani
      // If value is a function, invoke it and return its value
7340 e4a6c3b8 Olga Brani
      value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
7341 e4a6c3b8 Olga Brani
      s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7342 e4a6c3b8 Olga Brani
    };
7343 e4a6c3b8 Olga Brani
7344 e4a6c3b8 Olga Brani
  // Set traditional to true for jQuery <= 1.3.2 behavior.
7345 e4a6c3b8 Olga Brani
  if ( traditional === undefined ) {
7346 e4a6c3b8 Olga Brani
    traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
7347 e4a6c3b8 Olga Brani
  }
7348 e4a6c3b8 Olga Brani
7349 e4a6c3b8 Olga Brani
  // If an array was passed in, assume that it is an array of form elements.
7350 e4a6c3b8 Olga Brani
  if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7351 e4a6c3b8 Olga Brani
    // Serialize the form elements
7352 e4a6c3b8 Olga Brani
    jQuery.each( a, function() {
7353 e4a6c3b8 Olga Brani
      add( this.name, this.value );
7354 e4a6c3b8 Olga Brani
    });
7355 e4a6c3b8 Olga Brani
7356 e4a6c3b8 Olga Brani
  } else {
7357 e4a6c3b8 Olga Brani
    // If traditional, encode the "old" way (the way 1.3.2 or older
7358 e4a6c3b8 Olga Brani
    // did it), otherwise encode params recursively.
7359 e4a6c3b8 Olga Brani
    for ( prefix in a ) {
7360 e4a6c3b8 Olga Brani
      buildParams( prefix, a[ prefix ], traditional, add );
7361 e4a6c3b8 Olga Brani
    }
7362 e4a6c3b8 Olga Brani
  }
7363 e4a6c3b8 Olga Brani
7364 e4a6c3b8 Olga Brani
  // Return the resulting serialization
7365 e4a6c3b8 Olga Brani
  return s.join( "&" ).replace( r20, "+" );
7366 e4a6c3b8 Olga Brani
};
7367 e4a6c3b8 Olga Brani
7368 e4a6c3b8 Olga Brani
function buildParams( prefix, obj, traditional, add ) {
7369 e4a6c3b8 Olga Brani
  var name;
7370 e4a6c3b8 Olga Brani
7371 e4a6c3b8 Olga Brani
  if ( jQuery.isArray( obj ) ) {
7372 e4a6c3b8 Olga Brani
    // Serialize array item.
7373 e4a6c3b8 Olga Brani
    jQuery.each( obj, function( i, v ) {
7374 e4a6c3b8 Olga Brani
      if ( traditional || rbracket.test( prefix ) ) {
7375 e4a6c3b8 Olga Brani
        // Treat each array item as a scalar.
7376 e4a6c3b8 Olga Brani
        add( prefix, v );
7377 e4a6c3b8 Olga Brani
7378 e4a6c3b8 Olga Brani
      } else {
7379 e4a6c3b8 Olga Brani
        // Item is non-scalar (array or object), encode its numeric index.
7380 e4a6c3b8 Olga Brani
        buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
7381 e4a6c3b8 Olga Brani
      }
7382 e4a6c3b8 Olga Brani
    });
7383 e4a6c3b8 Olga Brani
7384 e4a6c3b8 Olga Brani
  } else if ( !traditional && jQuery.type( obj ) === "object" ) {
7385 e4a6c3b8 Olga Brani
    // Serialize object item.
7386 e4a6c3b8 Olga Brani
    for ( name in obj ) {
7387 e4a6c3b8 Olga Brani
      buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7388 e4a6c3b8 Olga Brani
    }
7389 e4a6c3b8 Olga Brani
7390 e4a6c3b8 Olga Brani
  } else {
7391 e4a6c3b8 Olga Brani
    // Serialize scalar item.
7392 e4a6c3b8 Olga Brani
    add( prefix, obj );
7393 e4a6c3b8 Olga Brani
  }
7394 e4a6c3b8 Olga Brani
}
7395 e4a6c3b8 Olga Brani
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
7396 e4a6c3b8 Olga Brani
  "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
7397 e4a6c3b8 Olga Brani
  "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
7398 e4a6c3b8 Olga Brani
7399 e4a6c3b8 Olga Brani
  // Handle event binding
7400 e4a6c3b8 Olga Brani
  jQuery.fn[ name ] = function( data, fn ) {
7401 e4a6c3b8 Olga Brani
    return arguments.length > 0 ?
7402 e4a6c3b8 Olga Brani
      this.on( name, null, data, fn ) :
7403 e4a6c3b8 Olga Brani
      this.trigger( name );
7404 e4a6c3b8 Olga Brani
  };
7405 e4a6c3b8 Olga Brani
});
7406 e4a6c3b8 Olga Brani
7407 e4a6c3b8 Olga Brani
jQuery.fn.hover = function( fnOver, fnOut ) {
7408 e4a6c3b8 Olga Brani
  return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
7409 e4a6c3b8 Olga Brani
};
7410 e4a6c3b8 Olga Brani
var
7411 e4a6c3b8 Olga Brani
  // Document location
7412 e4a6c3b8 Olga Brani
  ajaxLocParts,
7413 e4a6c3b8 Olga Brani
  ajaxLocation,
7414 e4a6c3b8 Olga Brani
  ajax_nonce = jQuery.now(),
7415 e4a6c3b8 Olga Brani
7416 e4a6c3b8 Olga Brani
  ajax_rquery = /\?/,
7417 e4a6c3b8 Olga Brani
  rhash = /#.*$/,
7418 e4a6c3b8 Olga Brani
  rts = /([?&])_=[^&]*/,
7419 e4a6c3b8 Olga Brani
  rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
7420 e4a6c3b8 Olga Brani
  // #7653, #8125, #8152: local protocol detection
7421 e4a6c3b8 Olga Brani
  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
7422 e4a6c3b8 Olga Brani
  rnoContent = /^(?:GET|HEAD)$/,
7423 e4a6c3b8 Olga Brani
  rprotocol = /^\/\//,
7424 e4a6c3b8 Olga Brani
  rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
7425 e4a6c3b8 Olga Brani
7426 e4a6c3b8 Olga Brani
  // Keep a copy of the old load method
7427 e4a6c3b8 Olga Brani
  _load = jQuery.fn.load,
7428 e4a6c3b8 Olga Brani
7429 e4a6c3b8 Olga Brani
  /* Prefilters
7430 e4a6c3b8 Olga Brani
   * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
7431 e4a6c3b8 Olga Brani
   * 2) These are called:
7432 e4a6c3b8 Olga Brani
   *    - BEFORE asking for a transport
7433 e4a6c3b8 Olga Brani
   *    - AFTER param serialization (s.data is a string if s.processData is true)
7434 e4a6c3b8 Olga Brani
   * 3) key is the dataType
7435 e4a6c3b8 Olga Brani
   * 4) the catchall symbol "*" can be used
7436 e4a6c3b8 Olga Brani
   * 5) execution will start with transport dataType and THEN continue down to "*" if needed
7437 e4a6c3b8 Olga Brani
   */
7438 e4a6c3b8 Olga Brani
  prefilters = {},
7439 e4a6c3b8 Olga Brani
7440 e4a6c3b8 Olga Brani
  /* Transports bindings
7441 e4a6c3b8 Olga Brani
   * 1) key is the dataType
7442 e4a6c3b8 Olga Brani
   * 2) the catchall symbol "*" can be used
7443 e4a6c3b8 Olga Brani
   * 3) selection will start with transport dataType and THEN go to "*" if needed
7444 e4a6c3b8 Olga Brani
   */
7445 e4a6c3b8 Olga Brani
  transports = {},
7446 e4a6c3b8 Olga Brani
7447 e4a6c3b8 Olga Brani
  // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
7448 e4a6c3b8 Olga Brani
  allTypes = "*/".concat("*");
7449 e4a6c3b8 Olga Brani
7450 e4a6c3b8 Olga Brani
// #8138, IE may throw an exception when accessing
7451 e4a6c3b8 Olga Brani
// a field from window.location if document.domain has been set
7452 e4a6c3b8 Olga Brani
try {
7453 e4a6c3b8 Olga Brani
  ajaxLocation = location.href;
7454 e4a6c3b8 Olga Brani
} catch( e ) {
7455 e4a6c3b8 Olga Brani
  // Use the href attribute of an A element
7456 e4a6c3b8 Olga Brani
  // since IE will modify it given document.location
7457 e4a6c3b8 Olga Brani
  ajaxLocation = document.createElement( "a" );
7458 e4a6c3b8 Olga Brani
  ajaxLocation.href = "";
7459 e4a6c3b8 Olga Brani
  ajaxLocation = ajaxLocation.href;
7460 e4a6c3b8 Olga Brani
}
7461 e4a6c3b8 Olga Brani
7462 e4a6c3b8 Olga Brani
// Segment location into parts
7463 e4a6c3b8 Olga Brani
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
7464 e4a6c3b8 Olga Brani
7465 e4a6c3b8 Olga Brani
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7466 e4a6c3b8 Olga Brani
function addToPrefiltersOrTransports( structure ) {
7467 e4a6c3b8 Olga Brani
7468 e4a6c3b8 Olga Brani
  // dataTypeExpression is optional and defaults to "*"
7469 e4a6c3b8 Olga Brani
  return function( dataTypeExpression, func ) {
7470 e4a6c3b8 Olga Brani
7471 e4a6c3b8 Olga Brani
    if ( typeof dataTypeExpression !== "string" ) {
7472 e4a6c3b8 Olga Brani
      func = dataTypeExpression;
7473 e4a6c3b8 Olga Brani
      dataTypeExpression = "*";
7474 e4a6c3b8 Olga Brani
    }
7475 e4a6c3b8 Olga Brani
7476 e4a6c3b8 Olga Brani
    var dataType,
7477 e4a6c3b8 Olga Brani
      i = 0,
7478 e4a6c3b8 Olga Brani
      dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
7479 e4a6c3b8 Olga Brani
7480 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( func ) ) {
7481 e4a6c3b8 Olga Brani
      // For each dataType in the dataTypeExpression
7482 e4a6c3b8 Olga Brani
      while ( (dataType = dataTypes[i++]) ) {
7483 e4a6c3b8 Olga Brani
        // Prepend if requested
7484 e4a6c3b8 Olga Brani
        if ( dataType[0] === "+" ) {
7485 e4a6c3b8 Olga Brani
          dataType = dataType.slice( 1 ) || "*";
7486 e4a6c3b8 Olga Brani
          (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
7487 e4a6c3b8 Olga Brani
7488 e4a6c3b8 Olga Brani
        // Otherwise append
7489 e4a6c3b8 Olga Brani
        } else {
7490 e4a6c3b8 Olga Brani
          (structure[ dataType ] = structure[ dataType ] || []).push( func );
7491 e4a6c3b8 Olga Brani
        }
7492 e4a6c3b8 Olga Brani
      }
7493 e4a6c3b8 Olga Brani
    }
7494 e4a6c3b8 Olga Brani
  };
7495 e4a6c3b8 Olga Brani
}
7496 e4a6c3b8 Olga Brani
7497 e4a6c3b8 Olga Brani
// Base inspection function for prefilters and transports
7498 e4a6c3b8 Olga Brani
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
7499 e4a6c3b8 Olga Brani
7500 e4a6c3b8 Olga Brani
  var inspected = {},
7501 e4a6c3b8 Olga Brani
    seekingTransport = ( structure === transports );
7502 e4a6c3b8 Olga Brani
7503 e4a6c3b8 Olga Brani
  function inspect( dataType ) {
7504 e4a6c3b8 Olga Brani
    var selected;
7505 e4a6c3b8 Olga Brani
    inspected[ dataType ] = true;
7506 e4a6c3b8 Olga Brani
    jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
7507 e4a6c3b8 Olga Brani
      var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
7508 e4a6c3b8 Olga Brani
      if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
7509 e4a6c3b8 Olga Brani
        options.dataTypes.unshift( dataTypeOrTransport );
7510 e4a6c3b8 Olga Brani
        inspect( dataTypeOrTransport );
7511 e4a6c3b8 Olga Brani
        return false;
7512 e4a6c3b8 Olga Brani
      } else if ( seekingTransport ) {
7513 e4a6c3b8 Olga Brani
        return !( selected = dataTypeOrTransport );
7514 e4a6c3b8 Olga Brani
      }
7515 e4a6c3b8 Olga Brani
    });
7516 e4a6c3b8 Olga Brani
    return selected;
7517 e4a6c3b8 Olga Brani
  }
7518 e4a6c3b8 Olga Brani
7519 e4a6c3b8 Olga Brani
  return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
7520 e4a6c3b8 Olga Brani
}
7521 e4a6c3b8 Olga Brani
7522 e4a6c3b8 Olga Brani
// A special extend for ajax options
7523 e4a6c3b8 Olga Brani
// that takes "flat" options (not to be deep extended)
7524 e4a6c3b8 Olga Brani
// Fixes #9887
7525 e4a6c3b8 Olga Brani
function ajaxExtend( target, src ) {
7526 e4a6c3b8 Olga Brani
  var deep, key,
7527 e4a6c3b8 Olga Brani
    flatOptions = jQuery.ajaxSettings.flatOptions || {};
7528 e4a6c3b8 Olga Brani
7529 e4a6c3b8 Olga Brani
  for ( key in src ) {
7530 e4a6c3b8 Olga Brani
    if ( src[ key ] !== undefined ) {
7531 e4a6c3b8 Olga Brani
      ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
7532 e4a6c3b8 Olga Brani
    }
7533 e4a6c3b8 Olga Brani
  }
7534 e4a6c3b8 Olga Brani
  if ( deep ) {
7535 e4a6c3b8 Olga Brani
    jQuery.extend( true, target, deep );
7536 e4a6c3b8 Olga Brani
  }
7537 e4a6c3b8 Olga Brani
7538 e4a6c3b8 Olga Brani
  return target;
7539 e4a6c3b8 Olga Brani
}
7540 e4a6c3b8 Olga Brani
7541 e4a6c3b8 Olga Brani
jQuery.fn.load = function( url, params, callback ) {
7542 e4a6c3b8 Olga Brani
  if ( typeof url !== "string" && _load ) {
7543 e4a6c3b8 Olga Brani
    return _load.apply( this, arguments );
7544 e4a6c3b8 Olga Brani
  }
7545 e4a6c3b8 Olga Brani
7546 e4a6c3b8 Olga Brani
  var selector, response, type,
7547 e4a6c3b8 Olga Brani
    self = this,
7548 e4a6c3b8 Olga Brani
    off = url.indexOf(" ");
7549 e4a6c3b8 Olga Brani
7550 e4a6c3b8 Olga Brani
  if ( off >= 0 ) {
7551 e4a6c3b8 Olga Brani
    selector = url.slice( off, url.length );
7552 e4a6c3b8 Olga Brani
    url = url.slice( 0, off );
7553 e4a6c3b8 Olga Brani
  }
7554 e4a6c3b8 Olga Brani
7555 e4a6c3b8 Olga Brani
  // If it's a function
7556 e4a6c3b8 Olga Brani
  if ( jQuery.isFunction( params ) ) {
7557 e4a6c3b8 Olga Brani
7558 e4a6c3b8 Olga Brani
    // We assume that it's the callback
7559 e4a6c3b8 Olga Brani
    callback = params;
7560 e4a6c3b8 Olga Brani
    params = undefined;
7561 e4a6c3b8 Olga Brani
7562 e4a6c3b8 Olga Brani
  // Otherwise, build a param string
7563 e4a6c3b8 Olga Brani
  } else if ( params && typeof params === "object" ) {
7564 e4a6c3b8 Olga Brani
    type = "POST";
7565 e4a6c3b8 Olga Brani
  }
7566 e4a6c3b8 Olga Brani
7567 e4a6c3b8 Olga Brani
  // If we have elements to modify, make the request
7568 e4a6c3b8 Olga Brani
  if ( self.length > 0 ) {
7569 e4a6c3b8 Olga Brani
    jQuery.ajax({
7570 e4a6c3b8 Olga Brani
      url: url,
7571 e4a6c3b8 Olga Brani
7572 e4a6c3b8 Olga Brani
      // if "type" variable is undefined, then "GET" method will be used
7573 e4a6c3b8 Olga Brani
      type: type,
7574 e4a6c3b8 Olga Brani
      dataType: "html",
7575 e4a6c3b8 Olga Brani
      data: params
7576 e4a6c3b8 Olga Brani
    }).done(function( responseText ) {
7577 e4a6c3b8 Olga Brani
7578 e4a6c3b8 Olga Brani
      // Save response for use in complete callback
7579 e4a6c3b8 Olga Brani
      response = arguments;
7580 e4a6c3b8 Olga Brani
7581 e4a6c3b8 Olga Brani
      self.html( selector ?
7582 e4a6c3b8 Olga Brani
7583 e4a6c3b8 Olga Brani
        // If a selector was specified, locate the right elements in a dummy div
7584 e4a6c3b8 Olga Brani
        // Exclude scripts to avoid IE 'Permission Denied' errors
7585 e4a6c3b8 Olga Brani
        jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
7586 e4a6c3b8 Olga Brani
7587 e4a6c3b8 Olga Brani
        // Otherwise use the full result
7588 e4a6c3b8 Olga Brani
        responseText );
7589 e4a6c3b8 Olga Brani
7590 e4a6c3b8 Olga Brani
    }).complete( callback && function( jqXHR, status ) {
7591 e4a6c3b8 Olga Brani
      self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
7592 e4a6c3b8 Olga Brani
    });
7593 e4a6c3b8 Olga Brani
  }
7594 e4a6c3b8 Olga Brani
7595 e4a6c3b8 Olga Brani
  return this;
7596 e4a6c3b8 Olga Brani
};
7597 e4a6c3b8 Olga Brani
7598 e4a6c3b8 Olga Brani
// Attach a bunch of functions for handling common AJAX events
7599 e4a6c3b8 Olga Brani
jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
7600 e4a6c3b8 Olga Brani
  jQuery.fn[ type ] = function( fn ){
7601 e4a6c3b8 Olga Brani
    return this.on( type, fn );
7602 e4a6c3b8 Olga Brani
  };
7603 e4a6c3b8 Olga Brani
});
7604 e4a6c3b8 Olga Brani
7605 e4a6c3b8 Olga Brani
jQuery.each( [ "get", "post" ], function( i, method ) {
7606 e4a6c3b8 Olga Brani
  jQuery[ method ] = function( url, data, callback, type ) {
7607 e4a6c3b8 Olga Brani
    // shift arguments if data argument was omitted
7608 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( data ) ) {
7609 e4a6c3b8 Olga Brani
      type = type || callback;
7610 e4a6c3b8 Olga Brani
      callback = data;
7611 e4a6c3b8 Olga Brani
      data = undefined;
7612 e4a6c3b8 Olga Brani
    }
7613 e4a6c3b8 Olga Brani
7614 e4a6c3b8 Olga Brani
    return jQuery.ajax({
7615 e4a6c3b8 Olga Brani
      url: url,
7616 e4a6c3b8 Olga Brani
      type: method,
7617 e4a6c3b8 Olga Brani
      dataType: type,
7618 e4a6c3b8 Olga Brani
      data: data,
7619 e4a6c3b8 Olga Brani
      success: callback
7620 e4a6c3b8 Olga Brani
    });
7621 e4a6c3b8 Olga Brani
  };
7622 e4a6c3b8 Olga Brani
});
7623 e4a6c3b8 Olga Brani
7624 e4a6c3b8 Olga Brani
jQuery.extend({
7625 e4a6c3b8 Olga Brani
7626 e4a6c3b8 Olga Brani
  // Counter for holding the number of active queries
7627 e4a6c3b8 Olga Brani
  active: 0,
7628 e4a6c3b8 Olga Brani
7629 e4a6c3b8 Olga Brani
  // Last-Modified header cache for next request
7630 e4a6c3b8 Olga Brani
  lastModified: {},
7631 e4a6c3b8 Olga Brani
  etag: {},
7632 e4a6c3b8 Olga Brani
7633 e4a6c3b8 Olga Brani
  ajaxSettings: {
7634 e4a6c3b8 Olga Brani
    url: ajaxLocation,
7635 e4a6c3b8 Olga Brani
    type: "GET",
7636 e4a6c3b8 Olga Brani
    isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7637 e4a6c3b8 Olga Brani
    global: true,
7638 e4a6c3b8 Olga Brani
    processData: true,
7639 e4a6c3b8 Olga Brani
    async: true,
7640 e4a6c3b8 Olga Brani
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
7641 e4a6c3b8 Olga Brani
    /*
7642 e4a6c3b8 Olga Brani
    timeout: 0,
7643 e4a6c3b8 Olga Brani
    data: null,
7644 e4a6c3b8 Olga Brani
    dataType: null,
7645 e4a6c3b8 Olga Brani
    username: null,
7646 e4a6c3b8 Olga Brani
    password: null,
7647 e4a6c3b8 Olga Brani
    cache: null,
7648 e4a6c3b8 Olga Brani
    throws: false,
7649 e4a6c3b8 Olga Brani
    traditional: false,
7650 e4a6c3b8 Olga Brani
    headers: {},
7651 e4a6c3b8 Olga Brani
    */
7652 e4a6c3b8 Olga Brani
7653 e4a6c3b8 Olga Brani
    accepts: {
7654 e4a6c3b8 Olga Brani
      "*": allTypes,
7655 e4a6c3b8 Olga Brani
      text: "text/plain",
7656 e4a6c3b8 Olga Brani
      html: "text/html",
7657 e4a6c3b8 Olga Brani
      xml: "application/xml, text/xml",
7658 e4a6c3b8 Olga Brani
      json: "application/json, text/javascript"
7659 e4a6c3b8 Olga Brani
    },
7660 e4a6c3b8 Olga Brani
7661 e4a6c3b8 Olga Brani
    contents: {
7662 e4a6c3b8 Olga Brani
      xml: /xml/,
7663 e4a6c3b8 Olga Brani
      html: /html/,
7664 e4a6c3b8 Olga Brani
      json: /json/
7665 e4a6c3b8 Olga Brani
    },
7666 e4a6c3b8 Olga Brani
7667 e4a6c3b8 Olga Brani
    responseFields: {
7668 e4a6c3b8 Olga Brani
      xml: "responseXML",
7669 e4a6c3b8 Olga Brani
      text: "responseText"
7670 e4a6c3b8 Olga Brani
    },
7671 e4a6c3b8 Olga Brani
7672 e4a6c3b8 Olga Brani
    // Data converters
7673 e4a6c3b8 Olga Brani
    // Keys separate source (or catchall "*") and destination types with a single space
7674 e4a6c3b8 Olga Brani
    converters: {
7675 e4a6c3b8 Olga Brani
7676 e4a6c3b8 Olga Brani
      // Convert anything to text
7677 e4a6c3b8 Olga Brani
      "* text": window.String,
7678 e4a6c3b8 Olga Brani
7679 e4a6c3b8 Olga Brani
      // Text to html (true = no transformation)
7680 e4a6c3b8 Olga Brani
      "text html": true,
7681 e4a6c3b8 Olga Brani
7682 e4a6c3b8 Olga Brani
      // Evaluate text as a json expression
7683 e4a6c3b8 Olga Brani
      "text json": jQuery.parseJSON,
7684 e4a6c3b8 Olga Brani
7685 e4a6c3b8 Olga Brani
      // Parse text as xml
7686 e4a6c3b8 Olga Brani
      "text xml": jQuery.parseXML
7687 e4a6c3b8 Olga Brani
    },
7688 e4a6c3b8 Olga Brani
7689 e4a6c3b8 Olga Brani
    // For options that shouldn't be deep extended:
7690 e4a6c3b8 Olga Brani
    // you can add your own custom options here if
7691 e4a6c3b8 Olga Brani
    // and when you create one that shouldn't be
7692 e4a6c3b8 Olga Brani
    // deep extended (see ajaxExtend)
7693 e4a6c3b8 Olga Brani
    flatOptions: {
7694 e4a6c3b8 Olga Brani
      url: true,
7695 e4a6c3b8 Olga Brani
      context: true
7696 e4a6c3b8 Olga Brani
    }
7697 e4a6c3b8 Olga Brani
  },
7698 e4a6c3b8 Olga Brani
7699 e4a6c3b8 Olga Brani
  // Creates a full fledged settings object into target
7700 e4a6c3b8 Olga Brani
  // with both ajaxSettings and settings fields.
7701 e4a6c3b8 Olga Brani
  // If target is omitted, writes into ajaxSettings.
7702 e4a6c3b8 Olga Brani
  ajaxSetup: function( target, settings ) {
7703 e4a6c3b8 Olga Brani
    return settings ?
7704 e4a6c3b8 Olga Brani
7705 e4a6c3b8 Olga Brani
      // Building a settings object
7706 e4a6c3b8 Olga Brani
      ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
7707 e4a6c3b8 Olga Brani
7708 e4a6c3b8 Olga Brani
      // Extending ajaxSettings
7709 e4a6c3b8 Olga Brani
      ajaxExtend( jQuery.ajaxSettings, target );
7710 e4a6c3b8 Olga Brani
  },
7711 e4a6c3b8 Olga Brani
7712 e4a6c3b8 Olga Brani
  ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7713 e4a6c3b8 Olga Brani
  ajaxTransport: addToPrefiltersOrTransports( transports ),
7714 e4a6c3b8 Olga Brani
7715 e4a6c3b8 Olga Brani
  // Main method
7716 e4a6c3b8 Olga Brani
  ajax: function( url, options ) {
7717 e4a6c3b8 Olga Brani
7718 e4a6c3b8 Olga Brani
    // If url is an object, simulate pre-1.5 signature
7719 e4a6c3b8 Olga Brani
    if ( typeof url === "object" ) {
7720 e4a6c3b8 Olga Brani
      options = url;
7721 e4a6c3b8 Olga Brani
      url = undefined;
7722 e4a6c3b8 Olga Brani
    }
7723 e4a6c3b8 Olga Brani
7724 e4a6c3b8 Olga Brani
    // Force options to be an object
7725 e4a6c3b8 Olga Brani
    options = options || {};
7726 e4a6c3b8 Olga Brani
7727 e4a6c3b8 Olga Brani
    var // Cross-domain detection vars
7728 e4a6c3b8 Olga Brani
      parts,
7729 e4a6c3b8 Olga Brani
      // Loop variable
7730 e4a6c3b8 Olga Brani
      i,
7731 e4a6c3b8 Olga Brani
      // URL without anti-cache param
7732 e4a6c3b8 Olga Brani
      cacheURL,
7733 e4a6c3b8 Olga Brani
      // Response headers as string
7734 e4a6c3b8 Olga Brani
      responseHeadersString,
7735 e4a6c3b8 Olga Brani
      // timeout handle
7736 e4a6c3b8 Olga Brani
      timeoutTimer,
7737 e4a6c3b8 Olga Brani
7738 e4a6c3b8 Olga Brani
      // To know if global events are to be dispatched
7739 e4a6c3b8 Olga Brani
      fireGlobals,
7740 e4a6c3b8 Olga Brani
7741 e4a6c3b8 Olga Brani
      transport,
7742 e4a6c3b8 Olga Brani
      // Response headers
7743 e4a6c3b8 Olga Brani
      responseHeaders,
7744 e4a6c3b8 Olga Brani
      // Create the final options object
7745 e4a6c3b8 Olga Brani
      s = jQuery.ajaxSetup( {}, options ),
7746 e4a6c3b8 Olga Brani
      // Callbacks context
7747 e4a6c3b8 Olga Brani
      callbackContext = s.context || s,
7748 e4a6c3b8 Olga Brani
      // Context for global events is callbackContext if it is a DOM node or jQuery collection
7749 e4a6c3b8 Olga Brani
      globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
7750 e4a6c3b8 Olga Brani
        jQuery( callbackContext ) :
7751 e4a6c3b8 Olga Brani
        jQuery.event,
7752 e4a6c3b8 Olga Brani
      // Deferreds
7753 e4a6c3b8 Olga Brani
      deferred = jQuery.Deferred(),
7754 e4a6c3b8 Olga Brani
      completeDeferred = jQuery.Callbacks("once memory"),
7755 e4a6c3b8 Olga Brani
      // Status-dependent callbacks
7756 e4a6c3b8 Olga Brani
      statusCode = s.statusCode || {},
7757 e4a6c3b8 Olga Brani
      // Headers (they are sent all at once)
7758 e4a6c3b8 Olga Brani
      requestHeaders = {},
7759 e4a6c3b8 Olga Brani
      requestHeadersNames = {},
7760 e4a6c3b8 Olga Brani
      // The jqXHR state
7761 e4a6c3b8 Olga Brani
      state = 0,
7762 e4a6c3b8 Olga Brani
      // Default abort message
7763 e4a6c3b8 Olga Brani
      strAbort = "canceled",
7764 e4a6c3b8 Olga Brani
      // Fake xhr
7765 e4a6c3b8 Olga Brani
      jqXHR = {
7766 e4a6c3b8 Olga Brani
        readyState: 0,
7767 e4a6c3b8 Olga Brani
7768 e4a6c3b8 Olga Brani
        // Builds headers hashtable if needed
7769 e4a6c3b8 Olga Brani
        getResponseHeader: function( key ) {
7770 e4a6c3b8 Olga Brani
          var match;
7771 e4a6c3b8 Olga Brani
          if ( state === 2 ) {
7772 e4a6c3b8 Olga Brani
            if ( !responseHeaders ) {
7773 e4a6c3b8 Olga Brani
              responseHeaders = {};
7774 e4a6c3b8 Olga Brani
              while ( (match = rheaders.exec( responseHeadersString )) ) {
7775 e4a6c3b8 Olga Brani
                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7776 e4a6c3b8 Olga Brani
              }
7777 e4a6c3b8 Olga Brani
            }
7778 e4a6c3b8 Olga Brani
            match = responseHeaders[ key.toLowerCase() ];
7779 e4a6c3b8 Olga Brani
          }
7780 e4a6c3b8 Olga Brani
          return match == null ? null : match;
7781 e4a6c3b8 Olga Brani
        },
7782 e4a6c3b8 Olga Brani
7783 e4a6c3b8 Olga Brani
        // Raw string
7784 e4a6c3b8 Olga Brani
        getAllResponseHeaders: function() {
7785 e4a6c3b8 Olga Brani
          return state === 2 ? responseHeadersString : null;
7786 e4a6c3b8 Olga Brani
        },
7787 e4a6c3b8 Olga Brani
7788 e4a6c3b8 Olga Brani
        // Caches the header
7789 e4a6c3b8 Olga Brani
        setRequestHeader: function( name, value ) {
7790 e4a6c3b8 Olga Brani
          var lname = name.toLowerCase();
7791 e4a6c3b8 Olga Brani
          if ( !state ) {
7792 e4a6c3b8 Olga Brani
            name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7793 e4a6c3b8 Olga Brani
            requestHeaders[ name ] = value;
7794 e4a6c3b8 Olga Brani
          }
7795 e4a6c3b8 Olga Brani
          return this;
7796 e4a6c3b8 Olga Brani
        },
7797 e4a6c3b8 Olga Brani
7798 e4a6c3b8 Olga Brani
        // Overrides response content-type header
7799 e4a6c3b8 Olga Brani
        overrideMimeType: function( type ) {
7800 e4a6c3b8 Olga Brani
          if ( !state ) {
7801 e4a6c3b8 Olga Brani
            s.mimeType = type;
7802 e4a6c3b8 Olga Brani
          }
7803 e4a6c3b8 Olga Brani
          return this;
7804 e4a6c3b8 Olga Brani
        },
7805 e4a6c3b8 Olga Brani
7806 e4a6c3b8 Olga Brani
        // Status-dependent callbacks
7807 e4a6c3b8 Olga Brani
        statusCode: function( map ) {
7808 e4a6c3b8 Olga Brani
          var code;
7809 e4a6c3b8 Olga Brani
          if ( map ) {
7810 e4a6c3b8 Olga Brani
            if ( state < 2 ) {
7811 e4a6c3b8 Olga Brani
              for ( code in map ) {
7812 e4a6c3b8 Olga Brani
                // Lazy-add the new callback in a way that preserves old ones
7813 e4a6c3b8 Olga Brani
                statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
7814 e4a6c3b8 Olga Brani
              }
7815 e4a6c3b8 Olga Brani
            } else {
7816 e4a6c3b8 Olga Brani
              // Execute the appropriate callbacks
7817 e4a6c3b8 Olga Brani
              jqXHR.always( map[ jqXHR.status ] );
7818 e4a6c3b8 Olga Brani
            }
7819 e4a6c3b8 Olga Brani
          }
7820 e4a6c3b8 Olga Brani
          return this;
7821 e4a6c3b8 Olga Brani
        },
7822 e4a6c3b8 Olga Brani
7823 e4a6c3b8 Olga Brani
        // Cancel the request
7824 e4a6c3b8 Olga Brani
        abort: function( statusText ) {
7825 e4a6c3b8 Olga Brani
          var finalText = statusText || strAbort;
7826 e4a6c3b8 Olga Brani
          if ( transport ) {
7827 e4a6c3b8 Olga Brani
            transport.abort( finalText );
7828 e4a6c3b8 Olga Brani
          }
7829 e4a6c3b8 Olga Brani
          done( 0, finalText );
7830 e4a6c3b8 Olga Brani
          return this;
7831 e4a6c3b8 Olga Brani
        }
7832 e4a6c3b8 Olga Brani
      };
7833 e4a6c3b8 Olga Brani
7834 e4a6c3b8 Olga Brani
    // Attach deferreds
7835 e4a6c3b8 Olga Brani
    deferred.promise( jqXHR ).complete = completeDeferred.add;
7836 e4a6c3b8 Olga Brani
    jqXHR.success = jqXHR.done;
7837 e4a6c3b8 Olga Brani
    jqXHR.error = jqXHR.fail;
7838 e4a6c3b8 Olga Brani
7839 e4a6c3b8 Olga Brani
    // Remove hash character (#7531: and string promotion)
7840 e4a6c3b8 Olga Brani
    // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7841 e4a6c3b8 Olga Brani
    // Handle falsy url in the settings object (#10093: consistency with old signature)
7842 e4a6c3b8 Olga Brani
    // We also use the url parameter if available
7843 e4a6c3b8 Olga Brani
    s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7844 e4a6c3b8 Olga Brani
7845 e4a6c3b8 Olga Brani
    // Alias method option to type as per ticket #12004
7846 e4a6c3b8 Olga Brani
    s.type = options.method || options.type || s.method || s.type;
7847 e4a6c3b8 Olga Brani
7848 e4a6c3b8 Olga Brani
    // Extract dataTypes list
7849 e4a6c3b8 Olga Brani
    s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
7850 e4a6c3b8 Olga Brani
7851 e4a6c3b8 Olga Brani
    // A cross-domain request is in order when we have a protocol:host:port mismatch
7852 e4a6c3b8 Olga Brani
    if ( s.crossDomain == null ) {
7853 e4a6c3b8 Olga Brani
      parts = rurl.exec( s.url.toLowerCase() );
7854 e4a6c3b8 Olga Brani
      s.crossDomain = !!( parts &&
7855 e4a6c3b8 Olga Brani
        ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
7856 e4a6c3b8 Olga Brani
          ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7857 e4a6c3b8 Olga Brani
            ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7858 e4a6c3b8 Olga Brani
      );
7859 e4a6c3b8 Olga Brani
    }
7860 e4a6c3b8 Olga Brani
7861 e4a6c3b8 Olga Brani
    // Convert data if not already a string
7862 e4a6c3b8 Olga Brani
    if ( s.data && s.processData && typeof s.data !== "string" ) {
7863 e4a6c3b8 Olga Brani
      s.data = jQuery.param( s.data, s.traditional );
7864 e4a6c3b8 Olga Brani
    }
7865 e4a6c3b8 Olga Brani
7866 e4a6c3b8 Olga Brani
    // Apply prefilters
7867 e4a6c3b8 Olga Brani
    inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7868 e4a6c3b8 Olga Brani
7869 e4a6c3b8 Olga Brani
    // If request was aborted inside a prefilter, stop there
7870 e4a6c3b8 Olga Brani
    if ( state === 2 ) {
7871 e4a6c3b8 Olga Brani
      return jqXHR;
7872 e4a6c3b8 Olga Brani
    }
7873 e4a6c3b8 Olga Brani
7874 e4a6c3b8 Olga Brani
    // We can fire global events as of now if asked to
7875 e4a6c3b8 Olga Brani
    fireGlobals = s.global;
7876 e4a6c3b8 Olga Brani
7877 e4a6c3b8 Olga Brani
    // Watch for a new set of requests
7878 e4a6c3b8 Olga Brani
    if ( fireGlobals && jQuery.active++ === 0 ) {
7879 e4a6c3b8 Olga Brani
      jQuery.event.trigger("ajaxStart");
7880 e4a6c3b8 Olga Brani
    }
7881 e4a6c3b8 Olga Brani
7882 e4a6c3b8 Olga Brani
    // Uppercase the type
7883 e4a6c3b8 Olga Brani
    s.type = s.type.toUpperCase();
7884 e4a6c3b8 Olga Brani
7885 e4a6c3b8 Olga Brani
    // Determine if request has content
7886 e4a6c3b8 Olga Brani
    s.hasContent = !rnoContent.test( s.type );
7887 e4a6c3b8 Olga Brani
7888 e4a6c3b8 Olga Brani
    // Save the URL in case we're toying with the If-Modified-Since
7889 e4a6c3b8 Olga Brani
    // and/or If-None-Match header later on
7890 e4a6c3b8 Olga Brani
    cacheURL = s.url;
7891 e4a6c3b8 Olga Brani
7892 e4a6c3b8 Olga Brani
    // More options handling for requests with no content
7893 e4a6c3b8 Olga Brani
    if ( !s.hasContent ) {
7894 e4a6c3b8 Olga Brani
7895 e4a6c3b8 Olga Brani
      // If data is available, append data to url
7896 e4a6c3b8 Olga Brani
      if ( s.data ) {
7897 e4a6c3b8 Olga Brani
        cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
7898 e4a6c3b8 Olga Brani
        // #9682: remove data so that it's not used in an eventual retry
7899 e4a6c3b8 Olga Brani
        delete s.data;
7900 e4a6c3b8 Olga Brani
      }
7901 e4a6c3b8 Olga Brani
7902 e4a6c3b8 Olga Brani
      // Add anti-cache in url if needed
7903 e4a6c3b8 Olga Brani
      if ( s.cache === false ) {
7904 e4a6c3b8 Olga Brani
        s.url = rts.test( cacheURL ) ?
7905 e4a6c3b8 Olga Brani
7906 e4a6c3b8 Olga Brani
          // If there is already a '_' parameter, set its value
7907 e4a6c3b8 Olga Brani
          cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
7908 e4a6c3b8 Olga Brani
7909 e4a6c3b8 Olga Brani
          // Otherwise add one to the end
7910 e4a6c3b8 Olga Brani
          cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
7911 e4a6c3b8 Olga Brani
      }
7912 e4a6c3b8 Olga Brani
    }
7913 e4a6c3b8 Olga Brani
7914 e4a6c3b8 Olga Brani
    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7915 e4a6c3b8 Olga Brani
    if ( s.ifModified ) {
7916 e4a6c3b8 Olga Brani
      if ( jQuery.lastModified[ cacheURL ] ) {
7917 e4a6c3b8 Olga Brani
        jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
7918 e4a6c3b8 Olga Brani
      }
7919 e4a6c3b8 Olga Brani
      if ( jQuery.etag[ cacheURL ] ) {
7920 e4a6c3b8 Olga Brani
        jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
7921 e4a6c3b8 Olga Brani
      }
7922 e4a6c3b8 Olga Brani
    }
7923 e4a6c3b8 Olga Brani
7924 e4a6c3b8 Olga Brani
    // Set the correct header, if data is being sent
7925 e4a6c3b8 Olga Brani
    if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7926 e4a6c3b8 Olga Brani
      jqXHR.setRequestHeader( "Content-Type", s.contentType );
7927 e4a6c3b8 Olga Brani
    }
7928 e4a6c3b8 Olga Brani
7929 e4a6c3b8 Olga Brani
    // Set the Accepts header for the server, depending on the dataType
7930 e4a6c3b8 Olga Brani
    jqXHR.setRequestHeader(
7931 e4a6c3b8 Olga Brani
      "Accept",
7932 e4a6c3b8 Olga Brani
      s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7933 e4a6c3b8 Olga Brani
        s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
7934 e4a6c3b8 Olga Brani
        s.accepts[ "*" ]
7935 e4a6c3b8 Olga Brani
    );
7936 e4a6c3b8 Olga Brani
7937 e4a6c3b8 Olga Brani
    // Check for headers option
7938 e4a6c3b8 Olga Brani
    for ( i in s.headers ) {
7939 e4a6c3b8 Olga Brani
      jqXHR.setRequestHeader( i, s.headers[ i ] );
7940 e4a6c3b8 Olga Brani
    }
7941 e4a6c3b8 Olga Brani
7942 e4a6c3b8 Olga Brani
    // Allow custom headers/mimetypes and early abort
7943 e4a6c3b8 Olga Brani
    if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7944 e4a6c3b8 Olga Brani
      // Abort if not done already and return
7945 e4a6c3b8 Olga Brani
      return jqXHR.abort();
7946 e4a6c3b8 Olga Brani
    }
7947 e4a6c3b8 Olga Brani
7948 e4a6c3b8 Olga Brani
    // aborting is no longer a cancellation
7949 e4a6c3b8 Olga Brani
    strAbort = "abort";
7950 e4a6c3b8 Olga Brani
7951 e4a6c3b8 Olga Brani
    // Install callbacks on deferreds
7952 e4a6c3b8 Olga Brani
    for ( i in { success: 1, error: 1, complete: 1 } ) {
7953 e4a6c3b8 Olga Brani
      jqXHR[ i ]( s[ i ] );
7954 e4a6c3b8 Olga Brani
    }
7955 e4a6c3b8 Olga Brani
7956 e4a6c3b8 Olga Brani
    // Get transport
7957 e4a6c3b8 Olga Brani
    transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7958 e4a6c3b8 Olga Brani
7959 e4a6c3b8 Olga Brani
    // If no transport, we auto-abort
7960 e4a6c3b8 Olga Brani
    if ( !transport ) {
7961 e4a6c3b8 Olga Brani
      done( -1, "No Transport" );
7962 e4a6c3b8 Olga Brani
    } else {
7963 e4a6c3b8 Olga Brani
      jqXHR.readyState = 1;
7964 e4a6c3b8 Olga Brani
7965 e4a6c3b8 Olga Brani
      // Send global event
7966 e4a6c3b8 Olga Brani
      if ( fireGlobals ) {
7967 e4a6c3b8 Olga Brani
        globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7968 e4a6c3b8 Olga Brani
      }
7969 e4a6c3b8 Olga Brani
      // Timeout
7970 e4a6c3b8 Olga Brani
      if ( s.async && s.timeout > 0 ) {
7971 e4a6c3b8 Olga Brani
        timeoutTimer = setTimeout(function() {
7972 e4a6c3b8 Olga Brani
          jqXHR.abort("timeout");
7973 e4a6c3b8 Olga Brani
        }, s.timeout );
7974 e4a6c3b8 Olga Brani
      }
7975 e4a6c3b8 Olga Brani
7976 e4a6c3b8 Olga Brani
      try {
7977 e4a6c3b8 Olga Brani
        state = 1;
7978 e4a6c3b8 Olga Brani
        transport.send( requestHeaders, done );
7979 e4a6c3b8 Olga Brani
      } catch ( e ) {
7980 e4a6c3b8 Olga Brani
        // Propagate exception as error if not done
7981 e4a6c3b8 Olga Brani
        if ( state < 2 ) {
7982 e4a6c3b8 Olga Brani
          done( -1, e );
7983 e4a6c3b8 Olga Brani
        // Simply rethrow otherwise
7984 e4a6c3b8 Olga Brani
        } else {
7985 e4a6c3b8 Olga Brani
          throw e;
7986 e4a6c3b8 Olga Brani
        }
7987 e4a6c3b8 Olga Brani
      }
7988 e4a6c3b8 Olga Brani
    }
7989 e4a6c3b8 Olga Brani
7990 e4a6c3b8 Olga Brani
    // Callback for when everything is done
7991 e4a6c3b8 Olga Brani
    function done( status, nativeStatusText, responses, headers ) {
7992 e4a6c3b8 Olga Brani
      var isSuccess, success, error, response, modified,
7993 e4a6c3b8 Olga Brani
        statusText = nativeStatusText;
7994 e4a6c3b8 Olga Brani
7995 e4a6c3b8 Olga Brani
      // Called once
7996 e4a6c3b8 Olga Brani
      if ( state === 2 ) {
7997 e4a6c3b8 Olga Brani
        return;
7998 e4a6c3b8 Olga Brani
      }
7999 e4a6c3b8 Olga Brani
8000 e4a6c3b8 Olga Brani
      // State is "done" now
8001 e4a6c3b8 Olga Brani
      state = 2;
8002 e4a6c3b8 Olga Brani
8003 e4a6c3b8 Olga Brani
      // Clear timeout if it exists
8004 e4a6c3b8 Olga Brani
      if ( timeoutTimer ) {
8005 e4a6c3b8 Olga Brani
        clearTimeout( timeoutTimer );
8006 e4a6c3b8 Olga Brani
      }
8007 e4a6c3b8 Olga Brani
8008 e4a6c3b8 Olga Brani
      // Dereference transport for early garbage collection
8009 e4a6c3b8 Olga Brani
      // (no matter how long the jqXHR object will be used)
8010 e4a6c3b8 Olga Brani
      transport = undefined;
8011 e4a6c3b8 Olga Brani
8012 e4a6c3b8 Olga Brani
      // Cache response headers
8013 e4a6c3b8 Olga Brani
      responseHeadersString = headers || "";
8014 e4a6c3b8 Olga Brani
8015 e4a6c3b8 Olga Brani
      // Set readyState
8016 e4a6c3b8 Olga Brani
      jqXHR.readyState = status > 0 ? 4 : 0;
8017 e4a6c3b8 Olga Brani
8018 e4a6c3b8 Olga Brani
      // Get response data
8019 e4a6c3b8 Olga Brani
      if ( responses ) {
8020 e4a6c3b8 Olga Brani
        response = ajaxHandleResponses( s, jqXHR, responses );
8021 e4a6c3b8 Olga Brani
      }
8022 e4a6c3b8 Olga Brani
8023 e4a6c3b8 Olga Brani
      // If successful, handle type chaining
8024 e4a6c3b8 Olga Brani
      if ( status >= 200 && status < 300 || status === 304 ) {
8025 e4a6c3b8 Olga Brani
8026 e4a6c3b8 Olga Brani
        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8027 e4a6c3b8 Olga Brani
        if ( s.ifModified ) {
8028 e4a6c3b8 Olga Brani
          modified = jqXHR.getResponseHeader("Last-Modified");
8029 e4a6c3b8 Olga Brani
          if ( modified ) {
8030 e4a6c3b8 Olga Brani
            jQuery.lastModified[ cacheURL ] = modified;
8031 e4a6c3b8 Olga Brani
          }
8032 e4a6c3b8 Olga Brani
          modified = jqXHR.getResponseHeader("etag");
8033 e4a6c3b8 Olga Brani
          if ( modified ) {
8034 e4a6c3b8 Olga Brani
            jQuery.etag[ cacheURL ] = modified;
8035 e4a6c3b8 Olga Brani
          }
8036 e4a6c3b8 Olga Brani
        }
8037 e4a6c3b8 Olga Brani
8038 e4a6c3b8 Olga Brani
        // if no content
8039 e4a6c3b8 Olga Brani
        if ( status === 204 ) {
8040 e4a6c3b8 Olga Brani
          isSuccess = true;
8041 e4a6c3b8 Olga Brani
          statusText = "nocontent";
8042 e4a6c3b8 Olga Brani
8043 e4a6c3b8 Olga Brani
        // if not modified
8044 e4a6c3b8 Olga Brani
        } else if ( status === 304 ) {
8045 e4a6c3b8 Olga Brani
          isSuccess = true;
8046 e4a6c3b8 Olga Brani
          statusText = "notmodified";
8047 e4a6c3b8 Olga Brani
8048 e4a6c3b8 Olga Brani
        // If we have data, let's convert it
8049 e4a6c3b8 Olga Brani
        } else {
8050 e4a6c3b8 Olga Brani
          isSuccess = ajaxConvert( s, response );
8051 e4a6c3b8 Olga Brani
          statusText = isSuccess.state;
8052 e4a6c3b8 Olga Brani
          success = isSuccess.data;
8053 e4a6c3b8 Olga Brani
          error = isSuccess.error;
8054 e4a6c3b8 Olga Brani
          isSuccess = !error;
8055 e4a6c3b8 Olga Brani
        }
8056 e4a6c3b8 Olga Brani
      } else {
8057 e4a6c3b8 Olga Brani
        // We extract error from statusText
8058 e4a6c3b8 Olga Brani
        // then normalize statusText and status for non-aborts
8059 e4a6c3b8 Olga Brani
        error = statusText;
8060 e4a6c3b8 Olga Brani
        if ( status || !statusText ) {
8061 e4a6c3b8 Olga Brani
          statusText = "error";
8062 e4a6c3b8 Olga Brani
          if ( status < 0 ) {
8063 e4a6c3b8 Olga Brani
            status = 0;
8064 e4a6c3b8 Olga Brani
          }
8065 e4a6c3b8 Olga Brani
        }
8066 e4a6c3b8 Olga Brani
      }
8067 e4a6c3b8 Olga Brani
8068 e4a6c3b8 Olga Brani
      // Set data for the fake xhr object
8069 e4a6c3b8 Olga Brani
      jqXHR.status = status;
8070 e4a6c3b8 Olga Brani
      jqXHR.statusText = ( nativeStatusText || statusText ) + "";
8071 e4a6c3b8 Olga Brani
8072 e4a6c3b8 Olga Brani
      // Success/Error
8073 e4a6c3b8 Olga Brani
      if ( isSuccess ) {
8074 e4a6c3b8 Olga Brani
        deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
8075 e4a6c3b8 Olga Brani
      } else {
8076 e4a6c3b8 Olga Brani
        deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
8077 e4a6c3b8 Olga Brani
      }
8078 e4a6c3b8 Olga Brani
8079 e4a6c3b8 Olga Brani
      // Status-dependent callbacks
8080 e4a6c3b8 Olga Brani
      jqXHR.statusCode( statusCode );
8081 e4a6c3b8 Olga Brani
      statusCode = undefined;
8082 e4a6c3b8 Olga Brani
8083 e4a6c3b8 Olga Brani
      if ( fireGlobals ) {
8084 e4a6c3b8 Olga Brani
        globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
8085 e4a6c3b8 Olga Brani
          [ jqXHR, s, isSuccess ? success : error ] );
8086 e4a6c3b8 Olga Brani
      }
8087 e4a6c3b8 Olga Brani
8088 e4a6c3b8 Olga Brani
      // Complete
8089 e4a6c3b8 Olga Brani
      completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
8090 e4a6c3b8 Olga Brani
8091 e4a6c3b8 Olga Brani
      if ( fireGlobals ) {
8092 e4a6c3b8 Olga Brani
        globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
8093 e4a6c3b8 Olga Brani
        // Handle the global AJAX counter
8094 e4a6c3b8 Olga Brani
        if ( !( --jQuery.active ) ) {
8095 e4a6c3b8 Olga Brani
          jQuery.event.trigger("ajaxStop");
8096 e4a6c3b8 Olga Brani
        }
8097 e4a6c3b8 Olga Brani
      }
8098 e4a6c3b8 Olga Brani
    }
8099 e4a6c3b8 Olga Brani
8100 e4a6c3b8 Olga Brani
    return jqXHR;
8101 e4a6c3b8 Olga Brani
  },
8102 e4a6c3b8 Olga Brani
8103 e4a6c3b8 Olga Brani
  getScript: function( url, callback ) {
8104 e4a6c3b8 Olga Brani
    return jQuery.get( url, undefined, callback, "script" );
8105 e4a6c3b8 Olga Brani
  },
8106 e4a6c3b8 Olga Brani
8107 e4a6c3b8 Olga Brani
  getJSON: function( url, data, callback ) {
8108 e4a6c3b8 Olga Brani
    return jQuery.get( url, data, callback, "json" );
8109 e4a6c3b8 Olga Brani
  }
8110 e4a6c3b8 Olga Brani
});
8111 e4a6c3b8 Olga Brani
8112 e4a6c3b8 Olga Brani
/* Handles responses to an ajax request:
8113 e4a6c3b8 Olga Brani
 * - sets all responseXXX fields accordingly
8114 e4a6c3b8 Olga Brani
 * - finds the right dataType (mediates between content-type and expected dataType)
8115 e4a6c3b8 Olga Brani
 * - returns the corresponding response
8116 e4a6c3b8 Olga Brani
 */
8117 e4a6c3b8 Olga Brani
function ajaxHandleResponses( s, jqXHR, responses ) {
8118 e4a6c3b8 Olga Brani
  var firstDataType, ct, finalDataType, type,
8119 e4a6c3b8 Olga Brani
    contents = s.contents,
8120 e4a6c3b8 Olga Brani
    dataTypes = s.dataTypes,
8121 e4a6c3b8 Olga Brani
    responseFields = s.responseFields;
8122 e4a6c3b8 Olga Brani
8123 e4a6c3b8 Olga Brani
  // Fill responseXXX fields
8124 e4a6c3b8 Olga Brani
  for ( type in responseFields ) {
8125 e4a6c3b8 Olga Brani
    if ( type in responses ) {
8126 e4a6c3b8 Olga Brani
      jqXHR[ responseFields[type] ] = responses[ type ];
8127 e4a6c3b8 Olga Brani
    }
8128 e4a6c3b8 Olga Brani
  }
8129 e4a6c3b8 Olga Brani
8130 e4a6c3b8 Olga Brani
  // Remove auto dataType and get content-type in the process
8131 e4a6c3b8 Olga Brani
  while( dataTypes[ 0 ] === "*" ) {
8132 e4a6c3b8 Olga Brani
    dataTypes.shift();
8133 e4a6c3b8 Olga Brani
    if ( ct === undefined ) {
8134 e4a6c3b8 Olga Brani
      ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
8135 e4a6c3b8 Olga Brani
    }
8136 e4a6c3b8 Olga Brani
  }
8137 e4a6c3b8 Olga Brani
8138 e4a6c3b8 Olga Brani
  // Check if we're dealing with a known content-type
8139 e4a6c3b8 Olga Brani
  if ( ct ) {
8140 e4a6c3b8 Olga Brani
    for ( type in contents ) {
8141 e4a6c3b8 Olga Brani
      if ( contents[ type ] && contents[ type ].test( ct ) ) {
8142 e4a6c3b8 Olga Brani
        dataTypes.unshift( type );
8143 e4a6c3b8 Olga Brani
        break;
8144 e4a6c3b8 Olga Brani
      }
8145 e4a6c3b8 Olga Brani
    }
8146 e4a6c3b8 Olga Brani
  }
8147 e4a6c3b8 Olga Brani
8148 e4a6c3b8 Olga Brani
  // Check to see if we have a response for the expected dataType
8149 e4a6c3b8 Olga Brani
  if ( dataTypes[ 0 ] in responses ) {
8150 e4a6c3b8 Olga Brani
    finalDataType = dataTypes[ 0 ];
8151 e4a6c3b8 Olga Brani
  } else {
8152 e4a6c3b8 Olga Brani
    // Try convertible dataTypes
8153 e4a6c3b8 Olga Brani
    for ( type in responses ) {
8154 e4a6c3b8 Olga Brani
      if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
8155 e4a6c3b8 Olga Brani
        finalDataType = type;
8156 e4a6c3b8 Olga Brani
        break;
8157 e4a6c3b8 Olga Brani
      }
8158 e4a6c3b8 Olga Brani
      if ( !firstDataType ) {
8159 e4a6c3b8 Olga Brani
        firstDataType = type;
8160 e4a6c3b8 Olga Brani
      }
8161 e4a6c3b8 Olga Brani
    }
8162 e4a6c3b8 Olga Brani
    // Or just use first one
8163 e4a6c3b8 Olga Brani
    finalDataType = finalDataType || firstDataType;
8164 e4a6c3b8 Olga Brani
  }
8165 e4a6c3b8 Olga Brani
8166 e4a6c3b8 Olga Brani
  // If we found a dataType
8167 e4a6c3b8 Olga Brani
  // We add the dataType to the list if needed
8168 e4a6c3b8 Olga Brani
  // and return the corresponding response
8169 e4a6c3b8 Olga Brani
  if ( finalDataType ) {
8170 e4a6c3b8 Olga Brani
    if ( finalDataType !== dataTypes[ 0 ] ) {
8171 e4a6c3b8 Olga Brani
      dataTypes.unshift( finalDataType );
8172 e4a6c3b8 Olga Brani
    }
8173 e4a6c3b8 Olga Brani
    return responses[ finalDataType ];
8174 e4a6c3b8 Olga Brani
  }
8175 e4a6c3b8 Olga Brani
}
8176 e4a6c3b8 Olga Brani
8177 e4a6c3b8 Olga Brani
// Chain conversions given the request and the original response
8178 e4a6c3b8 Olga Brani
function ajaxConvert( s, response ) {
8179 e4a6c3b8 Olga Brani
  var conv2, current, conv, tmp,
8180 e4a6c3b8 Olga Brani
    converters = {},
8181 e4a6c3b8 Olga Brani
    i = 0,
8182 e4a6c3b8 Olga Brani
    // Work with a copy of dataTypes in case we need to modify it for conversion
8183 e4a6c3b8 Olga Brani
    dataTypes = s.dataTypes.slice(),
8184 e4a6c3b8 Olga Brani
    prev = dataTypes[ 0 ];
8185 e4a6c3b8 Olga Brani
8186 e4a6c3b8 Olga Brani
  // Apply the dataFilter if provided
8187 e4a6c3b8 Olga Brani
  if ( s.dataFilter ) {
8188 e4a6c3b8 Olga Brani
    response = s.dataFilter( response, s.dataType );
8189 e4a6c3b8 Olga Brani
  }
8190 e4a6c3b8 Olga Brani
8191 e4a6c3b8 Olga Brani
  // Create converters map with lowercased keys
8192 e4a6c3b8 Olga Brani
  if ( dataTypes[ 1 ] ) {
8193 e4a6c3b8 Olga Brani
    for ( conv in s.converters ) {
8194 e4a6c3b8 Olga Brani
      converters[ conv.toLowerCase() ] = s.converters[ conv ];
8195 e4a6c3b8 Olga Brani
    }
8196 e4a6c3b8 Olga Brani
  }
8197 e4a6c3b8 Olga Brani
8198 e4a6c3b8 Olga Brani
  // Convert to each sequential dataType, tolerating list modification
8199 e4a6c3b8 Olga Brani
  for ( ; (current = dataTypes[++i]); ) {
8200 e4a6c3b8 Olga Brani
8201 e4a6c3b8 Olga Brani
    // There's only work to do if current dataType is non-auto
8202 e4a6c3b8 Olga Brani
    if ( current !== "*" ) {
8203 e4a6c3b8 Olga Brani
8204 e4a6c3b8 Olga Brani
      // Convert response if prev dataType is non-auto and differs from current
8205 e4a6c3b8 Olga Brani
      if ( prev !== "*" && prev !== current ) {
8206 e4a6c3b8 Olga Brani
8207 e4a6c3b8 Olga Brani
        // Seek a direct converter
8208 e4a6c3b8 Olga Brani
        conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8209 e4a6c3b8 Olga Brani
8210 e4a6c3b8 Olga Brani
        // If none found, seek a pair
8211 e4a6c3b8 Olga Brani
        if ( !conv ) {
8212 e4a6c3b8 Olga Brani
          for ( conv2 in converters ) {
8213 e4a6c3b8 Olga Brani
8214 e4a6c3b8 Olga Brani
            // If conv2 outputs current
8215 e4a6c3b8 Olga Brani
            tmp = conv2.split(" ");
8216 e4a6c3b8 Olga Brani
            if ( tmp[ 1 ] === current ) {
8217 e4a6c3b8 Olga Brani
8218 e4a6c3b8 Olga Brani
              // If prev can be converted to accepted input
8219 e4a6c3b8 Olga Brani
              conv = converters[ prev + " " + tmp[ 0 ] ] ||
8220 e4a6c3b8 Olga Brani
                converters[ "* " + tmp[ 0 ] ];
8221 e4a6c3b8 Olga Brani
              if ( conv ) {
8222 e4a6c3b8 Olga Brani
                // Condense equivalence converters
8223 e4a6c3b8 Olga Brani
                if ( conv === true ) {
8224 e4a6c3b8 Olga Brani
                  conv = converters[ conv2 ];
8225 e4a6c3b8 Olga Brani
8226 e4a6c3b8 Olga Brani
                // Otherwise, insert the intermediate dataType
8227 e4a6c3b8 Olga Brani
                } else if ( converters[ conv2 ] !== true ) {
8228 e4a6c3b8 Olga Brani
                  current = tmp[ 0 ];
8229 e4a6c3b8 Olga Brani
                  dataTypes.splice( i--, 0, current );
8230 e4a6c3b8 Olga Brani
                }
8231 e4a6c3b8 Olga Brani
8232 e4a6c3b8 Olga Brani
                break;
8233 e4a6c3b8 Olga Brani
              }
8234 e4a6c3b8 Olga Brani
            }
8235 e4a6c3b8 Olga Brani
          }
8236 e4a6c3b8 Olga Brani
        }
8237 e4a6c3b8 Olga Brani
8238 e4a6c3b8 Olga Brani
        // Apply converter (if not an equivalence)
8239 e4a6c3b8 Olga Brani
        if ( conv !== true ) {
8240 e4a6c3b8 Olga Brani
8241 e4a6c3b8 Olga Brani
          // Unless errors are allowed to bubble, catch and return them
8242 e4a6c3b8 Olga Brani
          if ( conv && s["throws"] ) {
8243 e4a6c3b8 Olga Brani
            response = conv( response );
8244 e4a6c3b8 Olga Brani
          } else {
8245 e4a6c3b8 Olga Brani
            try {
8246 e4a6c3b8 Olga Brani
              response = conv( response );
8247 e4a6c3b8 Olga Brani
            } catch ( e ) {
8248 e4a6c3b8 Olga Brani
              return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
8249 e4a6c3b8 Olga Brani
            }
8250 e4a6c3b8 Olga Brani
          }
8251 e4a6c3b8 Olga Brani
        }
8252 e4a6c3b8 Olga Brani
      }
8253 e4a6c3b8 Olga Brani
8254 e4a6c3b8 Olga Brani
      // Update prev for next iteration
8255 e4a6c3b8 Olga Brani
      prev = current;
8256 e4a6c3b8 Olga Brani
    }
8257 e4a6c3b8 Olga Brani
  }
8258 e4a6c3b8 Olga Brani
8259 e4a6c3b8 Olga Brani
  return { state: "success", data: response };
8260 e4a6c3b8 Olga Brani
}
8261 e4a6c3b8 Olga Brani
// Install script dataType
8262 e4a6c3b8 Olga Brani
jQuery.ajaxSetup({
8263 e4a6c3b8 Olga Brani
  accepts: {
8264 e4a6c3b8 Olga Brani
    script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8265 e4a6c3b8 Olga Brani
  },
8266 e4a6c3b8 Olga Brani
  contents: {
8267 e4a6c3b8 Olga Brani
    script: /(?:java|ecma)script/
8268 e4a6c3b8 Olga Brani
  },
8269 e4a6c3b8 Olga Brani
  converters: {
8270 e4a6c3b8 Olga Brani
    "text script": function( text ) {
8271 e4a6c3b8 Olga Brani
      jQuery.globalEval( text );
8272 e4a6c3b8 Olga Brani
      return text;
8273 e4a6c3b8 Olga Brani
    }
8274 e4a6c3b8 Olga Brani
  }
8275 e4a6c3b8 Olga Brani
});
8276 e4a6c3b8 Olga Brani
8277 e4a6c3b8 Olga Brani
// Handle cache's special case and global
8278 e4a6c3b8 Olga Brani
jQuery.ajaxPrefilter( "script", function( s ) {
8279 e4a6c3b8 Olga Brani
  if ( s.cache === undefined ) {
8280 e4a6c3b8 Olga Brani
    s.cache = false;
8281 e4a6c3b8 Olga Brani
  }
8282 e4a6c3b8 Olga Brani
  if ( s.crossDomain ) {
8283 e4a6c3b8 Olga Brani
    s.type = "GET";
8284 e4a6c3b8 Olga Brani
    s.global = false;
8285 e4a6c3b8 Olga Brani
  }
8286 e4a6c3b8 Olga Brani
});
8287 e4a6c3b8 Olga Brani
8288 e4a6c3b8 Olga Brani
// Bind script tag hack transport
8289 e4a6c3b8 Olga Brani
jQuery.ajaxTransport( "script", function(s) {
8290 e4a6c3b8 Olga Brani
8291 e4a6c3b8 Olga Brani
  // This transport only deals with cross domain requests
8292 e4a6c3b8 Olga Brani
  if ( s.crossDomain ) {
8293 e4a6c3b8 Olga Brani
8294 e4a6c3b8 Olga Brani
    var script,
8295 e4a6c3b8 Olga Brani
      head = document.head || jQuery("head")[0] || document.documentElement;
8296 e4a6c3b8 Olga Brani
8297 e4a6c3b8 Olga Brani
    return {
8298 e4a6c3b8 Olga Brani
8299 e4a6c3b8 Olga Brani
      send: function( _, callback ) {
8300 e4a6c3b8 Olga Brani
8301 e4a6c3b8 Olga Brani
        script = document.createElement("script");
8302 e4a6c3b8 Olga Brani
8303 e4a6c3b8 Olga Brani
        script.async = true;
8304 e4a6c3b8 Olga Brani
8305 e4a6c3b8 Olga Brani
        if ( s.scriptCharset ) {
8306 e4a6c3b8 Olga Brani
          script.charset = s.scriptCharset;
8307 e4a6c3b8 Olga Brani
        }
8308 e4a6c3b8 Olga Brani
8309 e4a6c3b8 Olga Brani
        script.src = s.url;
8310 e4a6c3b8 Olga Brani
8311 e4a6c3b8 Olga Brani
        // Attach handlers for all browsers
8312 e4a6c3b8 Olga Brani
        script.onload = script.onreadystatechange = function( _, isAbort ) {
8313 e4a6c3b8 Olga Brani
8314 e4a6c3b8 Olga Brani
          if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
8315 e4a6c3b8 Olga Brani
8316 e4a6c3b8 Olga Brani
            // Handle memory leak in IE
8317 e4a6c3b8 Olga Brani
            script.onload = script.onreadystatechange = null;
8318 e4a6c3b8 Olga Brani
8319 e4a6c3b8 Olga Brani
            // Remove the script
8320 e4a6c3b8 Olga Brani
            if ( script.parentNode ) {
8321 e4a6c3b8 Olga Brani
              script.parentNode.removeChild( script );
8322 e4a6c3b8 Olga Brani
            }
8323 e4a6c3b8 Olga Brani
8324 e4a6c3b8 Olga Brani
            // Dereference the script
8325 e4a6c3b8 Olga Brani
            script = null;
8326 e4a6c3b8 Olga Brani
8327 e4a6c3b8 Olga Brani
            // Callback if not abort
8328 e4a6c3b8 Olga Brani
            if ( !isAbort ) {
8329 e4a6c3b8 Olga Brani
              callback( 200, "success" );
8330 e4a6c3b8 Olga Brani
            }
8331 e4a6c3b8 Olga Brani
          }
8332 e4a6c3b8 Olga Brani
        };
8333 e4a6c3b8 Olga Brani
8334 e4a6c3b8 Olga Brani
        // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
8335 e4a6c3b8 Olga Brani
        // Use native DOM manipulation to avoid our domManip AJAX trickery
8336 e4a6c3b8 Olga Brani
        head.insertBefore( script, head.firstChild );
8337 e4a6c3b8 Olga Brani
      },
8338 e4a6c3b8 Olga Brani
8339 e4a6c3b8 Olga Brani
      abort: function() {
8340 e4a6c3b8 Olga Brani
        if ( script ) {
8341 e4a6c3b8 Olga Brani
          script.onload( undefined, true );
8342 e4a6c3b8 Olga Brani
        }
8343 e4a6c3b8 Olga Brani
      }
8344 e4a6c3b8 Olga Brani
    };
8345 e4a6c3b8 Olga Brani
  }
8346 e4a6c3b8 Olga Brani
});
8347 e4a6c3b8 Olga Brani
var oldCallbacks = [],
8348 e4a6c3b8 Olga Brani
  rjsonp = /(=)\?(?=&|$)|\?\?/;
8349 e4a6c3b8 Olga Brani
8350 e4a6c3b8 Olga Brani
// Default jsonp settings
8351 e4a6c3b8 Olga Brani
jQuery.ajaxSetup({
8352 e4a6c3b8 Olga Brani
  jsonp: "callback",
8353 e4a6c3b8 Olga Brani
  jsonpCallback: function() {
8354 e4a6c3b8 Olga Brani
    var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
8355 e4a6c3b8 Olga Brani
    this[ callback ] = true;
8356 e4a6c3b8 Olga Brani
    return callback;
8357 e4a6c3b8 Olga Brani
  }
8358 e4a6c3b8 Olga Brani
});
8359 e4a6c3b8 Olga Brani
8360 e4a6c3b8 Olga Brani
// Detect, normalize options and install callbacks for jsonp requests
8361 e4a6c3b8 Olga Brani
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
8362 e4a6c3b8 Olga Brani
8363 e4a6c3b8 Olga Brani
  var callbackName, overwritten, responseContainer,
8364 e4a6c3b8 Olga Brani
    jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
8365 e4a6c3b8 Olga Brani
      "url" :
8366 e4a6c3b8 Olga Brani
      typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
8367 e4a6c3b8 Olga Brani
    );
8368 e4a6c3b8 Olga Brani
8369 e4a6c3b8 Olga Brani
  // Handle iff the expected data type is "jsonp" or we have a parameter to set
8370 e4a6c3b8 Olga Brani
  if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
8371 e4a6c3b8 Olga Brani
8372 e4a6c3b8 Olga Brani
    // Get callback name, remembering preexisting value associated with it
8373 e4a6c3b8 Olga Brani
    callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
8374 e4a6c3b8 Olga Brani
      s.jsonpCallback() :
8375 e4a6c3b8 Olga Brani
      s.jsonpCallback;
8376 e4a6c3b8 Olga Brani
8377 e4a6c3b8 Olga Brani
    // Insert callback into url or form data
8378 e4a6c3b8 Olga Brani
    if ( jsonProp ) {
8379 e4a6c3b8 Olga Brani
      s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
8380 e4a6c3b8 Olga Brani
    } else if ( s.jsonp !== false ) {
8381 e4a6c3b8 Olga Brani
      s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
8382 e4a6c3b8 Olga Brani
    }
8383 e4a6c3b8 Olga Brani
8384 e4a6c3b8 Olga Brani
    // Use data converter to retrieve json after script execution
8385 e4a6c3b8 Olga Brani
    s.converters["script json"] = function() {
8386 e4a6c3b8 Olga Brani
      if ( !responseContainer ) {
8387 e4a6c3b8 Olga Brani
        jQuery.error( callbackName + " was not called" );
8388 e4a6c3b8 Olga Brani
      }
8389 e4a6c3b8 Olga Brani
      return responseContainer[ 0 ];
8390 e4a6c3b8 Olga Brani
    };
8391 e4a6c3b8 Olga Brani
8392 e4a6c3b8 Olga Brani
    // force json dataType
8393 e4a6c3b8 Olga Brani
    s.dataTypes[ 0 ] = "json";
8394 e4a6c3b8 Olga Brani
8395 e4a6c3b8 Olga Brani
    // Install callback
8396 e4a6c3b8 Olga Brani
    overwritten = window[ callbackName ];
8397 e4a6c3b8 Olga Brani
    window[ callbackName ] = function() {
8398 e4a6c3b8 Olga Brani
      responseContainer = arguments;
8399 e4a6c3b8 Olga Brani
    };
8400 e4a6c3b8 Olga Brani
8401 e4a6c3b8 Olga Brani
    // Clean-up function (fires after converters)
8402 e4a6c3b8 Olga Brani
    jqXHR.always(function() {
8403 e4a6c3b8 Olga Brani
      // Restore preexisting value
8404 e4a6c3b8 Olga Brani
      window[ callbackName ] = overwritten;
8405 e4a6c3b8 Olga Brani
8406 e4a6c3b8 Olga Brani
      // Save back as free
8407 e4a6c3b8 Olga Brani
      if ( s[ callbackName ] ) {
8408 e4a6c3b8 Olga Brani
        // make sure that re-using the options doesn't screw things around
8409 e4a6c3b8 Olga Brani
        s.jsonpCallback = originalSettings.jsonpCallback;
8410 e4a6c3b8 Olga Brani
8411 e4a6c3b8 Olga Brani
        // save the callback name for future use
8412 e4a6c3b8 Olga Brani
        oldCallbacks.push( callbackName );
8413 e4a6c3b8 Olga Brani
      }
8414 e4a6c3b8 Olga Brani
8415 e4a6c3b8 Olga Brani
      // Call if it was a function and we have a response
8416 e4a6c3b8 Olga Brani
      if ( responseContainer && jQuery.isFunction( overwritten ) ) {
8417 e4a6c3b8 Olga Brani
        overwritten( responseContainer[ 0 ] );
8418 e4a6c3b8 Olga Brani
      }
8419 e4a6c3b8 Olga Brani
8420 e4a6c3b8 Olga Brani
      responseContainer = overwritten = undefined;
8421 e4a6c3b8 Olga Brani
    });
8422 e4a6c3b8 Olga Brani
8423 e4a6c3b8 Olga Brani
    // Delegate to script
8424 e4a6c3b8 Olga Brani
    return "script";
8425 e4a6c3b8 Olga Brani
  }
8426 e4a6c3b8 Olga Brani
});
8427 e4a6c3b8 Olga Brani
var xhrCallbacks, xhrSupported,
8428 e4a6c3b8 Olga Brani
  xhrId = 0,
8429 e4a6c3b8 Olga Brani
  // #5280: Internet Explorer will keep connections alive if we don't abort on unload
8430 e4a6c3b8 Olga Brani
  xhrOnUnloadAbort = window.ActiveXObject && function() {
8431 e4a6c3b8 Olga Brani
    // Abort all pending requests
8432 e4a6c3b8 Olga Brani
    var key;
8433 e4a6c3b8 Olga Brani
    for ( key in xhrCallbacks ) {
8434 e4a6c3b8 Olga Brani
      xhrCallbacks[ key ]( undefined, true );
8435 e4a6c3b8 Olga Brani
    }
8436 e4a6c3b8 Olga Brani
  };
8437 e4a6c3b8 Olga Brani
8438 e4a6c3b8 Olga Brani
// Functions to create xhrs
8439 e4a6c3b8 Olga Brani
function createStandardXHR() {
8440 e4a6c3b8 Olga Brani
  try {
8441 e4a6c3b8 Olga Brani
    return new window.XMLHttpRequest();
8442 e4a6c3b8 Olga Brani
  } catch( e ) {}
8443 e4a6c3b8 Olga Brani
}
8444 e4a6c3b8 Olga Brani
8445 e4a6c3b8 Olga Brani
function createActiveXHR() {
8446 e4a6c3b8 Olga Brani
  try {
8447 e4a6c3b8 Olga Brani
    return new window.ActiveXObject("Microsoft.XMLHTTP");
8448 e4a6c3b8 Olga Brani
  } catch( e ) {}
8449 e4a6c3b8 Olga Brani
}
8450 e4a6c3b8 Olga Brani
8451 e4a6c3b8 Olga Brani
// Create the request object
8452 e4a6c3b8 Olga Brani
// (This is still attached to ajaxSettings for backward compatibility)
8453 e4a6c3b8 Olga Brani
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
8454 e4a6c3b8 Olga Brani
  /* Microsoft failed to properly
8455 e4a6c3b8 Olga Brani
   * implement the XMLHttpRequest in IE7 (can't request local files),
8456 e4a6c3b8 Olga Brani
   * so we use the ActiveXObject when it is available
8457 e4a6c3b8 Olga Brani
   * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8458 e4a6c3b8 Olga Brani
   * we need a fallback.
8459 e4a6c3b8 Olga Brani
   */
8460 e4a6c3b8 Olga Brani
  function() {
8461 e4a6c3b8 Olga Brani
    return !this.isLocal && createStandardXHR() || createActiveXHR();
8462 e4a6c3b8 Olga Brani
  } :
8463 e4a6c3b8 Olga Brani
  // For all other browsers, use the standard XMLHttpRequest object
8464 e4a6c3b8 Olga Brani
  createStandardXHR;
8465 e4a6c3b8 Olga Brani
8466 e4a6c3b8 Olga Brani
// Determine support properties
8467 e4a6c3b8 Olga Brani
xhrSupported = jQuery.ajaxSettings.xhr();
8468 e4a6c3b8 Olga Brani
jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
8469 e4a6c3b8 Olga Brani
xhrSupported = jQuery.support.ajax = !!xhrSupported;
8470 e4a6c3b8 Olga Brani
8471 e4a6c3b8 Olga Brani
// Create transport if the browser can provide an xhr
8472 e4a6c3b8 Olga Brani
if ( xhrSupported ) {
8473 e4a6c3b8 Olga Brani
8474 e4a6c3b8 Olga Brani
  jQuery.ajaxTransport(function( s ) {
8475 e4a6c3b8 Olga Brani
    // Cross domain only allowed if supported through XMLHttpRequest
8476 e4a6c3b8 Olga Brani
    if ( !s.crossDomain || jQuery.support.cors ) {
8477 e4a6c3b8 Olga Brani
8478 e4a6c3b8 Olga Brani
      var callback;
8479 e4a6c3b8 Olga Brani
8480 e4a6c3b8 Olga Brani
      return {
8481 e4a6c3b8 Olga Brani
        send: function( headers, complete ) {
8482 e4a6c3b8 Olga Brani
8483 e4a6c3b8 Olga Brani
          // Get a new xhr
8484 e4a6c3b8 Olga Brani
          var handle, i,
8485 e4a6c3b8 Olga Brani
            xhr = s.xhr();
8486 e4a6c3b8 Olga Brani
8487 e4a6c3b8 Olga Brani
          // Open the socket
8488 e4a6c3b8 Olga Brani
          // Passing null username, generates a login popup on Opera (#2865)
8489 e4a6c3b8 Olga Brani
          if ( s.username ) {
8490 e4a6c3b8 Olga Brani
            xhr.open( s.type, s.url, s.async, s.username, s.password );
8491 e4a6c3b8 Olga Brani
          } else {
8492 e4a6c3b8 Olga Brani
            xhr.open( s.type, s.url, s.async );
8493 e4a6c3b8 Olga Brani
          }
8494 e4a6c3b8 Olga Brani
8495 e4a6c3b8 Olga Brani
          // Apply custom fields if provided
8496 e4a6c3b8 Olga Brani
          if ( s.xhrFields ) {
8497 e4a6c3b8 Olga Brani
            for ( i in s.xhrFields ) {
8498 e4a6c3b8 Olga Brani
              xhr[ i ] = s.xhrFields[ i ];
8499 e4a6c3b8 Olga Brani
            }
8500 e4a6c3b8 Olga Brani
          }
8501 e4a6c3b8 Olga Brani
8502 e4a6c3b8 Olga Brani
          // Override mime type if needed
8503 e4a6c3b8 Olga Brani
          if ( s.mimeType && xhr.overrideMimeType ) {
8504 e4a6c3b8 Olga Brani
            xhr.overrideMimeType( s.mimeType );
8505 e4a6c3b8 Olga Brani
          }
8506 e4a6c3b8 Olga Brani
8507 e4a6c3b8 Olga Brani
          // X-Requested-With header
8508 e4a6c3b8 Olga Brani
          // For cross-domain requests, seeing as conditions for a preflight are
8509 e4a6c3b8 Olga Brani
          // akin to a jigsaw puzzle, we simply never set it to be sure.
8510 e4a6c3b8 Olga Brani
          // (it can always be set on a per-request basis or even using ajaxSetup)
8511 e4a6c3b8 Olga Brani
          // For same-domain requests, won't change header if already provided.
8512 e4a6c3b8 Olga Brani
          if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8513 e4a6c3b8 Olga Brani
            headers["X-Requested-With"] = "XMLHttpRequest";
8514 e4a6c3b8 Olga Brani
          }
8515 e4a6c3b8 Olga Brani
8516 e4a6c3b8 Olga Brani
          // Need an extra try/catch for cross domain requests in Firefox 3
8517 e4a6c3b8 Olga Brani
          try {
8518 e4a6c3b8 Olga Brani
            for ( i in headers ) {
8519 e4a6c3b8 Olga Brani
              xhr.setRequestHeader( i, headers[ i ] );
8520 e4a6c3b8 Olga Brani
            }
8521 e4a6c3b8 Olga Brani
          } catch( err ) {}
8522 e4a6c3b8 Olga Brani
8523 e4a6c3b8 Olga Brani
          // Do send the request
8524 e4a6c3b8 Olga Brani
          // This may raise an exception which is actually
8525 e4a6c3b8 Olga Brani
          // handled in jQuery.ajax (so no try/catch here)
8526 e4a6c3b8 Olga Brani
          xhr.send( ( s.hasContent && s.data ) || null );
8527 e4a6c3b8 Olga Brani
8528 e4a6c3b8 Olga Brani
          // Listener
8529 e4a6c3b8 Olga Brani
          callback = function( _, isAbort ) {
8530 e4a6c3b8 Olga Brani
            var status, responseHeaders, statusText, responses;
8531 e4a6c3b8 Olga Brani
8532 e4a6c3b8 Olga Brani
            // Firefox throws exceptions when accessing properties
8533 e4a6c3b8 Olga Brani
            // of an xhr when a network error occurred
8534 e4a6c3b8 Olga Brani
            // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8535 e4a6c3b8 Olga Brani
            try {
8536 e4a6c3b8 Olga Brani
8537 e4a6c3b8 Olga Brani
              // Was never called and is aborted or complete
8538 e4a6c3b8 Olga Brani
              if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8539 e4a6c3b8 Olga Brani
8540 e4a6c3b8 Olga Brani
                // Only called once
8541 e4a6c3b8 Olga Brani
                callback = undefined;
8542 e4a6c3b8 Olga Brani
8543 e4a6c3b8 Olga Brani
                // Do not keep as active anymore
8544 e4a6c3b8 Olga Brani
                if ( handle ) {
8545 e4a6c3b8 Olga Brani
                  xhr.onreadystatechange = jQuery.noop;
8546 e4a6c3b8 Olga Brani
                  if ( xhrOnUnloadAbort ) {
8547 e4a6c3b8 Olga Brani
                    delete xhrCallbacks[ handle ];
8548 e4a6c3b8 Olga Brani
                  }
8549 e4a6c3b8 Olga Brani
                }
8550 e4a6c3b8 Olga Brani
8551 e4a6c3b8 Olga Brani
                // If it's an abort
8552 e4a6c3b8 Olga Brani
                if ( isAbort ) {
8553 e4a6c3b8 Olga Brani
                  // Abort it manually if needed
8554 e4a6c3b8 Olga Brani
                  if ( xhr.readyState !== 4 ) {
8555 e4a6c3b8 Olga Brani
                    xhr.abort();
8556 e4a6c3b8 Olga Brani
                  }
8557 e4a6c3b8 Olga Brani
                } else {
8558 e4a6c3b8 Olga Brani
                  responses = {};
8559 e4a6c3b8 Olga Brani
                  status = xhr.status;
8560 e4a6c3b8 Olga Brani
                  responseHeaders = xhr.getAllResponseHeaders();
8561 e4a6c3b8 Olga Brani
8562 e4a6c3b8 Olga Brani
                  // When requesting binary data, IE6-9 will throw an exception
8563 e4a6c3b8 Olga Brani
                  // on any attempt to access responseText (#11426)
8564 e4a6c3b8 Olga Brani
                  if ( typeof xhr.responseText === "string" ) {
8565 e4a6c3b8 Olga Brani
                    responses.text = xhr.responseText;
8566 e4a6c3b8 Olga Brani
                  }
8567 e4a6c3b8 Olga Brani
8568 e4a6c3b8 Olga Brani
                  // Firefox throws an exception when accessing
8569 e4a6c3b8 Olga Brani
                  // statusText for faulty cross-domain requests
8570 e4a6c3b8 Olga Brani
                  try {
8571 e4a6c3b8 Olga Brani
                    statusText = xhr.statusText;
8572 e4a6c3b8 Olga Brani
                  } catch( e ) {
8573 e4a6c3b8 Olga Brani
                    // We normalize with Webkit giving an empty statusText
8574 e4a6c3b8 Olga Brani
                    statusText = "";
8575 e4a6c3b8 Olga Brani
                  }
8576 e4a6c3b8 Olga Brani
8577 e4a6c3b8 Olga Brani
                  // Filter status for non standard behaviors
8578 e4a6c3b8 Olga Brani
8579 e4a6c3b8 Olga Brani
                  // If the request is local and we have data: assume a success
8580 e4a6c3b8 Olga Brani
                  // (success with no data won't get notified, that's the best we
8581 e4a6c3b8 Olga Brani
                  // can do given current implementations)
8582 e4a6c3b8 Olga Brani
                  if ( !status && s.isLocal && !s.crossDomain ) {
8583 e4a6c3b8 Olga Brani
                    status = responses.text ? 200 : 404;
8584 e4a6c3b8 Olga Brani
                  // IE - #1450: sometimes returns 1223 when it should be 204
8585 e4a6c3b8 Olga Brani
                  } else if ( status === 1223 ) {
8586 e4a6c3b8 Olga Brani
                    status = 204;
8587 e4a6c3b8 Olga Brani
                  }
8588 e4a6c3b8 Olga Brani
                }
8589 e4a6c3b8 Olga Brani
              }
8590 e4a6c3b8 Olga Brani
            } catch( firefoxAccessException ) {
8591 e4a6c3b8 Olga Brani
              if ( !isAbort ) {
8592 e4a6c3b8 Olga Brani
                complete( -1, firefoxAccessException );
8593 e4a6c3b8 Olga Brani
              }
8594 e4a6c3b8 Olga Brani
            }
8595 e4a6c3b8 Olga Brani
8596 e4a6c3b8 Olga Brani
            // Call complete if needed
8597 e4a6c3b8 Olga Brani
            if ( responses ) {
8598 e4a6c3b8 Olga Brani
              complete( status, statusText, responses, responseHeaders );
8599 e4a6c3b8 Olga Brani
            }
8600 e4a6c3b8 Olga Brani
          };
8601 e4a6c3b8 Olga Brani
8602 e4a6c3b8 Olga Brani
          if ( !s.async ) {
8603 e4a6c3b8 Olga Brani
            // if we're in sync mode we fire the callback
8604 e4a6c3b8 Olga Brani
            callback();
8605 e4a6c3b8 Olga Brani
          } else if ( xhr.readyState === 4 ) {
8606 e4a6c3b8 Olga Brani
            // (IE6 & IE7) if it's in cache and has been
8607 e4a6c3b8 Olga Brani
            // retrieved directly we need to fire the callback
8608 e4a6c3b8 Olga Brani
            setTimeout( callback );
8609 e4a6c3b8 Olga Brani
          } else {
8610 e4a6c3b8 Olga Brani
            handle = ++xhrId;
8611 e4a6c3b8 Olga Brani
            if ( xhrOnUnloadAbort ) {
8612 e4a6c3b8 Olga Brani
              // Create the active xhrs callbacks list if needed
8613 e4a6c3b8 Olga Brani
              // and attach the unload handler
8614 e4a6c3b8 Olga Brani
              if ( !xhrCallbacks ) {
8615 e4a6c3b8 Olga Brani
                xhrCallbacks = {};
8616 e4a6c3b8 Olga Brani
                jQuery( window ).unload( xhrOnUnloadAbort );
8617 e4a6c3b8 Olga Brani
              }
8618 e4a6c3b8 Olga Brani
              // Add to list of active xhrs callbacks
8619 e4a6c3b8 Olga Brani
              xhrCallbacks[ handle ] = callback;
8620 e4a6c3b8 Olga Brani
            }
8621 e4a6c3b8 Olga Brani
            xhr.onreadystatechange = callback;
8622 e4a6c3b8 Olga Brani
          }
8623 e4a6c3b8 Olga Brani
        },
8624 e4a6c3b8 Olga Brani
8625 e4a6c3b8 Olga Brani
        abort: function() {
8626 e4a6c3b8 Olga Brani
          if ( callback ) {
8627 e4a6c3b8 Olga Brani
            callback( undefined, true );
8628 e4a6c3b8 Olga Brani
          }
8629 e4a6c3b8 Olga Brani
        }
8630 e4a6c3b8 Olga Brani
      };
8631 e4a6c3b8 Olga Brani
    }
8632 e4a6c3b8 Olga Brani
  });
8633 e4a6c3b8 Olga Brani
}
8634 e4a6c3b8 Olga Brani
var fxNow, timerId,
8635 e4a6c3b8 Olga Brani
  rfxtypes = /^(?:toggle|show|hide)$/,
8636 e4a6c3b8 Olga Brani
  rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
8637 e4a6c3b8 Olga Brani
  rrun = /queueHooks$/,
8638 e4a6c3b8 Olga Brani
  animationPrefilters = [ defaultPrefilter ],
8639 e4a6c3b8 Olga Brani
  tweeners = {
8640 e4a6c3b8 Olga Brani
    "*": [function( prop, value ) {
8641 e4a6c3b8 Olga Brani
      var end, unit,
8642 e4a6c3b8 Olga Brani
        tween = this.createTween( prop, value ),
8643 e4a6c3b8 Olga Brani
        parts = rfxnum.exec( value ),
8644 e4a6c3b8 Olga Brani
        target = tween.cur(),
8645 e4a6c3b8 Olga Brani
        start = +target || 0,
8646 e4a6c3b8 Olga Brani
        scale = 1,
8647 e4a6c3b8 Olga Brani
        maxIterations = 20;
8648 e4a6c3b8 Olga Brani
8649 e4a6c3b8 Olga Brani
      if ( parts ) {
8650 e4a6c3b8 Olga Brani
        end = +parts[2];
8651 e4a6c3b8 Olga Brani
        unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
8652 e4a6c3b8 Olga Brani
8653 e4a6c3b8 Olga Brani
        // We need to compute starting value
8654 e4a6c3b8 Olga Brani
        if ( unit !== "px" && start ) {
8655 e4a6c3b8 Olga Brani
          // Iteratively approximate from a nonzero starting point
8656 e4a6c3b8 Olga Brani
          // Prefer the current property, because this process will be trivial if it uses the same units
8657 e4a6c3b8 Olga Brani
          // Fallback to end or a simple constant
8658 e4a6c3b8 Olga Brani
          start = jQuery.css( tween.elem, prop, true ) || end || 1;
8659 e4a6c3b8 Olga Brani
8660 e4a6c3b8 Olga Brani
          do {
8661 e4a6c3b8 Olga Brani
            // If previous iteration zeroed out, double until we get *something*
8662 e4a6c3b8 Olga Brani
            // Use a string for doubling factor so we don't accidentally see scale as unchanged below
8663 e4a6c3b8 Olga Brani
            scale = scale || ".5";
8664 e4a6c3b8 Olga Brani
8665 e4a6c3b8 Olga Brani
            // Adjust and apply
8666 e4a6c3b8 Olga Brani
            start = start / scale;
8667 e4a6c3b8 Olga Brani
            jQuery.style( tween.elem, prop, start + unit );
8668 e4a6c3b8 Olga Brani
8669 e4a6c3b8 Olga Brani
          // Update scale, tolerating zero or NaN from tween.cur()
8670 e4a6c3b8 Olga Brani
          // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
8671 e4a6c3b8 Olga Brani
          } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
8672 e4a6c3b8 Olga Brani
        }
8673 e4a6c3b8 Olga Brani
8674 e4a6c3b8 Olga Brani
        tween.unit = unit;
8675 e4a6c3b8 Olga Brani
        tween.start = start;
8676 e4a6c3b8 Olga Brani
        // If a +=/-= token was provided, we're doing a relative animation
8677 e4a6c3b8 Olga Brani
        tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
8678 e4a6c3b8 Olga Brani
      }
8679 e4a6c3b8 Olga Brani
      return tween;
8680 e4a6c3b8 Olga Brani
    }]
8681 e4a6c3b8 Olga Brani
  };
8682 e4a6c3b8 Olga Brani
8683 e4a6c3b8 Olga Brani
// Animations created synchronously will run synchronously
8684 e4a6c3b8 Olga Brani
function createFxNow() {
8685 e4a6c3b8 Olga Brani
  setTimeout(function() {
8686 e4a6c3b8 Olga Brani
    fxNow = undefined;
8687 e4a6c3b8 Olga Brani
  });
8688 e4a6c3b8 Olga Brani
  return ( fxNow = jQuery.now() );
8689 e4a6c3b8 Olga Brani
}
8690 e4a6c3b8 Olga Brani
8691 e4a6c3b8 Olga Brani
function createTweens( animation, props ) {
8692 e4a6c3b8 Olga Brani
  jQuery.each( props, function( prop, value ) {
8693 e4a6c3b8 Olga Brani
    var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
8694 e4a6c3b8 Olga Brani
      index = 0,
8695 e4a6c3b8 Olga Brani
      length = collection.length;
8696 e4a6c3b8 Olga Brani
    for ( ; index < length; index++ ) {
8697 e4a6c3b8 Olga Brani
      if ( collection[ index ].call( animation, prop, value ) ) {
8698 e4a6c3b8 Olga Brani
8699 e4a6c3b8 Olga Brani
        // we're done with this property
8700 e4a6c3b8 Olga Brani
        return;
8701 e4a6c3b8 Olga Brani
      }
8702 e4a6c3b8 Olga Brani
    }
8703 e4a6c3b8 Olga Brani
  });
8704 e4a6c3b8 Olga Brani
}
8705 e4a6c3b8 Olga Brani
8706 e4a6c3b8 Olga Brani
function Animation( elem, properties, options ) {
8707 e4a6c3b8 Olga Brani
  var result,
8708 e4a6c3b8 Olga Brani
    stopped,
8709 e4a6c3b8 Olga Brani
    index = 0,
8710 e4a6c3b8 Olga Brani
    length = animationPrefilters.length,
8711 e4a6c3b8 Olga Brani
    deferred = jQuery.Deferred().always( function() {
8712 e4a6c3b8 Olga Brani
      // don't match elem in the :animated selector
8713 e4a6c3b8 Olga Brani
      delete tick.elem;
8714 e4a6c3b8 Olga Brani
    }),
8715 e4a6c3b8 Olga Brani
    tick = function() {
8716 e4a6c3b8 Olga Brani
      if ( stopped ) {
8717 e4a6c3b8 Olga Brani
        return false;
8718 e4a6c3b8 Olga Brani
      }
8719 e4a6c3b8 Olga Brani
      var currentTime = fxNow || createFxNow(),
8720 e4a6c3b8 Olga Brani
        remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
8721 e4a6c3b8 Olga Brani
        // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
8722 e4a6c3b8 Olga Brani
        temp = remaining / animation.duration || 0,
8723 e4a6c3b8 Olga Brani
        percent = 1 - temp,
8724 e4a6c3b8 Olga Brani
        index = 0,
8725 e4a6c3b8 Olga Brani
        length = animation.tweens.length;
8726 e4a6c3b8 Olga Brani
8727 e4a6c3b8 Olga Brani
      for ( ; index < length ; index++ ) {
8728 e4a6c3b8 Olga Brani
        animation.tweens[ index ].run( percent );
8729 e4a6c3b8 Olga Brani
      }
8730 e4a6c3b8 Olga Brani
8731 e4a6c3b8 Olga Brani
      deferred.notifyWith( elem, [ animation, percent, remaining ]);
8732 e4a6c3b8 Olga Brani
8733 e4a6c3b8 Olga Brani
      if ( percent < 1 && length ) {
8734 e4a6c3b8 Olga Brani
        return remaining;
8735 e4a6c3b8 Olga Brani
      } else {
8736 e4a6c3b8 Olga Brani
        deferred.resolveWith( elem, [ animation ] );
8737 e4a6c3b8 Olga Brani
        return false;
8738 e4a6c3b8 Olga Brani
      }
8739 e4a6c3b8 Olga Brani
    },
8740 e4a6c3b8 Olga Brani
    animation = deferred.promise({
8741 e4a6c3b8 Olga Brani
      elem: elem,
8742 e4a6c3b8 Olga Brani
      props: jQuery.extend( {}, properties ),
8743 e4a6c3b8 Olga Brani
      opts: jQuery.extend( true, { specialEasing: {} }, options ),
8744 e4a6c3b8 Olga Brani
      originalProperties: properties,
8745 e4a6c3b8 Olga Brani
      originalOptions: options,
8746 e4a6c3b8 Olga Brani
      startTime: fxNow || createFxNow(),
8747 e4a6c3b8 Olga Brani
      duration: options.duration,
8748 e4a6c3b8 Olga Brani
      tweens: [],
8749 e4a6c3b8 Olga Brani
      createTween: function( prop, end ) {
8750 e4a6c3b8 Olga Brani
        var tween = jQuery.Tween( elem, animation.opts, prop, end,
8751 e4a6c3b8 Olga Brani
            animation.opts.specialEasing[ prop ] || animation.opts.easing );
8752 e4a6c3b8 Olga Brani
        animation.tweens.push( tween );
8753 e4a6c3b8 Olga Brani
        return tween;
8754 e4a6c3b8 Olga Brani
      },
8755 e4a6c3b8 Olga Brani
      stop: function( gotoEnd ) {
8756 e4a6c3b8 Olga Brani
        var index = 0,
8757 e4a6c3b8 Olga Brani
          // if we are going to the end, we want to run all the tweens
8758 e4a6c3b8 Olga Brani
          // otherwise we skip this part
8759 e4a6c3b8 Olga Brani
          length = gotoEnd ? animation.tweens.length : 0;
8760 e4a6c3b8 Olga Brani
        if ( stopped ) {
8761 e4a6c3b8 Olga Brani
          return this;
8762 e4a6c3b8 Olga Brani
        }
8763 e4a6c3b8 Olga Brani
        stopped = true;
8764 e4a6c3b8 Olga Brani
        for ( ; index < length ; index++ ) {
8765 e4a6c3b8 Olga Brani
          animation.tweens[ index ].run( 1 );
8766 e4a6c3b8 Olga Brani
        }
8767 e4a6c3b8 Olga Brani
8768 e4a6c3b8 Olga Brani
        // resolve when we played the last frame
8769 e4a6c3b8 Olga Brani
        // otherwise, reject
8770 e4a6c3b8 Olga Brani
        if ( gotoEnd ) {
8771 e4a6c3b8 Olga Brani
          deferred.resolveWith( elem, [ animation, gotoEnd ] );
8772 e4a6c3b8 Olga Brani
        } else {
8773 e4a6c3b8 Olga Brani
          deferred.rejectWith( elem, [ animation, gotoEnd ] );
8774 e4a6c3b8 Olga Brani
        }
8775 e4a6c3b8 Olga Brani
        return this;
8776 e4a6c3b8 Olga Brani
      }
8777 e4a6c3b8 Olga Brani
    }),
8778 e4a6c3b8 Olga Brani
    props = animation.props;
8779 e4a6c3b8 Olga Brani
8780 e4a6c3b8 Olga Brani
  propFilter( props, animation.opts.specialEasing );
8781 e4a6c3b8 Olga Brani
8782 e4a6c3b8 Olga Brani
  for ( ; index < length ; index++ ) {
8783 e4a6c3b8 Olga Brani
    result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
8784 e4a6c3b8 Olga Brani
    if ( result ) {
8785 e4a6c3b8 Olga Brani
      return result;
8786 e4a6c3b8 Olga Brani
    }
8787 e4a6c3b8 Olga Brani
  }
8788 e4a6c3b8 Olga Brani
8789 e4a6c3b8 Olga Brani
  createTweens( animation, props );
8790 e4a6c3b8 Olga Brani
8791 e4a6c3b8 Olga Brani
  if ( jQuery.isFunction( animation.opts.start ) ) {
8792 e4a6c3b8 Olga Brani
    animation.opts.start.call( elem, animation );
8793 e4a6c3b8 Olga Brani
  }
8794 e4a6c3b8 Olga Brani
8795 e4a6c3b8 Olga Brani
  jQuery.fx.timer(
8796 e4a6c3b8 Olga Brani
    jQuery.extend( tick, {
8797 e4a6c3b8 Olga Brani
      elem: elem,
8798 e4a6c3b8 Olga Brani
      anim: animation,
8799 e4a6c3b8 Olga Brani
      queue: animation.opts.queue
8800 e4a6c3b8 Olga Brani
    })
8801 e4a6c3b8 Olga Brani
  );
8802 e4a6c3b8 Olga Brani
8803 e4a6c3b8 Olga Brani
  // attach callbacks from options
8804 e4a6c3b8 Olga Brani
  return animation.progress( animation.opts.progress )
8805 e4a6c3b8 Olga Brani
    .done( animation.opts.done, animation.opts.complete )
8806 e4a6c3b8 Olga Brani
    .fail( animation.opts.fail )
8807 e4a6c3b8 Olga Brani
    .always( animation.opts.always );
8808 e4a6c3b8 Olga Brani
}
8809 e4a6c3b8 Olga Brani
8810 e4a6c3b8 Olga Brani
function propFilter( props, specialEasing ) {
8811 e4a6c3b8 Olga Brani
  var value, name, index, easing, hooks;
8812 e4a6c3b8 Olga Brani
8813 e4a6c3b8 Olga Brani
  // camelCase, specialEasing and expand cssHook pass
8814 e4a6c3b8 Olga Brani
  for ( index in props ) {
8815 e4a6c3b8 Olga Brani
    name = jQuery.camelCase( index );
8816 e4a6c3b8 Olga Brani
    easing = specialEasing[ name ];
8817 e4a6c3b8 Olga Brani
    value = props[ index ];
8818 e4a6c3b8 Olga Brani
    if ( jQuery.isArray( value ) ) {
8819 e4a6c3b8 Olga Brani
      easing = value[ 1 ];
8820 e4a6c3b8 Olga Brani
      value = props[ index ] = value[ 0 ];
8821 e4a6c3b8 Olga Brani
    }
8822 e4a6c3b8 Olga Brani
8823 e4a6c3b8 Olga Brani
    if ( index !== name ) {
8824 e4a6c3b8 Olga Brani
      props[ name ] = value;
8825 e4a6c3b8 Olga Brani
      delete props[ index ];
8826 e4a6c3b8 Olga Brani
    }
8827 e4a6c3b8 Olga Brani
8828 e4a6c3b8 Olga Brani
    hooks = jQuery.cssHooks[ name ];
8829 e4a6c3b8 Olga Brani
    if ( hooks && "expand" in hooks ) {
8830 e4a6c3b8 Olga Brani
      value = hooks.expand( value );
8831 e4a6c3b8 Olga Brani
      delete props[ name ];
8832 e4a6c3b8 Olga Brani
8833 e4a6c3b8 Olga Brani
      // not quite $.extend, this wont overwrite keys already present.
8834 e4a6c3b8 Olga Brani
      // also - reusing 'index' from above because we have the correct "name"
8835 e4a6c3b8 Olga Brani
      for ( index in value ) {
8836 e4a6c3b8 Olga Brani
        if ( !( index in props ) ) {
8837 e4a6c3b8 Olga Brani
          props[ index ] = value[ index ];
8838 e4a6c3b8 Olga Brani
          specialEasing[ index ] = easing;
8839 e4a6c3b8 Olga Brani
        }
8840 e4a6c3b8 Olga Brani
      }
8841 e4a6c3b8 Olga Brani
    } else {
8842 e4a6c3b8 Olga Brani
      specialEasing[ name ] = easing;
8843 e4a6c3b8 Olga Brani
    }
8844 e4a6c3b8 Olga Brani
  }
8845 e4a6c3b8 Olga Brani
}
8846 e4a6c3b8 Olga Brani
8847 e4a6c3b8 Olga Brani
jQuery.Animation = jQuery.extend( Animation, {
8848 e4a6c3b8 Olga Brani
8849 e4a6c3b8 Olga Brani
  tweener: function( props, callback ) {
8850 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( props ) ) {
8851 e4a6c3b8 Olga Brani
      callback = props;
8852 e4a6c3b8 Olga Brani
      props = [ "*" ];
8853 e4a6c3b8 Olga Brani
    } else {
8854 e4a6c3b8 Olga Brani
      props = props.split(" ");
8855 e4a6c3b8 Olga Brani
    }
8856 e4a6c3b8 Olga Brani
8857 e4a6c3b8 Olga Brani
    var prop,
8858 e4a6c3b8 Olga Brani
      index = 0,
8859 e4a6c3b8 Olga Brani
      length = props.length;
8860 e4a6c3b8 Olga Brani
8861 e4a6c3b8 Olga Brani
    for ( ; index < length ; index++ ) {
8862 e4a6c3b8 Olga Brani
      prop = props[ index ];
8863 e4a6c3b8 Olga Brani
      tweeners[ prop ] = tweeners[ prop ] || [];
8864 e4a6c3b8 Olga Brani
      tweeners[ prop ].unshift( callback );
8865 e4a6c3b8 Olga Brani
    }
8866 e4a6c3b8 Olga Brani
  },
8867 e4a6c3b8 Olga Brani
8868 e4a6c3b8 Olga Brani
  prefilter: function( callback, prepend ) {
8869 e4a6c3b8 Olga Brani
    if ( prepend ) {
8870 e4a6c3b8 Olga Brani
      animationPrefilters.unshift( callback );
8871 e4a6c3b8 Olga Brani
    } else {
8872 e4a6c3b8 Olga Brani
      animationPrefilters.push( callback );
8873 e4a6c3b8 Olga Brani
    }
8874 e4a6c3b8 Olga Brani
  }
8875 e4a6c3b8 Olga Brani
});
8876 e4a6c3b8 Olga Brani
8877 e4a6c3b8 Olga Brani
function defaultPrefilter( elem, props, opts ) {
8878 e4a6c3b8 Olga Brani
  /*jshint validthis:true */
8879 e4a6c3b8 Olga Brani
  var prop, index, length,
8880 e4a6c3b8 Olga Brani
    value, dataShow, toggle,
8881 e4a6c3b8 Olga Brani
    tween, hooks, oldfire,
8882 e4a6c3b8 Olga Brani
    anim = this,
8883 e4a6c3b8 Olga Brani
    style = elem.style,
8884 e4a6c3b8 Olga Brani
    orig = {},
8885 e4a6c3b8 Olga Brani
    handled = [],
8886 e4a6c3b8 Olga Brani
    hidden = elem.nodeType && isHidden( elem );
8887 e4a6c3b8 Olga Brani
8888 e4a6c3b8 Olga Brani
  // handle queue: false promises
8889 e4a6c3b8 Olga Brani
  if ( !opts.queue ) {
8890 e4a6c3b8 Olga Brani
    hooks = jQuery._queueHooks( elem, "fx" );
8891 e4a6c3b8 Olga Brani
    if ( hooks.unqueued == null ) {
8892 e4a6c3b8 Olga Brani
      hooks.unqueued = 0;
8893 e4a6c3b8 Olga Brani
      oldfire = hooks.empty.fire;
8894 e4a6c3b8 Olga Brani
      hooks.empty.fire = function() {
8895 e4a6c3b8 Olga Brani
        if ( !hooks.unqueued ) {
8896 e4a6c3b8 Olga Brani
          oldfire();
8897 e4a6c3b8 Olga Brani
        }
8898 e4a6c3b8 Olga Brani
      };
8899 e4a6c3b8 Olga Brani
    }
8900 e4a6c3b8 Olga Brani
    hooks.unqueued++;
8901 e4a6c3b8 Olga Brani
8902 e4a6c3b8 Olga Brani
    anim.always(function() {
8903 e4a6c3b8 Olga Brani
      // doing this makes sure that the complete handler will be called
8904 e4a6c3b8 Olga Brani
      // before this completes
8905 e4a6c3b8 Olga Brani
      anim.always(function() {
8906 e4a6c3b8 Olga Brani
        hooks.unqueued--;
8907 e4a6c3b8 Olga Brani
        if ( !jQuery.queue( elem, "fx" ).length ) {
8908 e4a6c3b8 Olga Brani
          hooks.empty.fire();
8909 e4a6c3b8 Olga Brani
        }
8910 e4a6c3b8 Olga Brani
      });
8911 e4a6c3b8 Olga Brani
    });
8912 e4a6c3b8 Olga Brani
  }
8913 e4a6c3b8 Olga Brani
8914 e4a6c3b8 Olga Brani
  // height/width overflow pass
8915 e4a6c3b8 Olga Brani
  if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
8916 e4a6c3b8 Olga Brani
    // Make sure that nothing sneaks out
8917 e4a6c3b8 Olga Brani
    // Record all 3 overflow attributes because IE does not
8918 e4a6c3b8 Olga Brani
    // change the overflow attribute when overflowX and
8919 e4a6c3b8 Olga Brani
    // overflowY are set to the same value
8920 e4a6c3b8 Olga Brani
    opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
8921 e4a6c3b8 Olga Brani
8922 e4a6c3b8 Olga Brani
    // Set display property to inline-block for height/width
8923 e4a6c3b8 Olga Brani
    // animations on inline elements that are having width/height animated
8924 e4a6c3b8 Olga Brani
    if ( jQuery.css( elem, "display" ) === "inline" &&
8925 e4a6c3b8 Olga Brani
        jQuery.css( elem, "float" ) === "none" ) {
8926 e4a6c3b8 Olga Brani
8927 e4a6c3b8 Olga Brani
      // inline-level elements accept inline-block;
8928 e4a6c3b8 Olga Brani
      // block-level elements need to be inline with layout
8929 e4a6c3b8 Olga Brani
      if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
8930 e4a6c3b8 Olga Brani
        style.display = "inline-block";
8931 e4a6c3b8 Olga Brani
8932 e4a6c3b8 Olga Brani
      } else {
8933 e4a6c3b8 Olga Brani
        style.zoom = 1;
8934 e4a6c3b8 Olga Brani
      }
8935 e4a6c3b8 Olga Brani
    }
8936 e4a6c3b8 Olga Brani
  }
8937 e4a6c3b8 Olga Brani
8938 e4a6c3b8 Olga Brani
  if ( opts.overflow ) {
8939 e4a6c3b8 Olga Brani
    style.overflow = "hidden";
8940 e4a6c3b8 Olga Brani
    if ( !jQuery.support.shrinkWrapBlocks ) {
8941 e4a6c3b8 Olga Brani
      anim.always(function() {
8942 e4a6c3b8 Olga Brani
        style.overflow = opts.overflow[ 0 ];
8943 e4a6c3b8 Olga Brani
        style.overflowX = opts.overflow[ 1 ];
8944 e4a6c3b8 Olga Brani
        style.overflowY = opts.overflow[ 2 ];
8945 e4a6c3b8 Olga Brani
      });
8946 e4a6c3b8 Olga Brani
    }
8947 e4a6c3b8 Olga Brani
  }
8948 e4a6c3b8 Olga Brani
8949 e4a6c3b8 Olga Brani
8950 e4a6c3b8 Olga Brani
  // show/hide pass
8951 e4a6c3b8 Olga Brani
  for ( index in props ) {
8952 e4a6c3b8 Olga Brani
    value = props[ index ];
8953 e4a6c3b8 Olga Brani
    if ( rfxtypes.exec( value ) ) {
8954 e4a6c3b8 Olga Brani
      delete props[ index ];
8955 e4a6c3b8 Olga Brani
      toggle = toggle || value === "toggle";
8956 e4a6c3b8 Olga Brani
      if ( value === ( hidden ? "hide" : "show" ) ) {
8957 e4a6c3b8 Olga Brani
        continue;
8958 e4a6c3b8 Olga Brani
      }
8959 e4a6c3b8 Olga Brani
      handled.push( index );
8960 e4a6c3b8 Olga Brani
    }
8961 e4a6c3b8 Olga Brani
  }
8962 e4a6c3b8 Olga Brani
8963 e4a6c3b8 Olga Brani
  length = handled.length;
8964 e4a6c3b8 Olga Brani
  if ( length ) {
8965 e4a6c3b8 Olga Brani
    dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
8966 e4a6c3b8 Olga Brani
    if ( "hidden" in dataShow ) {
8967 e4a6c3b8 Olga Brani
      hidden = dataShow.hidden;
8968 e4a6c3b8 Olga Brani
    }
8969 e4a6c3b8 Olga Brani
8970 e4a6c3b8 Olga Brani
    // store state if its toggle - enables .stop().toggle() to "reverse"
8971 e4a6c3b8 Olga Brani
    if ( toggle ) {
8972 e4a6c3b8 Olga Brani
      dataShow.hidden = !hidden;
8973 e4a6c3b8 Olga Brani
    }
8974 e4a6c3b8 Olga Brani
    if ( hidden ) {
8975 e4a6c3b8 Olga Brani
      jQuery( elem ).show();
8976 e4a6c3b8 Olga Brani
    } else {
8977 e4a6c3b8 Olga Brani
      anim.done(function() {
8978 e4a6c3b8 Olga Brani
        jQuery( elem ).hide();
8979 e4a6c3b8 Olga Brani
      });
8980 e4a6c3b8 Olga Brani
    }
8981 e4a6c3b8 Olga Brani
    anim.done(function() {
8982 e4a6c3b8 Olga Brani
      var prop;
8983 e4a6c3b8 Olga Brani
      jQuery._removeData( elem, "fxshow" );
8984 e4a6c3b8 Olga Brani
      for ( prop in orig ) {
8985 e4a6c3b8 Olga Brani
        jQuery.style( elem, prop, orig[ prop ] );
8986 e4a6c3b8 Olga Brani
      }
8987 e4a6c3b8 Olga Brani
    });
8988 e4a6c3b8 Olga Brani
    for ( index = 0 ; index < length ; index++ ) {
8989 e4a6c3b8 Olga Brani
      prop = handled[ index ];
8990 e4a6c3b8 Olga Brani
      tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
8991 e4a6c3b8 Olga Brani
      orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
8992 e4a6c3b8 Olga Brani
8993 e4a6c3b8 Olga Brani
      if ( !( prop in dataShow ) ) {
8994 e4a6c3b8 Olga Brani
        dataShow[ prop ] = tween.start;
8995 e4a6c3b8 Olga Brani
        if ( hidden ) {
8996 e4a6c3b8 Olga Brani
          tween.end = tween.start;
8997 e4a6c3b8 Olga Brani
          tween.start = prop === "width" || prop === "height" ? 1 : 0;
8998 e4a6c3b8 Olga Brani
        }
8999 e4a6c3b8 Olga Brani
      }
9000 e4a6c3b8 Olga Brani
    }
9001 e4a6c3b8 Olga Brani
  }
9002 e4a6c3b8 Olga Brani
}
9003 e4a6c3b8 Olga Brani
9004 e4a6c3b8 Olga Brani
function Tween( elem, options, prop, end, easing ) {
9005 e4a6c3b8 Olga Brani
  return new Tween.prototype.init( elem, options, prop, end, easing );
9006 e4a6c3b8 Olga Brani
}
9007 e4a6c3b8 Olga Brani
jQuery.Tween = Tween;
9008 e4a6c3b8 Olga Brani
9009 e4a6c3b8 Olga Brani
Tween.prototype = {
9010 e4a6c3b8 Olga Brani
  constructor: Tween,
9011 e4a6c3b8 Olga Brani
  init: function( elem, options, prop, end, easing, unit ) {
9012 e4a6c3b8 Olga Brani
    this.elem = elem;
9013 e4a6c3b8 Olga Brani
    this.prop = prop;
9014 e4a6c3b8 Olga Brani
    this.easing = easing || "swing";
9015 e4a6c3b8 Olga Brani
    this.options = options;
9016 e4a6c3b8 Olga Brani
    this.start = this.now = this.cur();
9017 e4a6c3b8 Olga Brani
    this.end = end;
9018 e4a6c3b8 Olga Brani
    this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
9019 e4a6c3b8 Olga Brani
  },
9020 e4a6c3b8 Olga Brani
  cur: function() {
9021 e4a6c3b8 Olga Brani
    var hooks = Tween.propHooks[ this.prop ];
9022 e4a6c3b8 Olga Brani
9023 e4a6c3b8 Olga Brani
    return hooks && hooks.get ?
9024 e4a6c3b8 Olga Brani
      hooks.get( this ) :
9025 e4a6c3b8 Olga Brani
      Tween.propHooks._default.get( this );
9026 e4a6c3b8 Olga Brani
  },
9027 e4a6c3b8 Olga Brani
  run: function( percent ) {
9028 e4a6c3b8 Olga Brani
    var eased,
9029 e4a6c3b8 Olga Brani
      hooks = Tween.propHooks[ this.prop ];
9030 e4a6c3b8 Olga Brani
9031 e4a6c3b8 Olga Brani
    if ( this.options.duration ) {
9032 e4a6c3b8 Olga Brani
      this.pos = eased = jQuery.easing[ this.easing ](
9033 e4a6c3b8 Olga Brani
        percent, this.options.duration * percent, 0, 1, this.options.duration
9034 e4a6c3b8 Olga Brani
      );
9035 e4a6c3b8 Olga Brani
    } else {
9036 e4a6c3b8 Olga Brani
      this.pos = eased = percent;
9037 e4a6c3b8 Olga Brani
    }
9038 e4a6c3b8 Olga Brani
    this.now = ( this.end - this.start ) * eased + this.start;
9039 e4a6c3b8 Olga Brani
9040 e4a6c3b8 Olga Brani
    if ( this.options.step ) {
9041 e4a6c3b8 Olga Brani
      this.options.step.call( this.elem, this.now, this );
9042 e4a6c3b8 Olga Brani
    }
9043 e4a6c3b8 Olga Brani
9044 e4a6c3b8 Olga Brani
    if ( hooks && hooks.set ) {
9045 e4a6c3b8 Olga Brani
      hooks.set( this );
9046 e4a6c3b8 Olga Brani
    } else {
9047 e4a6c3b8 Olga Brani
      Tween.propHooks._default.set( this );
9048 e4a6c3b8 Olga Brani
    }
9049 e4a6c3b8 Olga Brani
    return this;
9050 e4a6c3b8 Olga Brani
  }
9051 e4a6c3b8 Olga Brani
};
9052 e4a6c3b8 Olga Brani
9053 e4a6c3b8 Olga Brani
Tween.prototype.init.prototype = Tween.prototype;
9054 e4a6c3b8 Olga Brani
9055 e4a6c3b8 Olga Brani
Tween.propHooks = {
9056 e4a6c3b8 Olga Brani
  _default: {
9057 e4a6c3b8 Olga Brani
    get: function( tween ) {
9058 e4a6c3b8 Olga Brani
      var result;
9059 e4a6c3b8 Olga Brani
9060 e4a6c3b8 Olga Brani
      if ( tween.elem[ tween.prop ] != null &&
9061 e4a6c3b8 Olga Brani
        (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
9062 e4a6c3b8 Olga Brani
        return tween.elem[ tween.prop ];
9063 e4a6c3b8 Olga Brani
      }
9064 e4a6c3b8 Olga Brani
9065 e4a6c3b8 Olga Brani
      // passing an empty string as a 3rd parameter to .css will automatically
9066 e4a6c3b8 Olga Brani
      // attempt a parseFloat and fallback to a string if the parse fails
9067 e4a6c3b8 Olga Brani
      // so, simple values such as "10px" are parsed to Float.
9068 e4a6c3b8 Olga Brani
      // complex values such as "rotate(1rad)" are returned as is.
9069 e4a6c3b8 Olga Brani
      result = jQuery.css( tween.elem, tween.prop, "" );
9070 e4a6c3b8 Olga Brani
      // Empty strings, null, undefined and "auto" are converted to 0.
9071 e4a6c3b8 Olga Brani
      return !result || result === "auto" ? 0 : result;
9072 e4a6c3b8 Olga Brani
    },
9073 e4a6c3b8 Olga Brani
    set: function( tween ) {
9074 e4a6c3b8 Olga Brani
      // use step hook for back compat - use cssHook if its there - use .style if its
9075 e4a6c3b8 Olga Brani
      // available and use plain properties where available
9076 e4a6c3b8 Olga Brani
      if ( jQuery.fx.step[ tween.prop ] ) {
9077 e4a6c3b8 Olga Brani
        jQuery.fx.step[ tween.prop ]( tween );
9078 e4a6c3b8 Olga Brani
      } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
9079 e4a6c3b8 Olga Brani
        jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
9080 e4a6c3b8 Olga Brani
      } else {
9081 e4a6c3b8 Olga Brani
        tween.elem[ tween.prop ] = tween.now;
9082 e4a6c3b8 Olga Brani
      }
9083 e4a6c3b8 Olga Brani
    }
9084 e4a6c3b8 Olga Brani
  }
9085 e4a6c3b8 Olga Brani
};
9086 e4a6c3b8 Olga Brani
9087 e4a6c3b8 Olga Brani
// Remove in 2.0 - this supports IE8's panic based approach
9088 e4a6c3b8 Olga Brani
// to setting things on disconnected nodes
9089 e4a6c3b8 Olga Brani
9090 e4a6c3b8 Olga Brani
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
9091 e4a6c3b8 Olga Brani
  set: function( tween ) {
9092 e4a6c3b8 Olga Brani
    if ( tween.elem.nodeType && tween.elem.parentNode ) {
9093 e4a6c3b8 Olga Brani
      tween.elem[ tween.prop ] = tween.now;
9094 e4a6c3b8 Olga Brani
    }
9095 e4a6c3b8 Olga Brani
  }
9096 e4a6c3b8 Olga Brani
};
9097 e4a6c3b8 Olga Brani
9098 e4a6c3b8 Olga Brani
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
9099 e4a6c3b8 Olga Brani
  var cssFn = jQuery.fn[ name ];
9100 e4a6c3b8 Olga Brani
  jQuery.fn[ name ] = function( speed, easing, callback ) {
9101 e4a6c3b8 Olga Brani
    return speed == null || typeof speed === "boolean" ?
9102 e4a6c3b8 Olga Brani
      cssFn.apply( this, arguments ) :
9103 e4a6c3b8 Olga Brani
      this.animate( genFx( name, true ), speed, easing, callback );
9104 e4a6c3b8 Olga Brani
  };
9105 e4a6c3b8 Olga Brani
});
9106 e4a6c3b8 Olga Brani
9107 e4a6c3b8 Olga Brani
jQuery.fn.extend({
9108 e4a6c3b8 Olga Brani
  fadeTo: function( speed, to, easing, callback ) {
9109 e4a6c3b8 Olga Brani
9110 e4a6c3b8 Olga Brani
    // show any hidden elements after setting opacity to 0
9111 e4a6c3b8 Olga Brani
    return this.filter( isHidden ).css( "opacity", 0 ).show()
9112 e4a6c3b8 Olga Brani
9113 e4a6c3b8 Olga Brani
      // animate to the value specified
9114 e4a6c3b8 Olga Brani
      .end().animate({ opacity: to }, speed, easing, callback );
9115 e4a6c3b8 Olga Brani
  },
9116 e4a6c3b8 Olga Brani
  animate: function( prop, speed, easing, callback ) {
9117 e4a6c3b8 Olga Brani
    var empty = jQuery.isEmptyObject( prop ),
9118 e4a6c3b8 Olga Brani
      optall = jQuery.speed( speed, easing, callback ),
9119 e4a6c3b8 Olga Brani
      doAnimation = function() {
9120 e4a6c3b8 Olga Brani
        // Operate on a copy of prop so per-property easing won't be lost
9121 e4a6c3b8 Olga Brani
        var anim = Animation( this, jQuery.extend( {}, prop ), optall );
9122 e4a6c3b8 Olga Brani
        doAnimation.finish = function() {
9123 e4a6c3b8 Olga Brani
          anim.stop( true );
9124 e4a6c3b8 Olga Brani
        };
9125 e4a6c3b8 Olga Brani
        // Empty animations, or finishing resolves immediately
9126 e4a6c3b8 Olga Brani
        if ( empty || jQuery._data( this, "finish" ) ) {
9127 e4a6c3b8 Olga Brani
          anim.stop( true );
9128 e4a6c3b8 Olga Brani
        }
9129 e4a6c3b8 Olga Brani
      };
9130 e4a6c3b8 Olga Brani
      doAnimation.finish = doAnimation;
9131 e4a6c3b8 Olga Brani
9132 e4a6c3b8 Olga Brani
    return empty || optall.queue === false ?
9133 e4a6c3b8 Olga Brani
      this.each( doAnimation ) :
9134 e4a6c3b8 Olga Brani
      this.queue( optall.queue, doAnimation );
9135 e4a6c3b8 Olga Brani
  },
9136 e4a6c3b8 Olga Brani
  stop: function( type, clearQueue, gotoEnd ) {
9137 e4a6c3b8 Olga Brani
    var stopQueue = function( hooks ) {
9138 e4a6c3b8 Olga Brani
      var stop = hooks.stop;
9139 e4a6c3b8 Olga Brani
      delete hooks.stop;
9140 e4a6c3b8 Olga Brani
      stop( gotoEnd );
9141 e4a6c3b8 Olga Brani
    };
9142 e4a6c3b8 Olga Brani
9143 e4a6c3b8 Olga Brani
    if ( typeof type !== "string" ) {
9144 e4a6c3b8 Olga Brani
      gotoEnd = clearQueue;
9145 e4a6c3b8 Olga Brani
      clearQueue = type;
9146 e4a6c3b8 Olga Brani
      type = undefined;
9147 e4a6c3b8 Olga Brani
    }
9148 e4a6c3b8 Olga Brani
    if ( clearQueue && type !== false ) {
9149 e4a6c3b8 Olga Brani
      this.queue( type || "fx", [] );
9150 e4a6c3b8 Olga Brani
    }
9151 e4a6c3b8 Olga Brani
9152 e4a6c3b8 Olga Brani
    return this.each(function() {
9153 e4a6c3b8 Olga Brani
      var dequeue = true,
9154 e4a6c3b8 Olga Brani
        index = type != null && type + "queueHooks",
9155 e4a6c3b8 Olga Brani
        timers = jQuery.timers,
9156 e4a6c3b8 Olga Brani
        data = jQuery._data( this );
9157 e4a6c3b8 Olga Brani
9158 e4a6c3b8 Olga Brani
      if ( index ) {
9159 e4a6c3b8 Olga Brani
        if ( data[ index ] && data[ index ].stop ) {
9160 e4a6c3b8 Olga Brani
          stopQueue( data[ index ] );
9161 e4a6c3b8 Olga Brani
        }
9162 e4a6c3b8 Olga Brani
      } else {
9163 e4a6c3b8 Olga Brani
        for ( index in data ) {
9164 e4a6c3b8 Olga Brani
          if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
9165 e4a6c3b8 Olga Brani
            stopQueue( data[ index ] );
9166 e4a6c3b8 Olga Brani
          }
9167 e4a6c3b8 Olga Brani
        }
9168 e4a6c3b8 Olga Brani
      }
9169 e4a6c3b8 Olga Brani
9170 e4a6c3b8 Olga Brani
      for ( index = timers.length; index--; ) {
9171 e4a6c3b8 Olga Brani
        if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
9172 e4a6c3b8 Olga Brani
          timers[ index ].anim.stop( gotoEnd );
9173 e4a6c3b8 Olga Brani
          dequeue = false;
9174 e4a6c3b8 Olga Brani
          timers.splice( index, 1 );
9175 e4a6c3b8 Olga Brani
        }
9176 e4a6c3b8 Olga Brani
      }
9177 e4a6c3b8 Olga Brani
9178 e4a6c3b8 Olga Brani
      // start the next in the queue if the last step wasn't forced
9179 e4a6c3b8 Olga Brani
      // timers currently will call their complete callbacks, which will dequeue
9180 e4a6c3b8 Olga Brani
      // but only if they were gotoEnd
9181 e4a6c3b8 Olga Brani
      if ( dequeue || !gotoEnd ) {
9182 e4a6c3b8 Olga Brani
        jQuery.dequeue( this, type );
9183 e4a6c3b8 Olga Brani
      }
9184 e4a6c3b8 Olga Brani
    });
9185 e4a6c3b8 Olga Brani
  },
9186 e4a6c3b8 Olga Brani
  finish: function( type ) {
9187 e4a6c3b8 Olga Brani
    if ( type !== false ) {
9188 e4a6c3b8 Olga Brani
      type = type || "fx";
9189 e4a6c3b8 Olga Brani
    }
9190 e4a6c3b8 Olga Brani
    return this.each(function() {
9191 e4a6c3b8 Olga Brani
      var index,
9192 e4a6c3b8 Olga Brani
        data = jQuery._data( this ),
9193 e4a6c3b8 Olga Brani
        queue = data[ type + "queue" ],
9194 e4a6c3b8 Olga Brani
        hooks = data[ type + "queueHooks" ],
9195 e4a6c3b8 Olga Brani
        timers = jQuery.timers,
9196 e4a6c3b8 Olga Brani
        length = queue ? queue.length : 0;
9197 e4a6c3b8 Olga Brani
9198 e4a6c3b8 Olga Brani
      // enable finishing flag on private data
9199 e4a6c3b8 Olga Brani
      data.finish = true;
9200 e4a6c3b8 Olga Brani
9201 e4a6c3b8 Olga Brani
      // empty the queue first
9202 e4a6c3b8 Olga Brani
      jQuery.queue( this, type, [] );
9203 e4a6c3b8 Olga Brani
9204 e4a6c3b8 Olga Brani
      if ( hooks && hooks.cur && hooks.cur.finish ) {
9205 e4a6c3b8 Olga Brani
        hooks.cur.finish.call( this );
9206 e4a6c3b8 Olga Brani
      }
9207 e4a6c3b8 Olga Brani
9208 e4a6c3b8 Olga Brani
      // look for any active animations, and finish them
9209 e4a6c3b8 Olga Brani
      for ( index = timers.length; index--; ) {
9210 e4a6c3b8 Olga Brani
        if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
9211 e4a6c3b8 Olga Brani
          timers[ index ].anim.stop( true );
9212 e4a6c3b8 Olga Brani
          timers.splice( index, 1 );
9213 e4a6c3b8 Olga Brani
        }
9214 e4a6c3b8 Olga Brani
      }
9215 e4a6c3b8 Olga Brani
9216 e4a6c3b8 Olga Brani
      // look for any animations in the old queue and finish them
9217 e4a6c3b8 Olga Brani
      for ( index = 0; index < length; index++ ) {
9218 e4a6c3b8 Olga Brani
        if ( queue[ index ] && queue[ index ].finish ) {
9219 e4a6c3b8 Olga Brani
          queue[ index ].finish.call( this );
9220 e4a6c3b8 Olga Brani
        }
9221 e4a6c3b8 Olga Brani
      }
9222 e4a6c3b8 Olga Brani
9223 e4a6c3b8 Olga Brani
      // turn off finishing flag
9224 e4a6c3b8 Olga Brani
      delete data.finish;
9225 e4a6c3b8 Olga Brani
    });
9226 e4a6c3b8 Olga Brani
  }
9227 e4a6c3b8 Olga Brani
});
9228 e4a6c3b8 Olga Brani
9229 e4a6c3b8 Olga Brani
// Generate parameters to create a standard animation
9230 e4a6c3b8 Olga Brani
function genFx( type, includeWidth ) {
9231 e4a6c3b8 Olga Brani
  var which,
9232 e4a6c3b8 Olga Brani
    attrs = { height: type },
9233 e4a6c3b8 Olga Brani
    i = 0;
9234 e4a6c3b8 Olga Brani
9235 e4a6c3b8 Olga Brani
  // if we include width, step value is 1 to do all cssExpand values,
9236 e4a6c3b8 Olga Brani
  // if we don't include width, step value is 2 to skip over Left and Right
9237 e4a6c3b8 Olga Brani
  includeWidth = includeWidth? 1 : 0;
9238 e4a6c3b8 Olga Brani
  for( ; i < 4 ; i += 2 - includeWidth ) {
9239 e4a6c3b8 Olga Brani
    which = cssExpand[ i ];
9240 e4a6c3b8 Olga Brani
    attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
9241 e4a6c3b8 Olga Brani
  }
9242 e4a6c3b8 Olga Brani
9243 e4a6c3b8 Olga Brani
  if ( includeWidth ) {
9244 e4a6c3b8 Olga Brani
    attrs.opacity = attrs.width = type;
9245 e4a6c3b8 Olga Brani
  }
9246 e4a6c3b8 Olga Brani
9247 e4a6c3b8 Olga Brani
  return attrs;
9248 e4a6c3b8 Olga Brani
}
9249 e4a6c3b8 Olga Brani
9250 e4a6c3b8 Olga Brani
// Generate shortcuts for custom animations
9251 e4a6c3b8 Olga Brani
jQuery.each({
9252 e4a6c3b8 Olga Brani
  slideDown: genFx("show"),
9253 e4a6c3b8 Olga Brani
  slideUp: genFx("hide"),
9254 e4a6c3b8 Olga Brani
  slideToggle: genFx("toggle"),
9255 e4a6c3b8 Olga Brani
  fadeIn: { opacity: "show" },
9256 e4a6c3b8 Olga Brani
  fadeOut: { opacity: "hide" },
9257 e4a6c3b8 Olga Brani
  fadeToggle: { opacity: "toggle" }
9258 e4a6c3b8 Olga Brani
}, function( name, props ) {
9259 e4a6c3b8 Olga Brani
  jQuery.fn[ name ] = function( speed, easing, callback ) {
9260 e4a6c3b8 Olga Brani
    return this.animate( props, speed, easing, callback );
9261 e4a6c3b8 Olga Brani
  };
9262 e4a6c3b8 Olga Brani
});
9263 e4a6c3b8 Olga Brani
9264 e4a6c3b8 Olga Brani
jQuery.speed = function( speed, easing, fn ) {
9265 e4a6c3b8 Olga Brani
  var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
9266 e4a6c3b8 Olga Brani
    complete: fn || !fn && easing ||
9267 e4a6c3b8 Olga Brani
      jQuery.isFunction( speed ) && speed,
9268 e4a6c3b8 Olga Brani
    duration: speed,
9269 e4a6c3b8 Olga Brani
    easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
9270 e4a6c3b8 Olga Brani
  };
9271 e4a6c3b8 Olga Brani
9272 e4a6c3b8 Olga Brani
  opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
9273 e4a6c3b8 Olga Brani
    opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
9274 e4a6c3b8 Olga Brani
9275 e4a6c3b8 Olga Brani
  // normalize opt.queue - true/undefined/null -> "fx"
9276 e4a6c3b8 Olga Brani
  if ( opt.queue == null || opt.queue === true ) {
9277 e4a6c3b8 Olga Brani
    opt.queue = "fx";
9278 e4a6c3b8 Olga Brani
  }
9279 e4a6c3b8 Olga Brani
9280 e4a6c3b8 Olga Brani
  // Queueing
9281 e4a6c3b8 Olga Brani
  opt.old = opt.complete;
9282 e4a6c3b8 Olga Brani
9283 e4a6c3b8 Olga Brani
  opt.complete = function() {
9284 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( opt.old ) ) {
9285 e4a6c3b8 Olga Brani
      opt.old.call( this );
9286 e4a6c3b8 Olga Brani
    }
9287 e4a6c3b8 Olga Brani
9288 e4a6c3b8 Olga Brani
    if ( opt.queue ) {
9289 e4a6c3b8 Olga Brani
      jQuery.dequeue( this, opt.queue );
9290 e4a6c3b8 Olga Brani
    }
9291 e4a6c3b8 Olga Brani
  };
9292 e4a6c3b8 Olga Brani
9293 e4a6c3b8 Olga Brani
  return opt;
9294 e4a6c3b8 Olga Brani
};
9295 e4a6c3b8 Olga Brani
9296 e4a6c3b8 Olga Brani
jQuery.easing = {
9297 e4a6c3b8 Olga Brani
  linear: function( p ) {
9298 e4a6c3b8 Olga Brani
    return p;
9299 e4a6c3b8 Olga Brani
  },
9300 e4a6c3b8 Olga Brani
  swing: function( p ) {
9301 e4a6c3b8 Olga Brani
    return 0.5 - Math.cos( p*Math.PI ) / 2;
9302 e4a6c3b8 Olga Brani
  }
9303 e4a6c3b8 Olga Brani
};
9304 e4a6c3b8 Olga Brani
9305 e4a6c3b8 Olga Brani
jQuery.timers = [];
9306 e4a6c3b8 Olga Brani
jQuery.fx = Tween.prototype.init;
9307 e4a6c3b8 Olga Brani
jQuery.fx.tick = function() {
9308 e4a6c3b8 Olga Brani
  var timer,
9309 e4a6c3b8 Olga Brani
    timers = jQuery.timers,
9310 e4a6c3b8 Olga Brani
    i = 0;
9311 e4a6c3b8 Olga Brani
9312 e4a6c3b8 Olga Brani
  fxNow = jQuery.now();
9313 e4a6c3b8 Olga Brani
9314 e4a6c3b8 Olga Brani
  for ( ; i < timers.length; i++ ) {
9315 e4a6c3b8 Olga Brani
    timer = timers[ i ];
9316 e4a6c3b8 Olga Brani
    // Checks the timer has not already been removed
9317 e4a6c3b8 Olga Brani
    if ( !timer() && timers[ i ] === timer ) {
9318 e4a6c3b8 Olga Brani
      timers.splice( i--, 1 );
9319 e4a6c3b8 Olga Brani
    }
9320 e4a6c3b8 Olga Brani
  }
9321 e4a6c3b8 Olga Brani
9322 e4a6c3b8 Olga Brani
  if ( !timers.length ) {
9323 e4a6c3b8 Olga Brani
    jQuery.fx.stop();
9324 e4a6c3b8 Olga Brani
  }
9325 e4a6c3b8 Olga Brani
  fxNow = undefined;
9326 e4a6c3b8 Olga Brani
};
9327 e4a6c3b8 Olga Brani
9328 e4a6c3b8 Olga Brani
jQuery.fx.timer = function( timer ) {
9329 e4a6c3b8 Olga Brani
  if ( timer() && jQuery.timers.push( timer ) ) {
9330 e4a6c3b8 Olga Brani
    jQuery.fx.start();
9331 e4a6c3b8 Olga Brani
  }
9332 e4a6c3b8 Olga Brani
};
9333 e4a6c3b8 Olga Brani
9334 e4a6c3b8 Olga Brani
jQuery.fx.interval = 13;
9335 e4a6c3b8 Olga Brani
9336 e4a6c3b8 Olga Brani
jQuery.fx.start = function() {
9337 e4a6c3b8 Olga Brani
  if ( !timerId ) {
9338 e4a6c3b8 Olga Brani
    timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
9339 e4a6c3b8 Olga Brani
  }
9340 e4a6c3b8 Olga Brani
};
9341 e4a6c3b8 Olga Brani
9342 e4a6c3b8 Olga Brani
jQuery.fx.stop = function() {
9343 e4a6c3b8 Olga Brani
  clearInterval( timerId );
9344 e4a6c3b8 Olga Brani
  timerId = null;
9345 e4a6c3b8 Olga Brani
};
9346 e4a6c3b8 Olga Brani
9347 e4a6c3b8 Olga Brani
jQuery.fx.speeds = {
9348 e4a6c3b8 Olga Brani
  slow: 600,
9349 e4a6c3b8 Olga Brani
  fast: 200,
9350 e4a6c3b8 Olga Brani
  // Default speed
9351 e4a6c3b8 Olga Brani
  _default: 400
9352 e4a6c3b8 Olga Brani
};
9353 e4a6c3b8 Olga Brani
9354 e4a6c3b8 Olga Brani
// Back Compat <1.8 extension point
9355 e4a6c3b8 Olga Brani
jQuery.fx.step = {};
9356 e4a6c3b8 Olga Brani
9357 e4a6c3b8 Olga Brani
if ( jQuery.expr && jQuery.expr.filters ) {
9358 e4a6c3b8 Olga Brani
  jQuery.expr.filters.animated = function( elem ) {
9359 e4a6c3b8 Olga Brani
    return jQuery.grep(jQuery.timers, function( fn ) {
9360 e4a6c3b8 Olga Brani
      return elem === fn.elem;
9361 e4a6c3b8 Olga Brani
    }).length;
9362 e4a6c3b8 Olga Brani
  };
9363 e4a6c3b8 Olga Brani
}
9364 e4a6c3b8 Olga Brani
jQuery.fn.offset = function( options ) {
9365 e4a6c3b8 Olga Brani
  if ( arguments.length ) {
9366 e4a6c3b8 Olga Brani
    return options === undefined ?
9367 e4a6c3b8 Olga Brani
      this :
9368 e4a6c3b8 Olga Brani
      this.each(function( i ) {
9369 e4a6c3b8 Olga Brani
        jQuery.offset.setOffset( this, options, i );
9370 e4a6c3b8 Olga Brani
      });
9371 e4a6c3b8 Olga Brani
  }
9372 e4a6c3b8 Olga Brani
9373 e4a6c3b8 Olga Brani
  var docElem, win,
9374 e4a6c3b8 Olga Brani
    box = { top: 0, left: 0 },
9375 e4a6c3b8 Olga Brani
    elem = this[ 0 ],
9376 e4a6c3b8 Olga Brani
    doc = elem && elem.ownerDocument;
9377 e4a6c3b8 Olga Brani
9378 e4a6c3b8 Olga Brani
  if ( !doc ) {
9379 e4a6c3b8 Olga Brani
    return;
9380 e4a6c3b8 Olga Brani
  }
9381 e4a6c3b8 Olga Brani
9382 e4a6c3b8 Olga Brani
  docElem = doc.documentElement;
9383 e4a6c3b8 Olga Brani
9384 e4a6c3b8 Olga Brani
  // Make sure it's not a disconnected DOM node
9385 e4a6c3b8 Olga Brani
  if ( !jQuery.contains( docElem, elem ) ) {
9386 e4a6c3b8 Olga Brani
    return box;
9387 e4a6c3b8 Olga Brani
  }
9388 e4a6c3b8 Olga Brani
9389 e4a6c3b8 Olga Brani
  // If we don't have gBCR, just use 0,0 rather than error
9390 e4a6c3b8 Olga Brani
  // BlackBerry 5, iOS 3 (original iPhone)
9391 e4a6c3b8 Olga Brani
  if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
9392 e4a6c3b8 Olga Brani
    box = elem.getBoundingClientRect();
9393 e4a6c3b8 Olga Brani
  }
9394 e4a6c3b8 Olga Brani
  win = getWindow( doc );
9395 e4a6c3b8 Olga Brani
  return {
9396 e4a6c3b8 Olga Brani
    top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
9397 e4a6c3b8 Olga Brani
    left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
9398 e4a6c3b8 Olga Brani
  };
9399 e4a6c3b8 Olga Brani
};
9400 e4a6c3b8 Olga Brani
9401 e4a6c3b8 Olga Brani
jQuery.offset = {
9402 e4a6c3b8 Olga Brani
9403 e4a6c3b8 Olga Brani
  setOffset: function( elem, options, i ) {
9404 e4a6c3b8 Olga Brani
    var position = jQuery.css( elem, "position" );
9405 e4a6c3b8 Olga Brani
9406 e4a6c3b8 Olga Brani
    // set position first, in-case top/left are set even on static elem
9407 e4a6c3b8 Olga Brani
    if ( position === "static" ) {
9408 e4a6c3b8 Olga Brani
      elem.style.position = "relative";
9409 e4a6c3b8 Olga Brani
    }
9410 e4a6c3b8 Olga Brani
9411 e4a6c3b8 Olga Brani
    var curElem = jQuery( elem ),
9412 e4a6c3b8 Olga Brani
      curOffset = curElem.offset(),
9413 e4a6c3b8 Olga Brani
      curCSSTop = jQuery.css( elem, "top" ),
9414 e4a6c3b8 Olga Brani
      curCSSLeft = jQuery.css( elem, "left" ),
9415 e4a6c3b8 Olga Brani
      calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9416 e4a6c3b8 Olga Brani
      props = {}, curPosition = {}, curTop, curLeft;
9417 e4a6c3b8 Olga Brani
9418 e4a6c3b8 Olga Brani
    // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9419 e4a6c3b8 Olga Brani
    if ( calculatePosition ) {
9420 e4a6c3b8 Olga Brani
      curPosition = curElem.position();
9421 e4a6c3b8 Olga Brani
      curTop = curPosition.top;
9422 e4a6c3b8 Olga Brani
      curLeft = curPosition.left;
9423 e4a6c3b8 Olga Brani
    } else {
9424 e4a6c3b8 Olga Brani
      curTop = parseFloat( curCSSTop ) || 0;
9425 e4a6c3b8 Olga Brani
      curLeft = parseFloat( curCSSLeft ) || 0;
9426 e4a6c3b8 Olga Brani
    }
9427 e4a6c3b8 Olga Brani
9428 e4a6c3b8 Olga Brani
    if ( jQuery.isFunction( options ) ) {
9429 e4a6c3b8 Olga Brani
      options = options.call( elem, i, curOffset );
9430 e4a6c3b8 Olga Brani
    }
9431 e4a6c3b8 Olga Brani
9432 e4a6c3b8 Olga Brani
    if ( options.top != null ) {
9433 e4a6c3b8 Olga Brani
      props.top = ( options.top - curOffset.top ) + curTop;
9434 e4a6c3b8 Olga Brani
    }
9435 e4a6c3b8 Olga Brani
    if ( options.left != null ) {
9436 e4a6c3b8 Olga Brani
      props.left = ( options.left - curOffset.left ) + curLeft;
9437 e4a6c3b8 Olga Brani
    }
9438 e4a6c3b8 Olga Brani
9439 e4a6c3b8 Olga Brani
    if ( "using" in options ) {
9440 e4a6c3b8 Olga Brani
      options.using.call( elem, props );
9441 e4a6c3b8 Olga Brani
    } else {
9442 e4a6c3b8 Olga Brani
      curElem.css( props );
9443 e4a6c3b8 Olga Brani
    }
9444 e4a6c3b8 Olga Brani
  }
9445 e4a6c3b8 Olga Brani
};
9446 e4a6c3b8 Olga Brani
9447 e4a6c3b8 Olga Brani
9448 e4a6c3b8 Olga Brani
jQuery.fn.extend({
9449 e4a6c3b8 Olga Brani
9450 e4a6c3b8 Olga Brani
  position: function() {
9451 e4a6c3b8 Olga Brani
    if ( !this[ 0 ] ) {
9452 e4a6c3b8 Olga Brani
      return;
9453 e4a6c3b8 Olga Brani
    }
9454 e4a6c3b8 Olga Brani
9455 e4a6c3b8 Olga Brani
    var offsetParent, offset,
9456 e4a6c3b8 Olga Brani
      parentOffset = { top: 0, left: 0 },
9457 e4a6c3b8 Olga Brani
      elem = this[ 0 ];
9458 e4a6c3b8 Olga Brani
9459 e4a6c3b8 Olga Brani
    // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
9460 e4a6c3b8 Olga Brani
    if ( jQuery.css( elem, "position" ) === "fixed" ) {
9461 e4a6c3b8 Olga Brani
      // we assume that getBoundingClientRect is available when computed position is fixed
9462 e4a6c3b8 Olga Brani
      offset = elem.getBoundingClientRect();
9463 e4a6c3b8 Olga Brani
    } else {
9464 e4a6c3b8 Olga Brani
      // Get *real* offsetParent
9465 e4a6c3b8 Olga Brani
      offsetParent = this.offsetParent();
9466 e4a6c3b8 Olga Brani
9467 e4a6c3b8 Olga Brani
      // Get correct offsets
9468 e4a6c3b8 Olga Brani
      offset = this.offset();
9469 e4a6c3b8 Olga Brani
      if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
9470 e4a6c3b8 Olga Brani
        parentOffset = offsetParent.offset();
9471 e4a6c3b8 Olga Brani
      }
9472 e4a6c3b8 Olga Brani
9473 e4a6c3b8 Olga Brani
      // Add offsetParent borders
9474 e4a6c3b8 Olga Brani
      parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
9475 e4a6c3b8 Olga Brani
      parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
9476 e4a6c3b8 Olga Brani
    }
9477 e4a6c3b8 Olga Brani
9478 e4a6c3b8 Olga Brani
    // Subtract parent offsets and element margins
9479 e4a6c3b8 Olga Brani
    // note: when an element has margin: auto the offsetLeft and marginLeft
9480 e4a6c3b8 Olga Brani
    // are the same in Safari causing offset.left to incorrectly be 0
9481 e4a6c3b8 Olga Brani
    return {
9482 e4a6c3b8 Olga Brani
      top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
9483 e4a6c3b8 Olga Brani
      left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
9484 e4a6c3b8 Olga Brani
    };
9485 e4a6c3b8 Olga Brani
  },
9486 e4a6c3b8 Olga Brani
9487 e4a6c3b8 Olga Brani
  offsetParent: function() {
9488 e4a6c3b8 Olga Brani
    return this.map(function() {
9489 e4a6c3b8 Olga Brani
      var offsetParent = this.offsetParent || document.documentElement;
9490 e4a6c3b8 Olga Brani
      while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
9491 e4a6c3b8 Olga Brani
        offsetParent = offsetParent.offsetParent;
9492 e4a6c3b8 Olga Brani
      }
9493 e4a6c3b8 Olga Brani
      return offsetParent || document.documentElement;
9494 e4a6c3b8 Olga Brani
    });
9495 e4a6c3b8 Olga Brani
  }
9496 e4a6c3b8 Olga Brani
});
9497 e4a6c3b8 Olga Brani
9498 e4a6c3b8 Olga Brani
9499 e4a6c3b8 Olga Brani
// Create scrollLeft and scrollTop methods
9500 e4a6c3b8 Olga Brani
jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
9501 e4a6c3b8 Olga Brani
  var top = /Y/.test( prop );
9502 e4a6c3b8 Olga Brani
9503 e4a6c3b8 Olga Brani
  jQuery.fn[ method ] = function( val ) {
9504 e4a6c3b8 Olga Brani
    return jQuery.access( this, function( elem, method, val ) {
9505 e4a6c3b8 Olga Brani
      var win = getWindow( elem );
9506 e4a6c3b8 Olga Brani
9507 e4a6c3b8 Olga Brani
      if ( val === undefined ) {
9508 e4a6c3b8 Olga Brani
        return win ? (prop in win) ? win[ prop ] :
9509 e4a6c3b8 Olga Brani
          win.document.documentElement[ method ] :
9510 e4a6c3b8 Olga Brani
          elem[ method ];
9511 e4a6c3b8 Olga Brani
      }
9512 e4a6c3b8 Olga Brani
9513 e4a6c3b8 Olga Brani
      if ( win ) {
9514 e4a6c3b8 Olga Brani
        win.scrollTo(
9515 e4a6c3b8 Olga Brani
          !top ? val : jQuery( win ).scrollLeft(),
9516 e4a6c3b8 Olga Brani
          top ? val : jQuery( win ).scrollTop()
9517 e4a6c3b8 Olga Brani
        );
9518 e4a6c3b8 Olga Brani
9519 e4a6c3b8 Olga Brani
      } else {
9520 e4a6c3b8 Olga Brani
        elem[ method ] = val;
9521 e4a6c3b8 Olga Brani
      }
9522 e4a6c3b8 Olga Brani
    }, method, val, arguments.length, null );
9523 e4a6c3b8 Olga Brani
  };
9524 e4a6c3b8 Olga Brani
});
9525 e4a6c3b8 Olga Brani
9526 e4a6c3b8 Olga Brani
function getWindow( elem ) {
9527 e4a6c3b8 Olga Brani
  return jQuery.isWindow( elem ) ?
9528 e4a6c3b8 Olga Brani
    elem :
9529 e4a6c3b8 Olga Brani
    elem.nodeType === 9 ?
9530 e4a6c3b8 Olga Brani
      elem.defaultView || elem.parentWindow :
9531 e4a6c3b8 Olga Brani
      false;
9532 e4a6c3b8 Olga Brani
}
9533 e4a6c3b8 Olga Brani
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
9534 e4a6c3b8 Olga Brani
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
9535 e4a6c3b8 Olga Brani
  jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
9536 e4a6c3b8 Olga Brani
    // margin is only for outerHeight, outerWidth
9537 e4a6c3b8 Olga Brani
    jQuery.fn[ funcName ] = function( margin, value ) {
9538 e4a6c3b8 Olga Brani
      var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
9539 e4a6c3b8 Olga Brani
        extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
9540 e4a6c3b8 Olga Brani
9541 e4a6c3b8 Olga Brani
      return jQuery.access( this, function( elem, type, value ) {
9542 e4a6c3b8 Olga Brani
        var doc;
9543 e4a6c3b8 Olga Brani
9544 e4a6c3b8 Olga Brani
        if ( jQuery.isWindow( elem ) ) {
9545 e4a6c3b8 Olga Brani
          // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
9546 e4a6c3b8 Olga Brani
          // isn't a whole lot we can do. See pull request at this URL for discussion:
9547 e4a6c3b8 Olga Brani
          // https://github.com/jquery/jquery/pull/764
9548 e4a6c3b8 Olga Brani
          return elem.document.documentElement[ "client" + name ];
9549 e4a6c3b8 Olga Brani
        }
9550 e4a6c3b8 Olga Brani
9551 e4a6c3b8 Olga Brani
        // Get document width or height
9552 e4a6c3b8 Olga Brani
        if ( elem.nodeType === 9 ) {
9553 e4a6c3b8 Olga Brani
          doc = elem.documentElement;
9554 e4a6c3b8 Olga Brani
9555 e4a6c3b8 Olga Brani
          // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
9556 e4a6c3b8 Olga Brani
          // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
9557 e4a6c3b8 Olga Brani
          return Math.max(
9558 e4a6c3b8 Olga Brani
            elem.body[ "scroll" + name ], doc[ "scroll" + name ],
9559 e4a6c3b8 Olga Brani
            elem.body[ "offset" + name ], doc[ "offset" + name ],
9560 e4a6c3b8 Olga Brani
            doc[ "client" + name ]
9561 e4a6c3b8 Olga Brani
          );
9562 e4a6c3b8 Olga Brani
        }
9563 e4a6c3b8 Olga Brani
9564 e4a6c3b8 Olga Brani
        return value === undefined ?
9565 e4a6c3b8 Olga Brani
          // Get width or height on the element, requesting but not forcing parseFloat
9566 e4a6c3b8 Olga Brani
          jQuery.css( elem, type, extra ) :
9567 e4a6c3b8 Olga Brani
9568 e4a6c3b8 Olga Brani
          // Set width or height on the element
9569 e4a6c3b8 Olga Brani
          jQuery.style( elem, type, value, extra );
9570 e4a6c3b8 Olga Brani
      }, type, chainable ? margin : undefined, chainable, null );
9571 e4a6c3b8 Olga Brani
    };
9572 e4a6c3b8 Olga Brani
  });
9573 e4a6c3b8 Olga Brani
});
9574 e4a6c3b8 Olga Brani
// Limit scope pollution from any deprecated API
9575 e4a6c3b8 Olga Brani
// (function() {
9576 e4a6c3b8 Olga Brani
9577 e4a6c3b8 Olga Brani
// })();
9578 e4a6c3b8 Olga Brani
// Expose jQuery to the global object
9579 e4a6c3b8 Olga Brani
window.jQuery = window.$ = jQuery;
9580 e4a6c3b8 Olga Brani
9581 e4a6c3b8 Olga Brani
// Expose jQuery as an AMD module, but only for AMD loaders that
9582 e4a6c3b8 Olga Brani
// understand the issues with loading multiple versions of jQuery
9583 e4a6c3b8 Olga Brani
// in a page that all might call define(). The loader will indicate
9584 e4a6c3b8 Olga Brani
// they have special allowances for multiple jQuery versions by
9585 e4a6c3b8 Olga Brani
// specifying define.amd.jQuery = true. Register as a named module,
9586 e4a6c3b8 Olga Brani
// since jQuery can be concatenated with other files that may use define,
9587 e4a6c3b8 Olga Brani
// but not use a proper concatenation script that understands anonymous
9588 e4a6c3b8 Olga Brani
// AMD modules. A named AMD is safest and most robust way to register.
9589 e4a6c3b8 Olga Brani
// Lowercase jquery is used because AMD module names are derived from
9590 e4a6c3b8 Olga Brani
// file names, and jQuery is normally delivered in a lowercase file name.
9591 e4a6c3b8 Olga Brani
// Do this after creating the global so that if an AMD module wants to call
9592 e4a6c3b8 Olga Brani
// noConflict to hide this version of jQuery, it will work.
9593 e4a6c3b8 Olga Brani
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
9594 e4a6c3b8 Olga Brani
  define( "jquery", [], function () { return jQuery; } );
9595 e4a6c3b8 Olga Brani
}
9596 e4a6c3b8 Olga Brani
9597 e4a6c3b8 Olga Brani
})( window );