Merge lp:~ubuntu-sdk-team/ubuntu-ui-toolkit/generatedApDocs into lp:ubuntu/vivid/ubuntu-ui-toolkit

Proposed by Cris Dywan
Status: Approved
Approved by: Martin Pitt
Approved revision: 1492
Proposed branch: lp:~ubuntu-sdk-team/ubuntu-ui-toolkit/generatedApDocs
Merge into: lp:ubuntu/vivid/ubuntu-ui-toolkit
Diff against target: 15750 lines (+15498/-3)
35 files modified
debian/control (+0/-1)
debian/rules (+3/-2)
documentation/autopilot-helpers/_build/html/_modules/index.html (+74/-0)
documentation/autopilot-helpers/_build/html/_modules/ubuntuuitoolkit.html (+161/-0)
documentation/autopilot-helpers/_build/html/_sources/index.txt (+17/-0)
documentation/autopilot-helpers/_build/html/_sources/ubuntuuitoolkit.txt (+10/-0)
documentation/autopilot-helpers/_build/html/_static/basic.css (+537/-0)
documentation/autopilot-helpers/_build/html/_static/default.css (+256/-0)
documentation/autopilot-helpers/_build/html/_static/doctools.js (+238/-0)
documentation/autopilot-helpers/_build/html/_static/jquery.js (+9404/-0)
documentation/autopilot-helpers/_build/html/_static/nature.css (+211/-0)
documentation/autopilot-helpers/_build/html/_static/pygments.css (+63/-0)
documentation/autopilot-helpers/_build/html/_static/searchtools.js (+622/-0)
documentation/autopilot-helpers/_build/html/_static/sidebar.js (+159/-0)
documentation/autopilot-helpers/_build/html/_static/underscore.js (+1415/-0)
documentation/autopilot-helpers/_build/html/_static/websupport.js (+808/-0)
documentation/autopilot-helpers/_build/html/genindex.html (+73/-0)
documentation/autopilot-helpers/_build/html/index.html (+865/-0)
documentation/autopilot-helpers/_build/html/py-modindex.html (+96/-0)
documentation/autopilot-helpers/_build/html/search.html (+96/-0)
documentation/autopilot-helpers/_build/html/searchindex.js (+1/-0)
documentation/autopilot-helpers/_build/html/ubuntuuitoolkit.html (+79/-0)
documentation/autopilot-helpers/_build/json/_modules/index.fjson (+1/-0)
documentation/autopilot-helpers/_build/json/_modules/ubuntuuitoolkit.fjson (+1/-0)
documentation/autopilot-helpers/_build/json/_sources/index.txt (+17/-0)
documentation/autopilot-helpers/_build/json/_sources/ubuntuuitoolkit.txt (+10/-0)
documentation/autopilot-helpers/_build/json/_static/nature.css (+211/-0)
documentation/autopilot-helpers/_build/json/_static/pygments.css (+63/-0)
documentation/autopilot-helpers/_build/json/genindex.fjson (+1/-0)
documentation/autopilot-helpers/_build/json/globalcontext.json (+1/-0)
documentation/autopilot-helpers/_build/json/index.fjson (+1/-0)
documentation/autopilot-helpers/_build/json/py-modindex.fjson (+1/-0)
documentation/autopilot-helpers/_build/json/search.fjson (+1/-0)
documentation/autopilot-helpers/_build/json/searchindex.json (+1/-0)
documentation/autopilot-helpers/_build/json/ubuntuuitoolkit.fjson (+1/-0)
To merge this branch: bzr merge lp:~ubuntu-sdk-team/ubuntu-ui-toolkit/generatedApDocs
Reviewer Review Type Date Requested Status
Martin Pitt Approve
Review via email: mp+256910@code.launchpad.net

This proposal has been superseded by a proposal from 2015-04-21.

Commit message

Ship generated HTML and JSON docs for Autopilot helpers

To post a comment you must log in.
Revision history for this message
Martin Pitt (pitti) wrote :

Thanks Christian! This is of course "ugh" and a technical debt, but we don't have that much choice now. For vivid+1 we should sort this out properly by dropping autopilot-legacy, promoting autopilot to main, and re-enable building the docs, but for vivid this will do fine.

review: Approve
1491. By Cris Dywan

Ship generated HTML and JSON docs for Autopilot helpers

1492. By Cris Dywan

Exclude _build folders from licence check

Unmerged revisions

1492. By Cris Dywan

Exclude _build folders from licence check

1491. By Cris Dywan

Ship generated HTML and JSON docs for Autopilot helpers

1490. By Zoltan Balogh

Sync from trunk

1489. By Tim Peeters

Create a list of Actions from a list of Tabs so that OverflowPanel only needs one type of model.

Approved by PS Jenkins bot, Christian Dywan.

1488. By Loïc Molinari

[UbuntuShape] FBO redirected shapes must be y-flipped only when not rotated. Fixes: https://bugs.launchpad.net/bugs/1446279.

Approved by PS Jenkins bot, Tim Peeters.

1487. By Tim Peeters

Fix typos and extend navigation in theming tutorial.

Approved by Zsombor Egri, PS Jenkins bot.

1486. By Loïc Molinari

Fixed rendering with VMware's Gallium 0.4 on SVGA3D. Fixes: https://bugs.launchpad.net/bugs/1444975.

Approved by Tim Peeters, PS Jenkins bot.

1485. By Leo Arias

Removed python2 support from autopilot tests and helpers. Fixes: https://bugs.launchpad.net/bugs/1429163.

Approved by Christian Dywan, PS Jenkins bot.

1484. By Tim Peeters

Re-introduce the panel color properties to Ambience PageHeadStyle.

Approved by PS Jenkins bot, Zsombor Egri.

1483. By Zsombor Egri

Theming tutorial.

Approved by Zoltan Balogh, PS Jenkins bot.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'debian/control'
2--- debian/control 2015-03-27 12:35:55 +0000
3+++ debian/control 2015-04-21 10:57:13 +0000
4@@ -47,7 +47,6 @@
5 locales,
6 suru-icon-theme,
7 uuid-runtime,
8- python-autopilot (>= 1.4),
9 python3-sphinx,
10 Standards-Version: 3.9.4
11 Homepage: https://launchpad.net/ubuntu-ui-toolkit
12
13=== modified file 'debian/rules'
14--- debian/rules 2015-02-06 11:33:33 +0000
15+++ debian/rules 2015-04-21 10:57:13 +0000
16@@ -35,8 +35,9 @@
17
18 override_dh_install:
19 dh_auto_build -- docs
20- sphinx-build -b singlehtml documentation/autopilot-helpers documentation/autopilot-helpers/_build/html
21- sphinx-build -b json documentation/autopilot-helpers documentation/autopilot-helpers/_build/json
22+ # FIXME: Due to autopilot not being in the archive we ship docs for now
23+ # sphinx-build -b singlehtml documentation/autopilot-helpers documentation/autopilot-helpers/_build/html
24+ # sphinx-build -b json documentation/autopilot-helpers documentation/autopilot-helpers/_build/json
25 mkdir -p debian/tmp/`qmake -query QT_INSTALL_DOCS`/qch
26 mkdir -p debian/tmp/usr/share/ubuntu-ui-toolkit/doc
27 cp -r $(CURDIR)/documentation/*qch debian/tmp/`qmake -query QT_INSTALL_DOCS`/qch
28
29=== added directory 'documentation/autopilot-helpers/_build'
30=== added directory 'documentation/autopilot-helpers/_build/html'
31=== added directory 'documentation/autopilot-helpers/_build/html/_modules'
32=== added file 'documentation/autopilot-helpers/_build/html/_modules/index.html'
33--- documentation/autopilot-helpers/_build/html/_modules/index.html 1970-01-01 00:00:00 +0000
34+++ documentation/autopilot-helpers/_build/html/_modules/index.html 2015-04-21 10:57:13 +0000
35@@ -0,0 +1,74 @@
36+<!--
37+ Copyright 2015 Canonical Ltd.
38+-->
39+
40+
41+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
42+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
43+
44+
45+<html xmlns="http://www.w3.org/1999/xhtml">
46+ <head>
47+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
48+
49+ <title>Overview: module code &mdash; ubuntu-ui-toolkit-autopilot 15.04 documentation</title>
50+
51+ <link rel="stylesheet" href="../_static/default.css" type="text/css" />
52+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
53+
54+ <script type="text/javascript">
55+ var DOCUMENTATION_OPTIONS = {
56+ URL_ROOT: '../',
57+ VERSION: '15.04',
58+ COLLAPSE_INDEX: false,
59+ FILE_SUFFIX: '.html',
60+ HAS_SOURCE: true
61+ };
62+ </script>
63+ <script type="text/javascript" src="../_static/jquery.js"></script>
64+ <script type="text/javascript" src="../_static/underscore.js"></script>
65+ <script type="text/javascript" src="../_static/doctools.js"></script>
66+ <link rel="shortcut icon" href="../_static/favicon.ico"/>
67+ <link rel="top" title="ubuntu-ui-toolkit-autopilot 15.04 documentation" href="../index.html" />
68+ </head>
69+ <body>
70+ <div class="related">
71+ <h3>Navigation</h3>
72+ <ul>
73+ <li class="right" style="margin-right: 10px">
74+ <a href="../genindex.html" title="General Index"
75+ accesskey="I">index</a></li>
76+ <li class="right" >
77+ <a href="../py-modindex.html" title="Python Module Index"
78+ >modules</a> |</li>
79+ <li><a href="../index.html">ubuntu-ui-toolkit-autopilot 15.04 documentation</a> &raquo;</li>
80+ </ul>
81+ </div>
82+<div class="document">
83+ <div class="documentwrapper">
84+ <div class="bodywrapper">
85+ <div class="body">
86+
87+ <h1>All modules for which code is available</h1>
88+<ul><li><a href="ubuntuuitoolkit.html">ubuntuuitoolkit</a></li>
89+</ul>
90+
91+ </div>
92+ </div>
93+ <div class="related">
94+ <h3>Navigation</h3>
95+ <ul>
96+ <li class="right" style="margin-right: 10px">
97+ <a href="../genindex.html" title="General Index"
98+ >index</a></li>
99+ <li class="right" >
100+ <a href="../py-modindex.html" title="Python Module Index"
101+ >modules</a> |</li>
102+ <li><a href="../index.html">ubuntu-ui-toolkit-autopilot 15.04 documentation</a> &raquo;</li>
103+ </ul>
104+ </div>
105+ <div class="footer">
106+ &copy; Copyright 2015, Canonical.
107+ </div>
108+ </body>
109+</html>
110\ No newline at end of file
111
112=== added file 'documentation/autopilot-helpers/_build/html/_modules/ubuntuuitoolkit.html'
113--- documentation/autopilot-helpers/_build/html/_modules/ubuntuuitoolkit.html 1970-01-01 00:00:00 +0000
114+++ documentation/autopilot-helpers/_build/html/_modules/ubuntuuitoolkit.html 2015-04-21 10:57:13 +0000
115@@ -0,0 +1,161 @@
116+<!--
117+ Copyright 2015 Canonical Ltd.
118+-->
119+
120+
121+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
122+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
123+
124+
125+<html xmlns="http://www.w3.org/1999/xhtml">
126+ <head>
127+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
128+
129+ <title>ubuntuuitoolkit &mdash; ubuntu-ui-toolkit-autopilot 15.04 documentation</title>
130+
131+ <link rel="stylesheet" href="../_static/default.css" type="text/css" />
132+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
133+
134+ <script type="text/javascript">
135+ var DOCUMENTATION_OPTIONS = {
136+ URL_ROOT: '../',
137+ VERSION: '15.04',
138+ COLLAPSE_INDEX: false,
139+ FILE_SUFFIX: '.html',
140+ HAS_SOURCE: true
141+ };
142+ </script>
143+ <script type="text/javascript" src="../_static/jquery.js"></script>
144+ <script type="text/javascript" src="../_static/underscore.js"></script>
145+ <script type="text/javascript" src="../_static/doctools.js"></script>
146+ <link rel="shortcut icon" href="../_static/favicon.ico"/>
147+ <link rel="top" title="ubuntu-ui-toolkit-autopilot 15.04 documentation" href="../index.html" />
148+ <link rel="up" title="Module code" href="index.html" />
149+ </head>
150+ <body>
151+ <div class="related">
152+ <h3>Navigation</h3>
153+ <ul>
154+ <li class="right" style="margin-right: 10px">
155+ <a href="../genindex.html" title="General Index"
156+ accesskey="I">index</a></li>
157+ <li class="right" >
158+ <a href="../py-modindex.html" title="Python Module Index"
159+ >modules</a> |</li>
160+ <li><a href="../index.html">ubuntu-ui-toolkit-autopilot 15.04 documentation</a> &raquo;</li>
161+ <li><a href="index.html" accesskey="U">Module code</a> &raquo;</li>
162+ </ul>
163+ </div>
164+<div class="document">
165+ <div class="documentwrapper">
166+ <div class="bodywrapper">
167+ <div class="body">
168+
169+ <h1>Source code for ubuntuuitoolkit</h1><div class="highlight"><pre>
170+<span class="c"># -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-</span>
171+<span class="c">#</span>
172+<span class="c"># Copyright (C) 2012, 2013, 2014 Canonical Ltd.</span>
173+<span class="c">#</span>
174+<span class="c"># This program is free software; you can redistribute it and/or modify</span>
175+<span class="c"># it under the terms of the GNU Lesser General Public License as published by</span>
176+<span class="c"># the Free Software Foundation; version 3.</span>
177+<span class="c">#</span>
178+<span class="c"># This program is distributed in the hope that it will be useful,</span>
179+<span class="c"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
180+<span class="c"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
181+<span class="c"># GNU Lesser General Public License for more details.</span>
182+<span class="c">#</span>
183+<span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
184+<span class="c"># along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
185+
186+<span class="sd">&quot;&quot;&quot;Ubuntu UI Toolkit Autopilot tests and helpers.&quot;&quot;&quot;</span>
187+
188+
189+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
190+ <span class="s">&#39;AppHeader&#39;</span><span class="p">,</span>
191+ <span class="s">&#39;base&#39;</span><span class="p">,</span>
192+ <span class="s">&#39;check_autopilot_version&#39;</span><span class="p">,</span>
193+ <span class="s">&#39;CheckBox&#39;</span><span class="p">,</span>
194+ <span class="s">&#39;environment&#39;</span><span class="p">,</span>
195+ <span class="s">&#39;fixture_setup&#39;</span><span class="p">,</span>
196+ <span class="s">&#39;get_keyboard&#39;</span><span class="p">,</span>
197+ <span class="s">&#39;get_pointing_device&#39;</span><span class="p">,</span>
198+ <span class="s">&#39;Header&#39;</span><span class="p">,</span>
199+ <span class="s">&#39;Dialog&#39;</span><span class="p">,</span>
200+ <span class="s">&#39;listitems&#39;</span><span class="p">,</span>
201+ <span class="s">&#39;UCListItem&#39;</span><span class="p">,</span>
202+ <span class="s">&#39;MainView&#39;</span><span class="p">,</span>
203+ <span class="s">&#39;OptionSelector&#39;</span><span class="p">,</span>
204+ <span class="s">&#39;pickers&#39;</span><span class="p">,</span>
205+ <span class="s">&#39;popups&#39;</span><span class="p">,</span>
206+ <span class="s">&#39;QQuickFlickable&#39;</span><span class="p">,</span>
207+ <span class="s">&#39;QQuickGridView&#39;</span><span class="p">,</span>
208+ <span class="s">&#39;QQuickListView&#39;</span><span class="p">,</span>
209+ <span class="s">&#39;TabBar&#39;</span><span class="p">,</span>
210+ <span class="s">&#39;Tabs&#39;</span><span class="p">,</span>
211+ <span class="s">&#39;tests&#39;</span><span class="p">,</span>
212+ <span class="s">&#39;TextArea&#39;</span><span class="p">,</span>
213+ <span class="s">&#39;TextField&#39;</span><span class="p">,</span>
214+ <span class="s">&#39;Toolbar&#39;</span><span class="p">,</span>
215+ <span class="s">&#39;ToolkitException&#39;</span><span class="p">,</span>
216+ <span class="s">&#39;ubuntu_scenarios&#39;</span><span class="p">,</span>
217+ <span class="s">&#39;UbuntuListView11&#39;</span><span class="p">,</span>
218+ <span class="s">&#39;UbuntuUIToolkitCustomProxyObjectBase&#39;</span><span class="p">,</span>
219+<span class="p">]</span>
220+
221+
222+<span class="kn">from</span> <span class="nn">ubuntuuitoolkit</span> <span class="kn">import</span> <span class="p">(</span>
223+ <span class="n">base</span><span class="p">,</span>
224+ <span class="n">environment</span><span class="p">,</span>
225+ <span class="n">fixture_setup</span><span class="p">,</span>
226+ <span class="n">tests</span><span class="p">,</span>
227+ <span class="n">ubuntu_scenarios</span>
228+<span class="p">)</span>
229+<span class="kn">from</span> <span class="nn">ubuntuuitoolkit._custom_proxy_objects</span> <span class="kn">import</span> <span class="p">(</span>
230+ <span class="n">AppHeader</span><span class="p">,</span>
231+ <span class="n">check_autopilot_version</span><span class="p">,</span>
232+ <span class="n">CheckBox</span><span class="p">,</span>
233+ <span class="n">get_keyboard</span><span class="p">,</span>
234+ <span class="n">get_pointing_device</span><span class="p">,</span>
235+ <span class="n">Header</span><span class="p">,</span>
236+ <span class="n">Dialog</span><span class="p">,</span>
237+ <span class="n">listitems</span><span class="p">,</span>
238+ <span class="n">UCListItem</span><span class="p">,</span>
239+ <span class="n">MainView</span><span class="p">,</span>
240+ <span class="n">OptionSelector</span><span class="p">,</span>
241+ <span class="n">pickers</span><span class="p">,</span>
242+ <span class="n">popups</span><span class="p">,</span>
243+ <span class="n">QQuickFlickable</span><span class="p">,</span>
244+ <span class="n">QQuickGridView</span><span class="p">,</span>
245+ <span class="n">QQuickListView</span><span class="p">,</span>
246+ <span class="n">TabBar</span><span class="p">,</span>
247+ <span class="n">Tabs</span><span class="p">,</span>
248+ <span class="n">TextArea</span><span class="p">,</span>
249+ <span class="n">TextField</span><span class="p">,</span>
250+ <span class="n">Toolbar</span><span class="p">,</span>
251+ <span class="n">ToolkitException</span><span class="p">,</span>
252+ <span class="n">UbuntuUIToolkitCustomProxyObjectBase</span><span class="p">,</span>
253+ <span class="n">UbuntuListView11</span><span class="p">,</span>
254+<span class="p">)</span>
255+</pre></div>
256+
257+ </div>
258+ </div>
259+ <div class="related">
260+ <h3>Navigation</h3>
261+ <ul>
262+ <li class="right" style="margin-right: 10px">
263+ <a href="../genindex.html" title="General Index"
264+ >index</a></li>
265+ <li class="right" >
266+ <a href="../py-modindex.html" title="Python Module Index"
267+ >modules</a> |</li>
268+ <li><a href="../index.html">ubuntu-ui-toolkit-autopilot 15.04 documentation</a> &raquo;</li>
269+ <li><a href="index.html" >Module code</a> &raquo;</li>
270+ </ul>
271+ </div>
272+ <div class="footer">
273+ &copy; Copyright 2015, Canonical.
274+ </div>
275+ </body>
276+</html>
277\ No newline at end of file
278
279=== added directory 'documentation/autopilot-helpers/_build/html/_sources'
280=== added file 'documentation/autopilot-helpers/_build/html/_sources/index.txt'
281--- documentation/autopilot-helpers/_build/html/_sources/index.txt 1970-01-01 00:00:00 +0000
282+++ documentation/autopilot-helpers/_build/html/_sources/index.txt 2015-04-21 10:57:13 +0000
283@@ -0,0 +1,17 @@
284+.. ubuntu-ui-toolkit-autopilot documentation master file, created by
285+ sphinx-quickstart on Thu Jan 8 12:39:43 2015.
286+ You can adapt this file completely to your liking, but it should at least
287+ contain the root `toctree` directive.
288+
289+Welcome to ubuntu-ui-toolkit-autopilot's documentation!
290+======================================
291+
292+Contents:
293+
294+.. toctree::
295+ :maxdepth: 2
296+
297+ ubuntuuitoolkit
298+
299+* :ref:`genindex`
300+
301
302=== added file 'documentation/autopilot-helpers/_build/html/_sources/ubuntuuitoolkit.txt'
303--- documentation/autopilot-helpers/_build/html/_sources/ubuntuuitoolkit.txt 1970-01-01 00:00:00 +0000
304+++ documentation/autopilot-helpers/_build/html/_sources/ubuntuuitoolkit.txt 2015-04-21 10:57:13 +0000
305@@ -0,0 +1,10 @@
306+ubuntuuitoolkit Package
307+=======================
308+
309+:mod:`custom proxy object` Module
310+---------------------------------
311+
312+.. automodule:: ubuntuuitoolkit
313+ :members:
314+ :undoc-members:
315+ :show-inheritance:
316
317=== added directory 'documentation/autopilot-helpers/_build/html/_static'
318=== added file 'documentation/autopilot-helpers/_build/html/_static/ajax-loader.gif'
319Binary files documentation/autopilot-helpers/_build/html/_static/ajax-loader.gif 1970-01-01 00:00:00 +0000 and documentation/autopilot-helpers/_build/html/_static/ajax-loader.gif 2015-04-21 10:57:13 +0000 differ
320=== added file 'documentation/autopilot-helpers/_build/html/_static/basic.css'
321--- documentation/autopilot-helpers/_build/html/_static/basic.css 1970-01-01 00:00:00 +0000
322+++ documentation/autopilot-helpers/_build/html/_static/basic.css 2015-04-21 10:57:13 +0000
323@@ -0,0 +1,537 @@
324+/*
325+ * basic.css
326+ * ~~~~~~~~~
327+ *
328+ * Sphinx stylesheet -- basic theme.
329+ *
330+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
331+ * :license: BSD, see LICENSE for details.
332+ *
333+ */
334+
335+/* -- main layout ----------------------------------------------------------- */
336+
337+div.clearer {
338+ clear: both;
339+}
340+
341+/* -- relbar ---------------------------------------------------------------- */
342+
343+div.related {
344+ width: 100%;
345+ font-size: 90%;
346+}
347+
348+div.related h3 {
349+ display: none;
350+}
351+
352+div.related ul {
353+ margin: 0;
354+ padding: 0 0 0 10px;
355+ list-style: none;
356+}
357+
358+div.related li {
359+ display: inline;
360+}
361+
362+div.related li.right {
363+ float: right;
364+ margin-right: 5px;
365+}
366+
367+/* -- sidebar --------------------------------------------------------------- */
368+
369+div.sphinxsidebarwrapper {
370+ padding: 10px 5px 0 10px;
371+}
372+
373+div.sphinxsidebar {
374+ float: left;
375+ width: 230px;
376+ margin-left: -100%;
377+ font-size: 90%;
378+}
379+
380+div.sphinxsidebar ul {
381+ list-style: none;
382+}
383+
384+div.sphinxsidebar ul ul,
385+div.sphinxsidebar ul.want-points {
386+ margin-left: 20px;
387+ list-style: square;
388+}
389+
390+div.sphinxsidebar ul ul {
391+ margin-top: 0;
392+ margin-bottom: 0;
393+}
394+
395+div.sphinxsidebar form {
396+ margin-top: 10px;
397+}
398+
399+div.sphinxsidebar input {
400+ border: 1px solid #98dbcc;
401+ font-family: sans-serif;
402+ font-size: 1em;
403+}
404+
405+div.sphinxsidebar #searchbox input[type="text"] {
406+ width: 170px;
407+}
408+
409+div.sphinxsidebar #searchbox input[type="submit"] {
410+ width: 30px;
411+}
412+
413+img {
414+ border: 0;
415+ max-width: 100%;
416+}
417+
418+/* -- search page ----------------------------------------------------------- */
419+
420+ul.search {
421+ margin: 10px 0 0 20px;
422+ padding: 0;
423+}
424+
425+ul.search li {
426+ padding: 5px 0 5px 20px;
427+ background-image: url(file.png);
428+ background-repeat: no-repeat;
429+ background-position: 0 7px;
430+}
431+
432+ul.search li a {
433+ font-weight: bold;
434+}
435+
436+ul.search li div.context {
437+ color: #888;
438+ margin: 2px 0 0 30px;
439+ text-align: left;
440+}
441+
442+ul.keywordmatches li.goodmatch a {
443+ font-weight: bold;
444+}
445+
446+/* -- index page ------------------------------------------------------------ */
447+
448+table.contentstable {
449+ width: 90%;
450+}
451+
452+table.contentstable p.biglink {
453+ line-height: 150%;
454+}
455+
456+a.biglink {
457+ font-size: 1.3em;
458+}
459+
460+span.linkdescr {
461+ font-style: italic;
462+ padding-top: 5px;
463+ font-size: 90%;
464+}
465+
466+/* -- general index --------------------------------------------------------- */
467+
468+table.indextable {
469+ width: 100%;
470+}
471+
472+table.indextable td {
473+ text-align: left;
474+ vertical-align: top;
475+}
476+
477+table.indextable dl, table.indextable dd {
478+ margin-top: 0;
479+ margin-bottom: 0;
480+}
481+
482+table.indextable tr.pcap {
483+ height: 10px;
484+}
485+
486+table.indextable tr.cap {
487+ margin-top: 10px;
488+ background-color: #f2f2f2;
489+}
490+
491+img.toggler {
492+ margin-right: 3px;
493+ margin-top: 3px;
494+ cursor: pointer;
495+}
496+
497+div.modindex-jumpbox {
498+ border-top: 1px solid #ddd;
499+ border-bottom: 1px solid #ddd;
500+ margin: 1em 0 1em 0;
501+ padding: 0.4em;
502+}
503+
504+div.genindex-jumpbox {
505+ border-top: 1px solid #ddd;
506+ border-bottom: 1px solid #ddd;
507+ margin: 1em 0 1em 0;
508+ padding: 0.4em;
509+}
510+
511+/* -- general body styles --------------------------------------------------- */
512+
513+a.headerlink {
514+ visibility: hidden;
515+}
516+
517+h1:hover > a.headerlink,
518+h2:hover > a.headerlink,
519+h3:hover > a.headerlink,
520+h4:hover > a.headerlink,
521+h5:hover > a.headerlink,
522+h6:hover > a.headerlink,
523+dt:hover > a.headerlink {
524+ visibility: visible;
525+}
526+
527+div.body p.caption {
528+ text-align: inherit;
529+}
530+
531+div.body td {
532+ text-align: left;
533+}
534+
535+.field-list ul {
536+ padding-left: 1em;
537+}
538+
539+.first {
540+ margin-top: 0 !important;
541+}
542+
543+p.rubric {
544+ margin-top: 30px;
545+ font-weight: bold;
546+}
547+
548+img.align-left, .figure.align-left, object.align-left {
549+ clear: left;
550+ float: left;
551+ margin-right: 1em;
552+}
553+
554+img.align-right, .figure.align-right, object.align-right {
555+ clear: right;
556+ float: right;
557+ margin-left: 1em;
558+}
559+
560+img.align-center, .figure.align-center, object.align-center {
561+ display: block;
562+ margin-left: auto;
563+ margin-right: auto;
564+}
565+
566+.align-left {
567+ text-align: left;
568+}
569+
570+.align-center {
571+ text-align: center;
572+}
573+
574+.align-right {
575+ text-align: right;
576+}
577+
578+/* -- sidebars -------------------------------------------------------------- */
579+
580+div.sidebar {
581+ margin: 0 0 0.5em 1em;
582+ border: 1px solid #ddb;
583+ padding: 7px 7px 0 7px;
584+ background-color: #ffe;
585+ width: 40%;
586+ float: right;
587+}
588+
589+p.sidebar-title {
590+ font-weight: bold;
591+}
592+
593+/* -- topics ---------------------------------------------------------------- */
594+
595+div.topic {
596+ border: 1px solid #ccc;
597+ padding: 7px 7px 0 7px;
598+ margin: 10px 0 10px 0;
599+}
600+
601+p.topic-title {
602+ font-size: 1.1em;
603+ font-weight: bold;
604+ margin-top: 10px;
605+}
606+
607+/* -- admonitions ----------------------------------------------------------- */
608+
609+div.admonition {
610+ margin-top: 10px;
611+ margin-bottom: 10px;
612+ padding: 7px;
613+}
614+
615+div.admonition dt {
616+ font-weight: bold;
617+}
618+
619+div.admonition dl {
620+ margin-bottom: 0;
621+}
622+
623+p.admonition-title {
624+ margin: 0px 10px 5px 0px;
625+ font-weight: bold;
626+}
627+
628+div.body p.centered {
629+ text-align: center;
630+ margin-top: 25px;
631+}
632+
633+/* -- tables ---------------------------------------------------------------- */
634+
635+table.docutils {
636+ border: 0;
637+ border-collapse: collapse;
638+}
639+
640+table.docutils td, table.docutils th {
641+ padding: 1px 8px 1px 5px;
642+ border-top: 0;
643+ border-left: 0;
644+ border-right: 0;
645+ border-bottom: 1px solid #aaa;
646+}
647+
648+table.field-list td, table.field-list th {
649+ border: 0 !important;
650+}
651+
652+table.footnote td, table.footnote th {
653+ border: 0 !important;
654+}
655+
656+th {
657+ text-align: left;
658+ padding-right: 5px;
659+}
660+
661+table.citation {
662+ border-left: solid 1px gray;
663+ margin-left: 1px;
664+}
665+
666+table.citation td {
667+ border-bottom: none;
668+}
669+
670+/* -- other body styles ----------------------------------------------------- */
671+
672+ol.arabic {
673+ list-style: decimal;
674+}
675+
676+ol.loweralpha {
677+ list-style: lower-alpha;
678+}
679+
680+ol.upperalpha {
681+ list-style: upper-alpha;
682+}
683+
684+ol.lowerroman {
685+ list-style: lower-roman;
686+}
687+
688+ol.upperroman {
689+ list-style: upper-roman;
690+}
691+
692+dl {
693+ margin-bottom: 15px;
694+}
695+
696+dd p {
697+ margin-top: 0px;
698+}
699+
700+dd ul, dd table {
701+ margin-bottom: 10px;
702+}
703+
704+dd {
705+ margin-top: 3px;
706+ margin-bottom: 10px;
707+ margin-left: 30px;
708+}
709+
710+dt:target, .highlighted {
711+ background-color: #fbe54e;
712+}
713+
714+dl.glossary dt {
715+ font-weight: bold;
716+ font-size: 1.1em;
717+}
718+
719+.field-list ul {
720+ margin: 0;
721+ padding-left: 1em;
722+}
723+
724+.field-list p {
725+ margin: 0;
726+}
727+
728+.optional {
729+ font-size: 1.3em;
730+}
731+
732+.versionmodified {
733+ font-style: italic;
734+}
735+
736+.system-message {
737+ background-color: #fda;
738+ padding: 5px;
739+ border: 3px solid red;
740+}
741+
742+.footnote:target {
743+ background-color: #ffa;
744+}
745+
746+.line-block {
747+ display: block;
748+ margin-top: 1em;
749+ margin-bottom: 1em;
750+}
751+
752+.line-block .line-block {
753+ margin-top: 0;
754+ margin-bottom: 0;
755+ margin-left: 1.5em;
756+}
757+
758+.guilabel, .menuselection {
759+ font-family: sans-serif;
760+}
761+
762+.accelerator {
763+ text-decoration: underline;
764+}
765+
766+.classifier {
767+ font-style: oblique;
768+}
769+
770+abbr, acronym {
771+ border-bottom: dotted 1px;
772+ cursor: help;
773+}
774+
775+/* -- code displays --------------------------------------------------------- */
776+
777+pre {
778+ overflow: auto;
779+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
780+}
781+
782+td.linenos pre {
783+ padding: 5px 0px;
784+ border: 0;
785+ background-color: transparent;
786+ color: #aaa;
787+}
788+
789+table.highlighttable {
790+ margin-left: 0.5em;
791+}
792+
793+table.highlighttable td {
794+ padding: 0 0.5em 0 0.5em;
795+}
796+
797+tt.descname {
798+ background-color: transparent;
799+ font-weight: bold;
800+ font-size: 1.2em;
801+}
802+
803+tt.descclassname {
804+ background-color: transparent;
805+}
806+
807+tt.xref, a tt {
808+ background-color: transparent;
809+ font-weight: bold;
810+}
811+
812+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
813+ background-color: transparent;
814+}
815+
816+.viewcode-link {
817+ float: right;
818+}
819+
820+.viewcode-back {
821+ float: right;
822+ font-family: sans-serif;
823+}
824+
825+div.viewcode-block:target {
826+ margin: -1px -10px;
827+ padding: 0 10px;
828+}
829+
830+/* -- math display ---------------------------------------------------------- */
831+
832+img.math {
833+ vertical-align: middle;
834+}
835+
836+div.body div.math p {
837+ text-align: center;
838+}
839+
840+span.eqno {
841+ float: right;
842+}
843+
844+/* -- printout stylesheet --------------------------------------------------- */
845+
846+@media print {
847+ div.document,
848+ div.documentwrapper,
849+ div.bodywrapper {
850+ margin: 0 !important;
851+ width: 100%;
852+ }
853+
854+ div.sphinxsidebar,
855+ div.related,
856+ div.footer,
857+ #top-link {
858+ display: none;
859+ }
860+}
861\ No newline at end of file
862
863=== added file 'documentation/autopilot-helpers/_build/html/_static/comment-bright.png'
864Binary files documentation/autopilot-helpers/_build/html/_static/comment-bright.png 1970-01-01 00:00:00 +0000 and documentation/autopilot-helpers/_build/html/_static/comment-bright.png 2015-04-21 10:57:13 +0000 differ
865=== added file 'documentation/autopilot-helpers/_build/html/_static/comment-close.png'
866Binary files documentation/autopilot-helpers/_build/html/_static/comment-close.png 1970-01-01 00:00:00 +0000 and documentation/autopilot-helpers/_build/html/_static/comment-close.png 2015-04-21 10:57:13 +0000 differ
867=== added file 'documentation/autopilot-helpers/_build/html/_static/comment.png'
868Binary files documentation/autopilot-helpers/_build/html/_static/comment.png 1970-01-01 00:00:00 +0000 and documentation/autopilot-helpers/_build/html/_static/comment.png 2015-04-21 10:57:13 +0000 differ
869=== added file 'documentation/autopilot-helpers/_build/html/_static/default.css'
870--- documentation/autopilot-helpers/_build/html/_static/default.css 1970-01-01 00:00:00 +0000
871+++ documentation/autopilot-helpers/_build/html/_static/default.css 2015-04-21 10:57:13 +0000
872@@ -0,0 +1,256 @@
873+/*
874+ * default.css_t
875+ * ~~~~~~~~~~~~~
876+ *
877+ * Sphinx stylesheet -- default theme.
878+ *
879+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
880+ * :license: BSD, see LICENSE for details.
881+ *
882+ */
883+
884+@import url("basic.css");
885+
886+/* -- page layout ----------------------------------------------------------- */
887+
888+body {
889+ font-family: sans-serif;
890+ font-size: 100%;
891+ background-color: #11303d;
892+ color: #000;
893+ margin: 0;
894+ padding: 0;
895+}
896+
897+div.document {
898+ background-color: #1c4e63;
899+}
900+
901+div.documentwrapper {
902+ float: left;
903+ width: 100%;
904+}
905+
906+div.bodywrapper {
907+ margin: 0 0 0 230px;
908+}
909+
910+div.body {
911+ background-color: #ffffff;
912+ color: #000000;
913+ padding: 0 20px 30px 20px;
914+}
915+
916+div.footer {
917+ color: #ffffff;
918+ width: 100%;
919+ padding: 9px 0 9px 0;
920+ text-align: center;
921+ font-size: 75%;
922+}
923+
924+div.footer a {
925+ color: #ffffff;
926+ text-decoration: underline;
927+}
928+
929+div.related {
930+ background-color: #133f52;
931+ line-height: 30px;
932+ color: #ffffff;
933+}
934+
935+div.related a {
936+ color: #ffffff;
937+}
938+
939+div.sphinxsidebar {
940+}
941+
942+div.sphinxsidebar h3 {
943+ font-family: 'Trebuchet MS', sans-serif;
944+ color: #ffffff;
945+ font-size: 1.4em;
946+ font-weight: normal;
947+ margin: 0;
948+ padding: 0;
949+}
950+
951+div.sphinxsidebar h3 a {
952+ color: #ffffff;
953+}
954+
955+div.sphinxsidebar h4 {
956+ font-family: 'Trebuchet MS', sans-serif;
957+ color: #ffffff;
958+ font-size: 1.3em;
959+ font-weight: normal;
960+ margin: 5px 0 0 0;
961+ padding: 0;
962+}
963+
964+div.sphinxsidebar p {
965+ color: #ffffff;
966+}
967+
968+div.sphinxsidebar p.topless {
969+ margin: 5px 10px 10px 10px;
970+}
971+
972+div.sphinxsidebar ul {
973+ margin: 10px;
974+ padding: 0;
975+ color: #ffffff;
976+}
977+
978+div.sphinxsidebar a {
979+ color: #98dbcc;
980+}
981+
982+div.sphinxsidebar input {
983+ border: 1px solid #98dbcc;
984+ font-family: sans-serif;
985+ font-size: 1em;
986+}
987+
988+
989+
990+/* -- hyperlink styles ------------------------------------------------------ */
991+
992+a {
993+ color: #355f7c;
994+ text-decoration: none;
995+}
996+
997+a:visited {
998+ color: #355f7c;
999+ text-decoration: none;
1000+}
1001+
1002+a:hover {
1003+ text-decoration: underline;
1004+}
1005+
1006+
1007+
1008+/* -- body styles ----------------------------------------------------------- */
1009+
1010+div.body h1,
1011+div.body h2,
1012+div.body h3,
1013+div.body h4,
1014+div.body h5,
1015+div.body h6 {
1016+ font-family: 'Trebuchet MS', sans-serif;
1017+ background-color: #f2f2f2;
1018+ font-weight: normal;
1019+ color: #20435c;
1020+ border-bottom: 1px solid #ccc;
1021+ margin: 20px -20px 10px -20px;
1022+ padding: 3px 0 3px 10px;
1023+}
1024+
1025+div.body h1 { margin-top: 0; font-size: 200%; }
1026+div.body h2 { font-size: 160%; }
1027+div.body h3 { font-size: 140%; }
1028+div.body h4 { font-size: 120%; }
1029+div.body h5 { font-size: 110%; }
1030+div.body h6 { font-size: 100%; }
1031+
1032+a.headerlink {
1033+ color: #c60f0f;
1034+ font-size: 0.8em;
1035+ padding: 0 4px 0 4px;
1036+ text-decoration: none;
1037+}
1038+
1039+a.headerlink:hover {
1040+ background-color: #c60f0f;
1041+ color: white;
1042+}
1043+
1044+div.body p, div.body dd, div.body li {
1045+ text-align: justify;
1046+ line-height: 130%;
1047+}
1048+
1049+div.admonition p.admonition-title + p {
1050+ display: inline;
1051+}
1052+
1053+div.admonition p {
1054+ margin-bottom: 5px;
1055+}
1056+
1057+div.admonition pre {
1058+ margin-bottom: 5px;
1059+}
1060+
1061+div.admonition ul, div.admonition ol {
1062+ margin-bottom: 5px;
1063+}
1064+
1065+div.note {
1066+ background-color: #eee;
1067+ border: 1px solid #ccc;
1068+}
1069+
1070+div.seealso {
1071+ background-color: #ffc;
1072+ border: 1px solid #ff6;
1073+}
1074+
1075+div.topic {
1076+ background-color: #eee;
1077+}
1078+
1079+div.warning {
1080+ background-color: #ffe4e4;
1081+ border: 1px solid #f66;
1082+}
1083+
1084+p.admonition-title {
1085+ display: inline;
1086+}
1087+
1088+p.admonition-title:after {
1089+ content: ":";
1090+}
1091+
1092+pre {
1093+ padding: 5px;
1094+ background-color: #eeffcc;
1095+ color: #333333;
1096+ line-height: 120%;
1097+ border: 1px solid #ac9;
1098+ border-left: none;
1099+ border-right: none;
1100+}
1101+
1102+tt {
1103+ background-color: #ecf0f3;
1104+ padding: 0 1px 0 1px;
1105+ font-size: 0.95em;
1106+}
1107+
1108+th {
1109+ background-color: #ede;
1110+}
1111+
1112+.warning tt {
1113+ background: #efc2c2;
1114+}
1115+
1116+.note tt {
1117+ background: #d6d6d6;
1118+}
1119+
1120+.viewcode-back {
1121+ font-family: sans-serif;
1122+}
1123+
1124+div.viewcode-block:target {
1125+ background-color: #f4debf;
1126+ border-top: 1px solid #ac9;
1127+ border-bottom: 1px solid #ac9;
1128+}
1129\ No newline at end of file
1130
1131=== added file 'documentation/autopilot-helpers/_build/html/_static/doctools.js'
1132--- documentation/autopilot-helpers/_build/html/_static/doctools.js 1970-01-01 00:00:00 +0000
1133+++ documentation/autopilot-helpers/_build/html/_static/doctools.js 2015-04-21 10:57:13 +0000
1134@@ -0,0 +1,238 @@
1135+/*
1136+ * doctools.js
1137+ * ~~~~~~~~~~~
1138+ *
1139+ * Sphinx JavaScript utilities for all documentation.
1140+ *
1141+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
1142+ * :license: BSD, see LICENSE for details.
1143+ *
1144+ */
1145+
1146+/**
1147+ * select a different prefix for underscore
1148+ */
1149+$u = _.noConflict();
1150+
1151+/**
1152+ * make the code below compatible with browsers without
1153+ * an installed firebug like debugger
1154+if (!window.console || !console.firebug) {
1155+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
1156+ "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
1157+ "profile", "profileEnd"];
1158+ window.console = {};
1159+ for (var i = 0; i < names.length; ++i)
1160+ window.console[names[i]] = function() {};
1161+}
1162+ */
1163+
1164+/**
1165+ * small helper function to urldecode strings
1166+ */
1167+jQuery.urldecode = function(x) {
1168+ return decodeURIComponent(x).replace(/\+/g, ' ');
1169+};
1170+
1171+/**
1172+ * small helper function to urlencode strings
1173+ */
1174+jQuery.urlencode = encodeURIComponent;
1175+
1176+/**
1177+ * This function returns the parsed url parameters of the
1178+ * current request. Multiple values per key are supported,
1179+ * it will always return arrays of strings for the value parts.
1180+ */
1181+jQuery.getQueryParameters = function(s) {
1182+ if (typeof s == 'undefined')
1183+ s = document.location.search;
1184+ var parts = s.substr(s.indexOf('?') + 1).split('&');
1185+ var result = {};
1186+ for (var i = 0; i < parts.length; i++) {
1187+ var tmp = parts[i].split('=', 2);
1188+ var key = jQuery.urldecode(tmp[0]);
1189+ var value = jQuery.urldecode(tmp[1]);
1190+ if (key in result)
1191+ result[key].push(value);
1192+ else
1193+ result[key] = [value];
1194+ }
1195+ return result;
1196+};
1197+
1198+/**
1199+ * highlight a given string on a jquery object by wrapping it in
1200+ * span elements with the given class name.
1201+ */
1202+jQuery.fn.highlightText = function(text, className) {
1203+ function highlight(node) {
1204+ if (node.nodeType == 3) {
1205+ var val = node.nodeValue;
1206+ var pos = val.toLowerCase().indexOf(text);
1207+ if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
1208+ var span = document.createElement("span");
1209+ span.className = className;
1210+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
1211+ node.parentNode.insertBefore(span, node.parentNode.insertBefore(
1212+ document.createTextNode(val.substr(pos + text.length)),
1213+ node.nextSibling));
1214+ node.nodeValue = val.substr(0, pos);
1215+ }
1216+ }
1217+ else if (!jQuery(node).is("button, select, textarea")) {
1218+ jQuery.each(node.childNodes, function() {
1219+ highlight(this);
1220+ });
1221+ }
1222+ }
1223+ return this.each(function() {
1224+ highlight(this);
1225+ });
1226+};
1227+
1228+/**
1229+ * Small JavaScript module for the documentation.
1230+ */
1231+var Documentation = {
1232+
1233+ init : function() {
1234+ this.fixFirefoxAnchorBug();
1235+ this.highlightSearchWords();
1236+ this.initIndexTable();
1237+ },
1238+
1239+ /**
1240+ * i18n support
1241+ */
1242+ TRANSLATIONS : {},
1243+ PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
1244+ LOCALE : 'unknown',
1245+
1246+ // gettext and ngettext don't access this so that the functions
1247+ // can safely bound to a different name (_ = Documentation.gettext)
1248+ gettext : function(string) {
1249+ var translated = Documentation.TRANSLATIONS[string];
1250+ if (typeof translated == 'undefined')
1251+ return string;
1252+ return (typeof translated == 'string') ? translated : translated[0];
1253+ },
1254+
1255+ ngettext : function(singular, plural, n) {
1256+ var translated = Documentation.TRANSLATIONS[singular];
1257+ if (typeof translated == 'undefined')
1258+ return (n == 1) ? singular : plural;
1259+ return translated[Documentation.PLURALEXPR(n)];
1260+ },
1261+
1262+ addTranslations : function(catalog) {
1263+ for (var key in catalog.messages)
1264+ this.TRANSLATIONS[key] = catalog.messages[key];
1265+ this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
1266+ this.LOCALE = catalog.locale;
1267+ },
1268+
1269+ /**
1270+ * add context elements like header anchor links
1271+ */
1272+ addContextElements : function() {
1273+ $('div[id] > :header:first').each(function() {
1274+ $('<a class="headerlink">\u00B6</a>').
1275+ attr('href', '#' + this.id).
1276+ attr('title', _('Permalink to this headline')).
1277+ appendTo(this);
1278+ });
1279+ $('dt[id]').each(function() {
1280+ $('<a class="headerlink">\u00B6</a>').
1281+ attr('href', '#' + this.id).
1282+ attr('title', _('Permalink to this definition')).
1283+ appendTo(this);
1284+ });
1285+ },
1286+
1287+ /**
1288+ * workaround a firefox stupidity
1289+ */
1290+ fixFirefoxAnchorBug : function() {
1291+ if (document.location.hash && $.browser.mozilla)
1292+ window.setTimeout(function() {
1293+ document.location.href += '';
1294+ }, 10);
1295+ },
1296+
1297+ /**
1298+ * highlight the search words provided in the url in the text
1299+ */
1300+ highlightSearchWords : function() {
1301+ var params = $.getQueryParameters();
1302+ var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
1303+ if (terms.length) {
1304+ var body = $('div.body');
1305+ if (!body.length) {
1306+ body = $('body');
1307+ }
1308+ window.setTimeout(function() {
1309+ $.each(terms, function() {
1310+ body.highlightText(this.toLowerCase(), 'highlighted');
1311+ });
1312+ }, 10);
1313+ $('<p class="highlight-link"><a href="javascript:Documentation.' +
1314+ 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
1315+ .appendTo($('#searchbox'));
1316+ }
1317+ },
1318+
1319+ /**
1320+ * init the domain index toggle buttons
1321+ */
1322+ initIndexTable : function() {
1323+ var togglers = $('img.toggler').click(function() {
1324+ var src = $(this).attr('src');
1325+ var idnum = $(this).attr('id').substr(7);
1326+ $('tr.cg-' + idnum).toggle();
1327+ if (src.substr(-9) == 'minus.png')
1328+ $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
1329+ else
1330+ $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
1331+ }).css('display', '');
1332+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
1333+ togglers.click();
1334+ }
1335+ },
1336+
1337+ /**
1338+ * helper function to hide the search marks again
1339+ */
1340+ hideSearchWords : function() {
1341+ $('#searchbox .highlight-link').fadeOut(300);
1342+ $('span.highlighted').removeClass('highlighted');
1343+ },
1344+
1345+ /**
1346+ * make the url absolute
1347+ */
1348+ makeURL : function(relativeURL) {
1349+ return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
1350+ },
1351+
1352+ /**
1353+ * get the current relative url
1354+ */
1355+ getCurrentURL : function() {
1356+ var path = document.location.pathname;
1357+ var parts = path.split(/\//);
1358+ $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
1359+ if (this == '..')
1360+ parts.pop();
1361+ });
1362+ var url = parts.join('/');
1363+ return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
1364+ }
1365+};
1366+
1367+// quick alias for translations
1368+_ = Documentation.gettext;
1369+
1370+$(document).ready(function() {
1371+ Documentation.init();
1372+});
1373
1374=== added file 'documentation/autopilot-helpers/_build/html/_static/down-pressed.png'
1375Binary files documentation/autopilot-helpers/_build/html/_static/down-pressed.png 1970-01-01 00:00:00 +0000 and documentation/autopilot-helpers/_build/html/_static/down-pressed.png 2015-04-21 10:57:13 +0000 differ
1376=== added file 'documentation/autopilot-helpers/_build/html/_static/down.png'
1377Binary files documentation/autopilot-helpers/_build/html/_static/down.png 1970-01-01 00:00:00 +0000 and documentation/autopilot-helpers/_build/html/_static/down.png 2015-04-21 10:57:13 +0000 differ
1378=== added file 'documentation/autopilot-helpers/_build/html/_static/favicon.ico'
1379Binary files documentation/autopilot-helpers/_build/html/_static/favicon.ico 1970-01-01 00:00:00 +0000 and documentation/autopilot-helpers/_build/html/_static/favicon.ico 2015-04-21 10:57:13 +0000 differ
1380=== added file 'documentation/autopilot-helpers/_build/html/_static/file.png'
1381Binary files documentation/autopilot-helpers/_build/html/_static/file.png 1970-01-01 00:00:00 +0000 and documentation/autopilot-helpers/_build/html/_static/file.png 2015-04-21 10:57:13 +0000 differ
1382=== added file 'documentation/autopilot-helpers/_build/html/_static/jquery.js'
1383--- documentation/autopilot-helpers/_build/html/_static/jquery.js 1970-01-01 00:00:00 +0000
1384+++ documentation/autopilot-helpers/_build/html/_static/jquery.js 2015-04-21 10:57:13 +0000
1385@@ -0,0 +1,9404 @@
1386+/*!
1387+ * jQuery JavaScript Library v1.7.2
1388+ * http://jquery.com/
1389+ *
1390+ * Copyright 2011, John Resig
1391+ * Dual licensed under the MIT or GPL Version 2 licenses.
1392+ * http://jquery.org/license
1393+ *
1394+ * Includes Sizzle.js
1395+ * http://sizzlejs.com/
1396+ * Copyright 2011, The Dojo Foundation
1397+ * Released under the MIT, BSD, and GPL Licenses.
1398+ *
1399+ * Date: Wed Jul 30 14:06:55 UTC 2014
1400+ */
1401+(function( window, undefined ) {
1402+
1403+// Use the correct document accordingly with window argument (sandbox)
1404+var document = window.document,
1405+ navigator = window.navigator,
1406+ location = window.location;
1407+var jQuery = (function() {
1408+
1409+// Define a local copy of jQuery
1410+var jQuery = function( selector, context ) {
1411+ // The jQuery object is actually just the init constructor 'enhanced'
1412+ return new jQuery.fn.init( selector, context, rootjQuery );
1413+ },
1414+
1415+ // Map over jQuery in case of overwrite
1416+ _jQuery = window.jQuery,
1417+
1418+ // Map over the $ in case of overwrite
1419+ _$ = window.$,
1420+
1421+ // A central reference to the root jQuery(document)
1422+ rootjQuery,
1423+
1424+ // A simple way to check for HTML strings or ID strings
1425+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
1426+ quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
1427+
1428+ // Check if a string has a non-whitespace character in it
1429+ rnotwhite = /\S/,
1430+
1431+ // Used for trimming whitespace
1432+ trimLeft = /^\s+/,
1433+ trimRight = /\s+$/,
1434+
1435+ // Match a standalone tag
1436+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
1437+
1438+ // JSON RegExp
1439+ rvalidchars = /^[\],:{}\s]*$/,
1440+ rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
1441+ rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
1442+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
1443+
1444+ // Useragent RegExp
1445+ rwebkit = /(webkit)[ \/]([\w.]+)/,
1446+ ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
1447+ rmsie = /(msie) ([\w.]+)/,
1448+ rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
1449+
1450+ // Matches dashed string for camelizing
1451+ rdashAlpha = /-([a-z]|[0-9])/ig,
1452+ rmsPrefix = /^-ms-/,
1453+
1454+ // Used by jQuery.camelCase as callback to replace()
1455+ fcamelCase = function( all, letter ) {
1456+ return ( letter + "" ).toUpperCase();
1457+ },
1458+
1459+ // Keep a UserAgent string for use with jQuery.browser
1460+ userAgent = navigator.userAgent,
1461+
1462+ // For matching the engine and version of the browser
1463+ browserMatch,
1464+
1465+ // The deferred used on DOM ready
1466+ readyList,
1467+
1468+ // The ready event handler
1469+ DOMContentLoaded,
1470+
1471+ // Save a reference to some core methods
1472+ toString = Object.prototype.toString,
1473+ hasOwn = Object.prototype.hasOwnProperty,
1474+ push = Array.prototype.push,
1475+ slice = Array.prototype.slice,
1476+ trim = String.prototype.trim,
1477+ indexOf = Array.prototype.indexOf,
1478+
1479+ // [[Class]] -> type pairs
1480+ class2type = {};
1481+
1482+jQuery.fn = jQuery.prototype = {
1483+ constructor: jQuery,
1484+ init: function( selector, context, rootjQuery ) {
1485+ var match, elem, ret, doc;
1486+
1487+ // Handle $(""), $(null), or $(undefined)
1488+ if ( !selector ) {
1489+ return this;
1490+ }
1491+
1492+ // Handle $(DOMElement)
1493+ if ( selector.nodeType ) {
1494+ this.context = this[0] = selector;
1495+ this.length = 1;
1496+ return this;
1497+ }
1498+
1499+ // The body element only exists once, optimize finding it
1500+ if ( selector === "body" && !context && document.body ) {
1501+ this.context = document;
1502+ this[0] = document.body;
1503+ this.selector = selector;
1504+ this.length = 1;
1505+ return this;
1506+ }
1507+
1508+ // Handle HTML strings
1509+ if ( typeof selector === "string" ) {
1510+ // Are we dealing with HTML string or an ID?
1511+ if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
1512+ // Assume that strings that start and end with <> are HTML and skip the regex check
1513+ match = [ null, selector, null ];
1514+
1515+ } else {
1516+ match = quickExpr.exec( selector );
1517+ }
1518+
1519+ // Verify a match, and that no context was specified for #id
1520+ if ( match && (match[1] || !context) ) {
1521+
1522+ // HANDLE: $(html) -> $(array)
1523+ if ( match[1] ) {
1524+ context = context instanceof jQuery ? context[0] : context;
1525+ doc = ( context ? context.ownerDocument || context : document );
1526+
1527+ // If a single string is passed in and it's a single tag
1528+ // just do a createElement and skip the rest
1529+ ret = rsingleTag.exec( selector );
1530+
1531+ if ( ret ) {
1532+ if ( jQuery.isPlainObject( context ) ) {
1533+ selector = [ document.createElement( ret[1] ) ];
1534+ jQuery.fn.attr.call( selector, context, true );
1535+
1536+ } else {
1537+ selector = [ doc.createElement( ret[1] ) ];
1538+ }
1539+
1540+ } else {
1541+ ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
1542+ selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
1543+ }
1544+
1545+ return jQuery.merge( this, selector );
1546+
1547+ // HANDLE: $("#id")
1548+ } else {
1549+ elem = document.getElementById( match[2] );
1550+
1551+ // Check parentNode to catch when Blackberry 4.6 returns
1552+ // nodes that are no longer in the document #6963
1553+ if ( elem && elem.parentNode ) {
1554+ // Handle the case where IE and Opera return items
1555+ // by name instead of ID
1556+ if ( elem.id !== match[2] ) {
1557+ return rootjQuery.find( selector );
1558+ }
1559+
1560+ // Otherwise, we inject the element directly into the jQuery object
1561+ this.length = 1;
1562+ this[0] = elem;
1563+ }
1564+
1565+ this.context = document;
1566+ this.selector = selector;
1567+ return this;
1568+ }
1569+
1570+ // HANDLE: $(expr, $(...))
1571+ } else if ( !context || context.jquery ) {
1572+ return ( context || rootjQuery ).find( selector );
1573+
1574+ // HANDLE: $(expr, context)
1575+ // (which is just equivalent to: $(context).find(expr)
1576+ } else {
1577+ return this.constructor( context ).find( selector );
1578+ }
1579+
1580+ // HANDLE: $(function)
1581+ // Shortcut for document ready
1582+ } else if ( jQuery.isFunction( selector ) ) {
1583+ return rootjQuery.ready( selector );
1584+ }
1585+
1586+ if ( selector.selector !== undefined ) {
1587+ this.selector = selector.selector;
1588+ this.context = selector.context;
1589+ }
1590+
1591+ return jQuery.makeArray( selector, this );
1592+ },
1593+
1594+ // Start with an empty selector
1595+ selector: "",
1596+
1597+ // The current version of jQuery being used
1598+ jquery: "1.7.2",
1599+
1600+ // The default length of a jQuery object is 0
1601+ length: 0,
1602+
1603+ // The number of elements contained in the matched element set
1604+ size: function() {
1605+ return this.length;
1606+ },
1607+
1608+ toArray: function() {
1609+ return slice.call( this, 0 );
1610+ },
1611+
1612+ // Get the Nth element in the matched element set OR
1613+ // Get the whole matched element set as a clean array
1614+ get: function( num ) {
1615+ return num == null ?
1616+
1617+ // Return a 'clean' array
1618+ this.toArray() :
1619+
1620+ // Return just the object
1621+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
1622+ },
1623+
1624+ // Take an array of elements and push it onto the stack
1625+ // (returning the new matched element set)
1626+ pushStack: function( elems, name, selector ) {
1627+ // Build a new jQuery matched element set
1628+ var ret = this.constructor();
1629+
1630+ if ( jQuery.isArray( elems ) ) {
1631+ push.apply( ret, elems );
1632+
1633+ } else {
1634+ jQuery.merge( ret, elems );
1635+ }
1636+
1637+ // Add the old object onto the stack (as a reference)
1638+ ret.prevObject = this;
1639+
1640+ ret.context = this.context;
1641+
1642+ if ( name === "find" ) {
1643+ ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
1644+ } else if ( name ) {
1645+ ret.selector = this.selector + "." + name + "(" + selector + ")";
1646+ }
1647+
1648+ // Return the newly-formed element set
1649+ return ret;
1650+ },
1651+
1652+ // Execute a callback for every element in the matched set.
1653+ // (You can seed the arguments with an array of args, but this is
1654+ // only used internally.)
1655+ each: function( callback, args ) {
1656+ return jQuery.each( this, callback, args );
1657+ },
1658+
1659+ ready: function( fn ) {
1660+ // Attach the listeners
1661+ jQuery.bindReady();
1662+
1663+ // Add the callback
1664+ readyList.add( fn );
1665+
1666+ return this;
1667+ },
1668+
1669+ eq: function( i ) {
1670+ i = +i;
1671+ return i === -1 ?
1672+ this.slice( i ) :
1673+ this.slice( i, i + 1 );
1674+ },
1675+
1676+ first: function() {
1677+ return this.eq( 0 );
1678+ },
1679+
1680+ last: function() {
1681+ return this.eq( -1 );
1682+ },
1683+
1684+ slice: function() {
1685+ return this.pushStack( slice.apply( this, arguments ),
1686+ "slice", slice.call(arguments).join(",") );
1687+ },
1688+
1689+ map: function( callback ) {
1690+ return this.pushStack( jQuery.map(this, function( elem, i ) {
1691+ return callback.call( elem, i, elem );
1692+ }));
1693+ },
1694+
1695+ end: function() {
1696+ return this.prevObject || this.constructor(null);
1697+ },
1698+
1699+ // For internal use only.
1700+ // Behaves like an Array's method, not like a jQuery method.
1701+ push: push,
1702+ sort: [].sort,
1703+ splice: [].splice
1704+};
1705+
1706+// Give the init function the jQuery prototype for later instantiation
1707+jQuery.fn.init.prototype = jQuery.fn;
1708+
1709+jQuery.extend = jQuery.fn.extend = function() {
1710+ var options, name, src, copy, copyIsArray, clone,
1711+ target = arguments[0] || {},
1712+ i = 1,
1713+ length = arguments.length,
1714+ deep = false;
1715+
1716+ // Handle a deep copy situation
1717+ if ( typeof target === "boolean" ) {
1718+ deep = target;
1719+ target = arguments[1] || {};
1720+ // skip the boolean and the target
1721+ i = 2;
1722+ }
1723+
1724+ // Handle case when target is a string or something (possible in deep copy)
1725+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
1726+ target = {};
1727+ }
1728+
1729+ // extend jQuery itself if only one argument is passed
1730+ if ( length === i ) {
1731+ target = this;
1732+ --i;
1733+ }
1734+
1735+ for ( ; i < length; i++ ) {
1736+ // Only deal with non-null/undefined values
1737+ if ( (options = arguments[ i ]) != null ) {
1738+ // Extend the base object
1739+ for ( name in options ) {
1740+ src = target[ name ];
1741+ copy = options[ name ];
1742+
1743+ // Prevent never-ending loop
1744+ if ( target === copy ) {
1745+ continue;
1746+ }
1747+
1748+ // Recurse if we're merging plain objects or arrays
1749+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
1750+ if ( copyIsArray ) {
1751+ copyIsArray = false;
1752+ clone = src && jQuery.isArray(src) ? src : [];
1753+
1754+ } else {
1755+ clone = src && jQuery.isPlainObject(src) ? src : {};
1756+ }
1757+
1758+ // Never move original objects, clone them
1759+ target[ name ] = jQuery.extend( deep, clone, copy );
1760+
1761+ // Don't bring in undefined values
1762+ } else if ( copy !== undefined ) {
1763+ target[ name ] = copy;
1764+ }
1765+ }
1766+ }
1767+ }
1768+
1769+ // Return the modified object
1770+ return target;
1771+};
1772+
1773+jQuery.extend({
1774+ noConflict: function( deep ) {
1775+ if ( window.$ === jQuery ) {
1776+ window.$ = _$;
1777+ }
1778+
1779+ if ( deep && window.jQuery === jQuery ) {
1780+ window.jQuery = _jQuery;
1781+ }
1782+
1783+ return jQuery;
1784+ },
1785+
1786+ // Is the DOM ready to be used? Set to true once it occurs.
1787+ isReady: false,
1788+
1789+ // A counter to track how many items to wait for before
1790+ // the ready event fires. See #6781
1791+ readyWait: 1,
1792+
1793+ // Hold (or release) the ready event
1794+ holdReady: function( hold ) {
1795+ if ( hold ) {
1796+ jQuery.readyWait++;
1797+ } else {
1798+ jQuery.ready( true );
1799+ }
1800+ },
1801+
1802+ // Handle when the DOM is ready
1803+ ready: function( wait ) {
1804+ // Either a released hold or an DOMready/load event and not yet ready
1805+ if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
1806+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
1807+ if ( !document.body ) {
1808+ return setTimeout( jQuery.ready, 1 );
1809+ }
1810+
1811+ // Remember that the DOM is ready
1812+ jQuery.isReady = true;
1813+
1814+ // If a normal DOM Ready event fired, decrement, and wait if need be
1815+ if ( wait !== true && --jQuery.readyWait > 0 ) {
1816+ return;
1817+ }
1818+
1819+ // If there are functions bound, to execute
1820+ readyList.fireWith( document, [ jQuery ] );
1821+
1822+ // Trigger any bound ready events
1823+ if ( jQuery.fn.trigger ) {
1824+ jQuery( document ).trigger( "ready" ).off( "ready" );
1825+ }
1826+ }
1827+ },
1828+
1829+ bindReady: function() {
1830+ if ( readyList ) {
1831+ return;
1832+ }
1833+
1834+ readyList = jQuery.Callbacks( "once memory" );
1835+
1836+ // Catch cases where $(document).ready() is called after the
1837+ // browser event has already occurred.
1838+ if ( document.readyState === "complete" ) {
1839+ // Handle it asynchronously to allow scripts the opportunity to delay ready
1840+ return setTimeout( jQuery.ready, 1 );
1841+ }
1842+
1843+ // Mozilla, Opera and webkit nightlies currently support this event
1844+ if ( document.addEventListener ) {
1845+ // Use the handy event callback
1846+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
1847+
1848+ // A fallback to window.onload, that will always work
1849+ window.addEventListener( "load", jQuery.ready, false );
1850+
1851+ // If IE event model is used
1852+ } else if ( document.attachEvent ) {
1853+ // ensure firing before onload,
1854+ // maybe late but safe also for iframes
1855+ document.attachEvent( "onreadystatechange", DOMContentLoaded );
1856+
1857+ // A fallback to window.onload, that will always work
1858+ window.attachEvent( "onload", jQuery.ready );
1859+
1860+ // If IE and not a frame
1861+ // continually check to see if the document is ready
1862+ var toplevel = false;
1863+
1864+ try {
1865+ toplevel = window.frameElement == null;
1866+ } catch(e) {}
1867+
1868+ if ( document.documentElement.doScroll && toplevel ) {
1869+ doScrollCheck();
1870+ }
1871+ }
1872+ },
1873+
1874+ // See test/unit/core.js for details concerning isFunction.
1875+ // Since version 1.3, DOM methods and functions like alert
1876+ // aren't supported. They return false on IE (#2968).
1877+ isFunction: function( obj ) {
1878+ return jQuery.type(obj) === "function";
1879+ },
1880+
1881+ isArray: Array.isArray || function( obj ) {
1882+ return jQuery.type(obj) === "array";
1883+ },
1884+
1885+ isWindow: function( obj ) {
1886+ return obj != null && obj == obj.window;
1887+ },
1888+
1889+ isNumeric: function( obj ) {
1890+ return !isNaN( parseFloat(obj) ) && isFinite( obj );
1891+ },
1892+
1893+ type: function( obj ) {
1894+ return obj == null ?
1895+ String( obj ) :
1896+ class2type[ toString.call(obj) ] || "object";
1897+ },
1898+
1899+ isPlainObject: function( obj ) {
1900+ // Must be an Object.
1901+ // Because of IE, we also have to check the presence of the constructor property.
1902+ // Make sure that DOM nodes and window objects don't pass through, as well
1903+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
1904+ return false;
1905+ }
1906+
1907+ try {
1908+ // Not own constructor property must be Object
1909+ if ( obj.constructor &&
1910+ !hasOwn.call(obj, "constructor") &&
1911+ !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
1912+ return false;
1913+ }
1914+ } catch ( e ) {
1915+ // IE8,9 Will throw exceptions on certain host objects #9897
1916+ return false;
1917+ }
1918+
1919+ // Own properties are enumerated firstly, so to speed up,
1920+ // if last one is own, then all properties are own.
1921+
1922+ var key;
1923+ for ( key in obj ) {}
1924+
1925+ return key === undefined || hasOwn.call( obj, key );
1926+ },
1927+
1928+ isEmptyObject: function( obj ) {
1929+ for ( var name in obj ) {
1930+ return false;
1931+ }
1932+ return true;
1933+ },
1934+
1935+ error: function( msg ) {
1936+ throw new Error( msg );
1937+ },
1938+
1939+ parseJSON: function( data ) {
1940+ if ( typeof data !== "string" || !data ) {
1941+ return null;
1942+ }
1943+
1944+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
1945+ data = jQuery.trim( data );
1946+
1947+ // Attempt to parse using the native JSON parser first
1948+ if ( window.JSON && window.JSON.parse ) {
1949+ return window.JSON.parse( data );
1950+ }
1951+
1952+ // Make sure the incoming data is actual JSON
1953+ // Logic borrowed from http://json.org/json2.js
1954+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
1955+ .replace( rvalidtokens, "]" )
1956+ .replace( rvalidbraces, "")) ) {
1957+
1958+ return ( new Function( "return " + data ) )();
1959+
1960+ }
1961+ jQuery.error( "Invalid JSON: " + data );
1962+ },
1963+
1964+ // Cross-browser xml parsing
1965+ parseXML: function( data ) {
1966+ if ( typeof data !== "string" || !data ) {
1967+ return null;
1968+ }
1969+ var xml, tmp;
1970+ try {
1971+ if ( window.DOMParser ) { // Standard
1972+ tmp = new DOMParser();
1973+ xml = tmp.parseFromString( data , "text/xml" );
1974+ } else { // IE
1975+ xml = new ActiveXObject( "Microsoft.XMLDOM" );
1976+ xml.async = "false";
1977+ xml.loadXML( data );
1978+ }
1979+ } catch( e ) {
1980+ xml = undefined;
1981+ }
1982+ if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
1983+ jQuery.error( "Invalid XML: " + data );
1984+ }
1985+ return xml;
1986+ },
1987+
1988+ noop: function() {},
1989+
1990+ // Evaluates a script in a global context
1991+ // Workarounds based on findings by Jim Driscoll
1992+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
1993+ globalEval: function( data ) {
1994+ if ( data && rnotwhite.test( data ) ) {
1995+ // We use execScript on Internet Explorer
1996+ // We use an anonymous function so that context is window
1997+ // rather than jQuery in Firefox
1998+ ( window.execScript || function( data ) {
1999+ window[ "eval" ].call( window, data );
2000+ } )( data );
2001+ }
2002+ },
2003+
2004+ // Convert dashed to camelCase; used by the css and data modules
2005+ // Microsoft forgot to hump their vendor prefix (#9572)
2006+ camelCase: function( string ) {
2007+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
2008+ },
2009+
2010+ nodeName: function( elem, name ) {
2011+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
2012+ },
2013+
2014+ // args is for internal usage only
2015+ each: function( object, callback, args ) {
2016+ var name, i = 0,
2017+ length = object.length,
2018+ isObj = length === undefined || jQuery.isFunction( object );
2019+
2020+ if ( args ) {
2021+ if ( isObj ) {
2022+ for ( name in object ) {
2023+ if ( callback.apply( object[ name ], args ) === false ) {
2024+ break;
2025+ }
2026+ }
2027+ } else {
2028+ for ( ; i < length; ) {
2029+ if ( callback.apply( object[ i++ ], args ) === false ) {
2030+ break;
2031+ }
2032+ }
2033+ }
2034+
2035+ // A special, fast, case for the most common use of each
2036+ } else {
2037+ if ( isObj ) {
2038+ for ( name in object ) {
2039+ if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
2040+ break;
2041+ }
2042+ }
2043+ } else {
2044+ for ( ; i < length; ) {
2045+ if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
2046+ break;
2047+ }
2048+ }
2049+ }
2050+ }
2051+
2052+ return object;
2053+ },
2054+
2055+ // Use native String.trim function wherever possible
2056+ trim: trim ?
2057+ function( text ) {
2058+ return text == null ?
2059+ "" :
2060+ trim.call( text );
2061+ } :
2062+
2063+ // Otherwise use our own trimming functionality
2064+ function( text ) {
2065+ return text == null ?
2066+ "" :
2067+ text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
2068+ },
2069+
2070+ // results is for internal usage only
2071+ makeArray: function( array, results ) {
2072+ var ret = results || [];
2073+
2074+ if ( array != null ) {
2075+ // The window, strings (and functions) also have 'length'
2076+ // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
2077+ var type = jQuery.type( array );
2078+
2079+ if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
2080+ push.call( ret, array );
2081+ } else {
2082+ jQuery.merge( ret, array );
2083+ }
2084+ }
2085+
2086+ return ret;
2087+ },
2088+
2089+ inArray: function( elem, array, i ) {
2090+ var len;
2091+
2092+ if ( array ) {
2093+ if ( indexOf ) {
2094+ return indexOf.call( array, elem, i );
2095+ }
2096+
2097+ len = array.length;
2098+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
2099+
2100+ for ( ; i < len; i++ ) {
2101+ // Skip accessing in sparse arrays
2102+ if ( i in array && array[ i ] === elem ) {
2103+ return i;
2104+ }
2105+ }
2106+ }
2107+
2108+ return -1;
2109+ },
2110+
2111+ merge: function( first, second ) {
2112+ var i = first.length,
2113+ j = 0;
2114+
2115+ if ( typeof second.length === "number" ) {
2116+ for ( var l = second.length; j < l; j++ ) {
2117+ first[ i++ ] = second[ j ];
2118+ }
2119+
2120+ } else {
2121+ while ( second[j] !== undefined ) {
2122+ first[ i++ ] = second[ j++ ];
2123+ }
2124+ }
2125+
2126+ first.length = i;
2127+
2128+ return first;
2129+ },
2130+
2131+ grep: function( elems, callback, inv ) {
2132+ var ret = [], retVal;
2133+ inv = !!inv;
2134+
2135+ // Go through the array, only saving the items
2136+ // that pass the validator function
2137+ for ( var i = 0, length = elems.length; i < length; i++ ) {
2138+ retVal = !!callback( elems[ i ], i );
2139+ if ( inv !== retVal ) {
2140+ ret.push( elems[ i ] );
2141+ }
2142+ }
2143+
2144+ return ret;
2145+ },
2146+
2147+ // arg is for internal usage only
2148+ map: function( elems, callback, arg ) {
2149+ var value, key, ret = [],
2150+ i = 0,
2151+ length = elems.length,
2152+ // jquery objects are treated as arrays
2153+ isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
2154+
2155+ // Go through the array, translating each of the items to their
2156+ if ( isArray ) {
2157+ for ( ; i < length; i++ ) {
2158+ value = callback( elems[ i ], i, arg );
2159+
2160+ if ( value != null ) {
2161+ ret[ ret.length ] = value;
2162+ }
2163+ }
2164+
2165+ // Go through every key on the object,
2166+ } else {
2167+ for ( key in elems ) {
2168+ value = callback( elems[ key ], key, arg );
2169+
2170+ if ( value != null ) {
2171+ ret[ ret.length ] = value;
2172+ }
2173+ }
2174+ }
2175+
2176+ // Flatten any nested arrays
2177+ return ret.concat.apply( [], ret );
2178+ },
2179+
2180+ // A global GUID counter for objects
2181+ guid: 1,
2182+
2183+ // Bind a function to a context, optionally partially applying any
2184+ // arguments.
2185+ proxy: function( fn, context ) {
2186+ if ( typeof context === "string" ) {
2187+ var tmp = fn[ context ];
2188+ context = fn;
2189+ fn = tmp;
2190+ }
2191+
2192+ // Quick check to determine if target is callable, in the spec
2193+ // this throws a TypeError, but we will just return undefined.
2194+ if ( !jQuery.isFunction( fn ) ) {
2195+ return undefined;
2196+ }
2197+
2198+ // Simulated bind
2199+ var args = slice.call( arguments, 2 ),
2200+ proxy = function() {
2201+ return fn.apply( context, args.concat( slice.call( arguments ) ) );
2202+ };
2203+
2204+ // Set the guid of unique handler to the same of original handler, so it can be removed
2205+ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
2206+
2207+ return proxy;
2208+ },
2209+
2210+ // Mutifunctional method to get and set values to a collection
2211+ // The value/s can optionally be executed if it's a function
2212+ access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
2213+ var exec,
2214+ bulk = key == null,
2215+ i = 0,
2216+ length = elems.length;
2217+
2218+ // Sets many values
2219+ if ( key && typeof key === "object" ) {
2220+ for ( i in key ) {
2221+ jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
2222+ }
2223+ chainable = 1;
2224+
2225+ // Sets one value
2226+ } else if ( value !== undefined ) {
2227+ // Optionally, function values get executed if exec is true
2228+ exec = pass === undefined && jQuery.isFunction( value );
2229+
2230+ if ( bulk ) {
2231+ // Bulk operations only iterate when executing function values
2232+ if ( exec ) {
2233+ exec = fn;
2234+ fn = function( elem, key, value ) {
2235+ return exec.call( jQuery( elem ), value );
2236+ };
2237+
2238+ // Otherwise they run against the entire set
2239+ } else {
2240+ fn.call( elems, value );
2241+ fn = null;
2242+ }
2243+ }
2244+
2245+ if ( fn ) {
2246+ for (; i < length; i++ ) {
2247+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
2248+ }
2249+ }
2250+
2251+ chainable = 1;
2252+ }
2253+
2254+ return chainable ?
2255+ elems :
2256+
2257+ // Gets
2258+ bulk ?
2259+ fn.call( elems ) :
2260+ length ? fn( elems[0], key ) : emptyGet;
2261+ },
2262+
2263+ now: function() {
2264+ return ( new Date() ).getTime();
2265+ },
2266+
2267+ // Use of jQuery.browser is frowned upon.
2268+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
2269+ uaMatch: function( ua ) {
2270+ ua = ua.toLowerCase();
2271+
2272+ var match = rwebkit.exec( ua ) ||
2273+ ropera.exec( ua ) ||
2274+ rmsie.exec( ua ) ||
2275+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
2276+ [];
2277+
2278+ return { browser: match[1] || "", version: match[2] || "0" };
2279+ },
2280+
2281+ sub: function() {
2282+ function jQuerySub( selector, context ) {
2283+ return new jQuerySub.fn.init( selector, context );
2284+ }
2285+ jQuery.extend( true, jQuerySub, this );
2286+ jQuerySub.superclass = this;
2287+ jQuerySub.fn = jQuerySub.prototype = this();
2288+ jQuerySub.fn.constructor = jQuerySub;
2289+ jQuerySub.sub = this.sub;
2290+ jQuerySub.fn.init = function init( selector, context ) {
2291+ if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
2292+ context = jQuerySub( context );
2293+ }
2294+
2295+ return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
2296+ };
2297+ jQuerySub.fn.init.prototype = jQuerySub.fn;
2298+ var rootjQuerySub = jQuerySub(document);
2299+ return jQuerySub;
2300+ },
2301+
2302+ browser: {}
2303+});
2304+
2305+// Populate the class2type map
2306+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
2307+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
2308+});
2309+
2310+browserMatch = jQuery.uaMatch( userAgent );
2311+if ( browserMatch.browser ) {
2312+ jQuery.browser[ browserMatch.browser ] = true;
2313+ jQuery.browser.version = browserMatch.version;
2314+}
2315+
2316+// Deprecated, use jQuery.browser.webkit instead
2317+if ( jQuery.browser.webkit ) {
2318+ jQuery.browser.safari = true;
2319+}
2320+
2321+// IE doesn't match non-breaking spaces with \s
2322+if ( rnotwhite.test( "\xA0" ) ) {
2323+ trimLeft = /^[\s\xA0]+/;
2324+ trimRight = /[\s\xA0]+$/;
2325+}
2326+
2327+// All jQuery objects should point back to these
2328+rootjQuery = jQuery(document);
2329+
2330+// Cleanup functions for the document ready method
2331+if ( document.addEventListener ) {
2332+ DOMContentLoaded = function() {
2333+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
2334+ jQuery.ready();
2335+ };
2336+
2337+} else if ( document.attachEvent ) {
2338+ DOMContentLoaded = function() {
2339+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
2340+ if ( document.readyState === "complete" ) {
2341+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
2342+ jQuery.ready();
2343+ }
2344+ };
2345+}
2346+
2347+// The DOM ready check for Internet Explorer
2348+function doScrollCheck() {
2349+ if ( jQuery.isReady ) {
2350+ return;
2351+ }
2352+
2353+ try {
2354+ // If IE is used, use the trick by Diego Perini
2355+ // http://javascript.nwbox.com/IEContentLoaded/
2356+ document.documentElement.doScroll("left");
2357+ } catch(e) {
2358+ setTimeout( doScrollCheck, 1 );
2359+ return;
2360+ }
2361+
2362+ // and execute any waiting functions
2363+ jQuery.ready();
2364+}
2365+
2366+return jQuery;
2367+
2368+})();
2369+
2370+
2371+// String to Object flags format cache
2372+var flagsCache = {};
2373+
2374+// Convert String-formatted flags into Object-formatted ones and store in cache
2375+function createFlags( flags ) {
2376+ var object = flagsCache[ flags ] = {},
2377+ i, length;
2378+ flags = flags.split( /\s+/ );
2379+ for ( i = 0, length = flags.length; i < length; i++ ) {
2380+ object[ flags[i] ] = true;
2381+ }
2382+ return object;
2383+}
2384+
2385+/*
2386+ * Create a callback list using the following parameters:
2387+ *
2388+ * flags: an optional list of space-separated flags that will change how
2389+ * the callback list behaves
2390+ *
2391+ * By default a callback list will act like an event callback list and can be
2392+ * "fired" multiple times.
2393+ *
2394+ * Possible flags:
2395+ *
2396+ * once: will ensure the callback list can only be fired once (like a Deferred)
2397+ *
2398+ * memory: will keep track of previous values and will call any callback added
2399+ * after the list has been fired right away with the latest "memorized"
2400+ * values (like a Deferred)
2401+ *
2402+ * unique: will ensure a callback can only be added once (no duplicate in the list)
2403+ *
2404+ * stopOnFalse: interrupt callings when a callback returns false
2405+ *
2406+ */
2407+jQuery.Callbacks = function( flags ) {
2408+
2409+ // Convert flags from String-formatted to Object-formatted
2410+ // (we check in cache first)
2411+ flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
2412+
2413+ var // Actual callback list
2414+ list = [],
2415+ // Stack of fire calls for repeatable lists
2416+ stack = [],
2417+ // Last fire value (for non-forgettable lists)
2418+ memory,
2419+ // Flag to know if list was already fired
2420+ fired,
2421+ // Flag to know if list is currently firing
2422+ firing,
2423+ // First callback to fire (used internally by add and fireWith)
2424+ firingStart,
2425+ // End of the loop when firing
2426+ firingLength,
2427+ // Index of currently firing callback (modified by remove if needed)
2428+ firingIndex,
2429+ // Add one or several callbacks to the list
2430+ add = function( args ) {
2431+ var i,
2432+ length,
2433+ elem,
2434+ type,
2435+ actual;
2436+ for ( i = 0, length = args.length; i < length; i++ ) {
2437+ elem = args[ i ];
2438+ type = jQuery.type( elem );
2439+ if ( type === "array" ) {
2440+ // Inspect recursively
2441+ add( elem );
2442+ } else if ( type === "function" ) {
2443+ // Add if not in unique mode and callback is not in
2444+ if ( !flags.unique || !self.has( elem ) ) {
2445+ list.push( elem );
2446+ }
2447+ }
2448+ }
2449+ },
2450+ // Fire callbacks
2451+ fire = function( context, args ) {
2452+ args = args || [];
2453+ memory = !flags.memory || [ context, args ];
2454+ fired = true;
2455+ firing = true;
2456+ firingIndex = firingStart || 0;
2457+ firingStart = 0;
2458+ firingLength = list.length;
2459+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
2460+ if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
2461+ memory = true; // Mark as halted
2462+ break;
2463+ }
2464+ }
2465+ firing = false;
2466+ if ( list ) {
2467+ if ( !flags.once ) {
2468+ if ( stack && stack.length ) {
2469+ memory = stack.shift();
2470+ self.fireWith( memory[ 0 ], memory[ 1 ] );
2471+ }
2472+ } else if ( memory === true ) {
2473+ self.disable();
2474+ } else {
2475+ list = [];
2476+ }
2477+ }
2478+ },
2479+ // Actual Callbacks object
2480+ self = {
2481+ // Add a callback or a collection of callbacks to the list
2482+ add: function() {
2483+ if ( list ) {
2484+ var length = list.length;
2485+ add( arguments );
2486+ // Do we need to add the callbacks to the
2487+ // current firing batch?
2488+ if ( firing ) {
2489+ firingLength = list.length;
2490+ // With memory, if we're not firing then
2491+ // we should call right away, unless previous
2492+ // firing was halted (stopOnFalse)
2493+ } else if ( memory && memory !== true ) {
2494+ firingStart = length;
2495+ fire( memory[ 0 ], memory[ 1 ] );
2496+ }
2497+ }
2498+ return this;
2499+ },
2500+ // Remove a callback from the list
2501+ remove: function() {
2502+ if ( list ) {
2503+ var args = arguments,
2504+ argIndex = 0,
2505+ argLength = args.length;
2506+ for ( ; argIndex < argLength ; argIndex++ ) {
2507+ for ( var i = 0; i < list.length; i++ ) {
2508+ if ( args[ argIndex ] === list[ i ] ) {
2509+ // Handle firingIndex and firingLength
2510+ if ( firing ) {
2511+ if ( i <= firingLength ) {
2512+ firingLength--;
2513+ if ( i <= firingIndex ) {
2514+ firingIndex--;
2515+ }
2516+ }
2517+ }
2518+ // Remove the element
2519+ list.splice( i--, 1 );
2520+ // If we have some unicity property then
2521+ // we only need to do this once
2522+ if ( flags.unique ) {
2523+ break;
2524+ }
2525+ }
2526+ }
2527+ }
2528+ }
2529+ return this;
2530+ },
2531+ // Control if a given callback is in the list
2532+ has: function( fn ) {
2533+ if ( list ) {
2534+ var i = 0,
2535+ length = list.length;
2536+ for ( ; i < length; i++ ) {
2537+ if ( fn === list[ i ] ) {
2538+ return true;
2539+ }
2540+ }
2541+ }
2542+ return false;
2543+ },
2544+ // Remove all callbacks from the list
2545+ empty: function() {
2546+ list = [];
2547+ return this;
2548+ },
2549+ // Have the list do nothing anymore
2550+ disable: function() {
2551+ list = stack = memory = undefined;
2552+ return this;
2553+ },
2554+ // Is it disabled?
2555+ disabled: function() {
2556+ return !list;
2557+ },
2558+ // Lock the list in its current state
2559+ lock: function() {
2560+ stack = undefined;
2561+ if ( !memory || memory === true ) {
2562+ self.disable();
2563+ }
2564+ return this;
2565+ },
2566+ // Is it locked?
2567+ locked: function() {
2568+ return !stack;
2569+ },
2570+ // Call all callbacks with the given context and arguments
2571+ fireWith: function( context, args ) {
2572+ if ( stack ) {
2573+ if ( firing ) {
2574+ if ( !flags.once ) {
2575+ stack.push( [ context, args ] );
2576+ }
2577+ } else if ( !( flags.once && memory ) ) {
2578+ fire( context, args );
2579+ }
2580+ }
2581+ return this;
2582+ },
2583+ // Call all the callbacks with the given arguments
2584+ fire: function() {
2585+ self.fireWith( this, arguments );
2586+ return this;
2587+ },
2588+ // To know if the callbacks have already been called at least once
2589+ fired: function() {
2590+ return !!fired;
2591+ }
2592+ };
2593+
2594+ return self;
2595+};
2596+
2597+
2598+
2599+
2600+var // Static reference to slice
2601+ sliceDeferred = [].slice;
2602+
2603+jQuery.extend({
2604+
2605+ Deferred: function( func ) {
2606+ var doneList = jQuery.Callbacks( "once memory" ),
2607+ failList = jQuery.Callbacks( "once memory" ),
2608+ progressList = jQuery.Callbacks( "memory" ),
2609+ state = "pending",
2610+ lists = {
2611+ resolve: doneList,
2612+ reject: failList,
2613+ notify: progressList
2614+ },
2615+ promise = {
2616+ done: doneList.add,
2617+ fail: failList.add,
2618+ progress: progressList.add,
2619+
2620+ state: function() {
2621+ return state;
2622+ },
2623+
2624+ // Deprecated
2625+ isResolved: doneList.fired,
2626+ isRejected: failList.fired,
2627+
2628+ then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
2629+ deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
2630+ return this;
2631+ },
2632+ always: function() {
2633+ deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
2634+ return this;
2635+ },
2636+ pipe: function( fnDone, fnFail, fnProgress ) {
2637+ return jQuery.Deferred(function( newDefer ) {
2638+ jQuery.each( {
2639+ done: [ fnDone, "resolve" ],
2640+ fail: [ fnFail, "reject" ],
2641+ progress: [ fnProgress, "notify" ]
2642+ }, function( handler, data ) {
2643+ var fn = data[ 0 ],
2644+ action = data[ 1 ],
2645+ returned;
2646+ if ( jQuery.isFunction( fn ) ) {
2647+ deferred[ handler ](function() {
2648+ returned = fn.apply( this, arguments );
2649+ if ( returned && jQuery.isFunction( returned.promise ) ) {
2650+ returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
2651+ } else {
2652+ newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
2653+ }
2654+ });
2655+ } else {
2656+ deferred[ handler ]( newDefer[ action ] );
2657+ }
2658+ });
2659+ }).promise();
2660+ },
2661+ // Get a promise for this deferred
2662+ // If obj is provided, the promise aspect is added to the object
2663+ promise: function( obj ) {
2664+ if ( obj == null ) {
2665+ obj = promise;
2666+ } else {
2667+ for ( var key in promise ) {
2668+ obj[ key ] = promise[ key ];
2669+ }
2670+ }
2671+ return obj;
2672+ }
2673+ },
2674+ deferred = promise.promise({}),
2675+ key;
2676+
2677+ for ( key in lists ) {
2678+ deferred[ key ] = lists[ key ].fire;
2679+ deferred[ key + "With" ] = lists[ key ].fireWith;
2680+ }
2681+
2682+ // Handle state
2683+ deferred.done( function() {
2684+ state = "resolved";
2685+ }, failList.disable, progressList.lock ).fail( function() {
2686+ state = "rejected";
2687+ }, doneList.disable, progressList.lock );
2688+
2689+ // Call given func if any
2690+ if ( func ) {
2691+ func.call( deferred, deferred );
2692+ }
2693+
2694+ // All done!
2695+ return deferred;
2696+ },
2697+
2698+ // Deferred helper
2699+ when: function( firstParam ) {
2700+ var args = sliceDeferred.call( arguments, 0 ),
2701+ i = 0,
2702+ length = args.length,
2703+ pValues = new Array( length ),
2704+ count = length,
2705+ pCount = length,
2706+ deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
2707+ firstParam :
2708+ jQuery.Deferred(),
2709+ promise = deferred.promise();
2710+ function resolveFunc( i ) {
2711+ return function( value ) {
2712+ args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
2713+ if ( !( --count ) ) {
2714+ deferred.resolveWith( deferred, args );
2715+ }
2716+ };
2717+ }
2718+ function progressFunc( i ) {
2719+ return function( value ) {
2720+ pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
2721+ deferred.notifyWith( promise, pValues );
2722+ };
2723+ }
2724+ if ( length > 1 ) {
2725+ for ( ; i < length; i++ ) {
2726+ if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
2727+ args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
2728+ } else {
2729+ --count;
2730+ }
2731+ }
2732+ if ( !count ) {
2733+ deferred.resolveWith( deferred, args );
2734+ }
2735+ } else if ( deferred !== firstParam ) {
2736+ deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
2737+ }
2738+ return promise;
2739+ }
2740+});
2741+
2742+
2743+
2744+
2745+jQuery.support = (function() {
2746+
2747+ var support,
2748+ all,
2749+ a,
2750+ select,
2751+ opt,
2752+ input,
2753+ fragment,
2754+ tds,
2755+ events,
2756+ eventName,
2757+ i,
2758+ isSupported,
2759+ div = document.createElement( "div" ),
2760+ documentElement = document.documentElement;
2761+
2762+ // Preliminary tests
2763+ div.setAttribute("className", "t");
2764+ div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
2765+
2766+ all = div.getElementsByTagName( "*" );
2767+ a = div.getElementsByTagName( "a" )[ 0 ];
2768+
2769+ // Can't get basic test support
2770+ if ( !all || !all.length || !a ) {
2771+ return {};
2772+ }
2773+
2774+ // First batch of supports tests
2775+ select = document.createElement( "select" );
2776+ opt = select.appendChild( document.createElement("option") );
2777+ input = div.getElementsByTagName( "input" )[ 0 ];
2778+
2779+ support = {
2780+ // IE strips leading whitespace when .innerHTML is used
2781+ leadingWhitespace: ( div.firstChild.nodeType === 3 ),
2782+
2783+ // Make sure that tbody elements aren't automatically inserted
2784+ // IE will insert them into empty tables
2785+ tbody: !div.getElementsByTagName("tbody").length,
2786+
2787+ // Make sure that link elements get serialized correctly by innerHTML
2788+ // This requires a wrapper element in IE
2789+ htmlSerialize: !!div.getElementsByTagName("link").length,
2790+
2791+ // Get the style information from getAttribute
2792+ // (IE uses .cssText instead)
2793+ style: /top/.test( a.getAttribute("style") ),
2794+
2795+ // Make sure that URLs aren't manipulated
2796+ // (IE normalizes it by default)
2797+ hrefNormalized: ( a.getAttribute("href") === "/a" ),
2798+
2799+ // Make sure that element opacity exists
2800+ // (IE uses filter instead)
2801+ // Use a regex to work around a WebKit issue. See #5145
2802+ opacity: /^0.55/.test( a.style.opacity ),
2803+
2804+ // Verify style float existence
2805+ // (IE uses styleFloat instead of cssFloat)
2806+ cssFloat: !!a.style.cssFloat,
2807+
2808+ // Make sure that if no value is specified for a checkbox
2809+ // that it defaults to "on".
2810+ // (WebKit defaults to "" instead)
2811+ checkOn: ( input.value === "on" ),
2812+
2813+ // Make sure that a selected-by-default option has a working selected property.
2814+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
2815+ optSelected: opt.selected,
2816+
2817+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
2818+ getSetAttribute: div.className !== "t",
2819+
2820+ // Tests for enctype support on a form(#6743)
2821+ enctype: !!document.createElement("form").enctype,
2822+
2823+ // Makes sure cloning an html5 element does not cause problems
2824+ // Where outerHTML is undefined, this still works
2825+ html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
2826+
2827+ // Will be defined later
2828+ submitBubbles: true,
2829+ changeBubbles: true,
2830+ focusinBubbles: false,
2831+ deleteExpando: true,
2832+ noCloneEvent: true,
2833+ inlineBlockNeedsLayout: false,
2834+ shrinkWrapBlocks: false,
2835+ reliableMarginRight: true,
2836+ pixelMargin: true
2837+ };
2838+
2839+ // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
2840+ jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
2841+
2842+ // Make sure checked status is properly cloned
2843+ input.checked = true;
2844+ support.noCloneChecked = input.cloneNode( true ).checked;
2845+
2846+ // Make sure that the options inside disabled selects aren't marked as disabled
2847+ // (WebKit marks them as disabled)
2848+ select.disabled = true;
2849+ support.optDisabled = !opt.disabled;
2850+
2851+ // Test to see if it's possible to delete an expando from an element
2852+ // Fails in Internet Explorer
2853+ try {
2854+ delete div.test;
2855+ } catch( e ) {
2856+ support.deleteExpando = false;
2857+ }
2858+
2859+ if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
2860+ div.attachEvent( "onclick", function() {
2861+ // Cloning a node shouldn't copy over any
2862+ // bound event handlers (IE does this)
2863+ support.noCloneEvent = false;
2864+ });
2865+ div.cloneNode( true ).fireEvent( "onclick" );
2866+ }
2867+
2868+ // Check if a radio maintains its value
2869+ // after being appended to the DOM
2870+ input = document.createElement("input");
2871+ input.value = "t";
2872+ input.setAttribute("type", "radio");
2873+ support.radioValue = input.value === "t";
2874+
2875+ input.setAttribute("checked", "checked");
2876+
2877+ // #11217 - WebKit loses check when the name is after the checked attribute
2878+ input.setAttribute( "name", "t" );
2879+
2880+ div.appendChild( input );
2881+ fragment = document.createDocumentFragment();
2882+ fragment.appendChild( div.lastChild );
2883+
2884+ // WebKit doesn't clone checked state correctly in fragments
2885+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
2886+
2887+ // Check if a disconnected checkbox will retain its checked
2888+ // value of true after appended to the DOM (IE6/7)
2889+ support.appendChecked = input.checked;
2890+
2891+ fragment.removeChild( input );
2892+ fragment.appendChild( div );
2893+
2894+ // Technique from Juriy Zaytsev
2895+ // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
2896+ // We only care about the case where non-standard event systems
2897+ // are used, namely in IE. Short-circuiting here helps us to
2898+ // avoid an eval call (in setAttribute) which can cause CSP
2899+ // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
2900+ if ( div.attachEvent ) {
2901+ for ( i in {
2902+ submit: 1,
2903+ change: 1,
2904+ focusin: 1
2905+ }) {
2906+ eventName = "on" + i;
2907+ isSupported = ( eventName in div );
2908+ if ( !isSupported ) {
2909+ div.setAttribute( eventName, "return;" );
2910+ isSupported = ( typeof div[ eventName ] === "function" );
2911+ }
2912+ support[ i + "Bubbles" ] = isSupported;
2913+ }
2914+ }
2915+
2916+ fragment.removeChild( div );
2917+
2918+ // Null elements to avoid leaks in IE
2919+ fragment = select = opt = div = input = null;
2920+
2921+ // Run tests that need a body at doc ready
2922+ jQuery(function() {
2923+ var container, outer, inner, table, td, offsetSupport,
2924+ marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
2925+ paddingMarginBorderVisibility, paddingMarginBorder,
2926+ body = document.getElementsByTagName("body")[0];
2927+
2928+ if ( !body ) {
2929+ // Return for frameset docs that don't have a body
2930+ return;
2931+ }
2932+
2933+ conMarginTop = 1;
2934+ paddingMarginBorder = "padding:0;margin:0;border:";
2935+ positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
2936+ paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
2937+ style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
2938+ html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
2939+ "<table " + style + "' cellpadding='0' cellspacing='0'>" +
2940+ "<tr><td></td></tr></table>";
2941+
2942+ container = document.createElement("div");
2943+ container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
2944+ body.insertBefore( container, body.firstChild );
2945+
2946+ // Construct the test element
2947+ div = document.createElement("div");
2948+ container.appendChild( div );
2949+
2950+ // Check if table cells still have offsetWidth/Height when they are set
2951+ // to display:none and there are still other visible table cells in a
2952+ // table row; if so, offsetWidth/Height are not reliable for use when
2953+ // determining if an element has been hidden directly using
2954+ // display:none (it is still safe to use offsets if a parent element is
2955+ // hidden; don safety goggles and see bug #4512 for more information).
2956+ // (only IE 8 fails this test)
2957+ div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
2958+ tds = div.getElementsByTagName( "td" );
2959+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
2960+
2961+ tds[ 0 ].style.display = "";
2962+ tds[ 1 ].style.display = "none";
2963+
2964+ // Check if empty table cells still have offsetWidth/Height
2965+ // (IE <= 8 fail this test)
2966+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
2967+
2968+ // Check if div with explicit width and no margin-right incorrectly
2969+ // gets computed margin-right based on width of container. For more
2970+ // info see bug #3333
2971+ // Fails in WebKit before Feb 2011 nightlies
2972+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
2973+ if ( window.getComputedStyle ) {
2974+ div.innerHTML = "";
2975+ marginDiv = document.createElement( "div" );
2976+ marginDiv.style.width = "0";
2977+ marginDiv.style.marginRight = "0";
2978+ div.style.width = "2px";
2979+ div.appendChild( marginDiv );
2980+ support.reliableMarginRight =
2981+ ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
2982+ }
2983+
2984+ if ( typeof div.style.zoom !== "undefined" ) {
2985+ // Check if natively block-level elements act like inline-block
2986+ // elements when setting their display to 'inline' and giving
2987+ // them layout
2988+ // (IE < 8 does this)
2989+ div.innerHTML = "";
2990+ div.style.width = div.style.padding = "1px";
2991+ div.style.border = 0;
2992+ div.style.overflow = "hidden";
2993+ div.style.display = "inline";
2994+ div.style.zoom = 1;
2995+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
2996+
2997+ // Check if elements with layout shrink-wrap their children
2998+ // (IE 6 does this)
2999+ div.style.display = "block";
3000+ div.style.overflow = "visible";
3001+ div.innerHTML = "<div style='width:5px;'></div>";
3002+ support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
3003+ }
3004+
3005+ div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
3006+ div.innerHTML = html;
3007+
3008+ outer = div.firstChild;
3009+ inner = outer.firstChild;
3010+ td = outer.nextSibling.firstChild.firstChild;
3011+
3012+ offsetSupport = {
3013+ doesNotAddBorder: ( inner.offsetTop !== 5 ),
3014+ doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
3015+ };
3016+
3017+ inner.style.position = "fixed";
3018+ inner.style.top = "20px";
3019+
3020+ // safari subtracts parent border width here which is 5px
3021+ offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
3022+ inner.style.position = inner.style.top = "";
3023+
3024+ outer.style.overflow = "hidden";
3025+ outer.style.position = "relative";
3026+
3027+ offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
3028+ offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
3029+
3030+ if ( window.getComputedStyle ) {
3031+ div.style.marginTop = "1%";
3032+ support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
3033+ }
3034+
3035+ if ( typeof container.style.zoom !== "undefined" ) {
3036+ container.style.zoom = 1;
3037+ }
3038+
3039+ body.removeChild( container );
3040+ marginDiv = div = container = null;
3041+
3042+ jQuery.extend( support, offsetSupport );
3043+ });
3044+
3045+ return support;
3046+})();
3047+
3048+
3049+
3050+
3051+var rbrace = /^(?:\{.*\}|\[.*\])$/,
3052+ rmultiDash = /([A-Z])/g;
3053+
3054+jQuery.extend({
3055+ cache: {},
3056+
3057+ // Please use with caution
3058+ uuid: 0,
3059+
3060+ // Unique for each copy of jQuery on the page
3061+ // Non-digits removed to match rinlinejQuery
3062+ expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
3063+
3064+ // The following elements throw uncatchable exceptions if you
3065+ // attempt to add expando properties to them.
3066+ noData: {
3067+ "embed": true,
3068+ // Ban all objects except for Flash (which handle expandos)
3069+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
3070+ "applet": true
3071+ },
3072+
3073+ hasData: function( elem ) {
3074+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
3075+ return !!elem && !isEmptyDataObject( elem );
3076+ },
3077+
3078+ data: function( elem, name, data, pvt /* Internal Use Only */ ) {
3079+ if ( !jQuery.acceptData( elem ) ) {
3080+ return;
3081+ }
3082+
3083+ var privateCache, thisCache, ret,
3084+ internalKey = jQuery.expando,
3085+ getByName = typeof name === "string",
3086+
3087+ // We have to handle DOM nodes and JS objects differently because IE6-7
3088+ // can't GC object references properly across the DOM-JS boundary
3089+ isNode = elem.nodeType,
3090+
3091+ // Only DOM nodes need the global jQuery cache; JS object data is
3092+ // attached directly to the object so GC can occur automatically
3093+ cache = isNode ? jQuery.cache : elem,
3094+
3095+ // Only defining an ID for JS objects if its cache already exists allows
3096+ // the code to shortcut on the same path as a DOM node with no cache
3097+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
3098+ isEvents = name === "events";
3099+
3100+ // Avoid doing any more work than we need to when trying to get data on an
3101+ // object that has no data at all
3102+ if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
3103+ return;
3104+ }
3105+
3106+ if ( !id ) {
3107+ // Only DOM nodes need a new unique ID for each element since their data
3108+ // ends up in the global cache
3109+ if ( isNode ) {
3110+ elem[ internalKey ] = id = ++jQuery.uuid;
3111+ } else {
3112+ id = internalKey;
3113+ }
3114+ }
3115+
3116+ if ( !cache[ id ] ) {
3117+ cache[ id ] = {};
3118+
3119+ // Avoids exposing jQuery metadata on plain JS objects when the object
3120+ // is serialized using JSON.stringify
3121+ if ( !isNode ) {
3122+ cache[ id ].toJSON = jQuery.noop;
3123+ }
3124+ }
3125+
3126+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
3127+ // shallow copied over onto the existing cache
3128+ if ( typeof name === "object" || typeof name === "function" ) {
3129+ if ( pvt ) {
3130+ cache[ id ] = jQuery.extend( cache[ id ], name );
3131+ } else {
3132+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
3133+ }
3134+ }
3135+
3136+ privateCache = thisCache = cache[ id ];
3137+
3138+ // jQuery data() is stored in a separate object inside the object's internal data
3139+ // cache in order to avoid key collisions between internal data and user-defined
3140+ // data.
3141+ if ( !pvt ) {
3142+ if ( !thisCache.data ) {
3143+ thisCache.data = {};
3144+ }
3145+
3146+ thisCache = thisCache.data;
3147+ }
3148+
3149+ if ( data !== undefined ) {
3150+ thisCache[ jQuery.camelCase( name ) ] = data;
3151+ }
3152+
3153+ // Users should not attempt to inspect the internal events object using jQuery.data,
3154+ // it is undocumented and subject to change. But does anyone listen? No.
3155+ if ( isEvents && !thisCache[ name ] ) {
3156+ return privateCache.events;
3157+ }
3158+
3159+ // Check for both converted-to-camel and non-converted data property names
3160+ // If a data property was specified
3161+ if ( getByName ) {
3162+
3163+ // First Try to find as-is property data
3164+ ret = thisCache[ name ];
3165+
3166+ // Test for null|undefined property data
3167+ if ( ret == null ) {
3168+
3169+ // Try to find the camelCased property
3170+ ret = thisCache[ jQuery.camelCase( name ) ];
3171+ }
3172+ } else {
3173+ ret = thisCache;
3174+ }
3175+
3176+ return ret;
3177+ },
3178+
3179+ removeData: function( elem, name, pvt /* Internal Use Only */ ) {
3180+ if ( !jQuery.acceptData( elem ) ) {
3181+ return;
3182+ }
3183+
3184+ var thisCache, i, l,
3185+
3186+ // Reference to internal data cache key
3187+ internalKey = jQuery.expando,
3188+
3189+ isNode = elem.nodeType,
3190+
3191+ // See jQuery.data for more information
3192+ cache = isNode ? jQuery.cache : elem,
3193+
3194+ // See jQuery.data for more information
3195+ id = isNode ? elem[ internalKey ] : internalKey;
3196+
3197+ // If there is already no cache entry for this object, there is no
3198+ // purpose in continuing
3199+ if ( !cache[ id ] ) {
3200+ return;
3201+ }
3202+
3203+ if ( name ) {
3204+
3205+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
3206+
3207+ if ( thisCache ) {
3208+
3209+ // Support array or space separated string names for data keys
3210+ if ( !jQuery.isArray( name ) ) {
3211+
3212+ // try the string as a key before any manipulation
3213+ if ( name in thisCache ) {
3214+ name = [ name ];
3215+ } else {
3216+
3217+ // split the camel cased version by spaces unless a key with the spaces exists
3218+ name = jQuery.camelCase( name );
3219+ if ( name in thisCache ) {
3220+ name = [ name ];
3221+ } else {
3222+ name = name.split( " " );
3223+ }
3224+ }
3225+ }
3226+
3227+ for ( i = 0, l = name.length; i < l; i++ ) {
3228+ delete thisCache[ name[i] ];
3229+ }
3230+
3231+ // If there is no data left in the cache, we want to continue
3232+ // and let the cache object itself get destroyed
3233+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
3234+ return;
3235+ }
3236+ }
3237+ }
3238+
3239+ // See jQuery.data for more information
3240+ if ( !pvt ) {
3241+ delete cache[ id ].data;
3242+
3243+ // Don't destroy the parent cache unless the internal data object
3244+ // had been the only thing left in it
3245+ if ( !isEmptyDataObject(cache[ id ]) ) {
3246+ return;
3247+ }
3248+ }
3249+
3250+ // Browsers that fail expando deletion also refuse to delete expandos on
3251+ // the window, but it will allow it on all other JS objects; other browsers
3252+ // don't care
3253+ // Ensure that `cache` is not a window object #10080
3254+ if ( jQuery.support.deleteExpando || !cache.setInterval ) {
3255+ delete cache[ id ];
3256+ } else {
3257+ cache[ id ] = null;
3258+ }
3259+
3260+ // We destroyed the cache and need to eliminate the expando on the node to avoid
3261+ // false lookups in the cache for entries that no longer exist
3262+ if ( isNode ) {
3263+ // IE does not allow us to delete expando properties from nodes,
3264+ // nor does it have a removeAttribute function on Document nodes;
3265+ // we must handle all of these cases
3266+ if ( jQuery.support.deleteExpando ) {
3267+ delete elem[ internalKey ];
3268+ } else if ( elem.removeAttribute ) {
3269+ elem.removeAttribute( internalKey );
3270+ } else {
3271+ elem[ internalKey ] = null;
3272+ }
3273+ }
3274+ },
3275+
3276+ // For internal use only.
3277+ _data: function( elem, name, data ) {
3278+ return jQuery.data( elem, name, data, true );
3279+ },
3280+
3281+ // A method for determining if a DOM node can handle the data expando
3282+ acceptData: function( elem ) {
3283+ if ( elem.nodeName ) {
3284+ var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
3285+
3286+ if ( match ) {
3287+ return !(match === true || elem.getAttribute("classid") !== match);
3288+ }
3289+ }
3290+
3291+ return true;
3292+ }
3293+});
3294+
3295+jQuery.fn.extend({
3296+ data: function( key, value ) {
3297+ var parts, part, attr, name, l,
3298+ elem = this[0],
3299+ i = 0,
3300+ data = null;
3301+
3302+ // Gets all values
3303+ if ( key === undefined ) {
3304+ if ( this.length ) {
3305+ data = jQuery.data( elem );
3306+
3307+ if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
3308+ attr = elem.attributes;
3309+ for ( l = attr.length; i < l; i++ ) {
3310+ name = attr[i].name;
3311+
3312+ if ( name.indexOf( "data-" ) === 0 ) {
3313+ name = jQuery.camelCase( name.substring(5) );
3314+
3315+ dataAttr( elem, name, data[ name ] );
3316+ }
3317+ }
3318+ jQuery._data( elem, "parsedAttrs", true );
3319+ }
3320+ }
3321+
3322+ return data;
3323+ }
3324+
3325+ // Sets multiple values
3326+ if ( typeof key === "object" ) {
3327+ return this.each(function() {
3328+ jQuery.data( this, key );
3329+ });
3330+ }
3331+
3332+ parts = key.split( ".", 2 );
3333+ parts[1] = parts[1] ? "." + parts[1] : "";
3334+ part = parts[1] + "!";
3335+
3336+ return jQuery.access( this, function( value ) {
3337+
3338+ if ( value === undefined ) {
3339+ data = this.triggerHandler( "getData" + part, [ parts[0] ] );
3340+
3341+ // Try to fetch any internally stored data first
3342+ if ( data === undefined && elem ) {
3343+ data = jQuery.data( elem, key );
3344+ data = dataAttr( elem, key, data );
3345+ }
3346+
3347+ return data === undefined && parts[1] ?
3348+ this.data( parts[0] ) :
3349+ data;
3350+ }
3351+
3352+ parts[1] = value;
3353+ this.each(function() {
3354+ var self = jQuery( this );
3355+
3356+ self.triggerHandler( "setData" + part, parts );
3357+ jQuery.data( this, key, value );
3358+ self.triggerHandler( "changeData" + part, parts );
3359+ });
3360+ }, null, value, arguments.length > 1, null, false );
3361+ },
3362+
3363+ removeData: function( key ) {
3364+ return this.each(function() {
3365+ jQuery.removeData( this, key );
3366+ });
3367+ }
3368+});
3369+
3370+function dataAttr( elem, key, data ) {
3371+ // If nothing was found internally, try to fetch any
3372+ // data from the HTML5 data-* attribute
3373+ if ( data === undefined && elem.nodeType === 1 ) {
3374+
3375+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3376+
3377+ data = elem.getAttribute( name );
3378+
3379+ if ( typeof data === "string" ) {
3380+ try {
3381+ data = data === "true" ? true :
3382+ data === "false" ? false :
3383+ data === "null" ? null :
3384+ jQuery.isNumeric( data ) ? +data :
3385+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
3386+ data;
3387+ } catch( e ) {}
3388+
3389+ // Make sure we set the data so it isn't changed later
3390+ jQuery.data( elem, key, data );
3391+
3392+ } else {
3393+ data = undefined;
3394+ }
3395+ }
3396+
3397+ return data;
3398+}
3399+
3400+// checks a cache object for emptiness
3401+function isEmptyDataObject( obj ) {
3402+ for ( var name in obj ) {
3403+
3404+ // if the public data object is empty, the private is still empty
3405+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
3406+ continue;
3407+ }
3408+ if ( name !== "toJSON" ) {
3409+ return false;
3410+ }
3411+ }
3412+
3413+ return true;
3414+}
3415+
3416+
3417+
3418+
3419+function handleQueueMarkDefer( elem, type, src ) {
3420+ var deferDataKey = type + "defer",
3421+ queueDataKey = type + "queue",
3422+ markDataKey = type + "mark",
3423+ defer = jQuery._data( elem, deferDataKey );
3424+ if ( defer &&
3425+ ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
3426+ ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
3427+ // Give room for hard-coded callbacks to fire first
3428+ // and eventually mark/queue something else on the element
3429+ setTimeout( function() {
3430+ if ( !jQuery._data( elem, queueDataKey ) &&
3431+ !jQuery._data( elem, markDataKey ) ) {
3432+ jQuery.removeData( elem, deferDataKey, true );
3433+ defer.fire();
3434+ }
3435+ }, 0 );
3436+ }
3437+}
3438+
3439+jQuery.extend({
3440+
3441+ _mark: function( elem, type ) {
3442+ if ( elem ) {
3443+ type = ( type || "fx" ) + "mark";
3444+ jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
3445+ }
3446+ },
3447+
3448+ _unmark: function( force, elem, type ) {
3449+ if ( force !== true ) {
3450+ type = elem;
3451+ elem = force;
3452+ force = false;
3453+ }
3454+ if ( elem ) {
3455+ type = type || "fx";
3456+ var key = type + "mark",
3457+ count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
3458+ if ( count ) {
3459+ jQuery._data( elem, key, count );
3460+ } else {
3461+ jQuery.removeData( elem, key, true );
3462+ handleQueueMarkDefer( elem, type, "mark" );
3463+ }
3464+ }
3465+ },
3466+
3467+ queue: function( elem, type, data ) {
3468+ var q;
3469+ if ( elem ) {
3470+ type = ( type || "fx" ) + "queue";
3471+ q = jQuery._data( elem, type );
3472+
3473+ // Speed up dequeue by getting out quickly if this is just a lookup
3474+ if ( data ) {
3475+ if ( !q || jQuery.isArray(data) ) {
3476+ q = jQuery._data( elem, type, jQuery.makeArray(data) );
3477+ } else {
3478+ q.push( data );
3479+ }
3480+ }
3481+ return q || [];
3482+ }
3483+ },
3484+
3485+ dequeue: function( elem, type ) {
3486+ type = type || "fx";
3487+
3488+ var queue = jQuery.queue( elem, type ),
3489+ fn = queue.shift(),
3490+ hooks = {};
3491+
3492+ // If the fx queue is dequeued, always remove the progress sentinel
3493+ if ( fn === "inprogress" ) {
3494+ fn = queue.shift();
3495+ }
3496+
3497+ if ( fn ) {
3498+ // Add a progress sentinel to prevent the fx queue from being
3499+ // automatically dequeued
3500+ if ( type === "fx" ) {
3501+ queue.unshift( "inprogress" );
3502+ }
3503+
3504+ jQuery._data( elem, type + ".run", hooks );
3505+ fn.call( elem, function() {
3506+ jQuery.dequeue( elem, type );
3507+ }, hooks );
3508+ }
3509+
3510+ if ( !queue.length ) {
3511+ jQuery.removeData( elem, type + "queue " + type + ".run", true );
3512+ handleQueueMarkDefer( elem, type, "queue" );
3513+ }
3514+ }
3515+});
3516+
3517+jQuery.fn.extend({
3518+ queue: function( type, data ) {
3519+ var setter = 2;
3520+
3521+ if ( typeof type !== "string" ) {
3522+ data = type;
3523+ type = "fx";
3524+ setter--;
3525+ }
3526+
3527+ if ( arguments.length < setter ) {
3528+ return jQuery.queue( this[0], type );
3529+ }
3530+
3531+ return data === undefined ?
3532+ this :
3533+ this.each(function() {
3534+ var queue = jQuery.queue( this, type, data );
3535+
3536+ if ( type === "fx" && queue[0] !== "inprogress" ) {
3537+ jQuery.dequeue( this, type );
3538+ }
3539+ });
3540+ },
3541+ dequeue: function( type ) {
3542+ return this.each(function() {
3543+ jQuery.dequeue( this, type );
3544+ });
3545+ },
3546+ // Based off of the plugin by Clint Helfers, with permission.
3547+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
3548+ delay: function( time, type ) {
3549+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
3550+ type = type || "fx";
3551+
3552+ return this.queue( type, function( next, hooks ) {
3553+ var timeout = setTimeout( next, time );
3554+ hooks.stop = function() {
3555+ clearTimeout( timeout );
3556+ };
3557+ });
3558+ },
3559+ clearQueue: function( type ) {
3560+ return this.queue( type || "fx", [] );
3561+ },
3562+ // Get a promise resolved when queues of a certain type
3563+ // are emptied (fx is the type by default)
3564+ promise: function( type, object ) {
3565+ if ( typeof type !== "string" ) {
3566+ object = type;
3567+ type = undefined;
3568+ }
3569+ type = type || "fx";
3570+ var defer = jQuery.Deferred(),
3571+ elements = this,
3572+ i = elements.length,
3573+ count = 1,
3574+ deferDataKey = type + "defer",
3575+ queueDataKey = type + "queue",
3576+ markDataKey = type + "mark",
3577+ tmp;
3578+ function resolve() {
3579+ if ( !( --count ) ) {
3580+ defer.resolveWith( elements, [ elements ] );
3581+ }
3582+ }
3583+ while( i-- ) {
3584+ if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
3585+ ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
3586+ jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
3587+ jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
3588+ count++;
3589+ tmp.add( resolve );
3590+ }
3591+ }
3592+ resolve();
3593+ return defer.promise( object );
3594+ }
3595+});
3596+
3597+
3598+
3599+
3600+var rclass = /[\n\t\r]/g,
3601+ rspace = /\s+/,
3602+ rreturn = /\r/g,
3603+ rtype = /^(?:button|input)$/i,
3604+ rfocusable = /^(?:button|input|object|select|textarea)$/i,
3605+ rclickable = /^a(?:rea)?$/i,
3606+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
3607+ getSetAttribute = jQuery.support.getSetAttribute,
3608+ nodeHook, boolHook, fixSpecified;
3609+
3610+jQuery.fn.extend({
3611+ attr: function( name, value ) {
3612+ return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
3613+ },
3614+
3615+ removeAttr: function( name ) {
3616+ return this.each(function() {
3617+ jQuery.removeAttr( this, name );
3618+ });
3619+ },
3620+
3621+ prop: function( name, value ) {
3622+ return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
3623+ },
3624+
3625+ removeProp: function( name ) {
3626+ name = jQuery.propFix[ name ] || name;
3627+ return this.each(function() {
3628+ // try/catch handles cases where IE balks (such as removing a property on window)
3629+ try {
3630+ this[ name ] = undefined;
3631+ delete this[ name ];
3632+ } catch( e ) {}
3633+ });
3634+ },
3635+
3636+ addClass: function( value ) {
3637+ var classNames, i, l, elem,
3638+ setClass, c, cl;
3639+
3640+ if ( jQuery.isFunction( value ) ) {
3641+ return this.each(function( j ) {
3642+ jQuery( this ).addClass( value.call(this, j, this.className) );
3643+ });
3644+ }
3645+
3646+ if ( value && typeof value === "string" ) {
3647+ classNames = value.split( rspace );
3648+
3649+ for ( i = 0, l = this.length; i < l; i++ ) {
3650+ elem = this[ i ];
3651+
3652+ if ( elem.nodeType === 1 ) {
3653+ if ( !elem.className && classNames.length === 1 ) {
3654+ elem.className = value;
3655+
3656+ } else {
3657+ setClass = " " + elem.className + " ";
3658+
3659+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
3660+ if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
3661+ setClass += classNames[ c ] + " ";
3662+ }
3663+ }
3664+ elem.className = jQuery.trim( setClass );
3665+ }
3666+ }
3667+ }
3668+ }
3669+
3670+ return this;
3671+ },
3672+
3673+ removeClass: function( value ) {
3674+ var classNames, i, l, elem, className, c, cl;
3675+
3676+ if ( jQuery.isFunction( value ) ) {
3677+ return this.each(function( j ) {
3678+ jQuery( this ).removeClass( value.call(this, j, this.className) );
3679+ });
3680+ }
3681+
3682+ if ( (value && typeof value === "string") || value === undefined ) {
3683+ classNames = ( value || "" ).split( rspace );
3684+
3685+ for ( i = 0, l = this.length; i < l; i++ ) {
3686+ elem = this[ i ];
3687+
3688+ if ( elem.nodeType === 1 && elem.className ) {
3689+ if ( value ) {
3690+ className = (" " + elem.className + " ").replace( rclass, " " );
3691+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
3692+ className = className.replace(" " + classNames[ c ] + " ", " ");
3693+ }
3694+ elem.className = jQuery.trim( className );
3695+
3696+ } else {
3697+ elem.className = "";
3698+ }
3699+ }
3700+ }
3701+ }
3702+
3703+ return this;
3704+ },
3705+
3706+ toggleClass: function( value, stateVal ) {
3707+ var type = typeof value,
3708+ isBool = typeof stateVal === "boolean";
3709+
3710+ if ( jQuery.isFunction( value ) ) {
3711+ return this.each(function( i ) {
3712+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
3713+ });
3714+ }
3715+
3716+ return this.each(function() {
3717+ if ( type === "string" ) {
3718+ // toggle individual class names
3719+ var className,
3720+ i = 0,
3721+ self = jQuery( this ),
3722+ state = stateVal,
3723+ classNames = value.split( rspace );
3724+
3725+ while ( (className = classNames[ i++ ]) ) {
3726+ // check each className given, space seperated list
3727+ state = isBool ? state : !self.hasClass( className );
3728+ self[ state ? "addClass" : "removeClass" ]( className );
3729+ }
3730+
3731+ } else if ( type === "undefined" || type === "boolean" ) {
3732+ if ( this.className ) {
3733+ // store className if set
3734+ jQuery._data( this, "__className__", this.className );
3735+ }
3736+
3737+ // toggle whole className
3738+ this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
3739+ }
3740+ });
3741+ },
3742+
3743+ hasClass: function( selector ) {
3744+ var className = " " + selector + " ",
3745+ i = 0,
3746+ l = this.length;
3747+ for ( ; i < l; i++ ) {
3748+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
3749+ return true;
3750+ }
3751+ }
3752+
3753+ return false;
3754+ },
3755+
3756+ val: function( value ) {
3757+ var hooks, ret, isFunction,
3758+ elem = this[0];
3759+
3760+ if ( !arguments.length ) {
3761+ if ( elem ) {
3762+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
3763+
3764+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
3765+ return ret;
3766+ }
3767+
3768+ ret = elem.value;
3769+
3770+ return typeof ret === "string" ?
3771+ // handle most common string cases
3772+ ret.replace(rreturn, "") :
3773+ // handle cases where value is null/undef or number
3774+ ret == null ? "" : ret;
3775+ }
3776+
3777+ return;
3778+ }
3779+
3780+ isFunction = jQuery.isFunction( value );
3781+
3782+ return this.each(function( i ) {
3783+ var self = jQuery(this), val;
3784+
3785+ if ( this.nodeType !== 1 ) {
3786+ return;
3787+ }
3788+
3789+ if ( isFunction ) {
3790+ val = value.call( this, i, self.val() );
3791+ } else {
3792+ val = value;
3793+ }
3794+
3795+ // Treat null/undefined as ""; convert numbers to string
3796+ if ( val == null ) {
3797+ val = "";
3798+ } else if ( typeof val === "number" ) {
3799+ val += "";
3800+ } else if ( jQuery.isArray( val ) ) {
3801+ val = jQuery.map(val, function ( value ) {
3802+ return value == null ? "" : value + "";
3803+ });
3804+ }
3805+
3806+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
3807+
3808+ // If set returns undefined, fall back to normal setting
3809+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
3810+ this.value = val;
3811+ }
3812+ });
3813+ }
3814+});
3815+
3816+jQuery.extend({
3817+ valHooks: {
3818+ option: {
3819+ get: function( elem ) {
3820+ // attributes.value is undefined in Blackberry 4.7 but
3821+ // uses .value. See #6932
3822+ var val = elem.attributes.value;
3823+ return !val || val.specified ? elem.value : elem.text;
3824+ }
3825+ },
3826+ select: {
3827+ get: function( elem ) {
3828+ var value, i, max, option,
3829+ index = elem.selectedIndex,
3830+ values = [],
3831+ options = elem.options,
3832+ one = elem.type === "select-one";
3833+
3834+ // Nothing was selected
3835+ if ( index < 0 ) {
3836+ return null;
3837+ }
3838+
3839+ // Loop through all the selected options
3840+ i = one ? index : 0;
3841+ max = one ? index + 1 : options.length;
3842+ for ( ; i < max; i++ ) {
3843+ option = options[ i ];
3844+
3845+ // Don't return options that are disabled or in a disabled optgroup
3846+ if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
3847+ (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
3848+
3849+ // Get the specific value for the option
3850+ value = jQuery( option ).val();
3851+
3852+ // We don't need an array for one selects
3853+ if ( one ) {
3854+ return value;
3855+ }
3856+
3857+ // Multi-Selects return an array
3858+ values.push( value );
3859+ }
3860+ }
3861+
3862+ // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
3863+ if ( one && !values.length && options.length ) {
3864+ return jQuery( options[ index ] ).val();
3865+ }
3866+
3867+ return values;
3868+ },
3869+
3870+ set: function( elem, value ) {
3871+ var values = jQuery.makeArray( value );
3872+
3873+ jQuery(elem).find("option").each(function() {
3874+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
3875+ });
3876+
3877+ if ( !values.length ) {
3878+ elem.selectedIndex = -1;
3879+ }
3880+ return values;
3881+ }
3882+ }
3883+ },
3884+
3885+ attrFn: {
3886+ val: true,
3887+ css: true,
3888+ html: true,
3889+ text: true,
3890+ data: true,
3891+ width: true,
3892+ height: true,
3893+ offset: true
3894+ },
3895+
3896+ attr: function( elem, name, value, pass ) {
3897+ var ret, hooks, notxml,
3898+ nType = elem.nodeType;
3899+
3900+ // don't get/set attributes on text, comment and attribute nodes
3901+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
3902+ return;
3903+ }
3904+
3905+ if ( pass && name in jQuery.attrFn ) {
3906+ return jQuery( elem )[ name ]( value );
3907+ }
3908+
3909+ // Fallback to prop when attributes are not supported
3910+ if ( typeof elem.getAttribute === "undefined" ) {
3911+ return jQuery.prop( elem, name, value );
3912+ }
3913+
3914+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
3915+
3916+ // All attributes are lowercase
3917+ // Grab necessary hook if one is defined
3918+ if ( notxml ) {
3919+ name = name.toLowerCase();
3920+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
3921+ }
3922+
3923+ if ( value !== undefined ) {
3924+
3925+ if ( value === null ) {
3926+ jQuery.removeAttr( elem, name );
3927+ return;
3928+
3929+ } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
3930+ return ret;
3931+
3932+ } else {
3933+ elem.setAttribute( name, "" + value );
3934+ return value;
3935+ }
3936+
3937+ } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
3938+ return ret;
3939+
3940+ } else {
3941+
3942+ ret = elem.getAttribute( name );
3943+
3944+ // Non-existent attributes return null, we normalize to undefined
3945+ return ret === null ?
3946+ undefined :
3947+ ret;
3948+ }
3949+ },
3950+
3951+ removeAttr: function( elem, value ) {
3952+ var propName, attrNames, name, l, isBool,
3953+ i = 0;
3954+
3955+ if ( value && elem.nodeType === 1 ) {
3956+ attrNames = value.toLowerCase().split( rspace );
3957+ l = attrNames.length;
3958+
3959+ for ( ; i < l; i++ ) {
3960+ name = attrNames[ i ];
3961+
3962+ if ( name ) {
3963+ propName = jQuery.propFix[ name ] || name;
3964+ isBool = rboolean.test( name );
3965+
3966+ // See #9699 for explanation of this approach (setting first, then removal)
3967+ // Do not do this for boolean attributes (see #10870)
3968+ if ( !isBool ) {
3969+ jQuery.attr( elem, name, "" );
3970+ }
3971+ elem.removeAttribute( getSetAttribute ? name : propName );
3972+
3973+ // Set corresponding property to false for boolean attributes
3974+ if ( isBool && propName in elem ) {
3975+ elem[ propName ] = false;
3976+ }
3977+ }
3978+ }
3979+ }
3980+ },
3981+
3982+ attrHooks: {
3983+ type: {
3984+ set: function( elem, value ) {
3985+ // We can't allow the type property to be changed (since it causes problems in IE)
3986+ if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
3987+ jQuery.error( "type property can't be changed" );
3988+ } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
3989+ // Setting the type on a radio button after the value resets the value in IE6-9
3990+ // Reset value to it's default in case type is set after value
3991+ // This is for element creation
3992+ var val = elem.value;
3993+ elem.setAttribute( "type", value );
3994+ if ( val ) {
3995+ elem.value = val;
3996+ }
3997+ return value;
3998+ }
3999+ }
4000+ },
4001+ // Use the value property for back compat
4002+ // Use the nodeHook for button elements in IE6/7 (#1954)
4003+ value: {
4004+ get: function( elem, name ) {
4005+ if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
4006+ return nodeHook.get( elem, name );
4007+ }
4008+ return name in elem ?
4009+ elem.value :
4010+ null;
4011+ },
4012+ set: function( elem, value, name ) {
4013+ if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
4014+ return nodeHook.set( elem, value, name );
4015+ }
4016+ // Does not return so that setAttribute is also used
4017+ elem.value = value;
4018+ }
4019+ }
4020+ },
4021+
4022+ propFix: {
4023+ tabindex: "tabIndex",
4024+ readonly: "readOnly",
4025+ "for": "htmlFor",
4026+ "class": "className",
4027+ maxlength: "maxLength",
4028+ cellspacing: "cellSpacing",
4029+ cellpadding: "cellPadding",
4030+ rowspan: "rowSpan",
4031+ colspan: "colSpan",
4032+ usemap: "useMap",
4033+ frameborder: "frameBorder",
4034+ contenteditable: "contentEditable"
4035+ },
4036+
4037+ prop: function( elem, name, value ) {
4038+ var ret, hooks, notxml,
4039+ nType = elem.nodeType;
4040+
4041+ // don't get/set properties on text, comment and attribute nodes
4042+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
4043+ return;
4044+ }
4045+
4046+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
4047+
4048+ if ( notxml ) {
4049+ // Fix name and attach hooks
4050+ name = jQuery.propFix[ name ] || name;
4051+ hooks = jQuery.propHooks[ name ];
4052+ }
4053+
4054+ if ( value !== undefined ) {
4055+ if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
4056+ return ret;
4057+
4058+ } else {
4059+ return ( elem[ name ] = value );
4060+ }
4061+
4062+ } else {
4063+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
4064+ return ret;
4065+
4066+ } else {
4067+ return elem[ name ];
4068+ }
4069+ }
4070+ },
4071+
4072+ propHooks: {
4073+ tabIndex: {
4074+ get: function( elem ) {
4075+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
4076+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
4077+ var attributeNode = elem.getAttributeNode("tabindex");
4078+
4079+ return attributeNode && attributeNode.specified ?
4080+ parseInt( attributeNode.value, 10 ) :
4081+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
4082+ 0 :
4083+ undefined;
4084+ }
4085+ }
4086+ }
4087+});
4088+
4089+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
4090+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
4091+
4092+// Hook for boolean attributes
4093+boolHook = {
4094+ get: function( elem, name ) {
4095+ // Align boolean attributes with corresponding properties
4096+ // Fall back to attribute presence where some booleans are not supported
4097+ var attrNode,
4098+ property = jQuery.prop( elem, name );
4099+ return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
4100+ name.toLowerCase() :
4101+ undefined;
4102+ },
4103+ set: function( elem, value, name ) {
4104+ var propName;
4105+ if ( value === false ) {
4106+ // Remove boolean attributes when set to false
4107+ jQuery.removeAttr( elem, name );
4108+ } else {
4109+ // value is true since we know at this point it's type boolean and not false
4110+ // Set boolean attributes to the same name and set the DOM property
4111+ propName = jQuery.propFix[ name ] || name;
4112+ if ( propName in elem ) {
4113+ // Only set the IDL specifically if it already exists on the element
4114+ elem[ propName ] = true;
4115+ }
4116+
4117+ elem.setAttribute( name, name.toLowerCase() );
4118+ }
4119+ return name;
4120+ }
4121+};
4122+
4123+// IE6/7 do not support getting/setting some attributes with get/setAttribute
4124+if ( !getSetAttribute ) {
4125+
4126+ fixSpecified = {
4127+ name: true,
4128+ id: true,
4129+ coords: true
4130+ };
4131+
4132+ // Use this for any attribute in IE6/7
4133+ // This fixes almost every IE6/7 issue
4134+ nodeHook = jQuery.valHooks.button = {
4135+ get: function( elem, name ) {
4136+ var ret;
4137+ ret = elem.getAttributeNode( name );
4138+ return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
4139+ ret.nodeValue :
4140+ undefined;
4141+ },
4142+ set: function( elem, value, name ) {
4143+ // Set the existing or create a new attribute node
4144+ var ret = elem.getAttributeNode( name );
4145+ if ( !ret ) {
4146+ ret = document.createAttribute( name );
4147+ elem.setAttributeNode( ret );
4148+ }
4149+ return ( ret.nodeValue = value + "" );
4150+ }
4151+ };
4152+
4153+ // Apply the nodeHook to tabindex
4154+ jQuery.attrHooks.tabindex.set = nodeHook.set;
4155+
4156+ // Set width and height to auto instead of 0 on empty string( Bug #8150 )
4157+ // This is for removals
4158+ jQuery.each([ "width", "height" ], function( i, name ) {
4159+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
4160+ set: function( elem, value ) {
4161+ if ( value === "" ) {
4162+ elem.setAttribute( name, "auto" );
4163+ return value;
4164+ }
4165+ }
4166+ });
4167+ });
4168+
4169+ // Set contenteditable to false on removals(#10429)
4170+ // Setting to empty string throws an error as an invalid value
4171+ jQuery.attrHooks.contenteditable = {
4172+ get: nodeHook.get,
4173+ set: function( elem, value, name ) {
4174+ if ( value === "" ) {
4175+ value = "false";
4176+ }
4177+ nodeHook.set( elem, value, name );
4178+ }
4179+ };
4180+}
4181+
4182+
4183+// Some attributes require a special call on IE
4184+if ( !jQuery.support.hrefNormalized ) {
4185+ jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
4186+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
4187+ get: function( elem ) {
4188+ var ret = elem.getAttribute( name, 2 );
4189+ return ret === null ? undefined : ret;
4190+ }
4191+ });
4192+ });
4193+}
4194+
4195+if ( !jQuery.support.style ) {
4196+ jQuery.attrHooks.style = {
4197+ get: function( elem ) {
4198+ // Return undefined in the case of empty string
4199+ // Normalize to lowercase since IE uppercases css property names
4200+ return elem.style.cssText.toLowerCase() || undefined;
4201+ },
4202+ set: function( elem, value ) {
4203+ return ( elem.style.cssText = "" + value );
4204+ }
4205+ };
4206+}
4207+
4208+// Safari mis-reports the default selected property of an option
4209+// Accessing the parent's selectedIndex property fixes it
4210+if ( !jQuery.support.optSelected ) {
4211+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
4212+ get: function( elem ) {
4213+ var parent = elem.parentNode;
4214+
4215+ if ( parent ) {
4216+ parent.selectedIndex;
4217+
4218+ // Make sure that it also works with optgroups, see #5701
4219+ if ( parent.parentNode ) {
4220+ parent.parentNode.selectedIndex;
4221+ }
4222+ }
4223+ return null;
4224+ }
4225+ });
4226+}
4227+
4228+// IE6/7 call enctype encoding
4229+if ( !jQuery.support.enctype ) {
4230+ jQuery.propFix.enctype = "encoding";
4231+}
4232+
4233+// Radios and checkboxes getter/setter
4234+if ( !jQuery.support.checkOn ) {
4235+ jQuery.each([ "radio", "checkbox" ], function() {
4236+ jQuery.valHooks[ this ] = {
4237+ get: function( elem ) {
4238+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
4239+ return elem.getAttribute("value") === null ? "on" : elem.value;
4240+ }
4241+ };
4242+ });
4243+}
4244+jQuery.each([ "radio", "checkbox" ], function() {
4245+ jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
4246+ set: function( elem, value ) {
4247+ if ( jQuery.isArray( value ) ) {
4248+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
4249+ }
4250+ }
4251+ });
4252+});
4253+
4254+
4255+
4256+
4257+var rformElems = /^(?:textarea|input|select)$/i,
4258+ rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
4259+ rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
4260+ rkeyEvent = /^key/,
4261+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
4262+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4263+ rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
4264+ quickParse = function( selector ) {
4265+ var quick = rquickIs.exec( selector );
4266+ if ( quick ) {
4267+ // 0 1 2 3
4268+ // [ _, tag, id, class ]
4269+ quick[1] = ( quick[1] || "" ).toLowerCase();
4270+ quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
4271+ }
4272+ return quick;
4273+ },
4274+ quickIs = function( elem, m ) {
4275+ var attrs = elem.attributes || {};
4276+ return (
4277+ (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
4278+ (!m[2] || (attrs.id || {}).value === m[2]) &&
4279+ (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
4280+ );
4281+ },
4282+ hoverHack = function( events ) {
4283+ return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
4284+ };
4285+
4286+/*
4287+ * Helper functions for managing events -- not part of the public interface.
4288+ * Props to Dean Edwards' addEvent library for many of the ideas.
4289+ */
4290+jQuery.event = {
4291+
4292+ add: function( elem, types, handler, data, selector ) {
4293+
4294+ var elemData, eventHandle, events,
4295+ t, tns, type, namespaces, handleObj,
4296+ handleObjIn, quick, handlers, special;
4297+
4298+ // Don't attach events to noData or text/comment nodes (allow plain objects tho)
4299+ if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
4300+ return;
4301+ }
4302+
4303+ // Caller can pass in an object of custom data in lieu of the handler
4304+ if ( handler.handler ) {
4305+ handleObjIn = handler;
4306+ handler = handleObjIn.handler;
4307+ selector = handleObjIn.selector;
4308+ }
4309+
4310+ // Make sure that the handler has a unique ID, used to find/remove it later
4311+ if ( !handler.guid ) {
4312+ handler.guid = jQuery.guid++;
4313+ }
4314+
4315+ // Init the element's event structure and main handler, if this is the first
4316+ events = elemData.events;
4317+ if ( !events ) {
4318+ elemData.events = events = {};
4319+ }
4320+ eventHandle = elemData.handle;
4321+ if ( !eventHandle ) {
4322+ elemData.handle = eventHandle = function( e ) {
4323+ // Discard the second event of a jQuery.event.trigger() and
4324+ // when an event is called after a page has unloaded
4325+ return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
4326+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
4327+ undefined;
4328+ };
4329+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
4330+ eventHandle.elem = elem;
4331+ }
4332+
4333+ // Handle multiple events separated by a space
4334+ // jQuery(...).bind("mouseover mouseout", fn);
4335+ types = jQuery.trim( hoverHack(types) ).split( " " );
4336+ for ( t = 0; t < types.length; t++ ) {
4337+
4338+ tns = rtypenamespace.exec( types[t] ) || [];
4339+ type = tns[1];
4340+ namespaces = ( tns[2] || "" ).split( "." ).sort();
4341+
4342+ // If event changes its type, use the special event handlers for the changed type
4343+ special = jQuery.event.special[ type ] || {};
4344+
4345+ // If selector defined, determine special event api type, otherwise given type
4346+ type = ( selector ? special.delegateType : special.bindType ) || type;
4347+
4348+ // Update special based on newly reset type
4349+ special = jQuery.event.special[ type ] || {};
4350+
4351+ // handleObj is passed to all event handlers
4352+ handleObj = jQuery.extend({
4353+ type: type,
4354+ origType: tns[1],
4355+ data: data,
4356+ handler: handler,
4357+ guid: handler.guid,
4358+ selector: selector,
4359+ quick: selector && quickParse( selector ),
4360+ namespace: namespaces.join(".")
4361+ }, handleObjIn );
4362+
4363+ // Init the event handler queue if we're the first
4364+ handlers = events[ type ];
4365+ if ( !handlers ) {
4366+ handlers = events[ type ] = [];
4367+ handlers.delegateCount = 0;
4368+
4369+ // Only use addEventListener/attachEvent if the special events handler returns false
4370+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4371+ // Bind the global event handler to the element
4372+ if ( elem.addEventListener ) {
4373+ elem.addEventListener( type, eventHandle, false );
4374+
4375+ } else if ( elem.attachEvent ) {
4376+ elem.attachEvent( "on" + type, eventHandle );
4377+ }
4378+ }
4379+ }
4380+
4381+ if ( special.add ) {
4382+ special.add.call( elem, handleObj );
4383+
4384+ if ( !handleObj.handler.guid ) {
4385+ handleObj.handler.guid = handler.guid;
4386+ }
4387+ }
4388+
4389+ // Add to the element's handler list, delegates in front
4390+ if ( selector ) {
4391+ handlers.splice( handlers.delegateCount++, 0, handleObj );
4392+ } else {
4393+ handlers.push( handleObj );
4394+ }
4395+
4396+ // Keep track of which events have ever been used, for event optimization
4397+ jQuery.event.global[ type ] = true;
4398+ }
4399+
4400+ // Nullify elem to prevent memory leaks in IE
4401+ elem = null;
4402+ },
4403+
4404+ global: {},
4405+
4406+ // Detach an event or set of events from an element
4407+ remove: function( elem, types, handler, selector, mappedTypes ) {
4408+
4409+ var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
4410+ t, tns, type, origType, namespaces, origCount,
4411+ j, events, special, handle, eventType, handleObj;
4412+
4413+ if ( !elemData || !(events = elemData.events) ) {
4414+ return;
4415+ }
4416+
4417+ // Once for each type.namespace in types; type may be omitted
4418+ types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
4419+ for ( t = 0; t < types.length; t++ ) {
4420+ tns = rtypenamespace.exec( types[t] ) || [];
4421+ type = origType = tns[1];
4422+ namespaces = tns[2];
4423+
4424+ // Unbind all events (on this namespace, if provided) for the element
4425+ if ( !type ) {
4426+ for ( type in events ) {
4427+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
4428+ }
4429+ continue;
4430+ }
4431+
4432+ special = jQuery.event.special[ type ] || {};
4433+ type = ( selector? special.delegateType : special.bindType ) || type;
4434+ eventType = events[ type ] || [];
4435+ origCount = eventType.length;
4436+ namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
4437+
4438+ // Remove matching events
4439+ for ( j = 0; j < eventType.length; j++ ) {
4440+ handleObj = eventType[ j ];
4441+
4442+ if ( ( mappedTypes || origType === handleObj.origType ) &&
4443+ ( !handler || handler.guid === handleObj.guid ) &&
4444+ ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
4445+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
4446+ eventType.splice( j--, 1 );
4447+
4448+ if ( handleObj.selector ) {
4449+ eventType.delegateCount--;
4450+ }
4451+ if ( special.remove ) {
4452+ special.remove.call( elem, handleObj );
4453+ }
4454+ }
4455+ }
4456+
4457+ // Remove generic event handler if we removed something and no more handlers exist
4458+ // (avoids potential for endless recursion during removal of special event handlers)
4459+ if ( eventType.length === 0 && origCount !== eventType.length ) {
4460+ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
4461+ jQuery.removeEvent( elem, type, elemData.handle );
4462+ }
4463+
4464+ delete events[ type ];
4465+ }
4466+ }
4467+
4468+ // Remove the expando if it's no longer used
4469+ if ( jQuery.isEmptyObject( events ) ) {
4470+ handle = elemData.handle;
4471+ if ( handle ) {
4472+ handle.elem = null;
4473+ }
4474+
4475+ // removeData also checks for emptiness and clears the expando if empty
4476+ // so use it instead of delete
4477+ jQuery.removeData( elem, [ "events", "handle" ], true );
4478+ }
4479+ },
4480+
4481+ // Events that are safe to short-circuit if no handlers are attached.
4482+ // Native DOM events should not be added, they may have inline handlers.
4483+ customEvent: {
4484+ "getData": true,
4485+ "setData": true,
4486+ "changeData": true
4487+ },
4488+
4489+ trigger: function( event, data, elem, onlyHandlers ) {
4490+ // Don't do events on text and comment nodes
4491+ if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
4492+ return;
4493+ }
4494+
4495+ // Event object or event type
4496+ var type = event.type || event,
4497+ namespaces = [],
4498+ cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
4499+
4500+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
4501+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
4502+ return;
4503+ }
4504+
4505+ if ( type.indexOf( "!" ) >= 0 ) {
4506+ // Exclusive events trigger only for the exact event (no namespaces)
4507+ type = type.slice(0, -1);
4508+ exclusive = true;
4509+ }
4510+
4511+ if ( type.indexOf( "." ) >= 0 ) {
4512+ // Namespaced trigger; create a regexp to match event type in handle()
4513+ namespaces = type.split(".");
4514+ type = namespaces.shift();
4515+ namespaces.sort();
4516+ }
4517+
4518+ if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
4519+ // No jQuery handlers for this event type, and it can't have inline handlers
4520+ return;
4521+ }
4522+
4523+ // Caller can pass in an Event, Object, or just an event type string
4524+ event = typeof event === "object" ?
4525+ // jQuery.Event object
4526+ event[ jQuery.expando ] ? event :
4527+ // Object literal
4528+ new jQuery.Event( type, event ) :
4529+ // Just the event type (string)
4530+ new jQuery.Event( type );
4531+
4532+ event.type = type;
4533+ event.isTrigger = true;
4534+ event.exclusive = exclusive;
4535+ event.namespace = namespaces.join( "." );
4536+ event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
4537+ ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
4538+
4539+ // Handle a global trigger
4540+ if ( !elem ) {
4541+
4542+ // TODO: Stop taunting the data cache; remove global events and always attach to document
4543+ cache = jQuery.cache;
4544+ for ( i in cache ) {
4545+ if ( cache[ i ].events && cache[ i ].events[ type ] ) {
4546+ jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
4547+ }
4548+ }
4549+ return;
4550+ }
4551+
4552+ // Clean up the event in case it is being reused
4553+ event.result = undefined;
4554+ if ( !event.target ) {
4555+ event.target = elem;
4556+ }
4557+
4558+ // Clone any incoming data and prepend the event, creating the handler arg list
4559+ data = data != null ? jQuery.makeArray( data ) : [];
4560+ data.unshift( event );
4561+
4562+ // Allow special events to draw outside the lines
4563+ special = jQuery.event.special[ type ] || {};
4564+ if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
4565+ return;
4566+ }
4567+
4568+ // Determine event propagation path in advance, per W3C events spec (#9951)
4569+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4570+ eventPath = [[ elem, special.bindType || type ]];
4571+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
4572+
4573+ bubbleType = special.delegateType || type;
4574+ cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
4575+ old = null;
4576+ for ( ; cur; cur = cur.parentNode ) {
4577+ eventPath.push([ cur, bubbleType ]);
4578+ old = cur;
4579+ }
4580+
4581+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
4582+ if ( old && old === elem.ownerDocument ) {
4583+ eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
4584+ }
4585+ }
4586+
4587+ // Fire handlers on the event path
4588+ for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
4589+
4590+ cur = eventPath[i][0];
4591+ event.type = eventPath[i][1];
4592+
4593+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
4594+ if ( handle ) {
4595+ handle.apply( cur, data );
4596+ }
4597+ // Note that this is a bare JS function and not a jQuery handler
4598+ handle = ontype && cur[ ontype ];
4599+ if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
4600+ event.preventDefault();
4601+ }
4602+ }
4603+ event.type = type;
4604+
4605+ // If nobody prevented the default action, do it now
4606+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
4607+
4608+ if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
4609+ !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
4610+
4611+ // Call a native DOM method on the target with the same name name as the event.
4612+ // Can't use an .isFunction() check here because IE6/7 fails that test.
4613+ // Don't do default actions on window, that's where global variables be (#6170)
4614+ // IE<9 dies on focus/blur to hidden element (#1486)
4615+ if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
4616+
4617+ // Don't re-trigger an onFOO event when we call its FOO() method
4618+ old = elem[ ontype ];
4619+
4620+ if ( old ) {
4621+ elem[ ontype ] = null;
4622+ }
4623+
4624+ // Prevent re-triggering of the same event, since we already bubbled it above
4625+ jQuery.event.triggered = type;
4626+ elem[ type ]();
4627+ jQuery.event.triggered = undefined;
4628+
4629+ if ( old ) {
4630+ elem[ ontype ] = old;
4631+ }
4632+ }
4633+ }
4634+ }
4635+
4636+ return event.result;
4637+ },
4638+
4639+ dispatch: function( event ) {
4640+
4641+ // Make a writable jQuery.Event from the native event object
4642+ event = jQuery.event.fix( event || window.event );
4643+
4644+ var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
4645+ delegateCount = handlers.delegateCount,
4646+ args = [].slice.call( arguments, 0 ),
4647+ run_all = !event.exclusive && !event.namespace,
4648+ special = jQuery.event.special[ event.type ] || {},
4649+ handlerQueue = [],
4650+ i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
4651+
4652+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
4653+ args[0] = event;
4654+ event.delegateTarget = this;
4655+
4656+ // Call the preDispatch hook for the mapped type, and let it bail if desired
4657+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
4658+ return;
4659+ }
4660+
4661+ // Determine handlers that should run if there are delegated events
4662+ // Avoid non-left-click bubbling in Firefox (#3861)
4663+ if ( delegateCount && !(event.button && event.type === "click") ) {
4664+
4665+ // Pregenerate a single jQuery object for reuse with .is()
4666+ jqcur = jQuery(this);
4667+ jqcur.context = this.ownerDocument || this;
4668+
4669+ for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
4670+
4671+ // Don't process events on disabled elements (#6911, #8165)
4672+ if ( cur.disabled !== true ) {
4673+ selMatch = {};
4674+ matches = [];
4675+ jqcur[0] = cur;
4676+ for ( i = 0; i < delegateCount; i++ ) {
4677+ handleObj = handlers[ i ];
4678+ sel = handleObj.selector;
4679+
4680+ if ( selMatch[ sel ] === undefined ) {
4681+ selMatch[ sel ] = (
4682+ handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
4683+ );
4684+ }
4685+ if ( selMatch[ sel ] ) {
4686+ matches.push( handleObj );
4687+ }
4688+ }
4689+ if ( matches.length ) {
4690+ handlerQueue.push({ elem: cur, matches: matches });
4691+ }
4692+ }
4693+ }
4694+ }
4695+
4696+ // Add the remaining (directly-bound) handlers
4697+ if ( handlers.length > delegateCount ) {
4698+ handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
4699+ }
4700+
4701+ // Run delegates first; they may want to stop propagation beneath us
4702+ for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
4703+ matched = handlerQueue[ i ];
4704+ event.currentTarget = matched.elem;
4705+
4706+ for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
4707+ handleObj = matched.matches[ j ];
4708+
4709+ // Triggered event must either 1) be non-exclusive and have no namespace, or
4710+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
4711+ if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
4712+
4713+ event.data = handleObj.data;
4714+ event.handleObj = handleObj;
4715+
4716+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
4717+ .apply( matched.elem, args );
4718+
4719+ if ( ret !== undefined ) {
4720+ event.result = ret;
4721+ if ( ret === false ) {
4722+ event.preventDefault();
4723+ event.stopPropagation();
4724+ }
4725+ }
4726+ }
4727+ }
4728+ }
4729+
4730+ // Call the postDispatch hook for the mapped type
4731+ if ( special.postDispatch ) {
4732+ special.postDispatch.call( this, event );
4733+ }
4734+
4735+ return event.result;
4736+ },
4737+
4738+ // Includes some event props shared by KeyEvent and MouseEvent
4739+ // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
4740+ props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
4741+
4742+ fixHooks: {},
4743+
4744+ keyHooks: {
4745+ props: "char charCode key keyCode".split(" "),
4746+ filter: function( event, original ) {
4747+
4748+ // Add which for key events
4749+ if ( event.which == null ) {
4750+ event.which = original.charCode != null ? original.charCode : original.keyCode;
4751+ }
4752+
4753+ return event;
4754+ }
4755+ },
4756+
4757+ mouseHooks: {
4758+ props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
4759+ filter: function( event, original ) {
4760+ var eventDoc, doc, body,
4761+ button = original.button,
4762+ fromElement = original.fromElement;
4763+
4764+ // Calculate pageX/Y if missing and clientX/Y available
4765+ if ( event.pageX == null && original.clientX != null ) {
4766+ eventDoc = event.target.ownerDocument || document;
4767+ doc = eventDoc.documentElement;
4768+ body = eventDoc.body;
4769+
4770+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
4771+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
4772+ }
4773+
4774+ // Add relatedTarget, if necessary
4775+ if ( !event.relatedTarget && fromElement ) {
4776+ event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
4777+ }
4778+
4779+ // Add which for click: 1 === left; 2 === middle; 3 === right
4780+ // Note: button is not normalized, so don't use it
4781+ if ( !event.which && button !== undefined ) {
4782+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
4783+ }
4784+
4785+ return event;
4786+ }
4787+ },
4788+
4789+ fix: function( event ) {
4790+ if ( event[ jQuery.expando ] ) {
4791+ return event;
4792+ }
4793+
4794+ // Create a writable copy of the event object and normalize some properties
4795+ var i, prop,
4796+ originalEvent = event,
4797+ fixHook = jQuery.event.fixHooks[ event.type ] || {},
4798+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
4799+
4800+ event = jQuery.Event( originalEvent );
4801+
4802+ for ( i = copy.length; i; ) {
4803+ prop = copy[ --i ];
4804+ event[ prop ] = originalEvent[ prop ];
4805+ }
4806+
4807+ // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
4808+ if ( !event.target ) {
4809+ event.target = originalEvent.srcElement || document;
4810+ }
4811+
4812+ // Target should not be a text node (#504, Safari)
4813+ if ( event.target.nodeType === 3 ) {
4814+ event.target = event.target.parentNode;
4815+ }
4816+
4817+ // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
4818+ if ( event.metaKey === undefined ) {
4819+ event.metaKey = event.ctrlKey;
4820+ }
4821+
4822+ return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
4823+ },
4824+
4825+ special: {
4826+ ready: {
4827+ // Make sure the ready event is setup
4828+ setup: jQuery.bindReady
4829+ },
4830+
4831+ load: {
4832+ // Prevent triggered image.load events from bubbling to window.load
4833+ noBubble: true
4834+ },
4835+
4836+ focus: {
4837+ delegateType: "focusin"
4838+ },
4839+ blur: {
4840+ delegateType: "focusout"
4841+ },
4842+
4843+ beforeunload: {
4844+ setup: function( data, namespaces, eventHandle ) {
4845+ // We only want to do this special case on windows
4846+ if ( jQuery.isWindow( this ) ) {
4847+ this.onbeforeunload = eventHandle;
4848+ }
4849+ },
4850+
4851+ teardown: function( namespaces, eventHandle ) {
4852+ if ( this.onbeforeunload === eventHandle ) {
4853+ this.onbeforeunload = null;
4854+ }
4855+ }
4856+ }
4857+ },
4858+
4859+ simulate: function( type, elem, event, bubble ) {
4860+ // Piggyback on a donor event to simulate a different one.
4861+ // Fake originalEvent to avoid donor's stopPropagation, but if the
4862+ // simulated event prevents default then we do the same on the donor.
4863+ var e = jQuery.extend(
4864+ new jQuery.Event(),
4865+ event,
4866+ { type: type,
4867+ isSimulated: true,
4868+ originalEvent: {}
4869+ }
4870+ );
4871+ if ( bubble ) {
4872+ jQuery.event.trigger( e, null, elem );
4873+ } else {
4874+ jQuery.event.dispatch.call( elem, e );
4875+ }
4876+ if ( e.isDefaultPrevented() ) {
4877+ event.preventDefault();
4878+ }
4879+ }
4880+};
4881+
4882+// Some plugins are using, but it's undocumented/deprecated and will be removed.
4883+// The 1.7 special event interface should provide all the hooks needed now.
4884+jQuery.event.handle = jQuery.event.dispatch;
4885+
4886+jQuery.removeEvent = document.removeEventListener ?
4887+ function( elem, type, handle ) {
4888+ if ( elem.removeEventListener ) {
4889+ elem.removeEventListener( type, handle, false );
4890+ }
4891+ } :
4892+ function( elem, type, handle ) {
4893+ if ( elem.detachEvent ) {
4894+ elem.detachEvent( "on" + type, handle );
4895+ }
4896+ };
4897+
4898+jQuery.Event = function( src, props ) {
4899+ // Allow instantiation without the 'new' keyword
4900+ if ( !(this instanceof jQuery.Event) ) {
4901+ return new jQuery.Event( src, props );
4902+ }
4903+
4904+ // Event object
4905+ if ( src && src.type ) {
4906+ this.originalEvent = src;
4907+ this.type = src.type;
4908+
4909+ // Events bubbling up the document may have been marked as prevented
4910+ // by a handler lower down the tree; reflect the correct value.
4911+ this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
4912+ src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
4913+
4914+ // Event type
4915+ } else {
4916+ this.type = src;
4917+ }
4918+
4919+ // Put explicitly provided properties onto the event object
4920+ if ( props ) {
4921+ jQuery.extend( this, props );
4922+ }
4923+
4924+ // Create a timestamp if incoming event doesn't have one
4925+ this.timeStamp = src && src.timeStamp || jQuery.now();
4926+
4927+ // Mark it as fixed
4928+ this[ jQuery.expando ] = true;
4929+};
4930+
4931+function returnFalse() {
4932+ return false;
4933+}
4934+function returnTrue() {
4935+ return true;
4936+}
4937+
4938+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
4939+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
4940+jQuery.Event.prototype = {
4941+ preventDefault: function() {
4942+ this.isDefaultPrevented = returnTrue;
4943+
4944+ var e = this.originalEvent;
4945+ if ( !e ) {
4946+ return;
4947+ }
4948+
4949+ // if preventDefault exists run it on the original event
4950+ if ( e.preventDefault ) {
4951+ e.preventDefault();
4952+
4953+ // otherwise set the returnValue property of the original event to false (IE)
4954+ } else {
4955+ e.returnValue = false;
4956+ }
4957+ },
4958+ stopPropagation: function() {
4959+ this.isPropagationStopped = returnTrue;
4960+
4961+ var e = this.originalEvent;
4962+ if ( !e ) {
4963+ return;
4964+ }
4965+ // if stopPropagation exists run it on the original event
4966+ if ( e.stopPropagation ) {
4967+ e.stopPropagation();
4968+ }
4969+ // otherwise set the cancelBubble property of the original event to true (IE)
4970+ e.cancelBubble = true;
4971+ },
4972+ stopImmediatePropagation: function() {
4973+ this.isImmediatePropagationStopped = returnTrue;
4974+ this.stopPropagation();
4975+ },
4976+ isDefaultPrevented: returnFalse,
4977+ isPropagationStopped: returnFalse,
4978+ isImmediatePropagationStopped: returnFalse
4979+};
4980+
4981+// Create mouseenter/leave events using mouseover/out and event-time checks
4982+jQuery.each({
4983+ mouseenter: "mouseover",
4984+ mouseleave: "mouseout"
4985+}, function( orig, fix ) {
4986+ jQuery.event.special[ orig ] = {
4987+ delegateType: fix,
4988+ bindType: fix,
4989+
4990+ handle: function( event ) {
4991+ var target = this,
4992+ related = event.relatedTarget,
4993+ handleObj = event.handleObj,
4994+ selector = handleObj.selector,
4995+ ret;
4996+
4997+ // For mousenter/leave call the handler if related is outside the target.
4998+ // NB: No relatedTarget if the mouse left/entered the browser window
4999+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
5000+ event.type = handleObj.origType;
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches