Remove MediaPlayer, Saythis and SettingsApp.
Change-Id: I20de8c80f91930613d9bc0995db6a4f3274af8b3
Signed-off-by: Dongxing Liu <dongxing.x.liu@intel.com>
+* 3.0.16
+* Remove deprecated sample applications
+== Dongxing Liu <dongxing.x.liu@intel.com> 2014-07-03
+
* 3.0.15
* Update Modello web samples from upstream
== Dongxing Liu <dongxing.x.liu@intel.com> 2014-07-03
-Version:3.0.15
+Version:3.0.16
Maintainer: Ziv Chang<ziv.chang@intel.com>
Package:ivi-3.0-web-sample
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<?xml-stylesheet type="text/xsl" href="description.xsl"?>\r
-<Overview version="1.0">\r
- <SampleName>MediaPlayer</SampleName>\r
- <SampleVersion>1.0.0</SampleVersion>\r
- <Preview>mediaplayer-snapshot.png</Preview>\r
- <Description>\r
- A sample application demonstrating the ivi special api mediaserver usage.\r
- </Description>\r
-</Overview>\r
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- This file provides a functionality to show template's description.xml in the project wizard.
- Don't delete or move this file.
- -->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:template match="/">
- <html>
- <head>
- <style type="text/css">
- html,body {
- font-family:Arial;
- margin: 0px;
- }
- td
- {
- font-size:13px;
- }
- .samplename
- {
- font-size:16px;
- color:#ffffff;
- height:26px;
- background-color:#6d96ac;
- }
- .category
- {
- font-size:16px;
- color:#ffffff;
- height:30px;
- background-color:#6d96ac;
- }
- .contents
- {
- padding: 6px 10px 14px 10px;
- }
- table#widgets td
- {
- border: solid 1px #6d96ac;
- border-collapse: collapse;
- }
- .widgetname
- {
- font-weight: bold;
- text-align: center;
- width: 20%;
- word-break:break-all;
- }
- table#references td
- {
- width: 100%;
- border: 0px;
- border-spacing: 0px;
- padding: 5px;
- }
- .refname
- {
- width: 100%;
- font-weight: bold;
- }
- </style>
- </head>
- <body>
- <table width="400px" border="0" cellspacing="0">
- <tr>
- <td class="samplename" align="center">
- <xsl:value-of select="Overview/SampleName"/>
- <xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
- <!--
- <xsl:value-of select="Overview/SampleVersion"/>
- -->
- </td>
- </tr>
- <tr bgcolor="#FFFFFF">
- <td class="contents">
- <strong>Type</strong>: JavaScript
- <p>
- <xsl:value-of select="Overview/Description"/>
- </p>
- </td>
- </tr>
- <tr>
- <td align="center" bgcolor="#FFFFFF" height="260px">
- <img>
- <xsl:attribute name="src">
- <xsl:value-of select="Overview/Preview"/>
- </xsl:attribute>
- </img>
- </td>
- </tr>
- </table>
- </body>
- </html>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-Brian Jones <brian.j.jones at intel dot com>
+++ /dev/null
-Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
+++ /dev/null
-PROJECT = MediaPlayer
-INSTALL_FILES = images js MediaPlayer.png index.html
-
-VERSION := 0.0.1
-PACKAGE = $(PROJECT)-$(VERSION)
-
-INSTALL_DIR = ${DESTDIR}/opt/usr/apps/.preinstallWidgets
-
-all:
- @echo "Nothing to build"
-
-wgtPkg:
- zip -r $(PROJECT).wgt js images css index.html manifest.json config.xml MediaPlayer.png
-
-install:
- @echo "Installing MediaPlayer, stand by..."
- mkdir -p $(INSTALL_DIR)/
- cp $(PROJECT).wgt $(INSTALL_DIR)/
-
-dist:
- tar czf ../$(PACKAGE).tar.bz2 .
+++ /dev/null
-
-[Desktop Entry]
-Version=1.0
-Name=MediaPlayer
-Comment=Media Playing application for music, video, and images
-GenericName=MediaPlayer
-Exec=chromium-browser --enable-plugins --enable-extensions --enable-user-scripts --enable-printing --enable-sync --use-gl=egl --ignore-gpu-blacklist --auto-ssl-client-auth %U --app-id=t8j6HTRpuz --load-extension=/usr/share/MediaPlayer/ --no-first-run
-Terminal=false
-X-MultipleArgs=false
-Type=Application
-Icon=MediaPlayer
-StartupWMClass=Chromium
-StartupNotify=true
+++ /dev/null
--=== MediaPlayer ===-
-
-This is a HTML media player capable of playing video, audio, as well as displaying images.
-It takes uses the <video> <audio> and <img> tags to accomplish this. In order for the
-application to discover your media, put your files in /opt/usr/media. Make sure they
-go in the appropriate folders, for example music goes in Sounds.
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://yourdomain/MediaPlayer" version="1.0.0" viewmodes="maximized">
- <tizen:application id="t8j6HTRpuz.MediaPlayer" package="t8j6HTRpuz" required_version="2.1"/>
- <content src="index.html"/>
- <icon src="MediaPlayer.png"/>
- <name>MediaPlayer</name>
- <access origin="*" />
- <tizen:privilege name="http://tizen.org/privilege/speech"/>
- <tizen:privilege name="http://tizen.org/privilege/content.read"/>
- <tizen:privilege name="http://tizen.org/privilege/content.write"/>
-</widget>
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-*
-{
- z-index : 2;
-}
-
-html
-{
- background-color: white;
- min-height: 100%;
- background-size:cover;
-}
-
-#mainMusicButton
-{
- display:none;
- content:url(../images/musicButton.png);
-}
-
-#mainVideoButton
-{
- display:none;
- content:url(../images/videoButton.png);
-}
-
-#mainImageButton
-{
- display:none;
- content:url(../images/imageButton.png);
-}
-
-#backButton
-{
- content:url(../images/backButton.png);
-}
-
-#nextButton
-{
- content:url(../images/nextButton.png);
-}
-
-#returnButton
-{
- content:url(../images/returnButton.png);
-}
-
-#listButton
-{
- content:url(../images/listIcon.png);
-}
-
-#playButton
-{
- content:url(../images/playButton.png);
-}
-
-#playButton.playing
-{
- content:url(../images/pauseButton.png);
-}
-
-#sortAllButton
-{
- display:none;
- content:url(../images/allButton.png);
-}
-
-#sortArtistButton
-{
- display:none;
- content:url(../images/artistButton.png);
-}
-
-#sortAlbumButton
-{
- display:none;
- content:url(../images/albumButton.png);
-}
-
-#mainMenuButtons
-{
- position: absolute;
- display: block;
- vertical-align: middle;
-}
-
-.mainButton
-{
- position: relative;
- padding: 20px;
-}
-
-#sortButtons
-{
- position: absolute;
- display: block;
- top: 35%;
- left: 0%;
- height: 5%;
- width: 100%;
-}
-
-.sortButton
-{
- position: relative;
- float: left;
- height: 100%;
- width: 33.333%;
-}
-
-#sortButtons.landscape
-{
- height: 10%;
-}
-
-#mediaName
-{
- display:none;
-}
-
-#trackTime
-{
- display:none;
-}
-
-#audioPlayer
-{
- position:absolute;
- display:none;
- width: 90%;
- height: 80%;
- left: 5%;
- right: 5%;
- top: 10%;
- bottom: 10%;
-}
-
-#videoPlayer
-{
- position:absolute;
- display:none;
- width: 100%;
- height: 100%;
- left: 0%;
- right: 0%;
- top: 0%;
- bottom: 0%;
-}
-
-#imagePlayer
-{
- position:absolute;
- background-size: contain;
- display:none;
- width: 100%;
- height: 100%;
- left: 0%;
- right: 0%;
- top: 0%;
- bottom: 0%;
-}
-
-.mediaList
-{
- position:absolute;
- display:none;
- width: 90%;
- height: 80%;
- left: 5%;
- right: 5%;
- top: 10%;
- bottom: 10%;
-}
-
-.mediaList.mediaListAudioList
-{
- height: 58%;
- left: 5%;
- right: 5%;
- top: 40%;
-}
-
-.mediaList.mediaListAudioList.landscape
-{
- height: 50%;
- top: 45%;
-}
-
-.mediaList { overflow: auto; width:90%; height: 75%; left: 5%; right: 5%; }
-
-.mediaList ul { list-style: none; overflow: auto; -webkit-padding-start: 0px;}
-
-.mediaList ul li a { position:absolute; display:block; overflow: auto; background-color:rgba(50, 50, 50, 0.5);
- padding-left:15px; padding-top:5px; padding-bottom:5px; border-radius: 20px; -webkit-border-radius: 20px;}
-
-.mediaList ul li a.lightColor { position:absolute; display:block; overflow: auto; background-color:rgba(150, 150, 250, 0.5);
- padding-left:15px; padding-top:5px; padding-bottom:5px; border-radius: 20px; -webkit-border-radius: 20px;}
-
-/********************** Night versions ***********************/
-
-html.night
-{
- background-color: black;
- min-height: 100%;
- background-size:cover;
-}
-
-.mediaList ul li a.night { position:absolute; display:block; overflow: auto; background-color:rgba(180, 180, 180, 0.5);
- padding-left:15px; padding-top:5px; padding-bottom:5px; border-radius: 20px; -webkit-border-radius: 20px;}
-
-.mediaList ul li a.lightColor.night { position:absolute; display:block; overflow: auto; background-color:rgba(18, 18, 18, 0.5);
- padding-left:15px; padding-top:5px; padding-bottom:5px; border-radius: 20px; -webkit-border-radius: 20px;}
-
-#mainMusicButton.night
-{
- content:url(../images/musicButtonNight.png);
-}
-
-#mainVideoButton.night
-{
- content:url(../images/videoButtonNight.png);
-}
-
-#mainImageButton.night
-{
- content:url(../images/imageButtonNight.png);
-}
-
-#backButton.night
-{
- content:url(../images/backButtonNight.png);
-}
-
-#nextButton.night
-{
- content:url(../images/nextButtonNight.png);
-}
-
-#returnButton.night
-{
- content:url(../images/returnButtonNight.png);
-}
-
-#listButton.night
-{
- content:url(../images/listIconNight.png);
-}
-
-#playButton.night
-{
- content:url(../images/playButtonNight.png);
-}
-
-#playButton.night.playing
-{
- content:url(../images/pauseButtonNight.png);
-}
-
-#sortAllButton.night
-{
- content:url(../images/allButtonNight.png);
-}
-
-#sortArtistButton.night
-{
- content:url(../images/artistButtonNight.png);
-}
-
-#sortAlbumButton.night
-{
- content:url(../images/albumButtonNight.png);
-}
+++ /dev/null
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!--
-* Copyright (c) 2013, Intel Corporation.
-*
-* This program is licensed under the terms and conditions of the
-* Apache License, version 2.0. The full text of the Apache License is at
-* http://www.apache.org/licenses/LICENSE-2.0
-*
--->
-<html>
- <head>
- <title>Media Player</title>
- <meta name="viewport" content="user-scable=no, height=1000, width=520">
- <link rel="stylesheet" href="css/main.css">
- <script src="js/jquery-1.9.1.min.js"></script>
- <script src="js/listFunctions.js"></script>
- <script src="js/player.js"></script>
- <script src="js/audioPlayer.js"></script>
- <script src="js/videoPlayer.js"></script>
- <script src="js/imagePlayer.js"></script>
- <script src="js/main.js"></script>
- <script src="js/textObject.js"></script>
- <script src="js/imageControls.js"></script>
- <script src="js/dlna.js"></script>
-
- </head>
- <body>
- <div id="background"></div>
- <audio id="audioPlayer" class="player" onended="nextButtonClick()" oncanplaythrough="playLoadedMedia()" onerror="mediaError()" >
-
- <source id=audioSrc type="audio/mpeg">
- </audio>
-
- <video id="videoPlayer" onClick="playButtonClick()" class="player" oncanplaythrough="videoLoaded()">
- <source id=videoSrc>
- </video>
-
- <div id="imagePlayer" class="player"></div>
-
- <div id="audioMediaList" class="mediaList mediaListAudioList">
- <ul id="audioMediaListItems">
- </ul>
- </div>
-
- <div id="videoMediaList" class="mediaList">
- <ul id="videoMediaListItems">
- </ul>
- </div>
-
- <div id="imageMediaList" class="mediaList">
- <ul id="imageMediaListItems">
- </ul>
- </div>
-
- <div id="mainMenuButtons">
- <img id="mainMusicButton" class="mainButton" onClick="changeMenu(this.id)">
- <img id="mainVideoButton" class="mainButton" onClick="changeMenu(this.id)">
- <img id="mainImageButton" class="mainButton" onClick="changeMenu(this.id)">
- </div>
-
- <div id="navigationButtons" style="position:absolute; visible:hidden">
- <img id="backButton" class="navButton" onClick="backButtonClick()" style="position:absolute; display: none">
- <img id="nextButton" class="navButton" onClick="nextButtonClick()" style="position:absolute; display: none">
- <img id="returnButton" class="navButton" onClick="showMainMenu()" style="position:absolute; display: none">
- <img id="listButton" class="navButton" onClick="showMediaList()" style="position:absolute; display: none">
- <img id="playButton" class="navButton" onClick="playButtonClick()" style="position:absolute; display: none">
-
- </div>
-
- <div id="sortButtons">
- <img id="sortAllButton" class="sortButton" onClick="sortByAlpha()">
- <img id="sortArtistButton" class="sortButton" onClick="sortByArtist()">
- <img id="sortAlbumButton" class="sortButton" onClick="sortByAlbum()">
- </div>
-
- <canvas id="mediaName" style="position:absolute; z-index : 0"></canvas>
- <canvas id="trackTime" style="position:absolute; z-index : 0"></canvas>
- </body>
-</html>
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-var mainArtistText;
-var songDurationSec;
-
-AudioPlayer = function()
-{
- this.clearAudioTimeInterval = undefined;
- this.currentAudioContent = undefined;
-}
-
-/*
- * Play function for when play button is clicked
- */
-
-AudioPlayer.prototype.play = function()
-{
- console.log("MediaPlayer in AudioPlayer::play");
-
- if (this.currentFileLoaded)
- {
- if (this.playerControls.paused)
- {
- this.playerControls.play();
-
- //Start tracking the current time of the media. This is used to play from previous position on restart.
- //Currently this isn't supported for remote files
- if (!this.content[this.listIndex].remoteFile)
- {
- var timeoutFunction = function()
- {
- localStorage.prevAudioTime = this.playerControls.currentTime;
- this.updateTrackTime();
- }
-
- this.clearAudioTimeInterval = setInterval(timeoutFunction.bind(this),500);
- }
- }
- }
- else
- console.log(this.content[this.listIndex].artists[0] + " : " + this.content[this.listIndex].title + " can't play yet, it hasn't loaded");
-}
-
-/*
- * Pause function for when pause button is clicked
- */
-
-AudioPlayer.prototype.pause = function()
-{
- if (!this.playerControls.paused)
- {
- this.playerControls.pause();
- clearInterval(this.clearAudioTimeInterval);
- }
-}
-
-/*
- * Next function for when next button is clicked
- */
-
-AudioPlayer.prototype.next = function()
-{
- if (this.content)
- {
- if (this.content.length > (this.listIndex + 1))
- this.listIndex++;
- else
- this.listIndex = 0;
-
- this.load(this.listIndex, true);
- }
-}
-
-/*
- * Previous function for when previous button is clicked
- */
-
-AudioPlayer.prototype.previous = function()
-{
- if (this.content)
- {
- if (this.listIndex > 0 )
- this.listIndex--;
- else
- this.listIndex = this.content.length - 1;
-
- this.load(this.listIndex, true);
- }
-}
-
-/*
- * Returns play state
- */
-
-AudioPlayer.prototype.playing = function()
-{
- return !(this.playerControls.paused);
-}
-
-/*
- * Load the file located at the index. If play is true, play immediately once file is loaded
- */
-
-AudioPlayer.prototype.load = function(index, play)
-{
- this.listIndex = index;
- this.loadAndPlay = play;
- this.playerControls.pause();
- this.updateMediaName(this.content[this.listIndex].artists[0], this.content[this.listIndex].title, this.content[this.listIndex].coverArt);
- $("#audioSrc").attr("src", this.content[this.listIndex].contentURI);
- this.playerControls.load();
-}
-
-/*
- * Redraws the media bar with the new artist, title, and cover album
- */
-
-AudioPlayer.prototype.updateMediaName = function(newArtist, newTitle, newCover)
-{
- playBarHeight = mediaNameCanvas.height;
- boxWidth = playBarHeight * 0.75;
- textStartX = boxWidth + 50;
- songDurationSec = this.playerControls.duration;
- mediaNameCTX.clearRect(0,0,mediaNameCanvas.width, mediaNameCanvas.height);
-
- mediaNameCTX.fillStyle="rgba(30,30,30,0.5)";
- mediaNameCTX.strokeStyle="rgba(130,130,130,1)";
- mediaNameCTX.lineWidth = 5;
- mediaNameCTX.fillRect(0,0,mediaNameCanvas.width, playBarHeight);
- mediaNameCTX.strokeRect(-20,0,mediaNameCanvas.width + 40, playBarHeight);
-
- if (newCover === undefined || newCover.naturalWidth === undefined || newCover.naturalWidth <= 0)
- {
- newCover = musicIcon;
- }
-
- mediaNameCTX.drawImage(newCover, 20, (playBarHeight - boxWidth) / 2, boxWidth, boxWidth);
-
- if (screenOrientation === "portrait")
- {
- var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 70 , "zLoc" : 0,
- "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 65, "wordWrap" : true});
-
- trackText.applyTemplate(mainMenuTitleTemplate);
-
- mainArtistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 70, "zLoc" : 0,
- "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
-
- mainArtistText.applyTemplate(mainTrackTemplate);
- }
- else
- {
- var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 50 , "zLoc" : 0,
- "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
- trackText.applyTemplate(mainMenuTitleTemplateLandscape);
- mainArtistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 50, "zLoc" : 0,
- "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
- mainArtistText.applyTemplate(mainTrackTemplateLandscape);
- }
-
- trackText.drawObj();
- trackText.drawLargeShadow();
- mainArtistText.yLoc += trackText.height;
- mainArtistText.drawObj();
-
- this.updateTrackTime();
-}
-
-/*
- * Redraws the current track time
- */
-
-AudioPlayer.prototype.updateTrackTime = function()
-{
- playBarHeight = mediaNameCanvas.height;
- boxWidth = playBarHeight * 0.75;
- textStartX = boxWidth + 50;
- var timeText = '';
- var songDurationSec = Math.floor(this.playerControls.duration % 60) > 9 ? Math.floor(this.playerControls.duration % 60) : '0' + Math.floor(this.playerControls.duration % 60);
- var songDurationMin = Math.floor(this.playerControls.duration / 60) > 9 ? Math.floor(this.playerControls.duration / 60) : '0' + Math.floor(this.playerControls.duration / 60);
- var songCurrentMin = Math.floor(this.playerControls.currentTime / 60) > 9 ? Math.floor(this.playerControls.currentTime / 60) : '0' + Math.floor(this.playerControls.currentTime / 60);
- var songCurrentSec = Math.floor(this.playerControls.currentTime % 60) > 9 ? Math.floor(this.playerControls.currentTime % 60) : '0' + Math.floor(this.playerControls.currentTime % 60);
-
- if ((songCurrentMin !== undefined && songCurrentSec !== undefined) && (!isNaN(songCurrentMin) && !isNaN(songCurrentSec)))
- timeText += songCurrentMin + ':' + songCurrentSec + ' / ';
- else
- timeText += "00:00 / ";
-
- if ((songDurationSec !== undefined && songDurationMin !== undefined) && (!isNaN(songDurationMin) && !isNaN(songDurationSec)))
- timeText += songDurationMin + ':' + songDurationSec;
- else
- timeText += "00:00";
-
-
- var trackTimeText = new TextObject(trackTimeCTX,{"text" : timeText, "xLoc" : textStartX, "yLoc" : 50, "zLoc" : 0,
- "width" : mediaNameCanvas.width - textStartX, "height" : 20, "lineHeight" : 20, "wordWrap" : false});
-
- trackTimeText.applyTemplate(timeTemplate);
- trackTimeCTX.clearRect(0, 0, trackTimeCanvas.width, trackTimeCanvas.height);
-
- trackTimeText.yLoc = ((playBarHeight - boxWidth) / 2) + boxWidth;
- trackTimeText.drawObj();
-}
-
-/*
- * Plays the currently loaded media file
- */
-
-AudioPlayer.prototype.playLoadedMedia = function()
-{
- console.log("MediaPlayer in playLoadedMedia");
- this.currentFileLoaded = true;
-
- //Only store track to localStorage if it's a local file, and current menu is the Audio menu
- if (!this.content[this.listIndex].remoteFile && localStorage.prevMenu === "mainMusicButton")
- {
- localStorage.prevAudioTrack = this.content[this.listIndex].contentURI;
- }
- else
- {
- localStorage.prevAudioTime = undefined;
- localStorage.prevAudioTrack = undefined;
- }
-
- this.currentAudioContent = this.content[this.listIndex];
-
- if (this.loadPrevAudio)
- {
- this.playerControls.currentTime = localStorage.prevAudioTime;
- this.loadPrevAudio = false;
- this.play();
- }
-
- if (this.loadAndPlay)
- {
- this.play();
- this.loadAndPlay = false;
- }
-
- this.updateMediaName(this.content[this.listIndex].artists[0], this.content[this.listIndex].title, this.content[this.listIndex].coverArt);
- this.currentFileLoaded = true;
-}
-
-/*
- * Sort the file list alphabetically
- */
-
-AudioPlayer.prototype.sortByAlpha = function()
-{
- console.log("MediaPlayer in sortByAlpha");
-
- this.emptyTimeouts();
-
- this.content.sort(function (a,b)
- {
- var first = a.title.toLowerCase();
- var second = b.title.toLowerCase();
-
- if (first < second)
- return -1;
- if (first > second)
- return 1;
-
- return 0;
- });
-
- this.fillMediaList();
-}
-
-/*
- * Sort the file list by artist name
- */
-
-AudioPlayer.prototype.sortByArtist = function()
-{
- console.log("MediaPlayer in sortByArtist");
-
- this.emptyTimeouts();
-
- this.content.sort(function (a,b)
- {
- var first = a.artists[0].toLowerCase();
- var second = b.artists[0].toLowerCase();
-
- if (first < second)
- return -1;
- if (first > second)
- return 1;
-
- return 0;
- });
-
- this.fillMediaList();
-}
-
-/*
- * Sort the file list by album name
- */
-
-AudioPlayer.prototype.sortByAlbum =function()
-{
- console.log("MediaPlayer in sortByAlbum");
-
- this.emptyTimeouts();
-
- this.content.sort(function (a,b)
- {
- var first = a.album.toLowerCase();
- var second = b.album.toLowerCase();
-
- if (first < second)
- return -1;
- if (first > second)
- return 1;
-
- return 0;
- });
-
- this.fillMediaList();
-}
-
-/*
- * Callback for when the local content has been successfully read using tizen.content.
- */
-
-AudioPlayer.prototype.onContentLoaded = function()
-{
- try
- {
- if (localStorage.prevAudioTrack && localStorage.prevAudioTrack !== "undefined")
- {
- for (var i = 0; i < this.content.length; i++)
- {
-
- if (this.content[i].contentURI === localStorage.prevAudioTrack)
- {
- this.listIndex = i;
- console.log("MediaPlayer: Previous audio found, loading " + this.content[this.listIndex].contentURI);
- this.loadPrevAudio = true;
- this.fillMediaList();
- this.load(i, true);
- }
- }
- }
- else
- {
- console.log("MediaPlayer: No previous audio found, loading first");
- this.load(0, false);
- this.updateMediaName(this.content[this.listIndex].artists[0], this.content[this.listIndex].title, this.content[this.listIndex].coverArt);
-
- if (currentMenu === "audio")
- this.fillMediaList();
- }
-
- var imgSources = [];
-
- for (var i = 0; i < this.content.length; i++)
- {
- var iconURI = (this.content[i].thumbnailURIs !== undefined && this.content[i].thumbnailURIs !== null) ? this.content[i].thumbnailURIs[0] : "images/musicIcon.png";
- this.content[i].coverArtURI = iconURI;
- }
-
- loadImages();
- }
- catch (err)
- {
- console.log("MediaPlayer: Error when parsing audioContent");
- }
-}
-
-/*
- * Create and draw an item in the media list
- */
-
-AudioPlayer.prototype.makeListItem = function(j, k)
-{
- var canvasH = mediaListItemH * 0.95 ;
-
- for (var i = j; (i < (j+k) && i < this.content.length); i++)
- {
- if (typeof this.content[i].title !== "string")
- this.content[i].title = "Unknown";
-
- //Check if album art is done loading, if not draw default until it is
- if (this.content[i].artists === undefined)
- {
- this.content[i].artists = new Array();
- this.content[i].artists[0] = "Unknown";
- }
-
- else if (typeof this.content[i].artists[0] !== "string")
- this.content[i].artists[0] = "Unknown";
-
- var trackText = {"text" : this.content[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0};
- var artistText = {"text" : this.content[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0};
-
- if (this.content[i].coverArt && this.content[i].coverArt.complete && (this.content[i].coverArt.naturalWidth !== 0 || this.content[i].coverArt.naturalHeight !== 0) )
- this.makeListBar(this.content[i].coverArt, i, artistText, trackText);
- else
- this.makeListBar(musicIcon, i, artistText, trackText);
-
- // Set callback function for the new list item
- $("#" + this.type + "CanvasNum" + i).click(function () {
- try
- {
- audioPlayer.load($(this).parent().parent().index(), true);
- }
- catch(err)
- {
- console.log("MediaPlayer: load audio error " + err.message);
- }
- });
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-var stopConnectionSearch = undefined;
-var remoteMediaPreviouslyLoaded = false;
-
-function convertMediaServerContent(item)
-{
- console.log(">>> MediaObject2 >>> " + JSON.stringify(item));
- var content = { id: item.Path, title: item.DisplayName };
-
- if (item.Type.indexOf("container") == 0)
- {
- content.directoryURI = "";
- content.storageType = "EXTERNAL";
- }
-
- else
- {
- content.editableAttributes = [];
- content.name = content.title;
- content.contentURI = item.URLs[0];
- content.mimeType = item.MIMEType;
- content.size = item.Size;
- content.rating = 0;
- content.remoteFile = true;
-
- if (item.Type.indexOf("video") == 0)
- {
- content.type = "VIDEO";
- content.artists = new Array();
- content.artists[0] = "Unknown";
- content.duration = item.Duration;
- content.width = item.Width;
- content.height = item.Height;
- }
-
- else if (item.Type.indexOf("audio") == 0 ||
- item.Type.indexOf("music") == 0)
- {
- content.type = "AUDIO";
- content.album = item.Album ? item.Album : "Unknown";
- content.coverArt = musicIcon;
- content.artists = new Array();
- content.artists[0] = item.Artist ? item.Artist : "Unknown";
- content.bitrate = item.SampleRate;
- content.duration = item.Duration;
- }
-
- if (item.Type.indexOf("image") == 0)
- {
- content.type = "IMAGE";
- content.width = item.Width;
- content.height = item.Height;
- content.orientation = "NORMAL";
- }
- }
-
- return content;
-}
-
-function browseCallback(medias)
-{
- console.log("MediaPlayer: MediaServer has called browseCallback");
- console.log("found " + medias.length + " medias.");
-
- for (var i=0; i<medias.length; i++)
- convertMediaServerContent(medias[i]);
-}
-
-function findAllCallback(medias)
-{
- console.log("MediaServer findAllCallback");
- console.log("found " + medias.length + " medias.");
-
- clearInterval(stopConnectionSearch);
- stopConnectionSearch = undefined;
-
- var itemsAdded = 0;
- var audioContent = new Array();
- var videoContent = new Array();
- var imageContent = new Array();
-
- for (var i=0; i < medias.length; i++)
- {
- var current = convertMediaServerContent(medias[i]);
-
- if (current)
- {
- switch(current.type)
- {
- case "AUDIO":
- audioContent.push(current);
- itemsAdded += 1;
- break;
- case "VIDEO":
- videoContent.push(current);
- itemsAdded += 1;
- break;
- case "IMAGE":
- imageContent.push(current);
- itemsAdded += 1;
- break;
- default:
- }
- }
- }
-
- //Force MediaPlayer to reload the lists so the new items show
- audioMediaListLoaded = false;
- videoMediaListLoaded = false;
- imageMediaListLoaded = false;
-
- audioPlayer.updateContent(audioContent, true);
- videoPlayer.updateContent(videoContent, true);
- imagePlayer.updateContent(imageContent, true);
-}
-
-function foundMediaServer(srv)
-{
- console.log("MediaPlayer: New MediaServer Found");
- console.log("MediaServer id: " + srv.id);
- console.log("MediaServer friendlyName: " + srv.friendlyName);
-
- clearInterval(stopServerSearch);
-
- if (srv.root)
- {
- console.log("MediaPlayer: MediaServer root folder: " + srv.root.id);
- srv.browse(srv.root.id, "+DisplayName", 0, 0, browseCallback);
- srv.find(srv.root.id, "*", "+DisplayName", 0, 0, findAllCallback);
-
- // Removing this for now to keep from spamming. Note Rygel must be running when launched or it will never find it
- // if (stopConnectionSearch !== undefined)
- // clearInterval(stopConnectionSearch);
-
- // stopConnectionSearch = setInterval(function(){console.log("MediaPlayer searching for remote media..."); tizen.mediaserver.scanNetwork(foundMediaServer);}, 3000);
-
- }
- else
- console.log("MediaServer not browsable");
-}
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-var slideshowInterval;
-
-ImageControls = function()
-{
- this.paused = true;
-}
-
-ImageControls.prototype.play = function()
-{
- this.paused = false;
- $("#playButton").toggleClass('playing', true);
- $("#navigationButtons").hide();
- slideshowInterval = setInterval(function(){
- nextButtonClick();
- }, 3000);
-}
-
-ImageControls.prototype.pause = function()
-{
- this.paused = true;
- $("#playButton").toggleClass('playing', false);
- $("#navigationButtons").show();
- clearInterval(slideshowInterval);
-}
+++ /dev/null
-
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-ImagePlayer = function()
-{
-
-}
-
-ImagePlayer.prototype.play = function()
-{
- console.log("MediaPlayer in ImagePlayer::play");
- if (this.playerControls.paused)
- this.playerControls.play();
-}
-
-ImagePlayer.prototype.pause = function()
-{
- if (!this.playerControls.paused)
- this.playerControls.pause();
-}
-
-ImagePlayer.prototype.playing = function()
-{
- return !(this.playerControls.paused);
-}
-
-ImagePlayer.prototype.next = function()
-{
- if (this.content)
- {
- if (this.content.length > (this.listIndex + 1))
- this.listIndex++;
- else
- this.listIndex = 0;
-
- this.load(this.listIndex);
- }
-}
-
-ImagePlayer.prototype.previous = function()
-{
- if (this.content)
- {
- if (this.listIndex > 0 )
- this.listIndex--;
- else
- this.listIndex = this.content.length - 1;
-
- this.load(this.listIndex);
- }
-}
-
-ImagePlayer.prototype.onContentLoaded = function()
-{
- try
- {
- this.listIndex = 0;
-
- if (localStorage.prevImage && localStorage.prevImage !== "undefined")
- {
- for (var i = 0; i < this.content.length; i++)
- {
- if (this.content[i].contentURI === localStorage.prevImage)
- {
- console.log("MediaPlayer: using previous image " + localStorage.prevImage);
- this.listIndex = i;
- this.fillMediaList();
- this.load(i);
- }
- }
- }
- else
- {
- console.log("MediaPlayer: using first image " + this.content[this.listIndex].contentURI);
- this.load(this.listIndex);
- }
- }
-
- catch (err)
- {
- console.log("MediaPlayer: Error when parsing imageContent");
- }
-}
-
-ImagePlayer.prototype.load = function(index)
-{
- this.listIndex = index;
-
- $("#imagePlayer").css("background", "url(" + this.content[this.listIndex].contentURI + ") no-repeat center");
- $("#imagePlayer").css("background-size", "contain");
-
- if (!this.content[this.listIndex].remoteFile)
- {
- localStorage.prevImage = this.content[this.listIndex].contentURI;
- }
- else
- {
- localStorage.prevImage = undefined;
- }
-}
-
-ImagePlayer.prototype.makeListItem = function(j, k)
-{
- var canvasH = mediaListItemH * 0.95 ;
-
- for (var i = j; (i < (j+k) && i < this.content.length); i++)
- {
- var artistText = {"text" : this.content[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0};
- var trackText = {"text" : " ", "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0};
-
- this.makeListBar(imgIcon, i, artistText, trackText);
-
- // Set callback function for the new list item
- $("#" + this.type + "CanvasNum" + i).click(function () {
-
- try
- {
- imagePlayer.load($(this).parent().parent().index());
- $("#imageMediaList").hide();
- }
- catch(err)
- {
- console.log("MediaPlayer: load image error: " + err.message);
- }
- });
- }
-}
+++ /dev/null
-/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery.min.map
-*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
-return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
-}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-function mediaError()
-{
- console.log("MediaPlayer: file failed to load");
-}
-
-var drawCanvasImage = function(imageSrc)
-{
- return function()
- {
- drawAlbumArt(imageSrc);
- }
-}
-
-function drawAlbumArt(imageSrc)
-{
- var canvasH = mediaListItemH * 0.95 ;
- var audioContent = audioPlayer.getContent();
-
- for (var i=0; i < audioContent.length; i++)
- {
- if (audioContent[i].coverArt.src !== musicIcon.src && audioContent[i].coverArt.src === imageSrc)
- {
- try
- {
- if (i === audioPlayer.currentIndex())
- {
- audioPlayer.updateMediaName(audioContent[audioPlayer.currentIndex()].artists[0], audioContent[audioPlayer.currentIndex()].title, audioContent[audioPlayer.currentIndex()].coverArt);
- }
-
- if(audioContent[i].ctx)
- audioContent[i].ctx.drawImage(audioContent[i].coverArt, 0, 0, canvasH, canvasH);
- }
- catch(err)
- {
- console.log("MediaPlayer: drawImage failed - " + err);
- }
- }
- }
-}
-
-function loadImages()
-{
- console.log("MediaPlayer in loadImages");
-
- var audioContent = audioPlayer.getContent();
-
- for (var src in audioContent)
- {
- try
- {
- var imgSrc = (audioContent[src].coverArtURI !== undefined && audioContent[src].coverArtURI !== "") ? audioContent[src].coverArtURI : "images/musicIcon.png";
- audioContent[src].coverArt = new Image();
- audioContent[src].coverArt.onload = drawCanvasImage(imgSrc);
-
- audioContent[src].coverArt.onerror = function(e){
- audioContent[src].coverArt.src = "images/musicIcon.png";
- };
-
- audioContent[src].coverArt.src = imgSrc;
- }
- catch(err)
- {
- console.log("Failed to load audio cover image: " + err);
- }
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-var currentMenu = "main";
-var mouseDownEvent;
-var resizeCB = resizeMainMenu;
-var screenWidth;
-var screenHeight;
-var screenOrientation;
-var iconWidth;
-var padding;
-var contentType = "AUDIO";
-var currentPlayer;
-var currentMediaList = $("#audioMediaList");
-var audioMediaListLoaded = false;
-var videoMediaListLoaded = false;
-var imageMediaListLoaded = false;
-var audioPlayer;
-var videoPlayer;
-var imagePlayer;
-var vidIcon = new Image();
-var imgIcon = new Image();
-var musicIcon = new Image();
-var imagesLoaded = false;
-var mediaListItemW;
-var mediaListItemH;
-var playOnConnect = false;
-var mediaNameCanvas;
-var mediaNameCTX;
-var trackTimeCanvas;
-var trackTimeCTX;
-var speechObj;
-var nightMode = false;
-var waitingToResumeVideo = false; //Media has been paused by exterior forces. If set to true, resume previous media when given the signal.
-var stopServerSearch;
-var playBarHeight;
-var boxWidth;
-var textStartX;
-
-var mainMenuTitleTemplateLandscape = {"font" : "oblique bolder 30pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
- "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
-
-var mainMenuTitleTemplate = {"font" : "oblique bolder 40pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
- "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
-
-var mainTrackTemplateLandscape = {"font" : "bold 20pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
- "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
-
-var mainTrackTemplate = {"font" : "bold 30pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
- "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
-
-var timeTemplate = {"font" : "bold 25pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
- "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
-
-var mediaTextTemplate2 = {"font" : "bold 20pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
- "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
-
-var mediaTextTemplate3 = {"font" : "bold 20pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
-
-var trackTextTemplate = {"font" : "bold 16pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
-
-var mediaTextTemplate2Landscape = {"font" : "bold 13pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
- "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
-
-var mediaTextTemplate3Landscape = {"font" : "bold 13pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
-
-var trackTextTemplateLandscape = {"font" : "bold 11pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
-
-
-var mediaTextTemplate = {"font" : "bold 20pt Arial", "fillStyle" : "", "textAlign" : "left",
- "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 12, "shadowColor" : "red"};
-
-function onError()
-{
- console.log("Content discovery failed");
-}
-
-function setupSpeech()
-{
- console.log("MediaPlayer in setupSpeech");
-
- speechObj = tizen.speech;
- speechObj.vocalizeString(" ");
-
- try
- {
- var speechEventListener = {
- onaudiostart: function(){console.log("MediaPlayer: onaudiostart received");},
- onsoundstart: function(){console.log("MediaPlayer: onsoundstart received");},
- onspeechstart: function(){console.log("MediaPlayer: onspeechstart received");},
- onspeechend: function(){console.log("MediaPlayer: onspeechend received");},
- onsoundend: function(){console.log("MediaPlayer: onsoundend received");},
- onaudioend: function(){console.log("MediaPlayer: onaudioend received");},
- onresult: function(result){
-
- console.log("MediaPlayer: onresult received");
-
- for (var i = 0; i < result.length; i++)
- {
- console.log("MediaPlayer: forloop, command = " + result[i]);
- var commandFound = false;
-
- switch(result[i])
- {
- case "play":
- playButtonClick();
- commandFound = true;
- break;
- case "next":
- nextButtonClick();
- commandFound = true;
- break;
- case "previous":
- backButtonClick();
- commandFound = true;
- break;
- case "stop":
- case "pause":
- pauseButtonClick();
- commandFound = true;
- break;
- default:
- break;
- }
-
- if (commandFound)
- break;
- }
- },
- onnomatch: function(result){console.log("MediaPlayer: onnomatch received ");},
- onerror: function(error){console.log("MediaPlayer: onerror received");},
- onstart: function(){console.log("MediaPlayer: onstart received");},
- onend: function(){console.log("MediaPlayer: onend received");}
- }
-
- speechObj.setCBListener(speechEventListener);
-
- }
- catch(err)
- {
- console.log("MediaPlayer setupSpeech FAILED + " + err.message);
- }
-
-}
-
-function onAudioContentLoaded(newContent)
-{
- if (!newContent || newContent.length === 0)
- {
- console.log("MediaPlayer: some content failed to load, trying again for " + audioPlayer.type);
- audioPlayer.clearContent();
- setTimeout(function(){getMedia(onAudioContentLoaded, "AUDIO");}, 3000);
- return;
- }
- else
- {
- audioPlayer.updateContent(newContent, true);
- audioPlayer.onContentLoaded();
- }
-}
-
-function onVideoContentLoaded(newContent)
-{
- if (!newContent || newContent.length === 0)
- {
- console.log("MediaPlayer: some content failed to load, trying again for " + videoPlayer.type);
- videoPlayer.clearContent();
- setTimeout(function(){getMedia(onVideoContentLoaded, "VIDEO");}, 3000);
- return;
- }
- else
- {
- videoPlayer.updateContent(newContent, true);
- videoPlayer.onContentLoaded();
- }
-}
-
-function onImageContentLoaded(newContent)
-{
- if (!newContent || newContent.length === 0)
- {
- console.log("MediaPlayer: some content failed to load, trying again for " + imagePlayer.type);
- imagePlayer.clearContent();
- setTimeout(function(){getMedia(onImageContentLoaded, "IMAGE");}, 3000);
- return;
- }
- else
- {
- imagePlayer.updateContent(newContent, true);
- imagePlayer.onContentLoaded();
- }
-}
-
-function getMedia(callback, filterType)
-{
- console.log("MediaPlayer in getMedia");
- var manager = tizen.content;
- if (manager)
- {
- var filter = new tizen.AttributeFilter("type", "EXACTLY", filterType);
- manager.find(callback, onError, null, filter);
- }
- else
- console.log("MediaPlayer failed to receive media, tizen.content is unavailable");
-}
-
-function showMediaMenu()
-{
- console.log("MediaPlayer in showMediaMenu");
- $(".navButton").show();
-
- switch(currentPlayer.type)
- {
- case "audio":
- $("#mediaName").show();
- $("#trackTime").show();
- $(".sortButton").show();
- currentPlayer.show();
-
- if (screenOrientation === "landscape" )
- $("#audioMediaList").addClass("landscape");
- else
- $("#audioMediaList").removeClass("landscape");
-
- $("#audioMediaList").show();
- break;
-
- case "video":
- //show video
- currentPlayer.show();
- //setTimeout(function(){currentPlayer.show()}, 800); //The video element can't be faded, so wait a moment before showing
- break;
-
- case "image":
- //show image
- currentPlayer.show();
- break;
-
- default:
- console.log("Invalid player type");
- break;
- }
-}
-
-function showMediaList()
-{
- console.log("MediaPlayer in showMediaList");
-
- if (currentMediaList.is(":visible"))
- currentMediaList.hide();
- else
- {
- currentMediaList.show();
- }
-}
-
-function changeMenu(menuButtonId)
-{
- console.log("MediaPlayer in changeMenu");
- var clickedButton = $("#" + menuButtonId);
- var buttonWidth = clickedButton.width();
- var buttonHeight = clickedButton.height();
- var buttonBottom = clickedButton.css("bottom");
- var buttonRight = clickedButton.css("right");
-
-/*
- //Animate the clicked button slightly
- clickedButton.animate({
- bottom: screenOrientation === "portrait" ? "+=0" : "+=50",
- right: screenOrientation === "portrait" ? "+=50" : "+=0",
- opacity: "0"
- }, 300 ,
-
- //Reset the size once done
- function() {
- clickedButton.width(buttonWidth);
- clickedButton.height(buttonHeight);
-
- if (screenOrientation === "portrait")
- clickedButton.css({"right": buttonRight});
- else
- clickedButton.css({"bottom": buttonBottom});
- }
- );
-*/
- $(".mainButton").hide();
-
- switch(menuButtonId)
- {
- case ("mainMusicButton"):
- speechObj.vocalizeString("Music player");
- currentMenu = "audio";
- currentPlayer = audioPlayer;
- currentMediaList = $("#audioMediaList");
- localStorage.prevMenu = "mainMusicButton";
-
- if (audioPlayer.currentAudioContent && audioPlayer.currentAudioContent.contentURI)
- {
- localStorage.prevAudioTrack = audioPlayer.currentAudioContent.contentURI
- localStorage.prevAudioTime = audioPlayer.playerControls.currentTime;
- }
-
- localStorage.prevVideo = undefined;
- localStorage.prevVideoTime = undefined;
-
- if (!audioMediaListLoaded)
- audioPlayer.fillMediaList();
-
- showMediaMenu();
- break;
-
- case ("mainVideoButton"):
- speechObj.vocalizeString("Video player");
- currentMenu = "video";
- currentPlayer = videoPlayer;
- currentMediaList = $("#videoMediaList");
- localStorage.prevMenu = "mainVideoButton";
-
- if (videoPlayer.currentVideoContent && videoPlayer.currentVideoContent.contentURI)
- {
- localStorage.prevVideo = videoPlayer.currentVideoContent.contentURI
- localStorage.prevVideoTime = videoPlayer.playerControls.currentTime;
- }
-
- localStorage.prevAudioTime = undefined;
- localStorage.prevAudioTrack = undefined;
-
- if (!videoMediaListLoaded)
- videoPlayer.fillMediaList();
-
- showMediaMenu();
- break;
-
- case ("mainImageButton"):
- speechObj.vocalizeString("Picture viewer");
- currentMenu = "image";
- currentPlayer = imagePlayer;
- currentMediaList = $("#imageMediaList");
- localStorage.prevMenu = "mainImageButton";
-
- if (!imageMediaListLoaded)
- imagePlayer.fillMediaList();
-
- showMediaMenu();
- break;
- default:
- console.log("Error: No menu by that name");
- break;
- }
-}
-
-function showMainMenu()
-{
- console.log("MediaPlayer in showMainMenu, clearing all localStorage...");
- currentMenu = "main";
- localStorage.prevMenu = "MAIN";
- localStorage.prevAudioTime = undefined;
- localStorage.prevAudioTrack = undefined;
- localStorage.prevVideo = undefined;
- localStorage.prevVideoTime = undefined;
- localStorage.prevImage = undefined;
-
- currentPlayer.pause();
-
- //If the media list is showing, hide it. Remove the mediaListAudioList class if it exists so that it will resize properly
- if (currentMediaList.is(":visible"))
- currentMediaList.hide();
-
- $(".navButton").hide();
- $(".sortButton").hide();
- $("#mediaName").hide();
- $("#trackTime").hide();
- $(".player").hide();
- $(".mainButton").css({"opacity": "100"});
- $(".mainButton").show();
-}
-
-function sortByAlpha(contentToSort)
-{
- currentPlayer.sortByAlpha();
-}
-
-function sortByArtist(contentToSort)
-{
- currentPlayer.sortByArtist();
-}
-
-function sortByAlbum(contentToSort)
-{
- currentPlayer.sortByAlbum();
-}
-
-/**************************************** NAVIGATION FUNCTIONS *******************************************/
-
-// This function is called once a file being loaded is ready to play
-function playLoadedMedia()
-{
- audioPlayer.playLoadedMedia();
-}
-
-function videoLoaded()
-{
- videoPlayer.videoLoaded();
-}
-
-function playButtonClick()
-{
- console.log("MediaPlayer in playButtonClick");
- if (!currentPlayer.playing())
- currentPlayer.play();
- else
- currentPlayer.pause();
-}
-
-function pauseButtonClick()
-{
- console.log("MediaPlayer in pauseButtonClick");
- if (currentPlayer.playing())
- {
- currentPlayer.pause();
- }
-}
-
-function backButtonClick()
-{
- console.log("MediaPlayer in backButtonClick");
- currentPlayer.previous();
-}
-
-
-function nextButtonClick()
-{
- console.log("MediaPlayer in nextButtonClick");
- currentPlayer.next();
-}
-
-/**************************************** END NAVIGATION FUNCTIONS *******************************************/
-
-function resizeMainMenu()
-{
- console.log("MediaPlayer in resizeMainMenu");
-
- currentMediaList.hide();
- screenWidth = window.innerWidth;
- screenHeight = window.innerHeight;
- screenOrientation = screenWidth < screenHeight ? "portrait" : "landscape";
- iconWidth = screenOrientation === "portrait" ? screenHeight / 4 : screenWidth / 4;
- var padding = 20;
-
- $(".mainButton").width(iconWidth + "px");
- $(".mainButton").height(iconWidth + "px");
-
- var iconsTop = screenOrientation === "portrait" ? ((screenHeight - (iconWidth * 3)) / 2) - (padding * 3) : (screenHeight - iconWidth) / 2;
-
- if (screenOrientation === "portrait")
- $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : (screenWidth / 2) - (iconWidth /2) - padding + "px", "width" : "50%"});
- else
- {
- $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : ((iconWidth / 2) - (padding * 3)) + "px", "width" : "100%"});
- $("#sortButtons").addClass("landscape");
- }
-}
-
-function resizePlayerPage()
-{
- console.log("MediaPlayer in resizePlayerPage");
-
- screenWidth = window.innerWidth;
- screenHeight = window.innerHeight;
-
- var padding = 15;
- var buttonWidth = screenOrientation === "portrait" ? screenHeight * 0.05 : screenWidth * 0.05;
-
- $("#backButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) - (buttonWidth *3)) + "px"});
- $("#nextButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) + (buttonWidth *2)) + "px"});
- $("#returnButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": padding + "px"});
- $("#listButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": (screenWidth - buttonWidth - padding * 2) + "px"});
- $("#playButton").css({"width": buttonWidth * 1.15 + "px", "height": buttonWidth * 1.15 + "px", "top": padding * 0.3 + "px", "left": (screenWidth / 2) - (buttonWidth / 2) + "px"});
-
- trackTimeCanvas.width = mediaNameCanvas.width = (screenWidth);
- trackTimeCanvas.height = mediaNameCanvas.height = (screenHeight * 0.34) - (buttonWidth + (2 * padding));
- trackTimeCanvas.style.top = mediaNameCanvas.style.top = (buttonWidth + (2 * padding) ) + "px";
- trackTimeCanvas.style.left = mediaNameCanvas.style.left = "0px";
-
- var sortButtonTop = (buttonWidth + (2 * padding) ) + mediaNameCanvas.height - (buttonWidth * 1.3);
- var sortButtonWidth = buttonWidth * 2.5;
- var buttonSpacing = screenWidth / 5;
-
- mediaListItemW = $("#videoMediaList").width() * 0.92;
- mediaListItemH = $("#videoMediaList").height() / 10;
-}
-
-function resizeAll()
-{
- console.log("MediaPlayer in resizeAll");
- resizeMainMenu();
- resizePlayerPage();
-}
-
-/*
- * swipe - Handles swipe events. Currently it just acts as another way to hit the next / back buttons, but
- * it could be expanded to other things in the future.
- */
-
-function swipe(direction, object)
-{
- console.log("MediaPlayer in swipe");
- switch (object)
- {
- case "mediaName":
- if (direction === "right")
- nextButtonClick();
- else if (direction === "left")
- backButtonClick();
- break;
-
- default:
- break;
- }
-}
-
-function toggleNightMode(nightModeValue)
-{
- if (nightMode !== nightModeValue)
- {
- Array.prototype.forEach.call (document.querySelectorAll ('*'), function (el) {el.classList.toggle('night');});
- nightMode = nightModeValue;
- }
-}
-
-function init()
-{
- console.log("MediaPlayer in init");
-
- musicIcon.src = "images/musicIcon.png";
- vidIcon.src = "images/videoIcon.png";
- imgIcon.src = "images/imageIcon.png";
- mediaNameCanvas = document.getElementById("mediaName");
- mediaNameCTX = mediaNameCanvas.getContext("2d");
- trackTimeCanvas = document.getElementById("trackTime");
- trackTimeCTX = trackTimeCanvas.getContext("2d");
- playBarHeight = mediaNameCanvas.height;
- boxWidth = playBarHeight * 0.75;
- textStartX = boxWidth + 50;
-
- var vehicle = tizen.vehicle;
-
-
- /* Subscribe to AMB NightMode signal, and switch colors
- * upon receipt of the signal
- */
-
- if (vehicle && vehicle !== undefined)
- {
- var getVal = vehicle.get("NightMode");
-
- //Check that NightMode returned a value before trying to hook up to it
- if (getVal)
- {
- toggleNightMode(getVal.nightMode);
- }
-
- /* Subscribe to AMB NightMode signal, and switch colors
- * upon receipt of the signal
- */
-
- vehicle.subscribe("NightMode",function(value) {
- console.log("MediaPlayer: Day / Night mode changed to " + value.nightMode);
- toggleNightMode(value.nightMode);
- });
-
-
- /* Subscribe to AMB DrivingMode signal, and pause video
- * upon receipt of the signal
- */
-
-
- vehicle.subscribe("DrivingMode",function(value) {
- console.log("MediaPlayer: DrivingMode changed to " + value.drivingMode);
-
- if (value.drivingMode > 0 && currentPlayer.type === "video" && currentPlayer.playing())
- {
- console.log("MediaPlayer: pausing video due to vehicle motion");
- currentPlayer.pause();
- waitingToResumeVideo = true;
- }
- else if (value.drivingMode === 0 && currentPlayer.type === "video" && waitingToResumeVideo)
- {
- console.log("MediaPlayer: vehicle has stopped, resuming video");
- currentPlayer.play();
- waitingToResumeVideo = false;
- }
- });
- }
-
- //Setup voice control
- if (tizen.speech)
- setupSpeech();
- else {
- console.log("MediaPlayer: Speech Recognition not running, voice control will be unavailable");
- speechObj = {
- vocalizeString: function(item) { console.log(item); }
- };
- }
-
- audioPlayer = new MediaPlayer("audio");
- videoPlayer = new MediaPlayer("video");
- imagePlayer = new MediaPlayer("image");
- currentPlayer = audioPlayer;
-
- //Resize all items and search for local media
- resizeAll();
-
- if (localStorage.prevMenu && localStorage.prevMenu !== "MAIN")
- changeMenu(localStorage.prevMenu)
- else
- showMainMenu();
-
- getMedia(onAudioContentLoaded, "AUDIO");
- getMedia(onVideoContentLoaded, "VIDEO");
- getMedia(onImageContentLoaded, "IMAGE");
-
- //Check if DLNA plugin is installed. If so, scan for media.
- if (tizen.mediaserver)
- {
- //Currently no success signal, so continue trying until a server is found. Once that
- //happens, clear the stopServerSearch interval
-
- stopServerSearch = setInterval(function(){console.log("MediaPlayer searching for remote media..."); tizen.mediaserver.scanNetwork(foundMediaServer);}, 5000);
- }
- else
- console.log("MediaPlayer: No DLNA server running, using local media only...");
-
- //Prevent highlighting
- window.ondragstart = function() { return false; }
-
- $(window).bind('resize', resizeAll);
-
- //Simple swipe detection
- $("#mediaName").mousedown(function(e){mouseDownEvent = e;});
- $("#mediaName").mouseup(function(e){
- if (Math.abs(mouseDownEvent.clientY - e.clientY) < 100)
- {
- if (Math.abs(mouseDownEvent.clientX - e.clientX) > 100)
- {
- if (mouseDownEvent.clientX > e.clientX)
- swipe("left", "mediaName");
- else
- swipe("right", "mediaName");
- }
- }
- });
-
- document.getElementById('videoPlayer').addEventListener("playing", function() {
- $("#playButton").toggleClass('playing', true);
- $("#navigationButtons").hide();
- }, false);
- document.getElementById('videoPlayer').addEventListener("pause", function() {
- $("#playButton").toggleClass('playing', false);
- $("#navigationButtons").show();
- }, false);
- document.getElementById('videoPlayer').addEventListener("ended", function() {
- $("#playButton").toggleClass('playing', false);
- $("#navigationButtons").show();
- }, false);
- document.getElementById('audioPlayer').addEventListener("playing", function() {
- $("#playButton").toggleClass('playing', true);
- }, false);
- document.getElementById('audioPlayer').addEventListener("pause", function() {
- $("#playButton").toggleClass('playing', false);
- }, false);
- document.getElementById('audioPlayer').addEventListener("ended", function() {
- $("#playButton").toggleClass('playing', false);
- }, false);
- document.getElementById('imagePlayer').addEventListener("click", function() {
- if (!imagePlayer.playing)
- {
- // next picture
- nextButtonClick();
- }
- else
- {
- // pause the slideshow and fade in the controls
- imagePlayer.pause();
- $("#navigationButtons").show();
- }
- }, false);
-}
-
-$(document).ready(function () {
- init();
-});
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-MediaPlayer = function(type)
-{
- this.type = type;
- this.content = new Array();
- this.mediaList = $("#" + type + "MediaList");
- this.mediaListItems = $("#" + type + "MediaListItems");
- this.playerControls = undefined;
- this.mediaListLoaded = false;
- this.listIndex = 0;
- this.imagesLoaded = false;
- this.loadAndPlay = false;
- this.loadPrev = false;
- this.currentFileLoaded = false;
- this.fillingList = false;
- this.clearDrawTimeouts = new Array();
-
- switch(type)
- {
- case "audio":
- console.log("MediaPlayer creating AudioPlayer");
- audioPlayer = new AudioPlayer;
- $.extend(this, audioPlayer);
- this.playerControls = document.getElementById("audioPlayer");
- break;
- case "video":
- console.log("MediaPlayer creating VideoPlayer");
- videoPlayer = new VideoPlayer;
- $.extend(this, videoPlayer);
- this.playerControls = document.getElementById("videoPlayer");
- break;
- case "image":
- console.log("MediaPlayer creating ImagePlayer");
- imagePlayer = new ImagePlayer;
- $.extend(this, imagePlayer);
- this.playerControls = new ImageControls();
- break;
- default:
- console.log("MediaPlayer: Trying to make an invalid player type " + type);
- break;
- }
-}
-
-MediaPlayer.prototype.updateContent = function(newContent, append)
-{
- console.log("MediaPlayer: updating content for " + this.type);
- if (newContent && newContent !== undefined && newContent.length > 0)
- {
- if (append)
- {
- this.content = this.content.concat(newContent);
- }
- else
- {
- this.content.length = 0;
- this.content = newContent;
- }
- }
- else
- console.log("MediaPlayer: invalid content update for " + this.type);
-}
-
-MediaPlayer.prototype.getContent = function()
-{
- return this.content;
-}
-
-MediaPlayer.prototype.contentLength = function()
-{
- return this.content.length;
-}
-
-MediaPlayer.prototype.show = function()
-{
- $("#" + this.type + "Player").show();
-}
-
-MediaPlayer.prototype.clearContent = function()
-{
- console.log("MediaPlayer: clearing content for " + this.type);
- this.emptyTimeouts();
- this.content.length = 0;
-}
-
-MediaPlayer.prototype.currentIndex = function()
-{
- return this.listIndex;
-}
-
-MediaPlayer.prototype.emptyTimeouts = function()
-{
- var clearItem;
-
- while (clearItem = this.clearDrawTimeouts.pop())
- {
- clearTimeout(clearItem);
- }
-}
-
-MediaPlayer.prototype.makeListBar = function(icon, i, artistTextObj, trackTextObj)
-{
- var lightColor = (i+1)%2 !== 0 ? "lightColor " : "";
- var nightColor = nightMode ? "night" : "";
- var canvasW = Math.floor(mediaListItemW);
- var canvasH = Math.floor(mediaListItemH * 0.95) ;
-
- this.mediaListItems.append("<li id=" + this.type + "ListItem" + i + " style='width:" + mediaListItemW + "px;" + " height:" + mediaListItemH + "px;" +
- " margin-bottom: 10px' ><a href='#' class='" + lightColor + nightColor + "' >" +
- "<canvas id=" + this.type + "CanvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
- "</a></li>"
- );
-
- try
- {
- var currentCanvas = document.getElementById(this.type + "CanvasNum" + i);
- var currentCTX = currentCanvas.getContext("2d");
-
- if (currentCanvas && currentCTX)
- {
- this.content[i].ctx = currentCTX;
-
- currentCTX.drawImage(icon, 0, 0, canvasH, canvasH );
- var artistText = new TextObject(currentCTX,artistTextObj);
- var trackText = new TextObject(currentCTX,trackTextObj);
- var trackTextTemp1 = screenOrientation === "portrait" ? mediaTextTemplate2 : mediaTextTemplate2Landscape;
- var trackTextTemp2 = screenOrientation === "portrait" ? mediaTextTemplate3 : mediaTextTemplate3Landscape;
- var artistTextTemp = screenOrientation === "portrait" ? trackTextTemplate : trackTextTemplateLandscape;
-
- trackText.applyTemplate(trackTextTemp1);
- trackText.drawObj();
- trackText.applyTemplate(trackTextTemp2);
- trackText.drawObj();
- artistText.applyTemplate(artistTextTemp);
- artistText.drawObj();
- }
- else
- console.log("MediaPlayer: Failed to draw media item for index " + i );
- }
- catch(err)
- {
- console.log("MediaPlayer: drawImage failed for " + this.type + " - reason -> " + err);
- console.log("Source below");
- console.log("Src = " + icon.src);
- }
-}
-
-MediaPlayer.prototype.fillMediaList = function()
-{
- console.log("MediaPlayer in fillMediaList for content = " + this.type);
- this.fillingList = true;
-
- //Don't try and fill an empty content list
- if (this.content === undefined || this.content === null || this.content.length <=0)
- return false;
-
- this.emptyTimeouts();
-
- this.mediaListItems.empty();
- var timeOut = 1;
-
- switch (this.type)
- {
- case "audio":
- audioMediaListLoaded = true;
- break;
- case "video":
- videoMediaListLoaded = true;
- break;
- case "image":
- imageMediaListLoaded = true;
- break;
- default:
- break;
- }
-
- var jumpSize = 1;
- var tmpClearTimeout;
-
- for (var i=0; i < this.content.length; i++)
- {
- tmpClearTimeout = setTimeout(this.makeListItem.bind(this, i, jumpSize), timeOut);
- this.clearDrawTimeouts.push(tmpClearTimeout);
-
- timeOut += 50;
- i+=jumpSize - 1;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-var cancelShadowFlickerInterval = undefined;
-
-TextObject = function(ctx, args)
-{
- /* General */
- this.name = args.name;
- this.type = "text";
- this.text = args.text ? args.text : "";
- this.xLoc = args.xLoc;
- this.yLoc = args.yLoc;
- this.zLoc = args.zLoc == undefined ? 0 : args.zLoc;
- this.width = args.width;
- this.height = args.lineHeight;
- this.lineHeight = args.lineHeight;
- this.wordWrap = args.wordWrap;
- this.largeShadow = args.largeShadow;
- this.ctx = ctx;
- this.visible = args.visible == undefined ? true : args.visible;
- this.onClick = undefined;
-
- /* Text styles */
- this.font = args.font;
- this.fillStyle = args.fillStyle;
- this.lineWidth = args.lineWidth;
- this.strokeStyle = args.strokeStyle;
- this.textAlign = args.textAlign;
- this.textBaseline = args.textBaseline;
- this.shadowOffsetX = args.shadowOffsetX;
- this.shadowOffsetY = args.shadowOffsetY;
- this.shadowBlur = args.shadowBlur;
- this.shadowColor = args.shadowColor;
-
- if (args.template)
- this.applyTemplate(args.template);
-
- if (this.wordWrap)
- {
- var words = this.text.split(" ");
- var line = "";
- var tmpYloc = this.yLoc;
-
- for(var i = 0; i < words.length; i++)
- {
- var testLine = line + words[i] + " ";
- var metrics = this.ctx.measureText(testLine);
- var testWidth = metrics.width;
-
- if(testWidth > this.width)
- {
- line = words[i] + " ";
- tmpYloc += this.lineHeight;
- this.height += this.lineHeight;
- }
- else
- {
- line = testLine;
- }
- }
- }
-}
-
-TextObject.prototype.update = function(args)
-{
- /* General */
- if (args.name) {this.name = args.name;}
- if (args.text) {this.text = args.text;}
- if (args.xLoc) {this.xLoc = args.xLoc;}
- if (args.yLoc) {this.yLoc = args.yLoc;}
- if (args.zLoc) {this.zLoc = args.zLoc;}
- if (args.width) {this.width = args.width;}
- if (args.lineHeight) {this.height = args.lineHeight;}
- if (args.lineHeight) {this.lineHeight = args.lineHeight;}
- if (args.wordWrap) {this.wordWrap = args.wordWrap;}
- if (args.largeShadow) {this.largeShadow = args.largeShadow;}
- if (args.ctx) {this.ctx = ctx;}
- if (args.visible) {this.visible = args.visible;}
- if (args.onClick) {this.onClick = args.onClick;}
-
- /* Text styles */
- if (args.font) {this.font = args.font;}
- if (args.fillStyle) {this.fillStyle = args.fillStyle;}
- if (args.lineWidth) {this.lineWidth = args.lineWidth;}
- if (args.strokeStyle) {this.strokeStyle = args.strokeStyle;}
- if (args.textAlign) {this.textAlign = args.textAlign;}
- if (args.textBaseline) {this.textBaseline = args.textBaseline;}
- if (args.shadowOffsetX) {this.shadowOffsetX = args.shadowOffsetX;}
- if (args.shadowOffsetY) {this.shadowOffsetY = args.shadowOffsetY;}
- if (args.shadowBlur) {this.shadowBlur = args.shadowBlur;}
- if (args.shadowColor) {this.shadowColor = args.shadowColor;}
-
- if (args.template)
- this.applyTemplate(args.template);
-}
-
-TextObject.prototype.drawObj = function()
-{
- if (this.visible)
- {
- this.ctx.save();
-
- this.ctx.font = this.font;
- this.ctx.fillStyle = this.fillStyle;
- this.ctx.lineWidth = this.lineWidth ;
- this.ctx.strokeStyle = this.strokeStyle;
- this.ctx.textAlign = this.textAlign;
- this.ctx.textBaseline = this.textBaseline;
- this.ctx.shadowOffsetX = this.shadowOffsetX;
- this.ctx.shadowOffsetY = this.shadowOffsetY;
- this.ctx.shadowBlur = this.shadowBlur;
- this.ctx.shadowColor = this.shadowColor;
-
- if (this.wordWrap)
- this.wrapText();
- else
- {
-
- if (this.strokeStyle)
- this.ctx.strokeText(this.text, this.xLoc, this.yLoc);
-
- if (this.fillStyle)
- this.ctx.fillText(this.text, this.xLoc, this.yLoc);
-
- this.drawNoShadow();
- }
-
- this.ctx.restore();
- }
-}
-
-TextObject.prototype.applyTemplate = function(template)
-{
- this.font = template.font;
- this.fillStyle = template.fillStyle;
- this.lineWidth = template.lineWidth;
- this.strokeStyle = template.strokeStyle;
- this.textAlign = template.textAlign;
- this.textBaseline = template.textBaseline;
- this.shadowOffsetX = template.shadowOffsetX;
- this.shadowOffsetY = template.shadowOffsetY;
- this.shadowBlur = template.shadowBlur;
- this.shadowColor = template.shadowColor;
-
- if (this.wordWrap)
- {
- var words = this.text.split(" ");
- var line = "";
- var tmpYloc = this.yLoc;
-
- for(var i = 0; i < words.length; i++)
- {
- var testLine = line + words[i] + " ";
- var metrics = this.ctx.measureText(testLine);
- var testWidth = metrics.width;
-
- if(testWidth > this.width)
- {
- line = words[i] + " ";
- tmpYloc += this.lineHeight;
- this.height += this.lineHeight;
- }
- else
- {
- line = testLine;
- }
- }
- }
-}
-
-TextObject.prototype.drawLargeShadow = function()
-{
- var origX = this.shadowOffsetX;
- var origY = this.shadowOffsetY;
-
- this.shadowOffsetX = this.largeShadow;
- this.shadowOffsetY = 0;
- this.drawObj();
- this.shadowOffsetY = this.largeShadow;
- this.drawObj();
- this.shadowOffsetX = 0;
- this.drawObj();
- this.shadowOffsetX = -this.largeShadow;
- this.drawObj();
- this.shadowOffsetY = 0;
- this.drawObj();
- this.shadowOffsetY = -this.largeShadow;
- this.drawObj();
- this.shadowOffsetX = -0;
- this.drawObj();
- this.shadowOffsetX = -this.largeShadow;
- this.drawObj();
-
- this.shadowOffsetX = origX;
- this.shadowOffsetY = origY;
-}
-
-TextObject.prototype.drawNoShadow = function()
-{
- this.ctx.save();
-
- this.ctx.shadowOffsetX = 0;
- this.ctx.shadowOffsetY = 0;
- this.ctx.shadowBlur = 0;
-
- if (this.strokeStyle)
- this.ctx.strokeText(this.text, this.xLoc, this.yLoc);
-
- if (this.fillStyle)
- this.ctx.fillText(this.text, this.xLoc, this.yLoc);
-
- this.ctx.restore();
-
-}
-
-TextObject.prototype.wrapText = function()
-{
- this.ctx.save();
-
- this.ctx.font = this.font;
- this.ctx.fillStyle = this.fillStyle;
- this.ctx.lineWidth = this.lineWidth ;
- this.ctx.strokeStyle = this.strokeStyle;
- this.ctx.textAlign = this.textAlign;
- this.ctx.textBaseline = this.textBaseline;
- this.ctx.shadowOffsetX = this.shadowOffsetX;
- this.ctx.shadowOffsetY = this.shadowOffsetY;
- this.ctx.shadowBlur = this.shadowBlur;
- this.ctx.shadowColor = this.shadowColor;
- this.height = this.lineHeight;
-
- var words = this.text.split(" ");
- var line = "";
- var tmpYloc = this.yLoc;
- var lineCount = 1;
-
- for(var i = 0; i < words.length; i++)
- {
- var testLine = line + words[i] + " ";
- var metrics = this.ctx.measureText(testLine);
- var testWidth = metrics.width;
-
- if(testWidth > this.width)
- {
- if (this.strokeStyle)
- this.ctx.strokeText(line, this.xLoc, tmpYloc);
-
- if (this.fillStyle)
- this.ctx.fillText(line, this.xLoc, tmpYloc);
-
- line = words[i] + " ";
- tmpYloc += this.lineHeight;
- this.height += this.lineHeight;
- lineCount += 1;
-
- if (lineCount >= 4)
- break;
- }
- else
- {
- line = testLine;
- }
- }
-
- if (this.strokeStyle)
- this.ctx.strokeText(line, this.xLoc, tmpYloc);
-
- if (this.fillStyle)
- this.ctx.fillText(line, this.xLoc, tmpYloc);
-
- this.ctx.restore();
-}
-
-function shadowFlicker(obj, min, max, interval)
-{
- var tmpObj = obj;
-
- if (cancelShadowFlickerInterval)
- clearInterval(cancelShadowFlickerInterval);
-
- cancelShadowFlickerInterval = setInterval(
-
- function(){
-
- if (tmpObj.largeShadow)
- var shadowOffset = tmpObj.largeShadow;
- else
- var shadowOffset = tmpObj.shadowOffsetX;
-
- if (shadowOffset > max)
- shadowOffset -= Math.floor(Math.random()*interval) + 1;
- else if (shadowOffset <= min)
- shadowOffset += Math.floor(Math.random()*interval) + 1;
- else
- {
- if (Math.floor(Math.random()*1))
- shadowOffset += Math.floor(Math.random()*interval) + 1;
- else
- shadowOffset -= Math.floor(Math.random()*interval) + 1;
- }
-
- if (shadowOffset < 1)
- shadowOffset = 1;
-
- tmpObj.ctx.clearRect(0,0,500,500);
-
-
- if (!tmpObj.largeShadow)
- {
- tmpObj.shadowOffsetX = shadowOffset;
- tmpObj.shadowOffsetY = shadowOffset;
- tmpObj.drawObj();
- tmpObj.largeShadow = shadowOffset;
- tmpObj.drawLargeShadow();
- }
- else
- {
- tmpObj.largeShadow = shadowOffset;
- tmpObj.drawLargeShadow();
- }
-
- }, 100);
-}
-
-function shadowGlow(obj, min, max, speed)
-{
- var tmpObj = obj;
-
- if (cancelShadowFlickerInterval)
- clearInterval(cancelShadowFlickerInterval);
-
- var direction = "OUT";
- cancelShadowFlickerInterval = setInterval(
-
- function(){
-
-
- if (tmpObj.largeShadow)
- var shadowOffset = tmpObj.largeShadow;
- else
- var shadowOffset = tmpObj.shadowOffsetX;
-
- if (shadowOffset > max)
- direction = "IN";
- else if (shadowOffset <= min)
- direction = "OUT";
-
- if (direction === "OUT")
- shadowOffset += 1;
- else
- shadowOffset -= 1;
-
- if (shadowOffset < 1)
- shadowOffset = 1;
-
- tmpObj.ctx.clearRect(0,0,500,500);
-
-
- if (!tmpObj.largeShadow)
- {
- tmpObj.shadowOffsetX = shadowOffset;
- tmpObj.shadowOffsetY = shadowOffset;
- tmpObj.drawObj();
- tmpObj.largeShadow = shadowOffset;
- tmpObj.drawLargeShadow();
- }
- else
- {
- tmpObj.largeShadow = shadowOffset;
- tmpObj.drawLargeShadow();
- }
-
- }, 100);
-}
-
+++ /dev/null
-
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-VideoPlayer = function()
-{
- this.clearVideoTimeInterval = undefined;
- this.loadPrevVideo = false;
- this.currentVideoContent = undefined;
-}
-
-VideoPlayer.prototype.play = function()
-{
- console.log("MediaPlayer in VideoPlayer::play");
- if (this.playerControls.paused)
- {
- this.playerControls.play();
-
- //Start tracking the current time of the media. This is used to play from previous position on restart.
- if (!this.content[this.listIndex].remoteFile)
- {
- var timeoutFunction = function()
- {
- localStorage.prevVideoTime = this.playerControls.currentTime;
- }
-
- //Start tracking the current time of the media. This is used to play from previous position on restart.
- this.clearVideoTimeInterval = setInterval(timeoutFunction.bind(this),500);
- }
- }
-}
-
-VideoPlayer.prototype.pause = function()
-{
- if (!this.playerControls.paused)
- {
- this.playerControls.pause();
- clearInterval(this.clearVideoTimeInterval);
- }
-}
-
-VideoPlayer.prototype.playing = function()
-{
- return !(this.playerControls.paused);
-}
-
-VideoPlayer.prototype.next = function()
-{
- if (this.content)
- {
- if (this.content.length > (this.listIndex + 1))
- this.listIndex++;
- else
- this.listIndex = 0;
- this.load(this.listIndex, false);
- }
-}
-
-VideoPlayer.prototype.previous = function()
-{
- if (this.content)
- {
- if (this.listIndex > 0 )
- this.listIndex--;
- else
- this.listIndex = this.content.length - 1;
-
- this.load(this.listIndex, false);
- }
-}
-
-VideoPlayer.prototype.load = function(index, play)
-{
- this.listIndex = index;
- this.loadAndPlay = play;
- this.playerControls.pause();
- $("#videoSrc").attr("src", this.content[this.listIndex].contentURI);
- this.playerControls.load();
-}
-
-VideoPlayer.prototype.videoLoaded = function()
-{
- this.currentVideoContent = this.content[this.listIndex];
-
- //Only store track to localStorage if it's a local file, and current menu is the Video menu
- if (!this.content[this.listIndex].remoteFile && localStorage.prevMenu === "mainVideoButton")
- {
- localStorage.prevVideo = this.content[this.listIndex].contentURI;
- }
- else
- {
- localStorage.prevVideo = undefined;
- localStorage.prevVideoTime = undefined;
- }
-
- if (this.loadPrevVideo)
- {
- this.playerControls.currentTime = localStorage.prevVideoTime;
- this.loadPrevVideo = false;
- this.play();
- }
-
- if (this.loadAndPlay)
- this.play();
-
- this.currentFileLoaded = true;
-}
-
-VideoPlayer.prototype.onContentLoaded = function()
-{
- try
- {
- if (localStorage.prevVideo && localStorage.prevVideo !== "undefined")
- {
- for (var i = 0; i < this.content.length; i++)
- {
- if (this.content[i].contentURI === localStorage.prevVideo)
- {
- console.log("MediaPlayer: Previous video found, loading " + this.content[i].contentURI);
- this.listIndex = i;
- this.loadPrevVideo = true;
- this.fillMediaList();
- this.load(i, true);
- }
- }
- }
- else
- {
- console.log("MediaPlayer: No previous video found, loading first");
- this.load(0,false);
- }
- }
-
- catch (err)
- {
- console.log("MediaPlayer: Error when parsing videoContent");
- }
-}
-
-VideoPlayer.prototype.makeListItem = function(j, k)
-{
- var canvasH = mediaListItemH * 0.95 ;
-
- for (var i = j; (i < (j+k) && i < this.content.length); i++)
- {
-
- if (this.content[i].artists === undefined)
- {
- this.content[i].artists = new Array();
- this.content[i].artists[0] = "Unknown";
- }
-
- else if (typeof this.content[i].artists[0] !== "string")
- this.content[i].artists[0] = "Unknown";
-
- var artistText = {"text" : this.content[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0};
- var trackText = {"text" : this.content[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0};
-
- this.makeListBar(vidIcon, i, artistText, trackText);
-
- // Set callback function for the new list item
- $("#" + this.type + "CanvasNum" + i).click(function () {
- try
- {
- videoPlayer.load($(this).parent().parent().index(), true);
- $("#videoMediaList").hide();
- }
- catch(err)
- {
- console.log("MediaPlayer: load video error " + err.message);
- }
- });
- }
-}
+++ /dev/null
-{
- "app": {
- "launch": {
- "container": "panel",
- "local_path": "index.html"
- }
- },
- "description": "__MSG_appDescription__",
- "icons": {
- "128": "MediaPlayer.png"
- },
- "name": "__MSG_appName__",
- "permissions": [],
- "version": "0.2013.6.10"
-}
+++ /dev/null
-* Wed Dec 18 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20131218.195059@b3964db
-- Adding requirement to the spec for speech-recognition and wrt-plugins-ivi
-
-* Mon Nov 18 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20131115.213224@f4bb5fa
-- Fix for showing elapsed time bar on video screen
-
-* Thu Nov 14 2013 brianjjones <brian.j.jones@intel.com> accepted/tizen/20131015.185352@dcea024
-- Adding current track time to the metadata output
-
-* Tue Oct 15 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20131015.010041@0cdd066
-- Saving of the localStorage now occurs after the file has successfully loaded
-
-* Mon Oct 14 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20131010.205318@a65dc75
-- Image player will now remember what image it was last on
-
-* Tue Oct 08 2013 brianjjones <brian.j.jones@intel.com> accepted/tizen/20131004.164521@81d77fa
-- Re-organizing the code so that the players are object based. Adding code to remember
- what page you were on as well as the previous media
-
-* Fri Oct 04 2013 brianjjones <brian.j.jones@intel.com> accepted/tizen/20131004.164521@b1a663e
-- Adding a change so that if local media fails to load, it tries again. Also now starts on
- previous menu.
-
-* Thu Oct 03 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130925.235244@b480ae8
-- MediaPlayer will now remember where the user was on restart. Also able to reconnect
- to remote media if connection is lost (TIVI-1254)
-- Load the first video when moving to the video player mode
-- Fix background when in nightMode
-- Make play button state driven directly off media events
-
-* Wed Sep 25 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130925.145436@899c31e
-- DLNA plugin doesn't currently give a signal that it failed to connect. So a interval call
- has been added to continue trying until successfull.
-
-* Tue Sep 24 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130920.001725@98ab50d
-- Update to the fillMediaList method. This breaks it into pieces so the rest of the app can
- continue to be used. This helps speed up the app and gives it a snappier feel.
- Signed-off-by: brianjjones <brian.j.jones@intel.com>
-
-* Thu Sep 19 2013 brianjjones <brian.j.jones@intel.com> accepted/tizen/20130918.185209@7d7f65c
-- Removing the wait for album art, instead a default image will be used until it's ready.
-- Broke that code out into it's own javascript file. Several fixes for properly displaying
-- the song text for longer names. Adding a postun to the spec so that the app is properly
-- uninstalled. Signed-off-by: brianjjones <brian.j.jones@intel.com>
-
-* Tue Sep 17 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130913.223432@5b6e998
-- Fix for NightMode, shrinking play button slightly to avoid overlap
-
-* Fri Sep 13 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130913.011212@023d5e5
-- Adding DLNA browsing support. MediaPlayer will now show files found on remote servers
-
-* Thu Sep 12 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130909.164827@ee8af51
-- Adding a listener for DriverMode. If it receives a value > 0 it will pause playing video.
-
-* Fri Sep 06 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130830.191004@b8fe9bb
-- Use all available space for videos and images
-- Remove background image
-- Adding icon, MediaPlayer.png, to the wgt file
-
-* Tue Aug 27 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130723.194640@f68855f
-- Adding tizen.speech (voice control) support.
-
-* Mon Jul 22 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130719.021058@4b5b477
-- Fix for play button bug, music now moves to the next song when finished, error shows up
- if filetype can't be loaded
-- More image shrinking
-
-* Wed Jul 17 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130702.231722@8097a1e
-- Shrinking image sizes and removing hard coded reference to ogg
-
-* Tue Jul 02 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130701.233523@c4d3618
-- Putting missing text back in. Adding several try/catch statements to deal with possible
- null arrays
-
-* Mon Jul 01 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130629.001025@76c119d
-- Adding a null check for artwork. Various other sizing tweaks
-
-* Fri Jun 28 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130628.000427@0eedd50
-- Changing installation to only wrt-install if it is after the first boot. Otherwise,
- copy the wgt file to the correct place and let wrt-installer handle it
-
-* Thu Jun 27 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130626.013745@95361ce
-- Adding slide show ability to image player. Various changes to make app look better
- in landscape. Cleaning up code.
-
-* Wed Jun 26 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130626.013745@2809676
-- Check that the album cover art image is valid before using it. Removing some images
- due to renaming.
-- Changing some image files. Adding check to ensure album cover image is valid.
- Removing stray text.
-
-Brian Jones <brian.j.jones@intel.com>
-Initial Checkin
+++ /dev/null
-Name: MediaPlayer
-Summary: A HTML media player application
-Version: 0.0.1
-Release: 1
-Group: Applications/System
-License: Apache 2.0
-URL: http://www.tizen.org2
-Source0: %{name}-%{version}.tar.bz2
-BuildRequires: zip
-BuildRequires: desktop-file-utils
-Requires: speech-recognition
-Requires: wrt-installer
-Requires: wrt-plugins-ivi
-
-%description
-A HTML media player for music, video, and images
-
-%prep
-%setup -q -n %{name}-%{version}
-
-%build
-
-make wgtPkg
-
-#make %{?jobs:-j%jobs}
-
-%install
-rm -rf %{buildroot}
-%make_install
-
-%post
-if [ -f /opt/usr/apps/.preinstallWidgets/preinstallDone ]; then
- wrt-installer -i /opt/usr/apps/.preinstallWidgets/MediaPlayer.wgt;
-fi
-
-%postun
- wrt-installer -un t8j6HTRpuz.MediaPlayer
-
-%files
-%defattr(-,root,root,-)
-/opt/usr/apps/.preinstallWidgets/MediaPlayer.wgt
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<tizen-app-template xmlns="http://www.tizen.org/tizen-app-template" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" template-version="" sdk-version="" icon32="tizen_32.png" icon64="tizen_64.png" xsi:schemaLocation="http://www.tizen.org/tizen-app-template tizen-app-template.xsd ">
- <template-name>MediaPlayer</template-name>
- <widget-type>TIZEN</widget-type>
- <description-file-name>description.xml</description-file-name>
-</tizen-app-template>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<?xml-stylesheet type="text/xsl" href="description.xsl"?>\r
-<Overview version="1.0">\r
- <SampleName>Saythis</SampleName>\r
- <SampleVersion>1.0.0</SampleVersion>\r
- <Preview>saythis-snapshot.png</Preview>\r
- <Description>\r
- A sample application demonstrating the ivi special api speech usage.\r
- </Description>\r
-</Overview>\r
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- This file provides a functionality to show template's description.xml in the project wizard.
- Don't delete or move this file.
- -->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:template match="/">
- <html>
- <head>
- <style type="text/css">
- html,body {
- font-family:Arial;
- margin: 0px;
- }
- td
- {
- font-size:13px;
- }
- .samplename
- {
- font-size:16px;
- color:#ffffff;
- height:26px;
- background-color:#6d96ac;
- }
- .category
- {
- font-size:16px;
- color:#ffffff;
- height:30px;
- background-color:#6d96ac;
- }
- .contents
- {
- padding: 6px 10px 14px 10px;
- }
- table#widgets td
- {
- border: solid 1px #6d96ac;
- border-collapse: collapse;
- }
- .widgetname
- {
- font-weight: bold;
- text-align: center;
- width: 20%;
- word-break:break-all;
- }
- table#references td
- {
- width: 100%;
- border: 0px;
- border-spacing: 0px;
- padding: 5px;
- }
- .refname
- {
- width: 100%;
- font-weight: bold;
- }
- </style>
- </head>
- <body>
- <table width="400px" border="0" cellspacing="0">
- <tr>
- <td class="samplename" align="center">
- <xsl:value-of select="Overview/SampleName"/>
- <xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
- <!--
- <xsl:value-of select="Overview/SampleVersion"/>
- -->
- </td>
- </tr>
- <tr bgcolor="#FFFFFF">
- <td class="contents">
- <strong>Type</strong>: JavaScript
- <p>
- <xsl:value-of select="Overview/Description"/>
- </p>
- </td>
- </tr>
- <tr>
- <td align="center" bgcolor="#FFFFFF" height="260px">
- <img>
- <xsl:attribute name="src">
- <xsl:value-of select="Overview/Preview"/>
- </xsl:attribute>
- </img>
- </td>
- </tr>
- </table>
- </body>
- </html>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+++ /dev/null
-PROJECT = saythis
-INSTALL_FILES = css js saythis.png index.html README.txt LICENSE
-
-VERSION := 0.0.1
-PACKAGE = $(PROJECT)-$(VERSION)
-
-INSTALL_DIR = ${DESTDIR}/opt/usr/apps/.preinstallWidgets
-
-all:
- @echo "Nothing to build"
-
-wgtPkg:
- zip -r $(PROJECT).wgt js css index.html manifest.json config.xml saythis.png
-
-install:
- @echo "Installing saythis, stand by..."
- mkdir -p $(INSTALL_DIR)/
- cp $(PROJECT).wgt $(INSTALL_DIR)/
-
-dist:
- tar czf ../$(PACKAGE).tar.bz2 .
+++ /dev/null
-
-SayThis is HTML5-based webapp for demonstrating text to speech
-
-Author: Jimmy Huang <jimmy.huang@intel.com>
-
-This application is written using HTML5/css3/jquery javascript library and is
-distributed under Apache2.0 license.
-
-IMAGES
------------------------------------------------------------------------------
-
-all images in the images/ folder are created by Intel Corp.
-they are licensed under the Creative Commons Attribution 3.0 license
-http://creativecommons.org/licenses/by/3.0/us/
-
-FONTS
------------------------------------------------------------------------------
-
-SOUNDS
------------------------------------------------------------------------------
-
-LIBRARIES
------------------------------------------------------------------------------
-
-jQuery JavaScript Library v1.7.2
-Copyright 2011, John Resig
-Dual licensed under the MIT or GPL Version 2 licenses.
-http://jquery.org/license
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://yourdomain/sayThis" version="1.0.0" viewmodes="maximized">
- <tizen:application id="lYjFlj49Q4.saythis" package="lYjFlj49Q4" required_version="2.1"/>
- <content src="index.html"/>
- <icon src="saythis.png"/>
- <name>saythis</name>
- <tizen:privilege name="http://tizen.org/privilege/speech"/>
-</widget>
+++ /dev/null
-/*
- * Copyright (c) 2012, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-/* -------------------------------- global ----------------------------- */
-
-body {
- margin: 0px;
- -webkit-user-select: none;
- background-color: "white";
- box-shadow: 5px 5px 20px black;
- top: 50%;
- left: 50%;
- -webkit-transform: translate(-50%, -50%);
- position: absolute;
- width: 90%;
- height: 80%;
- -webkit-box-align: center;
- -webkit-box-pack: center;
- -webkit-box-orient: vertical;
- display: -webkit-box;
-}
-
-#main_page {
- position: absolute;
- margin: 0;
- padding: 0;
- width: 100%;
- height: 100%;
- background-color: #ACD2F6;
-}
-
-#instructionLabel {
- margin-top: 30px;
- width: 80%;
- height: 15%;
- margin-left: 10%;
- margin-right: 10%;
- text-align: center;
- font-size: 50px;
- font-weight: lighter;
- color: #111111;
-}
-
-#inputArea {
- width: 80%;
- height: 60%;
- margin-left: 10%;
- margin-right: 10%;
- font-size: 50px;
- font-weight: lighter;
- resize: none;
-}
-
-#buttonPanel {
- width: 80%;
- height: 20%;
- margin-left: 10%;
- margin-right: 10%;
-}
-
-#speakButton {
- width: 20%;
- height: 50px;
- margin-top: 30px;
- margin-left: 40%;
- margin-right: 40%;
- text-align: center;
- font-size: 26px;
- font-weight: lighter;
- color: #ffffff;
- background-color: #470009;
-}
-
-.pressed {
- background-color: grey !important;
-}
-
-#speakButtonLabel {
- position: relative;
- top: 25%;
-}
+++ /dev/null
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!--
- * Copyright (c) 2012, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
--->
-<html>
-<head>
- <meta name="viewport" content="width=device-width target-densitydpi=device-dpi initial-scale=1 maximum-scale=1 user-scalable=0" />
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>SayThis</title>
- <link rel="stylesheet" type="text/css" href="css/main.css"></link>
- <script src="js/jquery-2.0.3.min.js"></script>
- <script src="js/main.js"></script>
-</head>
-
-<body>
- <div id="main_page">
- <div id="instructionLabel">Type in the words</div>
- <textarea id="inputArea"></textarea>
- <div id="buttonPanel">
- <div id="speakButton">
- <div id="speakButtonLabel">SAY</div>
- </div>
- </div>
- </div>
-</body>
-</html>
+++ /dev/null
-/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery-2.0.3.min.map
-*/
-(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)
-};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)
-},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window);
+++ /dev/null
-/*
- * Copyright (c) 2012, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-var mySpeechObj = tizen.speech;
-
-$(document).ready(function()
-{
- $('#speakButton').click(function() {
-
- var text = $('#inputArea').val();
- console.log(text);
-
- if (text) {
- mySpeechObj.vocalizeString(text);
- }
-
- $('#inputArea').val("");
- });
-
- $('#inputArea').keyup(function(event) {
- if (event.keyCode === 13) {
- $('#speakButton').click();
- }
- });
-});
+++ /dev/null
-* Wed Sep 18 2013 brianjjones <brian.j.jones@intel.com> submit/tizen/20130916.234809@43b7ebe
-- New icon for application
-
-* Mon Sep 16 2013 brianjjones <brian.j.jones@intel.com> accepted/tizen/20130912.212624@78077f1
-- Fixing the css file so the application is oriented properly
-
-* Thu Sep 12 2013 brianjjones <brian.j.jones@intel.com> 1.0_branch@71f490d
-- Updating saythis to use the tizen.speech.vocalizeString() method instead of websockets
-- Making it so pressing enter says the words
-
-* Wed Sep 12 2012 bjones <None> submit/trunk/20120911.004456@9d140f6
-- Fixing spec and desktop files
-- Initial commit
-
-
+++ /dev/null
-Name: saythis
-Summary: A HTML5 speech to text app
-Version: 0.0.1
-Release: 1
-Group: Applications/System
-License: Apache 2.0
-URL: http://www.tizen.org2
-Source0: %{name}-%{version}.tar.bz2
-BuildRequires: zip
-BuildRequires: desktop-file-utils
-Requires: wrt-installer
-
-%description
-A HTML5 speech to text app
-
-%prep
-%setup -q -n %{name}-%{version}
-
-%build
-
-make wgtPkg
-
-#make %{?jobs:-j%jobs}
-
-%install
-rm -rf %{buildroot}
-%make_install
-
-%post
-if [ -f /opt/usr/apps/.preinstallWidgets/preinstallDone ]; then
- wrt-installer -i /opt/usr/apps/.preinstallWidgets/saythis.wgt;
-fi
-
-%files
-%defattr(-,root,root,-)
-/opt/usr/apps/.preinstallWidgets/saythis.wgt
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<tizen-app-template xmlns="http://www.tizen.org/tizen-app-template" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" template-version="" sdk-version="" icon32="tizen_32.png" icon64="tizen_64.png" xsi:schemaLocation="http://www.tizen.org/tizen-app-template tizen-app-template.xsd ">
- <template-name>Saythis</template-name>
- <widget-type>TIZEN</widget-type>
- <description-file-name>description.xml</description-file-name>
-</tizen-app-template>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<?xml-stylesheet type="text/xsl" href="description.xsl"?>\r
-<Overview version="1.0">\r
- <SampleName>SettingsApp</SampleName>\r
- <SampleVersion>1.0.0</SampleVersion>\r
- <Preview>settingsapp-snapshot.png</Preview>\r
- <Description>\r
- A sample application demonstrating the tizen device API usage.\r
- </Description>\r
-</Overview>\r
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- This file provides a functionality to show template's description.xml in the project wizard.
- Don't delete or move this file.
- -->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:template match="/">
- <html>
- <head>
- <style type="text/css">
- html,body {
- font-family:Arial;
- margin: 0px;
- }
- td
- {
- font-size:13px;
- }
- .samplename
- {
- font-size:16px;
- color:#ffffff;
- height:26px;
- background-color:#6d96ac;
- }
- .category
- {
- font-size:16px;
- color:#ffffff;
- height:30px;
- background-color:#6d96ac;
- }
- .contents
- {
- padding: 6px 10px 14px 10px;
- }
- table#widgets td
- {
- border: solid 1px #6d96ac;
- border-collapse: collapse;
- }
- .widgetname
- {
- font-weight: bold;
- text-align: center;
- width: 20%;
- word-break:break-all;
- }
- table#references td
- {
- width: 100%;
- border: 0px;
- border-spacing: 0px;
- padding: 5px;
- }
- .refname
- {
- width: 100%;
- font-weight: bold;
- }
- </style>
- </head>
- <body>
- <table width="400px" border="0" cellspacing="0">
- <tr>
- <td class="samplename" align="center">
- <xsl:value-of select="Overview/SampleName"/>
- <xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
- <!--
- <xsl:value-of select="Overview/SampleVersion"/>
- -->
- </td>
- </tr>
- <tr bgcolor="#FFFFFF">
- <td class="contents">
- <strong>Type</strong>: JavaScript
- <p>
- <xsl:value-of select="Overview/Description"/>
- </p>
- </td>
- </tr>
- <tr>
- <td align="center" bgcolor="#FFFFFF" height="260px">
- <img>
- <xsl:attribute name="src">
- <xsl:value-of select="Overview/Preview"/>
- </xsl:attribute>
- </img>
- </td>
- </tr>
- </table>
- </body>
- </html>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
+++ /dev/null
-PROJECT = Settings
-
-VERSION := 0.0.2
-PACKAGE = $(PROJECT)-$(VERSION)
-
-INSTALL_DIR = ${DESTDIR}/opt/usr/apps/.preinstallWidgets
-
-FILES = js images css index.html manifest.json config.xml *.png
-
-all:
- @echo "Nothing to build"
-
-wgtPkg:
- zip -r $(PROJECT).wgt $(FILES)
-
-install:
- @echo "Installing Settings, stand by..."
- mkdir -p $(INSTALL_DIR)/
- cp $(PROJECT).wgt $(INSTALL_DIR)/
-
-dist:
- tar czf ../$(PACKAGE).tar.bz2 .
+++ /dev/null
-
-[Desktop Entry]
-Version=0.0.2
-Name=Settings
-Comment=System Settings Application
-GenericName=Settings
-Exec=chromium-browser --enable-plugins --enable-extensions --enable-user-scripts --enable-printing --enable-sync --use-gl=egl --ignore-gpu-blacklist --auto-ssl-client-auth %U --app-id=ODBQpKvkS1 --load-extension=/usr/share/Settings/ --no-first-run
-Terminal=false
-X-MultipleArgs=false
-Type=Application
-Icon=Settings
-StartupWMClass=Chromium
-StartupNotify=true
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://yourdomain/Settings" version="1.0.0" viewmodes="maximized">
- <tizen:application id="ODBQpKvkS1.Settings" package="ODBQpKvkS1" required_version="2.1"/>
- <content src="index.html"/>
- <icon src="Settings.png"/>
- <name>Settings</name>
- <tizen:privilege name="http://tizen.org/privilege/bluetooth.admin"/>
- <tizen:privilege name="http://tizen.org/privilege/bluetooth.gap"/>
-</widget>
+++ /dev/null
-/*
-* jQuery Mobile 1.3.1
-* Git HEAD hash: 74b4bec049fd93e4fe40205e6157de16eb64eb46 <> Date: Mon Apr 8 2013 19:41:28 UTC
-* http://jquerymobile.com
-*
-* Copyright 2010, 2013 jQuery Foundation, Inc. and other contributors
-* Released under the MIT license.
-* http://jquery.org/license
-*
-*/
-
-
-/* Swatches */
-/* A
------------------------------------------------------------------------------------------------------------*/
-.ui-bar-a {
- border: 1px solid #333 /*{a-bar-border}*/;
- background: #111 /*{a-bar-background-color}*/;
- color: #fff /*{a-bar-color}*/;
- font-weight: bold;
- text-shadow: 0 /*{a-bar-shadow-x}*/ -1px /*{a-bar-shadow-y}*/ 0 /*{a-bar-shadow-radius}*/ #000 /*{a-bar-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #3c3c3c /*{a-bar-background-start}*/), to( #111 /*{a-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/);
-}
-.ui-bar-a,
-.ui-bar-a input,
-.ui-bar-a select,
-.ui-bar-a textarea,
-.ui-bar-a button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-bar-a .ui-link-inherit {
- color: #fff /*{a-bar-color}*/;
-}
-.ui-bar-a a.ui-link {
- color: #7cc4e7 /*{a-bar-link-color}*/;
- font-weight: bold;
-}
-.ui-bar-a a.ui-link:visited {
- color: #2489ce /*{a-bar-link-visited}*/;
-}
-.ui-bar-a a.ui-link:hover {
- color: #2489ce /*{a-bar-link-hover}*/;
-}
-.ui-bar-a a.ui-link:active {
- color: #2489ce /*{a-bar-link-active}*/;
-}
-.ui-body-a,
-.ui-overlay-a {
- border: 1px solid #444 /*{a-body-border}*/;
- background: #222 /*{a-body-background-color}*/;
- color: #fff /*{a-body-color}*/;
- text-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ #111 /*{a-body-shadow-color}*/;
- font-weight: normal;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #444 /*{a-body-background-start}*/), to( #222 /*{a-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/);
-}
-.ui-overlay-a {
- background-image: none;
- border-width: 0;
-}
-.ui-body-a,
-.ui-body-a input,
-.ui-body-a select,
-.ui-body-a textarea,
-.ui-body-a button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-body-a .ui-link-inherit {
- color: #fff /*{a-body-color}*/;
-}
-.ui-body-a .ui-link {
- color: #2489ce /*{a-body-link-color}*/;
- font-weight: bold;
-}
-.ui-body-a .ui-link:visited {
- color: #2489ce /*{a-body-link-visited}*/;
-}
-.ui-body-a .ui-link:hover {
- color: #2489ce /*{a-body-link-hover}*/;
-}
-.ui-body-a .ui-link:active {
- color: #2489ce /*{a-body-link-active}*/;
-}
-.ui-btn-up-a {
- border: 1px solid #111 /*{a-bup-border}*/;
- background: #333 /*{a-bup-background-color}*/;
- font-weight: bold;
- color: #fff /*{a-bup-color}*/;
- text-shadow: 0 /*{a-bup-shadow-x}*/ 1px /*{a-bup-shadow-y}*/ 0 /*{a-bup-shadow-radius}*/ #111 /*{a-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #444 /*{a-bup-background-start}*/), to( #2d2d2d /*{a-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/);
-}
-.ui-btn-up-a:visited,
-.ui-btn-up-a a.ui-link-inherit {
- color: #fff /*{a-bup-color}*/;
-}
-.ui-btn-hover-a {
- border: 1px solid #000 /*{a-bhover-border}*/;
- background: #444 /*{a-bhover-background-color}*/;
- font-weight: bold;
- color: #fff /*{a-bhover-color}*/;
- text-shadow: 0 /*{a-bhover-shadow-x}*/ 1px /*{a-bhover-shadow-y}*/ 0 /*{a-bhover-shadow-radius}*/ #111 /*{a-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #555 /*{a-bhover-background-start}*/), to( #383838 /*{a-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/);
-}
-.ui-btn-hover-a:visited,
-.ui-btn-hover-a:hover,
-.ui-btn-hover-a a.ui-link-inherit {
- color: #fff /*{a-bhover-color}*/;
-}
-.ui-btn-down-a {
- border: 1px solid #000 /*{a-bdown-border}*/;
- background: #222 /*{a-bdown-background-color}*/;
- font-weight: bold;
- color: #fff /*{a-bdown-color}*/;
- text-shadow: 0 /*{a-bdown-shadow-x}*/ 1px /*{a-bdown-shadow-y}*/ 0 /*{a-bdown-shadow-radius}*/ #111 /*{a-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #202020 /*{a-bdown-background-start}*/), to( #2c2c2c /*{a-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/);
-}
-.ui-btn-down-a:visited,
-.ui-btn-down-a:hover,
-.ui-btn-down-a a.ui-link-inherit {
- color: #fff /*{a-bdown-color}*/;
-}
-.ui-btn-up-a,
-.ui-btn-hover-a,
-.ui-btn-down-a {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
- text-decoration: none;
-}
-/* B
------------------------------------------------------------------------------------------------------------*/
-.ui-bar-b {
- border: 1px solid #456f9a /*{b-bar-border}*/;
- background: #5e87b0 /*{b-bar-background-color}*/;
- color: #fff /*{b-bar-color}*/;
- font-weight: bold;
- text-shadow: 0 /*{b-bar-shadow-x}*/ 1px /*{b-bar-shadow-y}*/ 0 /*{b-bar-shadow-radius}*/ #3e6790 /*{b-bar-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #6facd5 /*{b-bar-background-start}*/), to( #497bae /*{b-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/);
-}
-.ui-bar-b,
-.ui-bar-b input,
-.ui-bar-b select,
-.ui-bar-b textarea,
-.ui-bar-b button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-bar-b .ui-link-inherit {
- color: #fff /*{b-bar-color}*/;
-}
-.ui-bar-b a.ui-link {
- color: #ddf0f8 /*{b-bar-link-color}*/;
- font-weight: bold;
-}
-.ui-bar-b a.ui-link:visited {
- color: #ddf0f8 /*{b-bar-link-visited}*/;
-}
-.ui-bar-b a.ui-link:hover {
- color: #ddf0f8 /*{b-bar-link-hover}*/;
-}
-.ui-bar-b a.ui-link:active {
- color: #ddf0f8 /*{b-bar-link-active}*/;
-}
-.ui-body-b,
-.ui-overlay-b {
- border: 1px solid #999 /*{b-body-border}*/;
- background: #f3f3f3 /*{b-body-background-color}*/;
- color: #222 /*{b-body-color}*/;
- text-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ #fff /*{b-body-shadow-color}*/;
- font-weight: normal;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #ddd /*{b-body-background-start}*/), to( #ccc /*{b-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/);
-}
-.ui-overlay-b {
- background-image: none;
- border-width: 0;
-}
-.ui-body-b,
-.ui-body-b input,
-.ui-body-b select,
-.ui-body-b textarea,
-.ui-body-b button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-body-b .ui-link-inherit {
- color: #333 /*{b-body-color}*/;
-}
-.ui-body-b .ui-link {
- color: #2489ce /*{b-body-link-color}*/;
- font-weight: bold;
-}
-.ui-body-b .ui-link:visited {
- color: #2489ce /*{b-body-link-visited}*/;
-}
-.ui-body-b .ui-link:hover {
- color: #2489ce /*{b-body-link-hover}*/;
-}
-.ui-body-b .ui-link:active {
- color: #2489ce /*{b-body-link-active}*/;
-}
-.ui-btn-up-b {
- border: 1px solid #044062 /*{b-bup-border}*/;
- background: #396b9e /*{b-bup-background-color}*/;
- font-weight: bold;
- color: #fff /*{b-bup-color}*/;
- text-shadow: 0 /*{b-bup-shadow-x}*/ 1px /*{b-bup-shadow-y}*/ 0 /*{b-bup-shadow-radius}*/ #194b7e /*{b-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #5f9cc5 /*{b-bup-background-start}*/), to( #396b9e /*{b-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/);
-}
-.ui-btn-up-b:visited,
-.ui-btn-up-b a.ui-link-inherit {
- color: #fff /*{b-bup-color}*/;
-}
-.ui-btn-hover-b {
- border: 1px solid #00415e /*{b-bhover-border}*/;
- background: #4b88b6 /*{b-bhover-background-color}*/;
- font-weight: bold;
- color: #fff /*{b-bhover-color}*/;
- text-shadow: 0 /*{b-bhover-shadow-x}*/ 1px /*{b-bhover-shadow-y}*/ 0 /*{b-bhover-shadow-radius}*/ #194b7e /*{b-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #6facd5 /*{b-bhover-background-start}*/), to( #4272a4 /*{b-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/);
-}
-.ui-btn-hover-b:visited,
-.ui-btn-hover-b:hover,
-.ui-btn-hover-b a.ui-link-inherit {
- color: #fff /*{b-bhover-color}*/;
-}
-.ui-btn-down-b {
- border: 1px solid #225377 /*{b-bdown-border}*/;
- background: #4e89c5 /*{b-bdown-background-color}*/;
- font-weight: bold;
- color: #fff /*{b-bdown-color}*/;
- text-shadow: 0 /*{b-bdown-shadow-x}*/ 1px /*{b-bdown-shadow-y}*/ 0 /*{b-bdown-shadow-radius}*/ #194b7e /*{b-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #295b8e /*{b-bdown-background-start}*/), to( #3e79b5 /*{b-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/);
-}
-.ui-btn-down-b:visited,
-.ui-btn-down-b:hover,
-.ui-btn-down-b a.ui-link-inherit {
- color: #fff /*{b-bdown-color}*/;
-}
-.ui-btn-up-b,
-.ui-btn-hover-b,
-.ui-btn-down-b {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
- text-decoration: none;
-}
-/* C
------------------------------------------------------------------------------------------------------------*/
-.ui-bar-c {
- border: 1px solid #b3b3b3 /*{c-bar-border}*/;
- background: #eee /*{c-bar-background-color}*/;
- color: #3e3e3e /*{c-bar-color}*/;
- font-weight: bold;
- text-shadow: 0 /*{c-bar-shadow-x}*/ 1px /*{c-bar-shadow-y}*/ 0 /*{c-bar-shadow-radius}*/ #fff /*{c-bar-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #f0f0f0 /*{c-bar-background-start}*/), to( #ddd /*{c-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/);
-}
-.ui-bar-c .ui-link-inherit {
- color: #3e3e3e /*{c-bar-color}*/;
-}
-.ui-bar-c a.ui-link {
- color: #7cc4e7 /*{c-bar-link-color}*/;
- font-weight: bold;
-}
-.ui-bar-c a.ui-link:visited {
- color: #2489ce /*{c-bar-link-visited}*/;
-}
-.ui-bar-c a.ui-link:hover {
- color: #2489ce /*{c-bar-link-hover}*/;
-}
-.ui-bar-c a.ui-link:active {
- color: #2489ce /*{c-bar-link-active}*/;
-}
-.ui-bar-c,
-.ui-bar-c input,
-.ui-bar-c select,
-.ui-bar-c textarea,
-.ui-bar-c button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-body-c,
-.ui-overlay-c {
- border: 1px solid #aaa /*{c-body-border}*/;
- color: #333 /*{c-body-color}*/;
- text-shadow: 0 /*{c-body-shadow-x}*/ 1px /*{c-body-shadow-y}*/ 0 /*{c-body-shadow-radius}*/ #fff /*{c-body-shadow-color}*/;
- background: #f9f9f9 /*{c-body-background-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #f9f9f9 /*{c-body-background-start}*/), to( #eee /*{c-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/);
-}
-.ui-overlay-c {
- background-image: none;
- border-width: 0;
-}
-.ui-body-c,
-.ui-body-c input,
-.ui-body-c select,
-.ui-body-c textarea,
-.ui-body-c button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-body-c .ui-link-inherit {
- color: #333 /*{c-body-color}*/;
-}
-.ui-body-c .ui-link {
- color: #2489ce /*{c-body-link-color}*/;
- font-weight: bold;
-}
-.ui-body-c .ui-link:visited {
- color: #2489ce /*{c-body-link-visited}*/;
-}
-.ui-body-c .ui-link:hover {
- color: #2489ce /*{c-body-link-hover}*/;
-}
-.ui-body-c .ui-link:active {
- color: #2489ce /*{c-body-link-active}*/;
-}
-.ui-btn-up-c {
- border: 1px solid #ccc /*{c-bup-border}*/;
- background: #eee /*{c-bup-background-color}*/;
- font-weight: bold;
- color: #222 /*{c-bup-color}*/;
- text-shadow: 0 /*{c-bup-shadow-x}*/ 1px /*{c-bup-shadow-y}*/ 0 /*{c-bup-shadow-radius}*/ #fff /*{c-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{c-bup-background-start}*/), to( #f1f1f1 /*{c-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/);
-}
-.ui-btn-up-c:visited,
-.ui-btn-up-c a.ui-link-inherit {
- color: #2f3e46 /*{c-bup-color}*/;
-}
-.ui-btn-hover-c {
- border: 1px solid #bbb /*{c-bhover-border}*/;
- background: #dfdfdf /*{c-bhover-background-color}*/;
- font-weight: bold;
- color: #222 /*{c-bhover-color}*/;
- text-shadow: 0 /*{c-bhover-shadow-x}*/ 1px /*{c-bhover-shadow-y}*/ 0 /*{c-bhover-shadow-radius}*/ #fff /*{c-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #f6f6f6 /*{c-bhover-background-start}*/), to( #e0e0e0 /*{c-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/);
-}
-.ui-btn-hover-c:visited,
-.ui-btn-hover-c:hover,
-.ui-btn-hover-c a.ui-link-inherit {
- color: #2f3e46 /*{c-bhover-color}*/;
-}
-.ui-btn-down-c {
- border: 1px solid #bbb /*{c-bdown-border}*/;
- background: #d6d6d6 /*{c-bdown-background-color}*/;
- font-weight: bold;
- color: #222 /*{c-bdown-color}*/;
- text-shadow: 0 /*{c-bdown-shadow-x}*/ 1px /*{c-bdown-shadow-y}*/ 0 /*{c-bdown-shadow-radius}*/ #fff /*{c-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #d0d0d0 /*{c-bdown-background-start}*/), to( #dfdfdf /*{c-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/);
-}
-.ui-btn-down-c:visited,
-.ui-btn-down-c:hover,
-.ui-btn-down-c a.ui-link-inherit {
- color: #2f3e46 /*{c-bdown-color}*/;
-}
-.ui-btn-up-c,
-.ui-btn-hover-c,
-.ui-btn-down-c {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
- text-decoration: none;
-}
-/* D
------------------------------------------------------------------------------------------------------------*/
-.ui-bar-d {
- border: 1px solid #bbb /*{d-bar-border}*/;
- background: #bbb /*{d-bar-background-color}*/;
- color: #333 /*{d-bar-color}*/;
- font-weight: bold;
- text-shadow: 0 /*{d-bar-shadow-x}*/ 1px /*{d-bar-shadow-y}*/ 0 /*{d-bar-shadow-radius}*/ #eee /*{d-bar-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #ddd /*{d-bar-background-start}*/), to( #bbb /*{d-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/);
-}
-.ui-bar-d,
-.ui-bar-d input,
-.ui-bar-d select,
-.ui-bar-d textarea,
-.ui-bar-d button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-bar-d .ui-link-inherit {
- color: #333 /*{d-bar-color}*/;
-}
-.ui-bar-d a.ui-link {
- color: #2489ce /*{d-bar-link-color}*/;
- font-weight: bold;
-}
-.ui-bar-d a.ui-link:visited {
- color: #2489ce /*{d-bar-link-visited}*/;
-}
-.ui-bar-d a.ui-link:hover {
- color: #2489ce /*{d-bar-link-hover}*/;
-}
-.ui-bar-d a.ui-link:active {
- color: #2489ce /*{d-bar-link-active}*/;
-}
-.ui-body-d,
-.ui-overlay-d {
- border: 1px solid #bbb /*{d-body-border}*/;
- color: #333 /*{d-body-color}*/;
- text-shadow: 0 /*{d-body-shadow-x}*/ 1px /*{d-body-shadow-y}*/ 0 /*{d-body-shadow-radius}*/ #fff /*{d-body-shadow-color}*/;
- background: #fff /*{d-body-background-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{d-body-background-start}*/), to( #fff /*{d-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/);
-}
-.ui-overlay-d {
- background-image: none;
- border-width: 0;
-}
-.ui-body-d,
-.ui-body-d input,
-.ui-body-d select,
-.ui-body-d textarea,
-.ui-body-d button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-body-d .ui-link-inherit {
- color: #333 /*{d-body-color}*/;
-}
-.ui-body-d .ui-link {
- color: #2489ce /*{d-body-link-color}*/;
- font-weight: bold;
-}
-.ui-body-d .ui-link:visited {
- color: #2489ce /*{d-body-link-visited}*/;
-}
-.ui-body-d .ui-link:hover {
- color: #2489ce /*{d-body-link-hover}*/;
-}
-.ui-body-d .ui-link:active {
- color: #2489ce /*{d-body-link-active}*/;
-}
-.ui-btn-up-d {
- border: 1px solid #bbb /*{d-bup-border}*/;
- background: #fff /*{d-bup-background-color}*/;
- font-weight: bold;
- color: #333 /*{d-bup-color}*/;
- text-shadow: 0 /*{d-bup-shadow-x}*/ 1px /*{d-bup-shadow-y}*/ 0 /*{d-bup-shadow-radius}*/ #fff /*{d-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fafafa /*{d-bup-background-start}*/), to( #f6f6f6 /*{d-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/);
-}
-.ui-btn-up-d:visited,
-.ui-btn-up-d a.ui-link-inherit {
- color: #333 /*{d-bup-color}*/;
-}
-.ui-btn-hover-d {
- border: 1px solid #aaa /*{d-bhover-border}*/;
- background: #eee /*{d-bhover-background-color}*/;
- font-weight: bold;
- color: #333 /*{d-bhover-color}*/;
- cursor: pointer;
- text-shadow: 0 /*{d-bhover-shadow-x}*/ 1px /*{d-bhover-shadow-y}*/ 0 /*{d-bhover-shadow-radius}*/ #fff /*{d-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{d-bhover-background-start}*/), to( #fff /*{d-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/);
-}
-.ui-btn-hover-d:visited,
-.ui-btn-hover-d:hover,
-.ui-btn-hover-d a.ui-link-inherit {
- color: #333 /*{d-bhover-color}*/;
-}
-.ui-btn-down-d {
- border: 1px solid #aaa /*{d-bdown-border}*/;
- background: #eee /*{d-bdown-background-color}*/;
- font-weight: bold;
- color: #333 /*{d-bdown-color}*/;
- text-shadow: 0 /*{d-bdown-shadow-x}*/ 1px /*{d-bdown-shadow-y}*/ 0 /*{d-bdown-shadow-radius}*/ #fff /*{d-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #e5e5e5 /*{d-bdown-background-start}*/), to( #f2f2f2 /*{d-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/);
-}
-.ui-btn-down-d:visited,
-.ui-btn-down-d:hover,
-.ui-btn-down-d a.ui-link-inherit {
- color: #333 /*{d-bdown-color}*/;
-}
-.ui-btn-up-d,
-.ui-btn-hover-d,
-.ui-btn-down-d {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
- text-decoration: none;
-}
-/* E
------------------------------------------------------------------------------------------------------------*/
-.ui-bar-e {
- border: 1px solid #f7c942 /*{e-bar-border}*/;
- background: #fadb4e /*{e-bar-background-color}*/;
- color: #333 /*{e-bar-color}*/;
- font-weight: bold;
- text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ #fff /*{e-bar-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bar-background-start}*/), to( #fbef7e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/);
-}
-.ui-bar-e,
-.ui-bar-e input,
-.ui-bar-e select,
-.ui-bar-e textarea,
-.ui-bar-e button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-bar-e .ui-link-inherit {
- color: #333 /*{e-bar-color}*/;
-}
-.ui-bar-e a.ui-link {
- color: #2489ce /*{e-bar-link-color}*/;
- font-weight: bold;
-}
-.ui-bar-e a.ui-link:visited {
- color: #2489ce /*{e-bar-link-visited}*/;
-}
-.ui-bar-e a.ui-link:hover {
- color: #2489ce /*{e-bar-link-hover}*/;
-}
-.ui-bar-e a.ui-link:active {
- color: #2489ce /*{e-bar-link-active}*/;
-}
-.ui-body-e,
-.ui-overlay-e {
- border: 1px solid #f7c942 /*{e-body-border}*/;
- color: #222 /*{e-body-color}*/;
- text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ #fff /*{e-body-shadow-color}*/;
- background: #fff9df /*{e-body-background-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fffadf /*{e-body-background-start}*/), to( #fff3a5 /*{e-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/);
-}
-.ui-overlay-e {
- background-image: none;
- border-width: 0;
-}
-.ui-body-e,
-.ui-body-e input,
-.ui-body-e select,
-.ui-body-e textarea,
-.ui-body-e button {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-body-e .ui-link-inherit {
- color: #222 /*{e-body-color}*/;
-}
-.ui-body-e .ui-link {
- color: #2489ce /*{e-body-link-color}*/;
- font-weight: bold;
-}
-.ui-body-e .ui-link:visited {
- color: #2489ce /*{e-body-link-visited}*/;
-}
-.ui-body-e .ui-link:hover {
- color: #2489ce /*{e-body-link-hover}*/;
-}
-.ui-body-e .ui-link:active {
- color: #2489ce /*{e-body-link-active}*/;
-}
-.ui-btn-up-e {
- border: 1px solid #f4c63f /*{e-bup-border}*/;
- background: #fadb4e /*{e-bup-background-color}*/;
- font-weight: bold;
- color: #222 /*{e-bup-color}*/;
- text-shadow: 0 /*{e-bup-shadow-x}*/ 1px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ #fff /*{e-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #ffefaa /*{e-bup-background-start}*/), to( #ffe155 /*{e-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/);
-}
-.ui-btn-up-e:visited,
-.ui-btn-up-e a.ui-link-inherit {
- color: #222 /*{e-bup-color}*/;
-}
-.ui-btn-hover-e {
- border: 1px solid #f2c43d /*{e-bhover-border}*/;
- background: #fbe26f /*{e-bhover-background-color}*/;
- font-weight: bold;
- color: #111 /*{e-bhover-color}*/;
- text-shadow: 0 /*{e-bhover-shadow-x}*/ 1px /*{e-bhover-shadow-y}*/ 0 /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fff5ba /*{e-bhover-background-start}*/), to( #fbdd52 /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/);
-}
-.ui-btn-hover-e:visited,
-.ui-btn-hover-e:hover,
-.ui-btn-hover-e a.ui-link-inherit {
- color: #333 /*{e-bhover-color}*/;
-}
-.ui-btn-down-e {
- border: 1px solid #f2c43d /*{e-bdown-border}*/;
- background: #fceda7 /*{e-bdown-background-color}*/;
- font-weight: bold;
- color: #111 /*{e-bdown-color}*/;
- text-shadow: 0 /*{e-bdown-shadow-x}*/ 1px /*{e-bdown-shadow-y}*/ 0 /*{e-bdown-shadow-radius}*/ #fff /*{e-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #f8d94c /*{e-bdown-background-start}*/), to( #fadb4e /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/);
-}
-.ui-btn-down-e:visited,
-.ui-btn-down-e:hover,
-.ui-btn-down-e a.ui-link-inherit {
- color: #333 /*{e-bdown-color}*/;
-}
-.ui-btn-up-e,
-.ui-btn-hover-e,
-.ui-btn-down-e {
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
- text-decoration: none;
-}
-/* Structure */
-/* links within "buttons"
------------------------------------------------------------------------------------------------------------*/
-a.ui-link-inherit {
- text-decoration: none !important;
-}
-/* Active class used as the "on" state across all themes
------------------------------------------------------------------------------------------------------------*/
-.ui-btn-active {
- border: 1px solid #2373a5 /*{global-active-border}*/;
- background: #5393c5 /*{global-active-background-color}*/;
- font-weight: bold;
- color: #fff /*{global-active-color}*/;
- cursor: pointer;
- text-shadow: 0 /*{global-active-shadow-x}*/ 1px /*{global-active-shadow-y}*/ 0 /*{global-active-shadow-radius}*/ #3373a5 /*{global-active-shadow-color}*/;
- text-decoration: none;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #5393c5 /*{global-active-background-start}*/), to( #6facd5 /*{global-active-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/);
- font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
-}
-.ui-btn-active:visited,
-.ui-btn-active:hover,
-.ui-btn-active a.ui-link-inherit {
- color: #fff /*{global-active-color}*/;
-}
-/* button inner top highlight
------------------------------------------------------------------------------------------------------------*/
-.ui-btn-inner {
- border-top: 1px solid #fff;
- border-color: rgba(255,255,255,.3);
-}
-/* corner rounding classes
------------------------------------------------------------------------------------------------------------*/
-.ui-corner-all {
- -webkit-border-radius: .6em /*{global-radii-blocks}*/;
- border-radius: .6em /*{global-radii-blocks}*/;
-}
-/* Form field separator
------------------------------------------------------------------------------------------------------------*/
-.ui-br {
- border-color: rgb(130,130,130);
- border-color: rgba(130,130,130,.3);
- border-style: solid;
-}
-/* Interaction cues
------------------------------------------------------------------------------------------------------------*/
-.ui-disabled {
- filter: Alpha(Opacity=30);
- opacity: .3;
- zoom: 1;
-}
-.ui-disabled,
-.ui-disabled a {
- cursor: default !important;
- pointer-events: none;
-}
-/* Icons
------------------------------------------------------------------------------------------------------------*/
-.ui-icon,
-.ui-icon-searchfield:after {
- background-color: #666 /*{global-icon-color}*/;
- background-color: rgba(0,0,0,.4) /*{global-icon-disc}*/;
- background-image: url(images/icons-18-white.png) /*{global-icon-set}*/;
- background-repeat: no-repeat;
- -webkit-border-radius: 9px;
- border-radius: 9px;
-}
-/* Alt icon color
------------------------------------------------------------------------------------------------------------*/
-.ui-icon-alt .ui-icon,
-.ui-icon-alt .ui-icon-searchfield:after {
- background-color: #fff;
- background-color: rgba(255,255,255,.3);
- background-image: url(images/icons-18-black.png);
- background-repeat: no-repeat;
-}
-/* No disc
------------------------------------------------------------------------------------------------------------*/
-.ui-icon-nodisc .ui-icon,
-.ui-icon-nodisc .ui-icon-searchfield:after,
-.ui-icon-nodisc .ui-icon-alt .ui-icon,
-.ui-icon-nodisc .ui-icon-alt .ui-icon-searchfield:after {
- background-color: transparent;
-}
-/* Icon sprite
------------------------------------------------------------------------------------------------------------*/
-/* plus minus */
-.ui-icon-plus {
- background-position: -1px -1px;
-}
-.ui-icon-minus {
- background-position: -37px -1px;
-}
-/* delete/close */
-.ui-icon-delete {
- background-position: -73px -1px;
-}
-/* arrows */
-.ui-icon-arrow-r {
- background-position: -108px -1px;
-}
-.ui-icon-arrow-l {
- background-position: -144px -1px;
-}
-.ui-icon-arrow-u {
- background-position: -180px -1px;
-}
-.ui-icon-arrow-d {
- background-position: -216px -1px;
-}
-/* misc */
-.ui-icon-check {
- background-position: -252px -1px;
-}
-.ui-icon-gear {
- background-position: -288px -1px;
-}
-.ui-icon-refresh {
- background-position: -323px -1px;
-}
-.ui-icon-forward {
- background-position: -360px -1px;
-}
-.ui-icon-back {
- background-position: -396px -1px;
-}
-.ui-icon-grid {
- background-position: -432px -1px;
-}
-.ui-icon-star {
- background-position: -467px -1px;
-}
-.ui-icon-alert {
- background-position: -503px -1px;
-}
-.ui-icon-info {
- background-position: -539px -1px;
-}
-.ui-icon-home {
- background-position: -575px -1px;
-}
-/* search */
-.ui-icon-search,
-.ui-icon-searchfield:after {
- background-position: -611px -1px;
-}
-/* checkbox radio */
-.ui-icon-checkbox-on {
- background-position: -647px -1px;
-}
-.ui-icon-checkbox-off {
- background-position: -683px -1px;
-}
-.ui-icon-radio-on {
- background-position: -718px -1px;
-}
-.ui-icon-radio-off {
- background-position: -754px -1px;
-}
-/* menu edit */
-.ui-icon-bars {
- background-position: -788px -1px;
-}
-.ui-icon-edit {
- background-position: -824px -1px;
-}
-/* HD/"retina" sprite
------------------------------------------------------------------------------------------------------------*/
-@media only screen and (-webkit-min-device-pixel-ratio: 1.3),
- only screen and (min--moz-device-pixel-ratio: 1.3),
- only screen and (min-resolution: 200dpi) {
-
- .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r,
- .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check,
- .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back,
- .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-bars, .ui-icon-edit,
- .ui-icon-search, .ui-icon-searchfield:after,
- .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on {
- background-image: url(images/icons-36-white.png);
- -moz-background-size: 864px 18px;
- -o-background-size: 864px 18px;
- -webkit-background-size: 864px 18px;
- background-size: 864px 18px;
- }
- .ui-icon-alt .ui-icon {
- background-image: url(images/icons-36-black.png);
- }
- .ui-icon-plus {
- background-position: 0 50%;
- }
- .ui-icon-minus {
- background-position: -36px 50%;
- }
- .ui-icon-delete {
- background-position: -72px 50%;
- }
- .ui-icon-arrow-r {
- background-position: -108px 50%;
- }
- .ui-icon-arrow-l {
- background-position: -144px 50%;
- }
- .ui-icon-arrow-u {
- background-position: -179px 50%;
- }
- .ui-icon-arrow-d {
- background-position: -215px 50%;
- }
- .ui-icon-check {
- background-position: -252px 50%;
- }
- .ui-icon-gear {
- background-position: -287px 50%;
- }
- .ui-icon-refresh {
- background-position: -323px 50%;
- }
- .ui-icon-forward {
- background-position: -360px 50%;
- }
- .ui-icon-back {
- background-position: -395px 50%;
- }
- .ui-icon-grid {
- background-position: -431px 50%;
- }
- .ui-icon-star {
- background-position: -467px 50%;
- }
- .ui-icon-alert {
- background-position: -503px 50%;
- }
- .ui-icon-info {
- background-position: -538px 50%;
- }
- .ui-icon-home {
- background-position: -575px 50%;
- }
- .ui-icon-search,
- .ui-icon-searchfield:after {
- background-position: -611px 50%;
- }
- .ui-icon-checkbox-on {
- background-position: -647px 50%;
- }
- .ui-icon-checkbox-off {
- background-position: -683px 50%;
- }
- .ui-icon-radio-on {
- background-position: -718px 50%;
- }
- .ui-icon-radio-off {
- background-position: -754px 50%;
- }
- .ui-icon-bars {
- background-position: -788px 50%;
-
- }.ui-icon-edit {
- background-position: -824px 50%;
- }
-}
-/* checks,radios */
-.ui-checkbox .ui-icon,
-.ui-selectmenu-list .ui-icon {
- -webkit-border-radius: 3px;
- border-radius: 3px;
-}
-.ui-icon-checkbox-off,
-.ui-icon-radio-off {
- background-color: transparent;
-}
-.ui-checkbox-on .ui-icon,
-.ui-radio-on .ui-icon {
- background-color: #4596ce /*{global-active-background-color}*/; /* NOTE: this hex should match the active state color. It's repeated here for cascade */
-}
-/* loading icon */
-.ui-icon-loading {
- background: url(images/ajax-loader.gif);
- background-size: 46px 46px;
-}
-/* Button corner class
------------------------------------------------------------------------------------------------------------*/
-.ui-btn-corner-all {
- -webkit-border-radius: 1em /*{global-radii-buttons}*/;
- border-radius: 1em /*{global-radii-buttons}*/;
-}
-/* radius clip workaround for cleaning up corner trapping */
-.ui-corner-all,
-.ui-btn-corner-all {
- -webkit-background-clip: padding;
- background-clip: padding-box;
-}
-/* Overlay / modal
------------------------------------------------------------------------------------------------------------*/
-.ui-overlay {
- background: #666;
- filter: Alpha(Opacity=50);
- opacity: .5;
- position: absolute;
- width: 100%;
- height: 100%;
-}
-.ui-overlay-shadow {
- -moz-box-shadow: 0 0 12px rgba(0,0,0,.6);
- -webkit-box-shadow: 0 0 12px rgba(0,0,0,.6);
- box-shadow: 0 0 12px rgba(0,0,0,.6);
-}
-.ui-shadow {
- -moz-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.2) /*{global-box-shadow-color}*/;
- -webkit-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.2) /*{global-box-shadow-color}*/;
- box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.2) /*{global-box-shadow-color}*/
-}
-.ui-bar-a .ui-shadow,
-.ui-bar-b .ui-shadow ,
-.ui-bar-c .ui-shadow {
- -moz-box-shadow: 0 1px 0 rgba(255,255,255,.3);
- -webkit-box-shadow: 0 1px 0 rgba(255,255,255,.3);
- box-shadow: 0 1px 0 rgba(255,255,255,.3);
-}
-.ui-shadow-inset {
- -moz-box-shadow: inset 0 1px 4px rgba(0,0,0,.2);
- -webkit-box-shadow: inset 0 1px 4px rgba(0,0,0,.2);
- box-shadow: inset 0 1px 4px rgba(0,0,0,.2);
-}
-.ui-icon-shadow {
- -moz-box-shadow: 0 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
- -webkit-box-shadow: 0 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
- box-shadow: 0 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
-}
-/* Focus state - set here for specificity (note: these classes are added by JavaScript)
------------------------------------------------------------------------------------------------------------*/
-.ui-btn:focus, .ui-link-inherit:focus {
- outline: 0;
-}
-.ui-btn.ui-focus {
- z-index: 1;
-}
-.ui-focus,
-.ui-btn:focus {
- -moz-box-shadow: inset 0 0 3px #387bbe /*{global-active-background-color}*/, 0 0 9px #387bbe /*{global-active-background-color}*/;
- -webkit-box-shadow: inset 0 0 3px #387bbe /*{global-active-background-color}*/, 0 0 9px #387bbe /*{global-active-background-color}*/;
- box-shadow: inset 0 0 3px #387bbe /*{global-active-background-color}*/, 0 0 9px #387bbe /*{global-active-background-color}*/;
-}
-.ui-input-text.ui-focus,
-.ui-input-search.ui-focus {
- -moz-box-shadow: 0 0 12px #387bbe /*{global-active-background-color}*/;
- -webkit-box-shadow: 0 0 12px #387bbe /*{global-active-background-color}*/;
- box-shadow: 0 0 12px #387bbe /*{global-active-background-color}*/;
-}
-/* unset box shadow in browsers that don't do it right
------------------------------------------------------------------------------------------------------------*/
-.ui-mobile-nosupport-boxshadow * {
- -moz-box-shadow: none !important;
- -webkit-box-shadow: none !important;
- box-shadow: none !important;
-}
-/* ...and bring back focus */
-.ui-mobile-nosupport-boxshadow .ui-focus,
-.ui-mobile-nosupport-boxshadow .ui-btn:focus,
-.ui-mobile-nosupport-boxshadow .ui-link-inherit:focus {
- outline-width: 1px;
- outline-style: auto;
-}
-/* some unsets - more probably needed */
-.ui-mobile, .ui-mobile body { height: 99.9%; }
-.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; }
-.ui-mobile a img, .ui-mobile fieldset { border-width: 0; }
-/* responsive page widths */
-.ui-mobile-viewport { margin: 0; overflow-x: visible; -webkit-text-size-adjust: 100%; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
-/* Issue #2066 */
-body.ui-mobile-viewport,
-div.ui-mobile-viewport { overflow-x: hidden; }
-/* "page" containers - full-screen views, one should always be in view post-pageload */
-.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; }
-.ui-mobile .ui-page-active { display: block; overflow: visible; }
-/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */
-.ui-page { outline: none; }
-/*orientations from js are available */
-@media screen and (orientation: portrait){
-.ui-mobile .ui-page { min-height: 420px; }
-}
-@media screen and (orientation: landscape){
-.ui-mobile .ui-page { min-height: 300px; }
-}
-/* loading screen */
-.ui-loading .ui-loader { display: block; }
-.ui-loader { display: none; z-index: 9999999; position: fixed; top: 50%; left: 50%; border:0; }
-.ui-loader-default { background: none; filter: Alpha(Opacity=18); opacity: .18; width: 46px; height: 46px; margin-left: -23px; margin-top: -23px; }
-.ui-loader-verbose { width: 200px; filter: Alpha(Opacity=88); opacity: .88; box-shadow: 0 1px 1px -1px #fff; height: auto; margin-left: -110px; margin-top: -43px; padding: 10px; }
-.ui-loader-default h1 { font-size: 0; width: 0; height: 0; overflow: hidden; }
-.ui-loader-verbose h1 { font-size: 16px; margin: 0; text-align: center; }
-.ui-loader .ui-icon { background-color: #000; display: block; margin: 0; width: 44px; height: 44px; padding: 1px; -webkit-border-radius: 36px; border-radius: 36px; }
-.ui-loader-verbose .ui-icon { margin: 0 auto 10px; filter: Alpha(Opacity=75); opacity: .75; }
-.ui-loader-textonly { padding: 15px; margin-left: -115px; }
-.ui-loader-textonly .ui-icon { display: none; }
-.ui-loader-fakefix { position: absolute; }
-/*fouc*/
-.ui-mobile-rendering > * { visibility: hidden; }
-/*headers, content panels*/
-.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; }
-.ui-bar { font-size: 16px; margin: 0; }
-.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; }
-.ui-header, .ui-footer { position: relative; zoom: 1; }
-.ui-mobile .ui-header, .ui-mobile .ui-footer { border-left-width: 0; border-right-width: 0; }
-.ui-header .ui-btn-left,
-.ui-header .ui-btn-right,
-.ui-footer .ui-btn-left,
-.ui-footer .ui-btn-right,
-.ui-header-fixed.ui-fixed-hidden .ui-btn-left,
-.ui-header-fixed.ui-fixed-hidden .ui-btn-right { position: absolute; top: 3px; }
-.ui-header-fixed .ui-btn-left,
-.ui-header-fixed .ui-btn-right { top: 4px;}
-.ui-header .ui-btn-left,
-.ui-footer .ui-btn-left { left: 5px; }
-.ui-header .ui-btn-right,
-.ui-footer .ui-btn-right { right: 5px; }
-.ui-footer > .ui-btn-icon-notext,
-.ui-header > .ui-btn-icon-notext,
-.ui-header-fixed.ui-fixed-hidden > .ui-btn-icon-notext { top: 6px; }
-.ui-header-fixed > .ui-btn-icon-notext { top: 7px;}
-.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 30% .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; }
-.ui-footer .ui-title { margin: .6em 15px .8em; }
-/* content area*/
-.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; }
-/* corner styling for dialogs and popups */
-.ui-corner-all > .ui-header:first-child,
-.ui-corner-all > .ui-content:first-child,
-.ui-corner-all > .ui-footer:first-child {
- -webkit-border-top-left-radius: inherit;
- border-top-left-radius: inherit;
- -webkit-border-top-right-radius: inherit;
- border-top-right-radius: inherit;
-}
-.ui-corner-all > .ui-header:last-child,
-.ui-corner-all > .ui-content:last-child,
-.ui-corner-all > .ui-footer:last-child {
- -webkit-border-bottom-left-radius: inherit;
- border-bottom-left-radius: inherit;
- -webkit-border-bottom-right-radius: inherit;
- border-bottom-right-radius: inherit;
-}
-/* icons sizing */
-.ui-icon { width: 18px; height: 18px; }
-/* non-js content hiding */
-.ui-nojs { position: absolute; left: -9999px; }
-/* accessible content hiding */
-.ui-hide-label label.ui-input-text, .ui-hide-label label.ui-select, .ui-hide-label label.ui-slider, .ui-hide-label label.ui-submit, .ui-hide-label .ui-controlgroup-label,
-.ui-hidden-accessible { position: absolute !important; left: -9999px; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
-/* Transitions originally inspired by those from jQtouch, nice work, folks */
-.ui-mobile-viewport-transitioning,
-.ui-mobile-viewport-transitioning .ui-page {
- width: 100%;
- height: 100%;
- overflow: hidden;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-.ui-page-pre-in {
- opacity: 0;
-}
-.in {
- -webkit-animation-timing-function: ease-out;
- -webkit-animation-duration: 350ms;
- -moz-animation-timing-function: ease-out;
- -moz-animation-duration: 350ms;
- animation-timing-function: ease-out;
- animation-duration: 350ms;
-}
-.out {
- -webkit-animation-timing-function: ease-in;
- -webkit-animation-duration: 225ms;
- -moz-animation-timing-function: ease-in;
- -moz-animation-duration: 225ms;
- animation-timing-function: ease-in;
- animation-duration: 225ms;
-}
-@-webkit-keyframes fadein {
- from { opacity: 0; }
- to { opacity: 1; }
-}
-@-moz-keyframes fadein {
- from { opacity: 0; }
- to { opacity: 1; }
-}
-@keyframes fadein {
- from { opacity: 0; }
- to { opacity: 1; }
-}
-@-webkit-keyframes fadeout {
- from { opacity: 1; }
- to { opacity: 0; }
-}
-@-moz-keyframes fadeout {
- from { opacity: 1; }
- to { opacity: 0; }
-}
-@keyframes fadeout {
- from { opacity: 1; }
- to { opacity: 0; }
-}
-.fade.out {
- opacity: 0;
- -webkit-animation-duration: 125ms;
- -webkit-animation-name: fadeout;
- -moz-animation-duration: 125ms;
- -moz-animation-name: fadeout;
- animation-duration: 125ms;
- animation-name: fadeout;
-}
-.fade.in {
- opacity: 1;
- -webkit-animation-duration: 225ms;
- -webkit-animation-name: fadein;
- -moz-animation-duration: 225ms;
- -moz-animation-name: fadein;
- animation-duration: 225ms;
- animation-name: fadein;
-}
-.pop {
- -webkit-transform-origin: 50% 50%;
- -moz-transform-origin: 50% 50%;
- transform-origin: 50% 50%;
-}
-.pop.in {
- -webkit-transform: scale(1);
- -webkit-animation-name: popin;
- -webkit-animation-duration: 350ms;
- -moz-transform: scale(1);
- -moz-animation-name: popin;
- -moz-animation-duration: 350ms;
- transform: scale(1);
- animation-name: popin;
- animation-duration: 350ms;
- opacity: 1;
-}
-.pop.out {
- -webkit-animation-name: fadeout;
- -webkit-animation-duration: 100ms;
- -moz-animation-name: fadeout;
- -moz-animation-duration: 100ms;
- animation-name: fadeout;
- animation-duration: 100ms;
- opacity: 0;
-}
-.pop.in.reverse {
- -webkit-animation-name: fadein;
- -moz-animation-name: fadein;
- animation-name: fadein;
-}
-.pop.out.reverse {
- -webkit-transform: scale(.8);
- -webkit-animation-name: popout;
- -moz-transform: scale(.8);
- -moz-animation-name: popout;
- transform: scale(.8);
- animation-name: popout;
-}
-@-webkit-keyframes popin {
- from {
- -webkit-transform: scale(.8);
- opacity: 0;
- }
- to {
- -webkit-transform: scale(1);
- opacity: 1;
- }
-}
-@-moz-keyframes popin {
- from {
- -moz-transform: scale(.8);
- opacity: 0;
- }
- to {
- -moz-transform: scale(1);
- opacity: 1;
- }
-}
-@keyframes popin {
- from {
- transform: scale(.8);
- opacity: 0;
- }
- to {
- transform: scale(1);
- opacity: 1;
- }
-}
-@-webkit-keyframes popout {
- from {
- -webkit-transform: scale(1);
- opacity: 1;
- }
- to {
- -webkit-transform: scale(.8);
- opacity: 0;
- }
-}
-@-moz-keyframes popout {
- from {
- -moz-transform: scale(1);
- opacity: 1;
- }
- to {
- -moz-transform: scale(.8);
- opacity: 0;
- }
-}
-@keyframes popout {
- from {
- transform: scale(1);
- opacity: 1;
- }
- to {
- transform: scale(.8);
- opacity: 0;
- }
-}
-/* keyframes for slidein from sides */
-@-webkit-keyframes slideinfromright {
- from { -webkit-transform: translate3d(100%,0,0); }
- to { -webkit-transform: translate3d(0,0,0); }
-}
-@-moz-keyframes slideinfromright {
- from { -moz-transform: translateX(100%); }
- to { -moz-transform: translateX(0); }
-}
-@keyframes slideinfromright {
- from { transform: translateX(100%); }
- to { transform: translateX(0); }
-}
-@-webkit-keyframes slideinfromleft {
- from { -webkit-transform: translate3d(-100%,0,0); }
- to { -webkit-transform: translate3d(0,0,0); }
-}
-@-moz-keyframes slideinfromleft {
- from { -moz-transform: translateX(-100%); }
- to { -moz-transform: translateX(0); }
-}
-@keyframes slideinfromleft {
- from { transform: translateX(-100%); }
- to { transform: translateX(0); }
-}
-/* keyframes for slideout to sides */
-@-webkit-keyframes slideouttoleft {
- from { -webkit-transform: translate3d(0,0,0); }
- to { -webkit-transform: translate3d(-100%,0,0); }
-}
-@-moz-keyframes slideouttoleft {
- from { -moz-transform: translateX(0); }
- to { -moz-transform: translateX(-100%); }
-}
-@keyframes slideouttoleft {
- from { transform: translateX(0); }
- to { transform: translateX(-100%); }
-}
-@-webkit-keyframes slideouttoright {
- from { -webkit-transform: translate3d(0,0,0); }
- to { -webkit-transform: translate3d(100%,0,0); }
-}
-@-moz-keyframes slideouttoright {
- from { -moz-transform: translateX(0); }
- to { -moz-transform: translateX(100%); }
-}
-@keyframes slideouttoright {
- from { transform: translateX(0); }
- to { transform: translateX(100%); }
-}
-.slide.out, .slide.in {
- -webkit-animation-timing-function: ease-out;
- -webkit-animation-duration: 350ms;
- -moz-animation-timing-function: ease-out;
- -moz-animation-duration: 350ms;
- animation-timing-function: ease-out;
- animation-duration: 350ms;
-}
-.slide.out {
- -webkit-transform: translate3d(-100%,0,0);
- -webkit-animation-name: slideouttoleft;
- -moz-transform: translateX(-100%);
- -moz-animation-name: slideouttoleft;
- transform: translateX(-100%);
- animation-name: slideouttoleft;
-}
-.slide.in {
- -webkit-transform: translate3d(0,0,0);
- -webkit-animation-name: slideinfromright;
- -moz-transform: translateX(0);
- -moz-animation-name: slideinfromright;
- transform: translateX(0);
- animation-name: slideinfromright;
-}
-.slide.out.reverse {
- -webkit-transform: translate3d(100%,0,0);
- -webkit-animation-name: slideouttoright;
- -moz-transform: translateX(100%);
- -moz-animation-name: slideouttoright;
- transform: translateX(100%);
- animation-name: slideouttoright;
-}
-.slide.in.reverse {
- -webkit-transform: translate3d(0,0,0);
- -webkit-animation-name: slideinfromleft;
- -moz-transform: translateX(0);
- -moz-animation-name: slideinfromleft;
- transform: translateX(0);
- animation-name: slideinfromleft;
-}
-.slidefade.out {
- -webkit-transform: translateX(-100%);
- -webkit-animation-name: slideouttoleft;
- -webkit-animation-duration: 225ms;
- -moz-transform: translateX(-100%);
- -moz-animation-name: slideouttoleft;
- -moz-animation-duration: 225ms;
- transform: translateX(-100%);
- animation-name: slideouttoleft;
- animation-duration: 225ms;
-}
-.slidefade.in {
- -webkit-transform: translateX(0);
- -webkit-animation-name: fadein;
- -webkit-animation-duration: 200ms;
- -moz-transform: translateX(0);
- -moz-animation-name: fadein;
- -moz-animation-duration: 200ms;
- transform: translateX(0);
- animation-name: fadein;
- animation-duration: 200ms;
-}
-.slidefade.out.reverse {
- -webkit-transform: translateX(100%);
- -webkit-animation-name: slideouttoright;
- -webkit-animation-duration: 200ms;
- -moz-transform: translateX(100%);
- -moz-animation-name: slideouttoright;
- -moz-animation-duration: 200ms;
- transform: translateX(100%);
- animation-name: slideouttoright;
- animation-duration: 200ms;
-}
-.slidefade.in.reverse {
- -webkit-transform: translateX(0);
- -webkit-animation-name: fadein;
- -webkit-animation-duration: 200ms;
- -moz-transform: translateX(0);
- -moz-animation-name: fadein;
- -moz-animation-duration: 200ms;
- transform: translateX(0);
- animation-name: fadein;
- animation-duration: 200ms;
-}
-/* slide down */
-.slidedown.out {
- -webkit-animation-name: fadeout;
- -webkit-animation-duration: 100ms;
- -moz-animation-name: fadeout;
- -moz-animation-duration: 100ms;
- animation-name: fadeout;
- animation-duration: 100ms;
-}
-.slidedown.in {
- -webkit-transform: translateY(0);
- -webkit-animation-name: slideinfromtop;
- -webkit-animation-duration: 250ms;
- -moz-transform: translateY(0);
- -moz-animation-name: slideinfromtop;
- -moz-animation-duration: 250ms;
- transform: translateY(0);
- animation-name: slideinfromtop;
- animation-duration: 250ms;
-}
-.slidedown.in.reverse {
- -webkit-animation-name: fadein;
- -webkit-animation-duration: 150ms;
- -moz-animation-name: fadein;
- -moz-animation-duration: 150ms;
- animation-name: fadein;
- animation-duration: 150ms;
-}
-.slidedown.out.reverse {
- -webkit-transform: translateY(-100%);
- -webkit-animation-name: slideouttotop;
- -webkit-animation-duration: 200ms;
- -moz-transform: translateY(-100%);
- -moz-animation-name: slideouttotop;
- -moz-animation-duration: 200ms;
- transform: translateY(-100%);
- animation-name: slideouttotop;
- animation-duration: 200ms;
-}
-@-webkit-keyframes slideinfromtop {
- from { -webkit-transform: translateY(-100%); }
- to { -webkit-transform: translateY(0); }
-}
-@-moz-keyframes slideinfromtop {
- from { -moz-transform: translateY(-100%); }
- to { -moz-transform: translateY(0); }
-}
-@keyframes slideinfromtop {
- from { transform: translateY(-100%); }
- to { transform: translateY(0); }
-}
-@-webkit-keyframes slideouttotop {
- from { -webkit-transform: translateY(0); }
- to { -webkit-transform: translateY(-100%); }
-}
-@-moz-keyframes slideouttotop {
- from { -moz-transform: translateY(0); }
- to { -moz-transform: translateY(-100%); }
-}
-@keyframes slideouttotop {
- from { transform: translateY(0); }
- to { transform: translateY(-100%); }
-}
-/* slide up */
-.slideup.out {
- -webkit-animation-name: fadeout;
- -webkit-animation-duration: 100ms;
- -moz-animation-name: fadeout;
- -moz-animation-duration: 100ms;
- animation-name: fadeout;
- animation-duration: 100ms;
-}
-.slideup.in {
- -webkit-transform: translateY(0);
- -webkit-animation-name: slideinfrombottom;
- -webkit-animation-duration: 250ms;
- -moz-transform: translateY(0);
- -moz-animation-name: slideinfrombottom;
- -moz-animation-duration: 250ms;
- transform: translateY(0);
- animation-name: slideinfrombottom;
- animation-duration: 250ms;
-}
-.slideup.in.reverse {
- -webkit-animation-name: fadein;
- -webkit-animation-duration: 150ms;
- -moz-animation-name: fadein;
- -moz-animation-duration: 150ms;
- animation-name: fadein;
- animation-duration: 150ms;
-}
-.slideup.out.reverse {
- -webkit-transform: translateY(100%);
- -webkit-animation-name: slideouttobottom;
- -webkit-animation-duration: 200ms;
- -moz-transform: translateY(100%);
- -moz-animation-name: slideouttobottom;
- -moz-animation-duration: 200ms;
- transform: translateY(100%);
- animation-name: slideouttobottom;
- animation-duration: 200ms;
-}
-@-webkit-keyframes slideinfrombottom {
- from { -webkit-transform: translateY(100%); }
- to { -webkit-transform: translateY(0); }
-}
-@-moz-keyframes slideinfrombottom {
- from { -moz-transform: translateY(100%); }
- to { -moz-transform: translateY(0); }
-}
-@keyframes slideinfrombottom {
- from { transform: translateY(100%); }
- to { transform: translateY(0); }
-}
-@-webkit-keyframes slideouttobottom {
- from { -webkit-transform: translateY(0); }
- to { -webkit-transform: translateY(100%); }
-}
-@-moz-keyframes slideouttobottom {
- from { -moz-transform: translateY(0); }
- to { -moz-transform: translateY(100%); }
-}
-@keyframes slideouttobottom {
- from { transform: translateY(0); }
- to { transform: translateY(100%); }
-}
-/* The properties in this rule are only necessary for the 'flip' transition.
- * We need specify the perspective to create a projection matrix. This will add
- * some depth as the element flips. The depth number represents the distance of
- * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate
- * value.
- */
-.viewport-flip {
- -webkit-perspective: 1000;
- -moz-perspective: 1000;
- perspective: 1000;
- position: absolute;
-}
-.flip {
- -webkit-backface-visibility: hidden;
- -webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
- -moz-backface-visibility: hidden;
- -moz-transform: translateX(0);
- backface-visibility: hidden;
- transform: translateX(0);
-}
-.flip.out {
- -webkit-transform: rotateY(-90deg) scale(.9);
- -webkit-animation-name: flipouttoleft;
- -webkit-animation-duration: 175ms;
- -moz-transform: rotateY(-90deg) scale(.9);
- -moz-animation-name: flipouttoleft;
- -moz-animation-duration: 175ms;
- transform: rotateY(-90deg) scale(.9);
- animation-name: flipouttoleft;
- animation-duration: 175ms;
-}
-.flip.in {
- -webkit-animation-name: flipintoright;
- -webkit-animation-duration: 225ms;
- -moz-animation-name: flipintoright;
- -moz-animation-duration: 225ms;
- animation-name: flipintoright;
- animation-duration: 225ms;
-}
-.flip.out.reverse {
- -webkit-transform: rotateY(90deg) scale(.9);
- -webkit-animation-name: flipouttoright;
- -moz-transform: rotateY(90deg) scale(.9);
- -moz-animation-name: flipouttoright;
- transform: rotateY(90deg) scale(.9);
- animation-name: flipouttoright;
-}
-.flip.in.reverse {
- -webkit-animation-name: flipintoleft;
- -moz-animation-name: flipintoleft;
- animation-name: flipintoleft;
-}
-@-webkit-keyframes flipouttoleft {
- from { -webkit-transform: rotateY(0); }
- to { -webkit-transform: rotateY(-90deg) scale(.9); }
-}
-@-moz-keyframes flipouttoleft {
- from { -moz-transform: rotateY(0); }
- to { -moz-transform: rotateY(-90deg) scale(.9); }
-}
-@keyframes flipouttoleft {
- from { transform: rotateY(0); }
- to { transform: rotateY(-90deg) scale(.9); }
-}
-@-webkit-keyframes flipouttoright {
- from { -webkit-transform: rotateY(0) ; }
- to { -webkit-transform: rotateY(90deg) scale(.9); }
-}
-@-moz-keyframes flipouttoright {
- from { -moz-transform: rotateY(0); }
- to { -moz-transform: rotateY(90deg) scale(.9); }
-}
-@keyframes flipouttoright {
- from { transform: rotateY(0); }
- to { transform: rotateY(90deg) scale(.9); }
-}
-@-webkit-keyframes flipintoleft {
- from { -webkit-transform: rotateY(-90deg) scale(.9); }
- to { -webkit-transform: rotateY(0); }
-}
-@-moz-keyframes flipintoleft {
- from { -moz-transform: rotateY(-90deg) scale(.9); }
- to { -moz-transform: rotateY(0); }
-}
-@keyframes flipintoleft {
- from { transform: rotateY(-90deg) scale(.9); }
- to { transform: rotateY(0); }
-}
-@-webkit-keyframes flipintoright {
- from { -webkit-transform: rotateY(90deg) scale(.9); }
- to { -webkit-transform: rotateY(0); }
-}
-@-moz-keyframes flipintoright {
- from { -moz-transform: rotateY(90deg) scale(.9); }
- to { -moz-transform: rotateY(0); }
-}
-@keyframes flipintoright {
- from { transform: rotateY(90deg) scale(.9); }
- to { transform: rotateY(0); }
-}
-/* The properties in this rule are only necessary for the 'flip' transition.
- * We need specify the perspective to create a projection matrix. This will add
- * some depth as the element flips. The depth number represents the distance of
- * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate
- * value.
- */
-.viewport-turn {
- -webkit-perspective: 200px;
- -moz-perspective: 200px;
- -ms-perspective: 200px;
- perspective: 200px;
- position: absolute;
-}
-.turn {
- -webkit-backface-visibility: hidden;
- -webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
- -webkit-transform-origin: 0;
-
- -moz-backface-visibility: hidden;
- -moz-transform: translateX(0);
- -moz-transform-origin: 0;
-
- backface-visibility :hidden;
- transform: translateX(0);
- transform-origin: 0;
-}
-.turn.out {
- -webkit-transform: rotateY(-90deg) scale(.9);
- -webkit-animation-name: flipouttoleft;
- -webkit-animation-duration: 125ms;
- -moz-transform: rotateY(-90deg) scale(.9);
- -moz-animation-name: flipouttoleft;
- -moz-animation-duration: 125ms;
- transform: rotateY(-90deg) scale(.9);
- animation-name: flipouttoleft;
- animation-duration: 125ms;
-}
-.turn.in {
- -webkit-animation-name: flipintoright;
- -webkit-animation-duration: 250ms;
- -moz-animation-name: flipintoright;
- -moz-animation-duration: 250ms;
- animation-name: flipintoright;
- animation-duration: 250ms;
-
-}
-.turn.out.reverse {
- -webkit-transform: rotateY(90deg) scale(.9);
- -webkit-animation-name: flipouttoright;
- -moz-transform: rotateY(90deg) scale(.9);
- -moz-animation-name: flipouttoright;
- transform: rotateY(90deg) scale(.9);
- animation-name: flipouttoright;
-}
-.turn.in.reverse {
- -webkit-animation-name: flipintoleft;
- -moz-animation-name: flipintoleft;
- animation-name: flipintoleft;
-}
-@-webkit-keyframes flipouttoleft {
- from { -webkit-transform: rotateY(0); }
- to { -webkit-transform: rotateY(-90deg) scale(.9); }
-}
-@-moz-keyframes flipouttoleft {
- from { -moz-transform: rotateY(0); }
- to { -moz-transform: rotateY(-90deg) scale(.9); }
-}
-@keyframes flipouttoleft {
- from { transform: rotateY(0); }
- to { transform: rotateY(-90deg) scale(.9); }
-}
-@-webkit-keyframes flipouttoright {
- from { -webkit-transform: rotateY(0) ; }
- to { -webkit-transform: rotateY(90deg) scale(.9); }
-}
-@-moz-keyframes flipouttoright {
- from { -moz-transform: rotateY(0); }
- to { -moz-transform: rotateY(90deg) scale(.9); }
-}
-@keyframes flipouttoright {
- from { transform: rotateY(0); }
- to { transform: rotateY(90deg) scale(.9); }
-}
-@-webkit-keyframes flipintoleft {
- from { -webkit-transform: rotateY(-90deg) scale(.9); }
- to { -webkit-transform: rotateY(0); }
-}
-@-moz-keyframes flipintoleft {
- from { -moz-transform: rotateY(-90deg) scale(.9); }
- to { -moz-transform: rotateY(0); }
-}
-@keyframes flipintoleft {
- from { transform: rotateY(-90deg) scale(.9); }
- to { transform: rotateY(0); }
-}
-@-webkit-keyframes flipintoright {
- from { -webkit-transform: rotateY(90deg) scale(.9); }
- to { -webkit-transform: rotateY(0); }
-}
-@-moz-keyframes flipintoright {
- from { -moz-transform: rotateY(90deg) scale(.9); }
- to { -moz-transform: rotateY(0); }
-}
-@keyframes flipintoright {
- from { transform: rotateY(90deg) scale(.9); }
- to { transform: rotateY(0); }
-}
-/* flow transition */
-.flow {
- -webkit-transform-origin: 50% 30%;
- -webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);
- -moz-transform-origin: 50% 30%;
- -moz-box-shadow: 0 0 20px rgba(0,0,0,.4);
- transform-origin: 50% 30%;
- box-shadow: 0 0 20px rgba(0,0,0,.4);
-}
-.ui-dialog.flow {
- -webkit-transform-origin: none;
- -webkit-box-shadow: none;
- -moz-transform-origin: none;
- -moz-box-shadow: none;
- transform-origin: none;
- box-shadow: none;
-}
-.flow.out {
- -webkit-transform: translateX(-100%) scale(.7);
- -webkit-animation-name: flowouttoleft;
- -webkit-animation-timing-function: ease;
- -webkit-animation-duration: 350ms;
- -moz-transform: translateX(-100%) scale(.7);
- -moz-animation-name: flowouttoleft;
- -moz-animation-timing-function: ease;
- -moz-animation-duration: 350ms;
- transform: translateX(-100%) scale(.7);
- animation-name: flowouttoleft;
- animation-timing-function: ease;
- animation-duration: 350ms;
-}
-.flow.in {
- -webkit-transform: translateX(0) scale(1);
- -webkit-animation-name: flowinfromright;
- -webkit-animation-timing-function: ease;
- -webkit-animation-duration: 350ms;
- -moz-transform: translateX(0) scale(1);
- -moz-animation-name: flowinfromright;
- -moz-animation-timing-function: ease;
- -moz-animation-duration: 350ms;
- transform: translateX(0) scale(1);
- animation-name: flowinfromright;
- animation-timing-function: ease;
- animation-duration: 350ms;
-}
-.flow.out.reverse {
- -webkit-transform: translateX(100%);
- -webkit-animation-name: flowouttoright;
- -moz-transform: translateX(100%);
- -moz-animation-name: flowouttoright;
- transform: translateX(100%);
- animation-name: flowouttoright;
-}
-.flow.in.reverse {
- -webkit-animation-name: flowinfromleft;
- -moz-animation-name: flowinfromleft;
- animation-name: flowinfromleft;
-}
-@-webkit-keyframes flowouttoleft {
- 0% { -webkit-transform: translateX(0) scale(1); }
- 60%, 70% { -webkit-transform: translateX(0) scale(.7); }
- 100% { -webkit-transform: translateX(-100%) scale(.7); }
-}
-@-moz-keyframes flowouttoleft {
- 0% { -moz-transform: translateX(0) scale(1); }
- 60%, 70% { -moz-transform: translateX(0) scale(.7); }
- 100% { -moz-transform: translateX(-100%) scale(.7); }
-}
-@keyframes flowouttoleft {
- 0% { transform: translateX(0) scale(1); }
- 60%, 70% { transform: translateX(0) scale(.7); }
- 100% { transform: translateX(-100%) scale(.7); }
-}
-@-webkit-keyframes flowouttoright {
- 0% { -webkit-transform: translateX(0) scale(1); }
- 60%, 70% { -webkit-transform: translateX(0) scale(.7); }
- 100% { -webkit-transform: translateX(100%) scale(.7); }
-}
-@-moz-keyframes flowouttoright {
- 0% { -moz-transform: translateX(0) scale(1); }
- 60%, 70% { -moz-transform: translateX(0) scale(.7); }
- 100% { -moz-transform: translateX(100%) scale(.7); }
-}
-@keyframes flowouttoright {
- 0% { transform: translateX(0) scale(1); }
- 60%, 70% { transform: translateX(0) scale(.7); }
- 100% { transform: translateX(100%) scale(.7); }
-}
-@-webkit-keyframes flowinfromleft {
- 0% { -webkit-transform: translateX(-100%) scale(.7); }
- 30%, 40% { -webkit-transform: translateX(0) scale(.7); }
- 100% { -webkit-transform: translateX(0) scale(1); }
-}
-@-moz-keyframes flowinfromleft {
- 0% { -moz-transform: translateX(-100%) scale(.7); }
- 30%, 40% { -moz-transform: translateX(0) scale(.7); }
- 100% { -moz-transform: translateX(0) scale(1); }
-}
-@keyframes flowinfromleft {
- 0% { transform: translateX(-100%) scale(.7); }
- 30%, 40% { transform: translateX(0) scale(.7); }
- 100% { transform: translateX(0) scale(1); }
-}
-@-webkit-keyframes flowinfromright {
- 0% { -webkit-transform: translateX(100%) scale(.7); }
- 30%, 40% { -webkit-transform: translateX(0) scale(.7); }
- 100% { -webkit-transform: translateX(0) scale(1); }
-}
-@-moz-keyframes flowinfromright {
- 0% { -moz-transform: translateX(100%) scale(.7); }
- 30%, 40% { -moz-transform: translateX(0) scale(.7); }
- 100% { -moz-transform: translateX(0) scale(1); }
-}
-@keyframes flowinfromright {
- 0% { transform: translateX(100%) scale(.7); }
- 30%, 40% { transform: translateX(0) scale(.7); }
- 100% { transform: translateX(0) scale(1); }
-}
-/* content configurations. */
-.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; }
-.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height: 1px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
-/* grid solo: 100 - single item fallback */
-.ui-grid-solo .ui-block-a { display: block; float: none; }
-/* Lower percentages for older browsers (i.e. IE7) to prevent wrapping. -.5px to fix BB5 wrap issue. */
-/* grid a: 50/50 */
-.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 49.95%; }
-.ui-grid-a > :nth-child(n) { width: 50%; margin-right: -.5px; }
-.ui-grid-a .ui-block-a { clear: left; }
-/* grid b: 33/33/33 */
-.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.25%; }
-.ui-grid-b > :nth-child(n) { width: 33.333%; margin-right: -.5px; }
-.ui-grid-b .ui-block-a { clear: left; }
-/* grid c: 25/25/25/25 */
-.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 24.925%; }
-.ui-grid-c > :nth-child(n) { width: 25%; margin-right: -.5px; }
-.ui-grid-c .ui-block-a { clear: left; }
-/* grid d: 20/20/20/20/20 */
-.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 19.925%; }
-.ui-grid-d > :nth-child(n) { width: 20%; }
-.ui-grid-d .ui-block-a { clear: left; }
-/* preset breakpoint to switch to stacked grid styles below 35em (560px) */
-@media all and (max-width: 35em) {
- .ui-responsive .ui-block-a,
- .ui-responsive .ui-block-b,
- .ui-responsive .ui-block-c,
- .ui-responsive .ui-block-d,
- .ui-responsive .ui-block-e {
- width: 100%;
- float:none;
- }
-}
-/* fixed page header & footer configuration */
-.ui-header-fixed,
-.ui-footer-fixed {
- left: 0;
- right: 0;
- width: 100%;
- position: fixed;
- z-index: 1000;
-}
-.ui-header-fixed {
- top: -1px;
- padding-top: 1px;
-}
-.ui-header-fixed.ui-fixed-hidden {
- top: 0;
- padding-top: 0;
-}
-.ui-footer-fixed {
- bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-footer-fixed.ui-fixed-hidden {
- bottom: 0;
- padding-bottom: 0;
-}
-.ui-header-fullscreen,
-.ui-footer-fullscreen {
- filter: Alpha(Opacity=90);
- opacity: .9;
-}
-.ui-page-header-fixed {
- padding-top: 2.6875em;
-}
-.ui-page-footer-fixed {
- padding-bottom: 2.6875em;
-}
-.ui-page-header-fullscreen > .ui-content,
-.ui-page-footer-fullscreen > .ui-content {
- padding: 0;
-}
-.ui-fixed-hidden {
- position: absolute;
-}
-.ui-page-header-fullscreen .ui-fixed-hidden,
-.ui-page-footer-fullscreen .ui-fixed-hidden {
- left: -9999px;
-}
-.ui-header-fixed .ui-btn,
-.ui-footer-fixed .ui-btn {
- z-index: 10;
-}
-/* workarounds for other widgets */
-.ui-android-2x-fixed .ui-li-has-thumb {
- -webkit-transform: translate3d(0,0,0);
-}
-.ui-navbar { max-width: 100%; }
-.ui-navbar.ui-mini { margin: 0; }
-.ui-navbar ul:before, .ui-navbar ul:after { content: " "; display: table; }
-.ui-navbar ul:after { clear: both; }
-.ui-navbar ul { list-style:none; margin: 0; padding: 0; position: relative; display: block; border: 0; max-width: 100%; overflow: visible; zoom: 1; }
-.ui-navbar li .ui-btn { display: block; text-align: center; margin: 0 -1px 0 0; border-right-width: 0; }
-.ui-navbar li .ui-btn-icon-right .ui-icon { right: 6px; }
-/* add border if not in header/footer (full width) */
-.ui-navbar li:last-child .ui-btn,
-.ui-navbar .ui-grid-duo .ui-block-b .ui-btn { margin-right: 0; border-right-width: 1px; }
-.ui-header .ui-navbar li:last-child .ui-btn,
-.ui-footer .ui-navbar li:last-child .ui-btn,
-.ui-header .ui-navbar .ui-grid-duo .ui-block-b .ui-btn,
-.ui-footer .ui-navbar .ui-grid-duo .ui-block-b .ui-btn { margin-right: -1px; border-right-width: 0; }
-.ui-navbar .ui-grid-duo li.ui-block-a:last-child .ui-btn { margin-right: -1px; border-right-width: 1px; }
-.ui-header .ui-navbar li .ui-btn,
-.ui-footer .ui-navbar li .ui-btn { border-top-width: 0; border-bottom-width: 0; }
-/* fixing gaps caused by subpixel problem */
-.ui-header .ui-navbar .ui-grid-b li.ui-block-c .ui-btn,
-.ui-footer .ui-navbar .ui-grid-b li.ui-block-c .ui-btn { margin-right: -5px; }
-.ui-header .ui-navbar .ui-grid-c li.ui-block-d .ui-btn,
-.ui-footer .ui-navbar .ui-grid-c li.ui-block-d .ui-btn,
-.ui-header .ui-navbar .ui-grid-d li.ui-block-e .ui-btn,
-.ui-footer .ui-navbar .ui-grid-d li.ui-block-e .ui-btn { margin-right: -4px; }
-.ui-header .ui-navbar .ui-grid-b li.ui-block-c .ui-btn-icon-right .ui-icon,
-.ui-footer .ui-navbar .ui-grid-b li.ui-block-c .ui-btn-icon-right .ui-icon,
-.ui-header .ui-navbar .ui-grid-c li.ui-block-d .ui-btn-icon-right .ui-icon,
-.ui-footer .ui-navbar .ui-grid-c li.ui-block-d .ui-btn-icon-right .ui-icon,
-.ui-header .ui-navbar .ui-grid-d li.ui-block-e .ui-btn-icon-right .ui-icon,
-.ui-footer .ui-navbar .ui-grid-d li.ui-block-e .ui-btn-icon-right .ui-icon { right: 8px; }
-.ui-navbar li .ui-btn .ui-btn-inner { padding-top: .7em; padding-bottom: .8em }
-.ui-navbar li .ui-btn-icon-top .ui-btn-inner { padding-top: 30px; }
-.ui-navbar li .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 30px; }
-.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 0; padding: 0; }
-.ui-mini { margin-top: .25em; margin-bottom: .25em; }
-.ui-btn-left, .ui-btn-right, .ui-input-clear, .ui-btn-inline,
-.ui-grid-a .ui-btn, .ui-grid-b .ui-btn, .ui-grid-c .ui-btn, .ui-grid-d .ui-btn, .ui-grid-e .ui-btn, .ui-grid-solo .ui-btn { margin-right: 5px; margin-left: 5px; }
-.ui-btn-inner { font-size: 16px; padding: .6em 20px; min-width: .75em; display: block; position: relative; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; zoom: 1; }
-.ui-btn input, .ui-btn button { z-index: 2; }
-.ui-btn-left, .ui-btn-right, .ui-btn-inline { display: inline-block; vertical-align: middle; }
-.ui-mobile .ui-btn-left, .ui-mobile .ui-btn-right, .ui-btn-left > .ui-btn, .ui-btn-right > .ui-btn { margin: 0; } /* .ui-mobile to increase specificity level */
-.ui-btn-block { display: block; }
-.ui-header > .ui-btn,
-.ui-footer > .ui-btn { display: inline-block; margin: 0; }
-.ui-header .ui-btn-block,
-.ui-footer .ui-btn-block { display: block; }
-.ui-header .ui-btn-inner,
-.ui-footer .ui-btn-inner,
-.ui-mini .ui-btn-inner { font-size: 12.5px; padding: .55em 11px .5em; }
-.ui-fullsize .ui-btn-inner,
-.ui-fullsize .ui-btn-inner { font-size: 16px; padding: .6em 20px; }
-.ui-btn-icon-notext { width: 24px; height: 24px; }
-.ui-btn-icon-notext .ui-btn-inner { padding: 0; height: 100%; }
-.ui-btn-icon-notext .ui-btn-inner .ui-icon { margin: 2px 1px 2px 3px; float: left; }
-.ui-btn-text { position: relative; z-index: 1; width: 100%; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; }
-div.ui-btn-text { width: auto; }
-.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -9999px; }
-.ui-btn-icon-left .ui-btn-inner { padding-left: 40px; }
-.ui-btn-icon-right .ui-btn-inner { padding-right: 40px; }
-.ui-btn-icon-top .ui-btn-inner { padding-top: 40px; }
-.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 40px; }
-.ui-header .ui-btn-icon-left .ui-btn-inner,
-.ui-footer .ui-btn-icon-left .ui-btn-inner,
-.ui-mini.ui-btn-icon-left .ui-btn-inner,
-.ui-mini .ui-btn-icon-left .ui-btn-inner { padding-left: 30px; }
-.ui-header .ui-btn-icon-right .ui-btn-inner,
-.ui-footer .ui-btn-icon-right .ui-btn-inner,
-.ui-mini.ui-btn-icon-right .ui-btn-inner,
-.ui-mini .ui-btn-icon-right .ui-btn-inner { padding-right: 30px; }
-.ui-header .ui-btn-icon-top .ui-btn-inner,
-.ui-footer .ui-btn-icon-top .ui-btn-inner { padding: 30px 3px .5em 3px; }
-.ui-mini.ui-btn-icon-top .ui-btn-inner,
-.ui-mini .ui-btn-icon-top .ui-btn-inner { padding-top: 30px; }
-.ui-header .ui-btn-icon-bottom .ui-btn-inner,
-.ui-footer .ui-btn-icon-bottom .ui-btn-inner { padding: .55em 3px 30px 3px; }
-.ui-mini.ui-btn-icon-bottom .ui-btn-inner,
-.ui-mini .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 30px; }
-/* Corner styling inheritance */
-.ui-btn-inner {
- -webkit-border-radius: inherit;
- border-radius: inherit;
-}
-/*btn icon positioning*/
-.ui-btn-icon-notext .ui-icon { display: block; z-index: 0;}
-.ui-btn-icon-left > .ui-btn-inner > .ui-icon, .ui-btn-icon-right > .ui-btn-inner > .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
-.ui-btn-icon-top .ui-btn-inner .ui-icon, .ui-btn-icon-bottom .ui-btn-inner .ui-icon { position: absolute; left: 50%; margin-left: -9px; }
-.ui-btn-icon-left .ui-icon { left: 10px; }
-.ui-btn-icon-right .ui-icon { right: 10px; }
-.ui-btn-icon-top .ui-icon { top: 10px; }
-.ui-btn-icon-bottom .ui-icon { top: auto; bottom: 10px; }
-.ui-header .ui-btn-icon-left .ui-icon,
-.ui-footer .ui-btn-icon-left .ui-icon,
-.ui-mini.ui-btn-icon-left .ui-icon,
-.ui-mini .ui-btn-icon-left .ui-icon { left: 5px; }
-.ui-header .ui-btn-icon-right .ui-icon,
-.ui-footer .ui-btn-icon-right .ui-icon,
-.ui-mini.ui-btn-icon-right .ui-icon,
-.ui-mini .ui-btn-icon-right .ui-icon { right: 5px; }
-.ui-header .ui-btn-icon-top .ui-icon,
-.ui-footer .ui-btn-icon-top .ui-icon,
-.ui-mini.ui-btn-icon-top .ui-icon,
-.ui-mini .ui-btn-icon-top .ui-icon { top: 5px; }
-.ui-header .ui-btn-icon-bottom .ui-icon,
-.ui-footer .ui-btn-icon-bottom .ui-icon,
-.ui-mini.ui-btn-icon-bottom .ui-icon,
-.ui-mini .ui-btn-icon-bottom .ui-icon { bottom: 5px; }
-/*hiding native button,inputs */
-.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: none; cursor: pointer; background: #fff; background: rgba(255,255,255,0); filter: Alpha(Opacity=0); opacity: .1; font-size: 1px; border: none; text-indent: -9999px; }
-/* Fixes IE/WP filter alpha opacity bugs */
-.ui-disabled .ui-btn-hidden { display: none; }
-.ui-disabled { z-index: 1; }
-.ui-field-contain .ui-btn.ui-submit { margin: 0; }
-label.ui-submit { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
-@media all and (min-width: 28em){
- .ui-field-contain label.ui-submit { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
- .ui-field-contain .ui-btn.ui-submit { width: 78%; display: inline-block; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
- .ui-hide-label .ui-btn.ui-submit { width: auto; display: block; }
-}
-.ui-collapsible-inset { margin: .5em 0; }
-.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -15px; padding: 0; position: relative; }
-.ui-collapsible-inset .ui-collapsible-heading { margin: 0; }
-.ui-collapsible-heading .ui-btn { text-align: left; margin: 0; border-left-width: 0; border-right-width: 0; }
-.ui-collapsible-inset .ui-collapsible-heading .ui-btn { border-right-width: 1px; border-left-width: 1px; }
-.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn { border-top-width: 0; }
-.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn { border-top-width: 1px; }
-.ui-collapsible-heading .ui-btn-inner { padding-left: 12px; padding-right: 12px; }
-.ui-collapsible-heading .ui-btn-icon-left .ui-btn-inner { padding-left: 40px; }
-.ui-collapsible-heading .ui-btn-icon-right .ui-btn-inner { padding-right: 40px; }
-.ui-collapsible-heading .ui-btn-icon-top .ui-btn-inner,
-.ui-collapsible-heading .ui-btn-icon-bottom .ui-btn-inner { text-align: center; }
-.ui-collapsible-heading .ui-btn-icon-left.ui-mini .ui-btn-inner { padding-left: 30px; }
-.ui-collapsible-heading .ui-btn-icon-right.ui-mini .ui-btn-inner { padding-right: 30px; }
-.ui-collapsible-heading .ui-btn span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0 1px 2px; text-indent: -9999px; }
-.ui-collapsible-heading .ui-btn span.ui-btn .ui-btn-inner { padding: 10px 0; }
-.ui-collapsible-heading .ui-btn span.ui-btn .ui-icon { left: 0; margin-top: -10px; }
-.ui-collapsible-heading-status { position: absolute; top: -9999px; left: 0; }
-.ui-collapsible-content {
- display: block;
- margin: 0 -15px;
- padding: 10px 15px;
- border-left-width: 0;
- border-right-width: 0;
- border-top: none; /* Overrides ui-body-* */
- background-image: none; /* Overrides ui-body-* */
-}
-.ui-collapsible-inset .ui-collapsible-content { margin: 0; border-right-width: 1px; border-left-width: 1px; }
-.ui-collapsible-content-collapsed { display: none; }
-.ui-collapsible-set > .ui-collapsible.ui-corner-all {
- -webkit-border-radius: 0;
- border-radius: 0;
-}
-.ui-collapsible-heading,
-.ui-collapsible-heading > .ui-btn {
- -webkit-border-radius: inherit;
- border-radius: inherit;
-}
-.ui-collapsible-set .ui-collapsible.ui-first-child {
- -webkit-border-top-right-radius: inherit;
- border-top-right-radius: inherit;
- -webkit-border-top-left-radius: inherit;
- border-top-left-radius: inherit;
-}
-.ui-collapsible-content,
-.ui-collapsible-set .ui-collapsible.ui-last-child {
- -webkit-border-bottom-right-radius: inherit;
- border-bottom-right-radius: inherit;
- -webkit-border-bottom-left-radius: inherit;
- border-bottom-left-radius: inherit;
-}
-.ui-collapsible-themed-content:not(.ui-collapsible-collapsed) > .ui-collapsible-heading {
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.ui-collapsible-set { margin: .5em 0; }
-.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; }
-.ui-collapsible-set .ui-collapsible.ui-first-child { margin-top: 0; }
-.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0; zoom: 1; }
-.ui-controlgroup.ui-mini, fieldset.ui-controlgroup.ui-mini { margin: .25em 0; }
-.ui-field-contain .ui-controlgroup, .ui-field-contain fieldset.ui-controlgroup { margin: 0; }
-.ui-bar .ui-controlgroup { margin: 0 5px; }
-.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .4em; }
-.ui-controlgroup-controls label.ui-select,
-.ui-controlgroup-controls label.ui-submit { position: absolute; left: -9999px; }
-.ui-controlgroup li { list-style: none; }
-.ui-controlgroup .ui-btn { margin: 0; }
-.ui-controlgroup .ui-btn-icon-notext { width: auto; height: auto; top: auto; }
-.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { height: 20px; padding: .6em 20px .6em 20px }
-.ui-controlgroup-horizontal .ui-btn-icon-notext .ui-btn-inner { width: 18px; }
-.ui-controlgroup.ui-mini .ui-btn-icon-notext .ui-btn-inner,
-.ui-header .ui-controlgroup .ui-btn-icon-notext .ui-btn-inner,
-.ui-footer .ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { height: 16px; padding: .55em 11px .5em 11px; }
-.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner .ui-icon { position: absolute; top: 50%; right: 50%; margin: -9px -9px 0 0; }
-.ui-controlgroup-horizontal .ui-btn-inner { text-align: center; }
-.ui-controlgroup-horizontal.ui-mini .ui-btn-inner { height: 16px; line-height: 16px; }
-.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; }
-.ui-controlgroup-horizontal .ui-controlgroup-controls:before,
-.ui-controlgroup-horizontal .ui-controlgroup-controls:after { content: ""; display: table; }
-.ui-controlgroup-horizontal .ui-controlgroup-controls:after { clear: both; }
-.ui-controlgroup-horizontal .ui-controlgroup-controls { display: inline-block; vertical-align: middle; zoom: 1; }
-.ui-controlgroup-horizontal .ui-controlgroup-controls > .ui-btn, .ui-controlgroup-horizontal .ui-controlgroup-controls li > .ui-btn,
-.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio,
-.ui-controlgroup-horizontal .ui-select { float: left; clear: none; margin: 0; }
-/* On IE7 the floating selects will be displayed as block if .ui-btn-text has width 100% */
-.ui-controlgroup-horizontal .ui-select .ui-btn-text { width: auto; }
-.ui-controlgroup-vertical .ui-btn { border-bottom-width: 0; }
-.ui-controlgroup-vertical .ui-btn.ui-last-child { border-bottom-width: 1px; }
-.ui-controlgroup-horizontal .ui-btn { border-right-width: 0; }
-.ui-controlgroup-horizontal .ui-btn.ui-last-child { border-right-width: 1px; }
-.ui-controlgroup .ui-btn-corner-all {
- -webkit-border-radius: 0;
- border-radius: 0;
-}
-.ui-controlgroup .ui-controlgroup-controls,
-.ui-controlgroup .ui-radio,
-.ui-controlgroup .ui-checkbox,
-.ui-controlgroup .ui-select,
-.ui-controlgroup li {
- -webkit-border-radius: inherit;
- border-radius: inherit;
-}
-.ui-controlgroup-vertical .ui-btn.ui-first-child {
- -webkit-border-top-left-radius: inherit;
- border-top-left-radius: inherit;
- -webkit-border-top-right-radius: inherit;
- border-top-right-radius: inherit;
-}
-.ui-controlgroup-vertical .ui-btn.ui-last-child {
- -webkit-border-bottom-left-radius: inherit;
- border-bottom-left-radius: inherit;
- -webkit-border-bottom-right-radius: inherit;
- border-bottom-right-radius: inherit;
-}
-.ui-controlgroup-horizontal .ui-btn.ui-first-child {
- -webkit-border-top-left-radius: inherit;
- border-top-left-radius: inherit;
- -webkit-border-bottom-left-radius: inherit;
- border-bottom-left-radius: inherit;
-}
-.ui-controlgroup-horizontal .ui-btn.ui-last-child {
- -webkit-border-top-right-radius: inherit;
- border-top-right-radius: inherit;
- -webkit-border-bottom-right-radius: inherit;
- border-bottom-right-radius: inherit;
-}
-.ui-controlgroup .ui-shadow:not(.ui-focus) {
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-@media all and (min-width: 28em){
- .ui-field-contain .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
- .ui-field-contain .ui-controlgroup-controls { width: 78%; display: inline-block; }
- .ui-field-contain .ui-controlgroup .ui-select { width: 100%; display: block; }
- .ui-field-contain .ui-controlgroup-horizontal .ui-select { width: auto; }
- .ui-hide-label .ui-controlgroup-controls { width: 100%; }
-}
-.ui-dialog {
- background: none !important; /* this is to ensure that dialog theming does not apply (by default at least) on the page div */
-}
-.ui-dialog-contain {
- width: 92.5%;
- max-width: 500px;
- margin: 10% auto 15px auto;
- padding: 0;
- position: relative;
- top: -15px;
-}
-.ui-dialog-contain > .ui-header,
-.ui-dialog-contain > .ui-content,
-.ui-dialog-contain > .ui-footer {
- display: block;
- position: relative;
- width: auto;
- margin: 0;
-}
-.ui-dialog-contain > .ui-header {
- border: none;
- overflow: hidden;
- z-index: 10;
- padding: 0;
-}
-.ui-dialog-contain > .ui-content {
- padding: 15px;
-}
-.ui-dialog-contain > .ui-footer {
- z-index: 10;
- padding: 0 15px;
-}
-.ui-popup-open .ui-header-fixed,
-.ui-popup-open .ui-footer-fixed {
- position: absolute !important; /* See line #553 of popup.js */
-}
-.ui-popup-screen {
- background-image: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */
- top: 0;
- left: 0;
- right: 0;
- bottom: 1px;
- position: absolute;
- filter: Alpha(Opacity=0);
- opacity: 0;
- z-index: 1099;
-}
-.ui-popup-screen.in {
- opacity: 0.5;
- filter: Alpha(Opacity=50);
-}
-.ui-popup-screen.out {
- opacity: 0;
- filter: Alpha(Opacity=0);
-}
-.ui-popup-container {
- z-index: 1100;
- display: inline-block;
- position: absolute;
- padding: 0;
- outline: 0;
-}
-.ui-popup {
- position: relative;
-}
-.ui-popup.ui-content,
-.ui-popup .ui-content {
- overflow: visible;
-}
-.ui-popup > p,
-.ui-popup > h1,
-.ui-popup > h2,
-.ui-popup > h3,
-.ui-popup > h4,
-.ui-popup > h5,
-.ui-popup > h6 {
- margin: .5em 7px;
-}
-.ui-popup > span {
- display: block;
- margin: .5em 7px;
-}
-.ui-popup .ui-title {
- font-size: 16px;
- font-weight: bold;
- margin-top: .5em;
- margin-bottom: .5em;
-}
-.ui-popup-container .ui-content > p,
-.ui-popup-container .ui-content > h1,
-.ui-popup-container .ui-content > h2,
-.ui-popup-container .ui-content > h3,
-.ui-popup-container .ui-content > h4,
-.ui-popup-container .ui-content > h5,
-.ui-popup-container .ui-content > h6 {
- margin: .5em 0;
-}
-.ui-popup-container .ui-content > span {
- margin: 0;
-}
-.ui-popup-container .ui-content > p:first-child,
-.ui-popup-container .ui-content > h1:first-child,
-.ui-popup-container .ui-content > h2:first-child,
-.ui-popup-container .ui-content > h3:first-child,
-.ui-popup-container .ui-content > h4:first-child,
-.ui-popup-container .ui-content > h5:first-child,
-.ui-popup-container .ui-content > h6:first-child {
- margin-top: 0;
-}
-.ui-popup-container .ui-content > p:last-child,
-.ui-popup-container .ui-content > h1:last-child,
-.ui-popup-container .ui-content > h2:last-child,
-.ui-popup-container .ui-content > h3:last-child,
-.ui-popup-container .ui-content > h4:last-child,
-.ui-popup-container .ui-content > h5:last-child,
-.ui-popup-container .ui-content > h6:last-child {
- margin-bottom: 0;
-}
-.ui-popup > img {
- width: auto;
- height: auto;
- max-width: 100%;
- max-height: 100%;
- vertical-align: middle;
-}
-.ui-popup:not(.ui-content) > img:only-child,
-.ui-popup:not(.ui-content) > .ui-btn-left:first-child + img:last-child,
-.ui-popup:not(.ui-content) > .ui-btn-right:first-child + img:last-child {
- -webkit-border-radius: inherit;
- border-radius: inherit;
-}
-.ui-popup iframe {
- vertical-align: middle;
-}
-@media all and (min-width: 28em){
- .ui-popup .ui-field-contain label.ui-submit,
- .ui-popup .ui-field-contain .ui-controlgroup-label,
- .ui-popup .ui-field-contain label.ui-select,
- .ui-popup .ui-field-contain label.ui-input-text {
- font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em;
- }
- .ui-popup .ui-field-contain .ui-btn.ui-submit,
- .ui-popup .ui-field-contain .ui-controlgroup-controls,
- .ui-popup .ui-field-contain .ui-select,
- .ui-popup .ui-field-contain input.ui-input-text,
- .ui-popup .ui-field-contain textarea.ui-input-text,
- .ui-popup .ui-field-contain .ui-input-search {
- width: 100%; display: block;
- }
-}
-.ui-popup > .ui-btn-left,
-.ui-popup > .ui-btn-right {
- position: absolute;
- top: -9px;
- margin: 0;
- z-index: 1101;
-}
-.ui-popup > .ui-btn-left { left: -9px; }
-.ui-popup > .ui-btn-right { right: -9px; }
-.ui-popup-hidden { top: -99999px; left: -9999px; }
-.ui-checkbox, .ui-radio { position: relative; clear: both; margin: 0; z-index: 1; }
-.ui-checkbox .ui-btn, .ui-radio .ui-btn { text-align: left; z-index: 2; }
-.ui-controlgroup .ui-checkbox .ui-btn, .ui-controlgroup .ui-radio .ui-btn { margin: 0; }
-.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner { white-space: normal; }
-.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; }
-.ui-checkbox .ui-mini.ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-mini.ui-btn-icon-left .ui-btn-inner { padding-left: 36px; }
-.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; }
-.ui-checkbox .ui-mini.ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-mini.ui-btn-icon-right .ui-btn-inner { padding-right: 36px; }
-.ui-checkbox .ui-btn-icon-top .ui-btn-inner, .ui-radio .ui-btn-icon-top .ui-btn-inner { padding-right: 0; padding-left: 0; text-align: center; }
-.ui-checkbox .ui-btn-icon-bottom .ui-btn-inner, .ui-radio .ui-btn-icon-bottom .ui-btn-inner { padding-right: 0; padding-left: 0; text-align: center; }
-.ui-checkbox .ui-icon, .ui-radio .ui-icon { top: 1.1em; }
-.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon { left: 15px; }
-.ui-checkbox .ui-mini.ui-btn-icon-left .ui-icon, .ui-radio .ui-mini.ui-btn-icon-left .ui-icon { left: 9px; }
-.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon { right: 15px; }
-.ui-checkbox .ui-mini.ui-btn-icon-right .ui-icon, .ui-radio .ui-mini.ui-btn-icon-right .ui-icon { right: 9px; }
-.ui-checkbox .ui-btn-icon-top .ui-icon, .ui-radio .ui-btn-icon-top .ui-icon { top: 10px; }
-.ui-checkbox .ui-btn-icon-bottom .ui-icon, .ui-radio .ui-btn-icon-bottom .ui-icon { top: auto; bottom: 10px; }
-.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon { right: 15px; }
-.ui-checkbox .ui-mini.ui-btn-icon-right .ui-icon, .ui-radio .ui-mini.ui-btn-icon-right .ui-icon { right: 9px; }
-.ui-controlgroup-horizontal .ui-checkbox .ui-icon,
-.ui-controlgroup-horizontal .ui-radio .ui-icon { display: none; }
-.ui-controlgroup-horizontal .ui-checkbox .ui-btn-inner,
-.ui-controlgroup-horizontal .ui-radio .ui-btn-inner { padding: .6em 20px; }
-.ui-controlgroup-horizontal .ui-checkbox .ui-mini .ui-btn-inner,
-.ui-controlgroup-horizontal .ui-radio .ui-mini .ui-btn-inner { padding: .55em 11px .5em; }
-/* input, label positioning */
-.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }
-.ui-field-contain, fieldset.ui-field-contain { padding: .8em 0; margin: 0; border-width: 0 0 1px 0; overflow: visible; }
-.ui-field-contain:last-child { border-bottom-width: 0; }
-.ui-field-contain { max-width: 100%; } /* This prevents horizontal scrollbar in IE7 */
-@media all and (min-width: 28em){
- .ui-field-contain, .ui-mobile fieldset.ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }
-}
-.ui-select { display: block; position: relative; }
-.ui-select select { position: absolute; left: -9999px; top: -9999px; }
-.ui-select .ui-btn { opacity: 1; }
-.ui-field-contain .ui-select .ui-btn { margin: 0; }
-/* Fixes #2588: When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select (including "inherit") without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */
-.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: none; left: 0; top:0; width: 100%; min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; filter: Alpha(Opacity=0); opacity: 0; z-index: 2; }
-.ui-select .ui-disabled { opacity: .3; }
-/* Display none because of issues with IE/WP's filter alpha opacity */
-.ui-select .ui-disabled select { display: none; }
-@-moz-document url-prefix() { .ui-select .ui-btn select { opacity: 0.0001; }}
-.ui-select .ui-btn.ui-select-nativeonly { border-radius: 0; border: 0; }
-.ui-select .ui-btn.ui-select-nativeonly select { opacity: 1; text-indent: 0; display: block; }
-.ui-select .ui-disabled.ui-select-nativeonly .ui-btn-inner { opacity: 0; }
-.ui-select .ui-btn-icon-right .ui-btn-inner, .ui-select .ui-li-has-count .ui-btn-inner { padding-right: 45px; }
-.ui-select .ui-mini.ui-btn-icon-right .ui-btn-inner { padding-right: 32px; }
-.ui-select .ui-btn-icon-right.ui-li-has-count .ui-btn-inner { padding-right: 80px; }
-.ui-select .ui-mini.ui-btn-icon-right.ui-li-has-count .ui-btn-inner { padding-right: 67px; }
-.ui-select .ui-btn-icon-right .ui-icon { right: 15px; }
-.ui-select .ui-mini.ui-btn-icon-right .ui-icon { right: 7px; }
-.ui-select .ui-btn-icon-right.ui-li-has-count .ui-li-count { right: 45px; }
-.ui-select .ui-mini.ui-btn-icon-right.ui-li-has-count .ui-li-count { right: 32px; }
-/* labels */
-label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
-/*listbox*/
-.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; overflow: hidden !important;
-/* This !important is required for iPad Safari specifically. See https://github.com/jquery/jquery-mobile/issues/2647 */ }
-.ui-select .ui-btn-text { text-overflow: ellipsis; }
-.ui-selectmenu { padding: 6px; min-width: 160px; }
-.ui-selectmenu .ui-listview { margin: 0; }
-.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; }
-.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; }
-.ui-selectmenu-list .ui-li .ui-icon { display: block; }
-.ui-li.ui-selectmenu-placeholder { display: none; }
-.ui-selectmenu .ui-header { margin: 0; padding: 0; }
-.ui-selectmenu.ui-popup .ui-header { -webkit-border-top-left-radius: 0; border-top-left-radius: 0; -webkit-border-top-right-radius: 0; border-top-right-radius: 0; }
-.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; }
-@media all and (min-width: 28em){
- .ui-field-contain label.ui-select { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
- .ui-field-contain .ui-select { width: 78%; display: inline-block; }
- .ui-hide-label .ui-select { width: 100%; }
-}
-/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button. this shim's content in there */
-.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }
-label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; }
-input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; margin: .5em 0; min-height: 1.4em; line-height: 1.4em; font-size: 16px; display: block; width: 100%; outline: 0; }
-input.ui-mini, .ui-mini input, textarea.ui-mini { font-size: 14px; }
-div.ui-input-text input.ui-input-text, div.ui-input-text textarea.ui-input-text,
-.ui-input-search input.ui-input-text { border: none; width: 100%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; }
-.ui-input-search, div.ui-input-text { margin: .5em 0; background-image: none; position: relative; }
-.ui-input-search { padding: 0 30px; }
-div.ui-input-text { padding: 0 .4em; }
-div.ui-input-has-clear { padding: 0 30px 0 .4em; }
-input.ui-input-text.ui-mini, textarea.ui-input-text.ui-mini,
-.ui-input-search.ui-mini, div.ui-input-text.ui-mini { margin: .25em 0; }
-.ui-field-contain input.ui-input-text, .ui-field-contain textarea.ui-input-text,
-.ui-field-contain .ui-input-search, .ui-field-contain div.ui-input-text { margin: 0; }
-textarea.ui-input-text { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
-input.ui-input-text { -webkit-appearance: none; }
-textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; }
-textarea.ui-mini { height: 45px; }
-.ui-icon-searchfield:after { position: absolute; left: 7px; top: 50%; margin-top: -9px; content: ""; width: 18px; height: 18px; opacity: .5; }
-.ui-input-search .ui-input-clear, .ui-input-text .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -13px; }
-.ui-mini .ui-input-clear { right: -3px; }
-.ui-input-search .ui-input-clear-hidden, .ui-input-text .ui-input-clear-hidden { display: none; }
-/* Resolves issue #5166: Added to support issue introduced in Firefox 15. We can likely remove this in the future. */
-input::-moz-placeholder, textarea::-moz-placeholder { color: #aaa; }
-/* Resolves issue #5131: Width of textinput depends on its type, for Android 4.1 */
-input[type=number]::-webkit-outer-spin-button { margin: 0; }
-@media all and (min-width: 28em){
- .ui-field-contain label.ui-input-text { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0 }
- .ui-field-contain input.ui-input-text,
- .ui-field-contain textarea.ui-input-text,
- .ui-field-contain .ui-input-search,
- .ui-field-contain div.ui-input-text { width: 78%; display: inline-block; }
- .ui-field-contain .ui-input-search,
- .ui-field-contain div.ui-input-text { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
- .ui-hide-label input.ui-input-text,
- .ui-hide-label textarea.ui-input-text,
- .ui-hide-label .ui-input-search,
- .ui-hide-label div.ui-input-text,
- .ui-input-search input.ui-input-text,
- div.ui-input-text input.ui-input-text { width: 100%; }
-}
-.ui-rangeslider {
- zoom: 1;
- margin: 0;
-}
-.ui-rangeslider:before,
-.ui-rangeslider:after {
- content: "";
- display: table;
-}
-.ui-rangeslider:after {
- clear: both;
-}
-/* Margin-top/bottom: .5em * 16px/14px to make it equal to ui-rangeslider-sliders margin (input font-size is 14px) */
-.ui-rangeslider input.ui-input-text.ui-slider-input {
- margin: .57143em 0;
-}
-.ui-rangeslider.ui-mini input.ui-slider-input {
- margin: .28571em 0;
-}
-.ui-rangeslider input.ui-slider-input.ui-rangeslider-last {
- float: right;
-}
-.ui-rangeslider .ui-rangeslider-sliders {
- position: relative;
- overflow: visible;
- height: 30px;
- margin: .5em 68px;
-}
-.ui-rangeslider.ui-mini .ui-rangeslider-sliders {
- margin: .25em 68px;
-}
-.ui-field-contain .ui-rangeslider input.ui-slider-input,
-.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input,
-.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,
-.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {
- margin-top: 0;
- margin-bottom: 0;
-}
-.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track {
- position: absolute;
- top: 6px;
- right: 0;
- left: 0;
- margin: 0;
-}
-.ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track {
- top: 8px;
-}
-.ui-rangeslider .ui-slider-track:first-child .ui-slider-bg {
- display: none;
-}
-.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {
- background-color: transparent;
- background: none;
- border-width: 0;
- height: 0;
-}
-/* this makes ie6 and ie7 set height to 0 to fix z-index problem */
-html >/**/body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {
- height: 15px;
- border-width: 1px;
-}
-html >/**/body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child {
- height: 12px;
-}
-@media all and (min-width: 28em){
- .ui-field-contain .ui-rangeslider label.ui-slider {
- float: left;
- }
- .ui-field-contain .ui-rangeslider input.ui-slider-input {
- position: relative;
- z-index: 1;
- }
- .ui-field-contain .ui-rangeslider input.ui-slider-input.ui-rangeslider-first,
- .ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input.ui-rangeslider-first {
- margin-right: 17px;
- }
- .ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,
- .ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {
- float: left;
- width: 78%;
- margin: 0 -68px;
- }
- .ui-field-contain .ui-rangeslider .ui-slider-track,
- .ui-field-contain .ui-rangeslider.ui-mini .ui-slider-track {
- right: 68px;
- left: 68px;
- }
- .ui-field-contain.ui-hide-label .ui-rangeslider input.ui-slider-input.ui-rangeslider-first {
- margin: 0;
- }
- .ui-field-contain.ui-hide-label .ui-rangeslider .ui-rangeslider-sliders,
- .ui-field-contain.ui-hide-label .ui-rangeslider.ui-mini .ui-rangeslider-sliders {
- width: auto;
- float: none;
- margin: 0 68px;
- }
- .ui-field-contain.ui-hide-label .ui-rangeslider .ui-slider-track,
- .ui-field-contain.ui-hide-label .ui-rangeslider.ui-mini .ui-slider-track {
- right: 0;
- left: 0;
- }
-}
-.ui-listview { margin: 0; }
-ol.ui-listview, ol.ui-listview .ui-li-divider { counter-reset: listnumbering; }
-.ui-content .ui-listview, .ui-panel-inner > .ui-listview { margin: -15px; }
-.ui-collapsible-content > .ui-listview { margin: -10px -15px; }
-.ui-content .ui-listview-inset, .ui-panel-inner .ui-listview-inset { margin: 1em 0; }
-.ui-collapsible-content .ui-listview-inset { margin: .5em 0; }
-.ui-listview, .ui-li { list-style: none; padding: 0; }
-.ui-li, .ui-li.ui-field-contain { display: block; margin: 0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; }
-.ui-li.ui-btn, .ui-li.ui-field-contain, .ui-li-divider, .ui-li-static { margin: 0; }
-.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; }
-.ui-li.ui-last-child, .ui-li.ui-field-contain.ui-last-child { border-bottom-width: 1px; }
-.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > .ui-li.ui-first-child { border-top-width: 0; }
-.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > .ui-li.ui-last-child { border-bottom-width: 0; }
-.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
-.ui-li-static { background-image: none; }
-.ui-li-divider { padding: .5em 15px; font-size: 14px; font-weight: bold; }
-ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal; counter-increment: listnumbering; content: counter(listnumbering) ". "; }
-ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */
-.ui-listview .ui-li > .ui-btn-text {
- -webkit-border-radius: inherit;
- border-radius: inherit;
-}
-.ui-listview > .ui-li.ui-first-child,
-.ui-listview .ui-btn.ui-first-child > .ui-li > .ui-btn-text > .ui-link-inherit {
- -webkit-border-top-right-radius: inherit;
- border-top-right-radius: inherit;
- -webkit-border-top-left-radius: inherit;
- border-top-left-radius: inherit;
-}
-.ui-listview > .ui-li.ui-last-child,
-.ui-listview .ui-btn.ui-last-child > .ui-li > .ui-btn-text > .ui-link-inherit,
-.ui-collapsible-content > .ui-listview:not(.ui-listview-inset),
-.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) .ui-li.ui-last-child {
- -webkit-border-bottom-right-radius: inherit;
- border-bottom-right-radius: inherit;
- -webkit-border-bottom-left-radius: inherit;
- border-bottom-left-radius: inherit;
-}
-.ui-listview > .ui-li.ui-first-child .ui-li-link-alt {
- -webkit-border-top-right-radius: inherit;
- border-top-right-radius: inherit;
-}
-.ui-listview > .ui-li.ui-last-child .ui-li-link-alt {
- -webkit-border-bottom-right-radius: inherit;
- border-bottom-right-radius: inherit;
-}
-.ui-listview > .ui-li.ui-first-child .ui-li-thumb:not(.ui-li-icon) {
- -webkit-border-top-left-radius: inherit;
- border-top-left-radius: inherit;
-}
-.ui-listview > .ui-li.ui-last-child .ui-li-thumb:not(.ui-li-icon) {
- -webkit-border-bottom-left-radius: inherit;
- border-bottom-left-radius: inherit;
-}
-.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; }
-.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 15px; display: block; }
-.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 59px; padding-left: 100px; }
-.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; }
-.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count, .ui-li-divider.ui-li-has-count { padding-right: 45px; }
-.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 40px; }
-.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow.ui-li-has-count { padding-right: 75px; }
-.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
-.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
-ol.ui-listview > .ui-li .ui-li-heading { display: inline-block; width: 100%; margin-left: -1.3em; text-indent: 1.3em; vertical-align: middle; }
-ol.ui-listview > .ui-li .ui-li-desc:not(.ui-li-aside) { text-indent: 1.55em; }
-.ui-li-thumb, .ui-listview .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; }
-.ui-listview .ui-li-icon { max-height: 16px; max-width: 16px; left: 10px; top: .9em; }
-.ui-li-thumb, .ui-listview .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; }
-.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; }
-@media all and (min-width: 480px){
- .ui-li-aside { width: 45%; }
-}
-.ui-li-divider { cursor: default; }
-.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 53px; }
-.ui-li-has-alt.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt.ui-li-has-count { padding-right: 88px; }
-.ui-li-has-count .ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 10px; }
-.ui-li-has-count.ui-li-divider .ui-li-count, .ui-li-has-count .ui-link-inherit .ui-li-count { margin-top: -.95em; }
-.ui-li-has-arrow.ui-li-has-count .ui-li-count { right: 40px; }
-.ui-li-has-alt.ui-li-has-count .ui-li-count { right: 53px; }
-.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; z-index: 2; }
-.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -13px 0 0 0; border-bottom-width: 1px; z-index: -1;}
-.ui-li-link-alt .ui-btn-inner { padding: 0; height: 100%; position: absolute; width: 100%; top: 0; left: 0;}
-.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; }
-.ui-li-link-alt .ui-btn-icon-notext .ui-btn-inner .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
-.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0; }
-.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px; }
-.ui-collapsible-content .ui-listview-filter { margin: -10px -15px 10px -15px; border-bottom: inherit; }
-.ui-listview-filter-inset { margin: -15px -5px; background: transparent; }
-.ui-collapsible-content .ui-listview-filter-inset { margin: -5px; border-bottom-width: 0; }
-.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; }
-.ui-li.ui-screen-hidden{ display:none; }
-/* Odd iPad positioning issue. */
-@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
- .ui-li .ui-btn-text { overflow: visible; }
-}
-label.ui-slider {
- font-size: 16px;
- line-height: 1.4;
- font-weight: normal;
- margin: 0;
- display: block;
-}
-.ui-field-contain label.ui-slider {
- margin-bottom: .4em;
-}
-div.ui-slider {
- height: 30px;
- margin: .5em 0;
- zoom: 1;
-}
-div.ui-slider.ui-mini {
- margin: .25em 0;
-}
-.ui-field-contain div.ui-slider,
-.ui-field-contain div.ui-slider.ui-mini {
- margin: 0;
-}
-div.ui-slider:before, div.ui-slider:after {
- content: "";
- display: table;
-}
-div.ui-slider:after {
- clear: both;
-}
-/* High level of specificity to override Textinput CSS. */
-input.ui-input-text.ui-slider-input {
- display: block;
- float: left;
- margin: 0;
- padding: 4px;
- width: 40px;
- height: 22px;
- line-height: 22px;
- font-size: 14px;
- border-width: 0;
- background-image: none;
- font-weight: bold;
- text-align: center;
- vertical-align: text-bottom;
- outline: 0;
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- -ms-box-sizing: content-box;
- box-sizing: content-box;
-}
-.ui-slider-input::-webkit-outer-spin-button,
-.ui-slider-input::-webkit-inner-spin-button {
- -webkit-appearance: none;
- margin: 0;
-}
-.ui-slider-track,
-.ui-slider-switch {
- position: relative;
- overflow: visible;
- height: 15px;
- margin: 0 15px 0 68px;
- top: 6px;
-}
-.ui-slider-track.ui-mini {
- height: 12px;
- top: 8px;
-}
-.ui-slider-bg {
- border: none;
- height: 100%;
-}
-/* High level of specificity to override button margins in grids */
-.ui-slider-track .ui-btn.ui-slider-handle,
-.ui-slider-switch .ui-btn.ui-slider-handle {
- position: absolute;
- z-index: 1;
- top: 50%;
- width: 28px;
- height: 28px;
- margin: -15px 0 0 -15px;
- outline: 0;
-}
-.ui-slider-track.ui-mini .ui-slider-handle {
- height: 14px;
- width: 14px;
- margin: -8px 0 0 -7px;
-}
-.ui-slider-handle .ui-btn-inner {
- padding: 0;
- height: 100%;
-}
-.ui-slider-track.ui-mini .ui-slider-handle .ui-btn-inner {
- height: 30px;
- width: 30px;
- padding: 0;
- margin: -9px 0 0 -9px;
- border-top: none;
-}
-select.ui-slider-switch {
- display: none;
-}
-div.ui-slider-switch {
- display: inline-block;
- height: 32px;
- width: 5.8em;
- margin: .5em 0;
- top: 0;
-}
-/* reset the clearfix */
-div.ui-slider-switch:before, div.ui-slider-switch:after {
- display: none;
- clear: none;
-}
-div.ui-slider-switch.ui-mini {
- width: 5em;
- height: 29px;
- margin: .25em 0;
- top: 0;
-}
-.ui-field-contain .ui-slider-switch,
-.ui-field-contain .ui-slider-switch.ui-mini {
- margin: 0;
-}
-.ui-slider-inneroffset {
- margin: 0 16px;
- position: relative;
- z-index: 1;
-}
-.ui-slider-switch.ui-mini .ui-slider-inneroffset {
- margin: 0 15px 0 14px;
-}
-.ui-slider-switch .ui-btn.ui-slider-handle {
- margin: 1px 0 0 -15px;
-}
-.ui-slider-switch.ui-mini .ui-slider-handle {
- width: 25px;
- height: 25px;
- margin: 1px 0 0 -13px;
- padding: 0;
-}
-.ui-slider-handle-snapping {
- -webkit-transition: left 70ms linear;
- -moz-transition: left 70ms linear;
-}
-.ui-slider-switch.ui-mini .ui-slider-handle .ui-btn-inner {
- height: 30px;
- width: 30px;
- padding: 0;
- margin: 0;
- border-top: none;
-}
-.ui-slider-switch .ui-slider-label {
- position: absolute;
- text-align: center;
- width: 100%;
- overflow: hidden;
- font-size: 16px;
- top: 0;
- line-height: 2;
- min-height: 100%;
- border-width: 0;
- white-space: nowrap;
- cursor: pointer;
-}
-.ui-slider-switch.ui-mini .ui-slider-label {
- font-size: 14px;
-}
-.ui-slider-switch .ui-slider-label-a {
- z-index: 1;
- left: 0;
- text-indent: -1.5em;
-}
-.ui-slider-switch .ui-slider-label-b {
- z-index: 0;
- right: 0;
- text-indent: 1.5em;
-}
-@media all and (min-width: 28em){
- .ui-field-contain label.ui-slider {
- vertical-align: top;
- display: inline-block;
- width: 20%;
- margin: 0 2% 0 0;
- }
- .ui-field-contain div.ui-slider {
- display: inline-block;
- width: 78%;
- }
- .ui-field-contain.ui-hide-label div.ui-slider {
- display: block;
- width: auto;
- }
- .ui-field-contain div.ui-slider-switch,
- .ui-field-contain.ui-hide-label div.ui-slider-switch {
- display: inline-block;
- width: 5.8em;
- }
- .ui-field-contain div.ui-slider-switch.ui-mini {
- width: 5em;
- }
-}
-.ui-table {
- border: 0;
- border-collapse: collapse;
- padding: 0;
- width: 100%;
-}
-.ui-table th,
-.ui-table td {
- line-height: 1.5em;
- text-align: left;
- padding: .4em .5em;
- vertical-align:top;
-}
-.ui-table th .ui-btn,
-.ui-table td .ui-btn {
- line-height: normal;
-}
-.ui-table th {
- font-weight: bold;
-}
-.ui-table caption {
- text-align:left;
- margin-bottom:1.4em;
- opacity: .5;
-}
-/* Add strokes between each row */
-.table-stroke thead th {
- border-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */
- border-bottom: 1px solid rgba(0, 0, 0, .1);
-}
-.table-stroke tbody th,
-.table-stroke tbody td {
- border-bottom: 1px solid #e6e6e6; /* non-RGBA fallback */
- border-bottom: 1px solid rgba(0, 0, 0, .05);
-}
-/* Add alternating row stripes */
-.table-stripe tbody tr:nth-child(odd) td,
-.table-stripe tbody tr:nth-child(odd) th {
- background-color: #eeeeee; /* non-RGBA fallback */
- background-color: rgba(0,0,0,0.04);
-}
-/* Add stroke to the header and last item */
-.table-stripe thead th,
-.table-stripe tbody tr:last-child {
- border-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */
- border-bottom: 1px solid rgba(0, 0, 0, .1);
-}
-/*
- Styles for the table columntoggle mode
-*/
-.ui-table-columntoggle-btn {
- float: right;
- margin-bottom:.8em;
-}
-/* Remove top/bottom margins around the fieldcontain on check list */
-.ui-table-columntoggle-popup fieldset {
- margin:0;
-}
-/* Hide all prioritized columns by default */
-@media only all {
- th.ui-table-priority-6,
- td.ui-table-priority-6,
- th.ui-table-priority-5,
- td.ui-table-priority-5,
- th.ui-table-priority-4,
- td.ui-table-priority-4,
- th.ui-table-priority-3,
- td.ui-table-priority-3,
- th.ui-table-priority-2,
- td.ui-table-priority-2,
- th.ui-table-priority-1,
- td.ui-table-priority-1 {
- display: none;
- }
-}
-/* Preset breakpoints if ".ui-responsive" class added to table */
-/* Show priority 1 at 320px (20em x 16px) */
-@media screen and (min-width: 20em) {
- .ui-table-columntoggle.ui-responsive th.ui-table-priority-1,
- .ui-table-columntoggle.ui-responsive td.ui-table-priority-1 {
- display: table-cell;
- }
-}
-/* Show priority 2 at 480px (30em x 16px) */
-@media screen and (min-width: 30em) {
- .ui-table-columntoggle.ui-responsive th.ui-table-priority-2,
- .ui-table-columntoggle.ui-responsive td.ui-table-priority-2 {
- display: table-cell;
- }
-}
-/* Show priority 3 at 640px (40em x 16px) */
-@media screen and (min-width: 40em) {
- .ui-table-columntoggle.ui-responsive th.ui-table-priority-3,
- .ui-table-columntoggle.ui-responsive td.ui-table-priority-3 {
- display: table-cell;
- }
-}
-/* Show priority 4 at 800px (50em x 16px) */
-@media screen and (min-width: 50em) {
- .ui-table-columntoggle.ui-responsive th.ui-table-priority-4,
- .ui-table-columntoggle.ui-responsive td.ui-table-priority-4 {
- display: table-cell;
- }
-}
-/* Show priority 5 at 960px (60em x 16px) */
-@media screen and (min-width: 60em) {
- .ui-table-columntoggle.ui-responsive th.ui-table-priority-5,
- .ui-table-columntoggle.ui-responsive td.ui-table-priority-5 {
- display: table-cell;
- }
-}
-/* Show priority 6 at 1,120px (70em x 16px) */
-@media screen and (min-width: 70em) {
- .ui-table-columntoggle.ui-responsive th.ui-table-priority-6,
- .ui-table-columntoggle.ui-responsive td.ui-table-priority-6 {
- display: table-cell;
- }
-}
-/* Unchecked manually: Always hide */
-.ui-table-columntoggle th.ui-table-cell-hidden,
-.ui-table-columntoggle td.ui-table-cell-hidden,
-.ui-table-columntoggle.ui-responsive th.ui-table-cell-hidden,
-.ui-table-columntoggle.ui-responsive td.ui-table-cell-hidden {
- display: none;
-}
-/* Checked manually: Always show */
-.ui-table-columntoggle th.ui-table-cell-visible,
-.ui-table-columntoggle td.ui-table-cell-visible,
-.ui-table-columntoggle.ui-responsive th.ui-table-cell-visible,
-.ui-table-columntoggle.ui-responsive td.ui-table-cell-visible {
- display: table-cell;
-}
-/*
- Styles for the table columntoggle mode
-*/
-.ui-table-reflow td .ui-table-cell-label,
-.ui-table-reflow th .ui-table-cell-label {
- display: none;
-}
-/* Mobile first styles: Begin with the stacked presentation at narrow widths */
-@media only all {
- /* Hide the table headers */
- .ui-table-reflow thead td,
- .ui-table-reflow thead th {
- display: none;
- }
- /* Show the table cells as a block level element */
- .ui-table-reflow td,
- .ui-table-reflow th {
- text-align: left;
- display: block;
- }
- /* Add a fair amount of top margin to visually separate each row when stacked */
- .ui-table-reflow tbody th {
- margin-top: 3em;
- }
- /* Make the label elements a percentage width */
- .ui-table-reflow td .ui-table-cell-label,
- .ui-table-reflow th .ui-table-cell-label {
- display: block;
- padding: .4em;
- min-width: 30%;
- display: inline-block;
- margin: -.4em 1em -.4em -.4em;
- }
- /* For grouped headers, have a different style to visually separate the levels by classing the first label in each col group */
- .ui-table-reflow th .ui-table-cell-label-top,
- .ui-table-reflow td .ui-table-cell-label-top {
- display: block;
- padding: .4em 0;
- margin: .4em 0;
- text-transform: uppercase;
- font-size: .9em;
- font-weight: normal;
- }
-}
-/* Breakpoint to show as a standard table at 560px (35em x 16px) or wider */
-@media ( min-width: 35em ) {
- /* Fixes table rendering when switching between breakpoints in Safari <= 5. See https://github.com/jquery/jquery-mobile/issues/5380 */
- .ui-table-reflow.ui-responsive {
- display: table-row-group;
- }
- /* Show the table header rows */
- .ui-table-reflow.ui-responsive td,
- .ui-table-reflow.ui-responsive th,
- .ui-table-reflow.ui-responsive tbody th,
- .ui-table-reflow.ui-responsive tbody td,
- .ui-table-reflow.ui-responsive thead td,
- .ui-table-reflow.ui-responsive thead th {
- display: table-cell;
- margin: 0;
- }
- /* Hide the labels in each cell */
- .ui-table-reflow.ui-responsive td .ui-table-cell-label,
- .ui-table-reflow.ui-responsive th .ui-table-cell-label {
- display: none;
- }
-}
-/* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */
-/* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/
-@media ( max-width: 35em ) {
- .ui-table-reflow.ui-responsive td,
- .ui-table-reflow.ui-responsive th {
- width: 100%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- float: left;
- clear: left;
- }
-}
-/* panel */
-.ui-panel {
- width: 17em;
- min-height: 100%;
- max-height: none;
- border-width: 0;
- position: absolute;
- top: 0;
- display: block;
-}
-.ui-panel-closed {
- width: 0;
- max-height: 100%;
- overflow: hidden;
- visibility: hidden;
-}
-.ui-panel-fixed {
- position: fixed;
- bottom: -1px; /* fixes gap on Chrome for Android */
- padding-bottom: 1px;
-}
-.ui-panel-display-overlay {
- z-index: 1001; /* fixed toolbars have z-index 1000 */
-}
-.ui-panel-display-reveal {
- z-index: 0;
-}
-.ui-panel-display-push {
- z-index: 999;
-}
-.ui-panel-inner {
- padding: 15px;
-}
-/* content-wrap */
-.ui-panel-content-wrap {
- position: relative;
- left: 0;
- min-height: inherit;
- border: none;
- z-index: 999;
-}
-.ui-panel-content-wrap-display-overlay,
-.ui-panel-animate.ui-panel-content-wrap > .ui-header, /* ios4 fix */
-.ui-panel-content-wrap-closed {
- position: static;
-}
-/* dismiss */
-.ui-panel-dismiss {
- position: absolute;
- top: 0;
- left:0;
- height: 100%;
- width: 100%;
- z-index: 1002;
- display: none;
-}
-.ui-panel-dismiss-open {
- display: block;
-}
-/* animate class is added to panel, wrapper and fixed toolbars */
-.ui-panel-animate {
- -webkit-transition: -webkit-transform 350ms ease;
- -moz-transition: -moz-transform 350ms ease;
- transition: transform 350ms ease;
-}
-/* hardware acceleration for smoother transitions on WebKit browsers */
-.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal),
-.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal) > div,
-.ui-panel-animate.ui-panel-closed.ui-panel-display-reveal > div,
-.ui-panel-animate.ui-panel-content-wrap,
-.ui-panel-animate.ui-panel-content-fixed-toolbar {
- -webkit-backface-visibility: hidden;
- -webkit-transform: translate3d(0,0,0);
-}
-/* positioning: panel */
-/* panel left */
-.ui-panel-position-left {
- left: -17em;
-}
-/* animated: panel left (for overlay and push) */
-.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay,
-.ui-panel-animate.ui-panel-position-left.ui-panel-display-push {
- left: 0;
- -webkit-transform: translate3d(-17em,0,0);
- -moz-transform: translate3d(-17em,0,0);
- transform: translate3d(-17em,0,0);
-}
-/* panel left open */
-.ui-panel-position-left.ui-panel-display-reveal, /* negate "panel left" for reveal */
-.ui-panel-position-left.ui-panel-open {
- left: 0;
-}
-/* animated: panel left open (for overlay and push) */
-.ui-panel-animate.ui-panel-position-left.ui-panel-open.ui-panel-display-overlay,
-.ui-panel-animate.ui-panel-position-left.ui-panel-open.ui-panel-display-push {
- -webkit-transform: translate3d(0,0,0);
- transform: translate3d(0,0,0);
- -moz-transform: none;
-}
-/* panel right */
-.ui-panel-position-right {
- right: -17em;
-}
-/* animated: panel right (for overlay and push) */
-.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay,
-.ui-panel-animate.ui-panel-position-right.ui-panel-display-push {
- right: 0;
- -webkit-transform: translate3d(17em,0,0);
- -moz-transform: translate3d(17em,0,0);
- transform: translate3d(17em,0,0);
-}
-/* panel right open */
-.ui-panel-position-right.ui-panel-display-reveal, /* negate "panel right" for reveal */
-.ui-panel-position-right.ui-panel-open {
- right: 0;
-}
-/* animated: panel right open (for overlay and push) */
-.ui-panel-animate.ui-panel-position-right.ui-panel-open.ui-panel-display-overlay,
-.ui-panel-animate.ui-panel-position-right.ui-panel-open.ui-panel-display-push {
- -webkit-transform: translate3d(0,0,0);
- transform: translate3d(0,0,0);
- -moz-transform: none;
-}
-/* positioning: content wrap, fixed toolbars and dismiss */
-/* panel left open */
-.ui-panel-content-fixed-toolbar-position-left.ui-panel-content-fixed-toolbar-open,
-.ui-panel-content-wrap-position-left.ui-panel-content-wrap-open,
-.ui-panel-dismiss-position-left.ui-panel-dismiss-open {
- left: 17em;
- right: -17em;
-}
-/* animated: panel left open (for reveal and push) */
-.ui-panel-animate.ui-panel-content-fixed-toolbar-position-left.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-reveal,
-.ui-panel-animate.ui-panel-content-fixed-toolbar-position-left.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-push,
-.ui-panel-animate.ui-panel-content-wrap-position-left.ui-panel-content-wrap-open.ui-panel-content-wrap-display-reveal,
-.ui-panel-animate.ui-panel-content-wrap-position-left.ui-panel-content-wrap-open.ui-panel-content-wrap-display-push {
- left: 0;
- right: 0;
- -webkit-transform: translate3d(17em,0,0);
- -moz-transform: translate3d(17em,0,0);
- transform: translate3d(17em,0,0);
-}
-/* panel right open */
-.ui-panel-content-fixed-toolbar-position-right.ui-panel-content-fixed-toolbar-open,
-.ui-panel-content-wrap-position-right.ui-panel-content-wrap-open,
-.ui-panel-dismiss-position-right.ui-panel-dismiss-open {
- left: -17em;
- right: 17em;
-}
-/* animated: panel right open (for reveal and push) */
-.ui-panel-animate.ui-panel-content-fixed-toolbar-position-right.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-reveal,
-.ui-panel-animate.ui-panel-content-fixed-toolbar-position-right.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-push,
-.ui-panel-animate.ui-panel-content-wrap-position-right.ui-panel-content-wrap-open.ui-panel-content-wrap-display-reveal,
-.ui-panel-animate.ui-panel-content-wrap-position-right.ui-panel-content-wrap-open.ui-panel-content-wrap-display-push {
- left: 0;
- right: 0;
- -webkit-transform: translate3d(-17em,0,0);
- -moz-transform: translate3d(-17em,0,0);
- transform: translate3d(-17em,0,0);
-}
-/* negate "panel left/right open" for overlay */
-.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-overlay,
-.ui-panel-content-wrap-open.ui-panel-content-wrap-display-overlay {
- left: 0;
-}
-/* always disable overflow-x to prevent zoom issue on Android */
-.ui-page-active.ui-page-panel {
- overflow-x: hidden;
-}
-/* shadows and borders */
-.ui-panel-display-reveal {
- -webkit-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);
- -moz-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);
- box-shadow: inset -5px 0 5px rgba(0,0,0,.15);
-}
-.ui-panel-position-right.ui-panel-display-reveal {
- -webkit-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);
- -moz-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);
- box-shadow: inset 5px 0 5px rgba(0,0,0,.15);
-}
-.ui-panel-display-overlay {
- -webkit-box-shadow: 5px 0 5px rgba(0,0,0,.15);
- -moz-box-shadow: 5px 0 5px rgba(0,0,0,.15);
- box-shadow: 5px 0 5px rgba(0,0,0,.15);
-}
-.ui-panel-position-right.ui-panel-display-overlay {
- -webkit-box-shadow: -5px 0 5px rgba(0,0,0,.15);
- -moz-box-shadow: -5px 0 5px rgba(0,0,0,.15);
- box-shadow: -5px 0 5px rgba(0,0,0,.15);
-}
-.ui-panel-display-push.ui-panel-open.ui-panel-position-left {
- border-right-width: 1px;
- margin-right: -1px;
-}
-.ui-panel-animate.ui-panel-content-fixed-toolbar-position-left.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-push {
- margin-left: 1px;
-}
-.ui-panel-display-push.ui-panel-open.ui-panel-position-right {
- border-left-width: 1px;
- margin-left: -1px;
-}
-.ui-panel-animate.ui-panel-content-fixed-toolbar-position-right.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-push {
- margin-right: 1px;
-}
-/* wrap on wide viewports once open */
-@media (min-width:55em){
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-push.ui-panel-content-fixed-toolbar-position-left,
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-reveal.ui-panel-content-fixed-toolbar-position-left,
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-wrap-display-push.ui-panel-content-wrap-position-left,
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-wrap-display-reveal.ui-panel-content-wrap-position-left {
- margin-right: 17em;
- }
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-push.ui-panel-content-fixed-toolbar-position-right,
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-reveal.ui-panel-content-fixed-toolbar-position-right,
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-wrap-display-push.ui-panel-content-wrap-position-right,
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-wrap-display-reveal.ui-panel-content-wrap-position-right {
- margin-left: 17em;
- }
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-push,
- .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-reveal {
- width: auto;
- }
- .ui-responsive-panel .ui-panel-dismiss-display-push {
- display: none;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
- body {
-}
-/* this makes the toggle buttons align to the right of the screen */
-.ui-field-contain div.ui-slider-switch {
- position: absolute;
- text-align: center;
- top: 0;
- bottom: 0;
- margin: auto;
- right: 10px;
-}
-/* WiFi */
-#wifi_networks {
- display: none;
-}
-.network-connected .network-status {
- color: green;
-}
-.network-ssid {
- font-size: 15px;
-}
-.network-encryption {
- font-size: 10px;
-}
-.network-strength {
- font-size: 10px;
-}
-.network-address {
- font-size: 10px;
-}
-.network-status {
- font-size: 10px;
-}
-.network-action-button {
- max-width: 150px;
- text-align: center;
-}
-/* make the button text so that it doesn't add the ellipsis */
-.network-action-button .ui-btn-inner {
- text-overflow: initial;
-}
-/* make room for bottom for bottom of the screen due to weston compositor */
-#button_wifi_add {
- margin-bottom: 100px;
-}
-/* Bluetooth */
-#bluetooth_devices {
- display: none;
-}
-.device-paired .device-status {
- color: green;
-}
-.device-connected .device-status {
- color: blue;
-}
-.device-name {
- font-size: 10px;
-}
-.device-address {
- font-size: 10px;
-}
-.device-status {
- font-size: 10px;
-}
-.device-action-button {
- max-width: 150px;
- text-align: center;
-}
-/* Date and Time */
-#button_datetime_apply, #button_datetime_cancel{
- display: none;
-}
-/* make the button text so that it doesn't add the ellipsis */
-.device-action-button .ui-btn-inner {
- text-overflow: initial;
-}
-/* make room for bottom for bottom of the screen due to weston compositor */
-#button_bluetooth_scan {
- margin-bottom: 100px;
-}
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<!--
-* Copyright (c) 2013, Intel Corporation.
-*
-* This program is licensed under the terms and conditions of the
-* Apache License, version 2.0. The full text of the Apache License is at
-* http://www.apache.org/licenses/LICENSE-2.0
-*
--->
-<html>
-<head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
-
- <title>Settings</title>
-
- <link rel="stylesheet" href="./css/jquery.mobile-1.3.1.css"/>
- <script type="text/javascript" src="./js/jquery-1.10.1.js"></script>
- <script type="text/javascript" src="./js/jquery.mobile-1.3.1.js"></script>
- <script type="text/javascript" src="./js/main.js"></script>
- <script type="text/javascript" src="./js/utils.js"></script>
- <script type="text/javascript" src="./js/websocket.js"></script>
- <script type="text/javascript" src="./js/api-wifi.js"></script>
- <script type="text/javascript" src="./js/api-bluetooth.js"></script>
- <script type="text/javascript" src="./js/api-datetime.js"></script>
- <script type="text/javascript" src="./js/panel-wifi.js"></script>
- <script type="text/javascript" src="./js/panel-bluetooth.js"></script>
- <script type="text/javascript" src="./js/panel-datetime.js"></script>
- <link rel="stylesheet" href="./css/style.css" />
-</head>
-
-<body>
- <!-- Settings -->
- <div data-role="page" id="main">
- <div data-role="header" data-position="fixed">
- <a href="" id="quit" data-icon="back">Quit</a>
- <h1>Settings</h1>
- </div><!-- /header -->
-
- <div data-role="collapsible-set">
- <div data-role="collapsible" id="col_connectivity" data-collapsed="false">
- <h3>Connectivity</h3>
- <div data-role="content">
- <ul data-role="listview">
- <li>
- <a href="#page_wifi" id="button_wifi_settings">Wi-Fi</a>
- </li>
- <li>
- <a href="#page_bluetooth" id="button_bluetooth_settings">Bluetooth</a>
- </li>
- </ul>
- </div>
- </div>
- </div>
-
- <div data-role="collapsible-set">
- <div data-role="collapsible" id="col_system" data-collapsed="false">
- <h3>System</h3>
- <div data-role="content">
- <ul data-role="listview">
- <li>
- <a href="#page_datetime" id="button_datetime_settings">Date and Time</a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </div>
-
- <!-- Wi-Fi Settings -->
- <div data-role="page" id="page_wifi">
- <div data-role="header" data-position="fixed">
- <a href="#main" data-icon="back">Back</a>
- <h1>Wi-Fi</h1>
- </div>
-
- <div data-role="content">
- <div class="adapter-info">
- <div class="adapter-name">
- <div id="label_wifi_adapter"></div>
- </div>
- </div>
- <ul data-role="listview" data-inset="true" class="ui-listview ui-listview-inset">
- <li data-role="fieldcontain">
- <label for="toggle_wifi" class="ui-slider">WiFi</label>
- <select data-role="slider" name="toggle_wifi" id="toggle_wifi" class="ui-slider-switch">
- <option value="off">Off</option>
- <option value="on">On</option>
- </select>
- </li>
- </ul>
- <div id="wifi_networks">
- <div><p>Available Networks</p></div>
- <ul data-role="listview" id="listview_network_known" data-inset="true" class="device-list ui-listview"></ul>
- <ul data-role="listview" id="listview_network_available" data-inset="true" class="device-list ui-listview"></ul>
- <div data-role="button" id="button_wifi_refresh">Refresh</div>
- <div data-role="button" id="button_wifi_add">Add</div>
- </div>
- </div>
- </div>
-
- <!-- WiFi Network Info -->
- <div data-role="page" id="page_wifi_detail">
- <div data-role="header" data-position="fixed">
- <a href="#page_wifi" data-icon="back">Back</a>
- <h1>Network Info</h1>
- </div>
-
- <div data-role="content" id="page_wifi_detail_content">
- </div>
- </div>
-
- <!-- WiFi Add New Network -->
- <div data-role="page" id="page_wifi_add">
- <div data-role="header" data-position="fixed">
- <a href="#page_wifi" id="page_wifi_button_back" data-icon="back">Back</a>
- <h1>Add Network</h1>
- <a href="#" id="page_wifi_button_add" data-icon="plus">Add</a>
- </div>
-
- <div data-role="content" id="page_wifi_add_content">
- <label for="input_wifi_ssid">SSID:</label>
- <input type="text" name="name" id="input_wifi_ssid" value="" />
-
- <label for="select_wifi_security" class="select">Security:</label>
- <ul data-role="listview" data-inset="true" class="device-list ui-listview">
- <li>
- <select name="select_wifi_security" id="select_wifi_security">
- <option value="None">None</option>
- <option value="WEP">WEP</option>
- <option value="WPA">WPA</option>
- <option value="WPA2">WPA2</option>
- <option value="WPA_Enterprise">WPA Enterprise</option>
- <option value="WPA2_Enterprise">WPA2 Enterprise</option>
- </select>
- </li>
- <li id="page_wifi_password">
- <label for="input_wifi_password">Password:</label>
- <input type="password" name="name" id="input_wifi_password" value="" />
- </li>
- </ul>
- </div>
- </div>
-
- <!-- Bluetooth Settings -->
- <div data-role="page" id="page_bluetooth">
- <div data-role="header" data-position="fixed">
- <a href="#main" data-icon="back">Back</a>
- <h1>Bluetooth</h1>
- </div>
-
- <div data-role="content">
- <div class="adapter-info">
- <div class="adapter-name">
- <div id="label_bluetooth_adapter"></div>
- </div>
- </div>
- <ul data-role="listview" data-inset="true" class="ui-listview ui-listview-inset">
- <li data-role="fieldcontain">
- <label for="toggle_bluetooth" class="ui-slider">Bluetooth</label>
- <select data-role="slider" name="toggle_bluetooth" id="toggle_bluetooth" class="ui-slider-switch">
- <option value="off">Off</option>
- <option value="on">On</option>
- </select>
- </li>
- </ul>
- <div id="bluetooth_devices">
- <div><p>Available Devices</p></div>
- <ul data-role="listview" id="listview_device_paired" data-inset="true" class="device-list ui-listview"></ul>
- <ul data-role="listview" id="listview_device_available" data-inset="true" class="device-list ui-listview"></ul>
- <div data-role="button" id="button_bluetooth_scan">Scan</div>
- </div>
- </div>
- </div>
-
- <!-- Bluetooth Device Info -->
- <div data-role="page" id="page_bluetooth_detail">
- <div data-role="header" data-position="fixed">
- <a href="#page_bluetooth" data-icon="back">Back</a>
- <h1>Device Info</h1>
- </div>
-
- <div data-role="content" id="page_bluetooth_detail_content">
- </div>
- </div>
-
- <!-- Date and Time Settings -->
- <div data-role="page" id="page_datetime">
- <div data-role="header" data-position="fixed">
- <a href="#main" id="page_datetime_button_back" data-icon="back">Back</a>
- <h1>Date and Time</h1>
- </div>
-
- <div data-role="content">
- <ul data-role="listview" data-inset="true" class="ui-listview ui-listview-inset">
- <li data-role="fieldcontain">
- <label for="toggle_timeupdates" class="ui-slider">Automatic time</label>
- <select data-role="slider" name="toggle_timeupdates" id="toggle_timeupdates" class="ui-slider-switch">
- <option value="manual">Off</option>
- <option value="auto">On</option>
- </select>
- </li>
- </ul>
- <ul data-role="listview" data-inset="true" class="ui-listview ui-listview-inset">
- <li data-role="fieldcontain">
- <label for="input_time">Time (hh:mm:ss):</label>
- <input type="text" data-clear-btn="false" name="input_time" id="input_time" value="">
- </li>
- </ul>
- <ul data-role="listview" data-inset="true" class="ui-listview ui-listview-inset">
- <li data-role="fieldcontain">
- <label for="input_date">Date (yyyy-mm-dd):</label>
- <input type="text" data-clear-btn="false" name="input_date" id="input_date" value="">
- </li>
- </ul>
- <ul data-role="listview" data-inset="true" class="ui-listview ui-listview-inset">
- <li data-role="fieldcontain">
- <label for="toggle_timezoneupdates" class="ui-slider">Automatic time zone</label>
- <select data-role="slider" name="toggle_timezoneupdates" id="toggle_timezoneupdates" class="ui-slider-switch">
- <option value="manual">Off</option>
- <option value="auto">On</option>
- </select>
- </li>
- </ul>
- <ul data-role="listview" data-inset="true" class="ui-listview ui-listview-inset">
- <li data-role="fieldcontain">
- <label for="select_timezone" class="select">Time zone:</label>
- <select name="select_timezone" id="select_timezone">
- <option value="Pacific/Midway">(GMT-11:00) Midway Island, Samoa</option>
- <option value="America/Adak">(GMT-10:00) Hawaii-Aleutian</option>
- <option value="Etc/GMT+10">(GMT-10:00) Hawaii</option>
- <option value="Pacific/Marquesas">(GMT-09:30) Marquesas Islands</option>
- <option value="Pacific/Gambier">(GMT-09:00) Gambier Islands</option>
- <option value="America/Anchorage">(GMT-09:00) Alaska</option>
- <option value="America/Ensenada">(GMT-08:00) Tijuana, Baja California</option>
- <option value="Etc/GMT+8">(GMT-08:00) Pitcairn Islands</option>
- <option value="America/Los_Angeles">(GMT-08:00) Pacific Time (US & Canada)</option>
- <option value="America/Denver">(GMT-07:00) Mountain Time (US & Canada)</option>
- <option value="America/Chihuahua">(GMT-07:00) Chihuahua, La Paz, Mazatlan</option>
- <option value="America/Dawson_Creek">(GMT-07:00) Arizona</option>
- <option value="America/Belize">(GMT-06:00) Saskatchewan, Central America</option>
- <option value="America/Cancun">(GMT-06:00) Guadalajara, Mexico City, Monterrey</option>
- <option value="Chile/EasterIsland">(GMT-06:00) Easter Island</option>
- <option value="America/Chicago">(GMT-06:00) Central Time (US & Canada)</option>
- <option value="America/New_York">(GMT-05:00) Eastern Time (US & Canada)</option>
- <option value="America/Havana">(GMT-05:00) Cuba</option>
- <option value="America/Bogota">(GMT-05:00) Bogota, Lima, Quito, Rio Branco</option>
- <option value="America/Caracas">(GMT-04:30) Caracas</option>
- <option value="America/Santiago">(GMT-04:00) Santiago</option>
- <option value="America/La_Paz">(GMT-04:00) La Paz</option>
- <option value="Atlantic/Stanley">(GMT-04:00) Faukland Islands</option>
- <option value="America/Campo_Grande">(GMT-04:00) Brazil</option>
- <option value="America/Goose_Bay">(GMT-04:00) Atlantic Time (Goose Bay)</option>
- <option value="America/Glace_Bay">(GMT-04:00) Atlantic Time (Canada)</option>
- <option value="America/St_Johns">(GMT-03:30) Newfoundland</option>
- <option value="America/Araguaina">(GMT-03:00) UTC-3</option>
- <option value="America/Montevideo">(GMT-03:00) Montevideo</option>
- <option value="America/Miquelon">(GMT-03:00) Miquelon, St. Pierre</option>
- <option value="America/Godthab">(GMT-03:00) Greenland</option>
- <option value="America/Argentina/Buenos_Aires">(GMT-03:00) Buenos Aires</option>
- <option value="America/Sao_Paulo">(GMT-03:00) Brasilia</option>
- <option value="America/Noronha">(GMT-02:00) Mid-Atlantic</option>
- <option value="Atlantic/Cape_Verde">(GMT-01:00) Cape Verde Is.</option>
- <option value="Atlantic/Azores">(GMT-01:00) Azores</option>
- <option value="Europe/Belfast">(GMT) Greenwich Mean Time : Belfast</option>
- <option value="Europe/Dublin">(GMT) Greenwich Mean Time : Dublin</option>
- <option value="Europe/Lisbon">(GMT) Greenwich Mean Time : Lisbon</option>
- <option value="Europe/London">(GMT) Greenwich Mean Time : London</option>
- <option value="Africa/Abidjan">(GMT) Monrovia, Reykjavik</option>
- <option value="Europe/Amsterdam">(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
- <option value="Europe/Belgrade">(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
- <option value="Europe/Brussels">(GMT+01:00) Brussels, Copenhagen, Madrid, Paris</option>
- <option value="Africa/Algiers">(GMT+01:00) West Central Africa</option>
- <option value="Africa/Windhoek">(GMT+01:00) Windhoek</option>
- <option value="Asia/Beirut">(GMT+02:00) Beirut</option>
- <option value="Africa/Cairo">(GMT+02:00) Cairo</option>
- <option value="Asia/Gaza">(GMT+02:00) Gaza</option>
- <option value="Africa/Blantyre">(GMT+02:00) Harare, Pretoria</option>
- <option value="Asia/Jerusalem">(GMT+02:00) Jerusalem</option>
- <option value="Europe/Minsk">(GMT+02:00) Minsk</option>
- <option value="Asia/Damascus">(GMT+02:00) Syria</option>
- <option value="Europe/Moscow">(GMT+03:00) Moscow, St. Petersburg, Volgograd</option>
- <option value="Africa/Addis_Ababa">(GMT+03:00) Nairobi</option>
- <option value="Asia/Tehran">(GMT+03:30) Tehran</option>
- <option value="Asia/Dubai">(GMT+04:00) Abu Dhabi, Muscat</option>
- <option value="Asia/Yerevan">(GMT+04:00) Yerevan</option>
- <option value="Asia/Kabul">(GMT+04:30) Kabul</option>
- <option value="Asia/Yekaterinburg">(GMT+05:00) Ekaterinburg</option>
- <option value="Asia/Tashkent">(GMT+05:00) Tashkent</option>
- <option value="Asia/Kolkata">(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi</option>
- <option value="Asia/Katmandu">(GMT+05:45) Kathmandu</option>
- <option value="Asia/Dhaka">(GMT+06:00) Astana, Dhaka</option>
- <option value="Asia/Novosibirsk">(GMT+06:00) Novosibirsk</option>
- <option value="Asia/Rangoon">(GMT+06:30) Yangon (Rangoon)</option>
- <option value="Asia/Bangkok">(GMT+07:00) Bangkok, Hanoi, Jakarta</option>
- <option value="Asia/Krasnoyarsk">(GMT+07:00) Krasnoyarsk</option>
- <option value="Asia/Hong_Kong">(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
- <option value="Asia/Irkutsk">(GMT+08:00) Irkutsk, Ulaan Bataar</option>
- <option value="Australia/Perth">(GMT+08:00) Perth</option>
- <option value="Australia/Eucla">(GMT+08:45) Eucla</option>
- <option value="Asia/Tokyo">(GMT+09:00) Osaka, Sapporo, Tokyo</option>
- <option value="Asia/Seoul">(GMT+09:00) Seoul</option>
- <option value="Asia/Yakutsk">(GMT+09:00) Yakutsk</option>
- <option value="Australia/Adelaide">(GMT+09:30) Adelaide</option>
- <option value="Australia/Darwin">(GMT+09:30) Darwin</option>
- <option value="Australia/Brisbane">(GMT+10:00) Brisbane</option>
- <option value="Australia/Hobart">(GMT+10:00) Hobart</option>
- <option value="Asia/Vladivostok">(GMT+10:00) Vladivostok</option>
- <option value="Australia/Lord_Howe">(GMT+10:30) Lord Howe Island</option>
- <option value="Etc/GMT-11">(GMT+11:00) Solomon Is., New Caledonia</option>
- <option value="Asia/Magadan">(GMT+11:00) Magadan</option>
- <option value="Pacific/Norfolk">(GMT+11:30) Norfolk Island</option>
- <option value="Asia/Anadyr">(GMT+12:00) Anadyr, Kamchatka</option>
- <option value="Pacific/Auckland">(GMT+12:00) Auckland, Wellington</option>
- <option value="Etc/GMT-12">(GMT+12:00) Fiji, Kamchatka, Marshall Is.</option>
- <option value="Pacific/Chatham">(GMT+12:45) Chatham Islands</option>
- <option value="Pacific/Tongatapu">(GMT+13:00) Nuku\'alofa</option>
- <option value="Pacific/Kiritimati">(GMT+14:00) Kiritimati</option>
- </select>
- </li>
- </ul>
- <div data-role="button" id="button_datetime_apply">Apply</div>
- <div data-role="button" id="button_datetime_cancel">Cancel</div>
- </div>
- </div>
-
-</body>
-</html>
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-/* Namespace */
-var settings = settings || {};
-settings.bluetooth = settings.bluetooth || {};
-
-/* Module */
-settings.bluetooth = (function() {
-
- var default_adapter = null;
-
- /* Adapter class */
- var BluetoothAdapter = function(adapter) {
- this.bt_adapter = adapter;
- this.name = adapter.name;
- this.powered = adapter.powered;
- this.visible = adapter.visible;
- };
-
- BluetoothAdapter.prototype.setPowered = function(powered, success_cb, error_cb) {
- if (this.bt_adapter === undefined) return;
-
- var self = this;
- if (powered) {
- // Power on
- this.bt_adapter.setPowered(true, function() {
- self.powered = self.bt_adapter.powered;
- success_cb();
- }, function(e) {
- self.powered = self.bt_adapter.powered;
- error_cb(e);
- });
- } else {
- // Power off
- this.bt_adapter.setPowered(false, function() {
- self.powered = self.bt_adapter.powered;
- success_cb();
- }, function(e) {
- self.powered = self.bt_adapter.powered;
- error_cb(e);
- });
- }
- };
-
- BluetoothAdapter.prototype.setVisible = function(visible, success_cb, error_cb) {
- if (this.bt_adapter === undefined || !this.bt_adapter.powered) return;
-
- console.log('settings.bluetooth - Failed to set bluetooth visibility - not supported');
- };
-
- BluetoothAdapter.prototype.startScanDevices = function(success_cb, error_cb) {
- if (this.bt_adapter === undefined || !this.bt_adapter.powered) return;
-
- this.bt_adapter.discoverDevices({
- onstarted: success_cb.onstarted,
- ondevicefound: function(device) {
- success_cb.ondevicefound(new BluetoothDevice(device));
- },
- ondevicedisappeared: success_cb.ondevicedisappeared,
- onfinished: function(devices) {
- var arr = [];
- for (var i = 0; i < devices.length; i++) {
- arr.push(new BluetoothDevice(devices[i]));
- }
- success_cb.onfinished(arr);
- }
- }, error_cb);
- };
-
- BluetoothAdapter.prototype.stopScanDevices = function(success_cb, error_cb) {
- if (this.bt_adapter === undefined || !this.bt_adapter.powered) return;
-
- this.bt_adapter.stopDiscovery(success_cb, error_cb);
- };
-
- BluetoothAdapter.prototype.pairDevice = function(device_address, success_cb, error_cb) {
- if (this.bt_adapter === undefined || !this.bt_adapter.powered) return;
-
- this.bt_adapter.createBonding(device_address, success_cb, error_cb);
- };
-
- BluetoothAdapter.prototype.unpairDevice = function(device_address, success_cb, error_cb) {
- if (this.bt_adapter === undefined || !this.bt_adapter.powered) return;
-
- this.bt_adapter.destroyBonding(device_address, success_cb, error_cb);
- };
-
- /* Device class */
- var BluetoothDevice = function(device) {
- this.bt_device = device;
- this.name = device.name;
- this.address = device.address;
- this.paired = device.isBonded;
- this.connected = device.isConnected;
- };
-
- function enableBluetooth(success_cb, error_cb) {
- wsAPI.sendRequest(WS_REQUEST_TYPE.BLUETOOTH, 'enable', true, success_cb, function(e) {
- if (e.indexOf('Already enabled') >= 0) {
- console.log('bluetooth subsystem already enabled');
- success_cb();
- } else {
- error_cb(e);
- }
- });
- }
-
- function disableBluetooth(success_cb, error_cb) {
- wsAPI.sendRequest(WS_REQUEST_TYPE.BLUETOOTH, 'enable', false, success_cb, function(e) {
- if (e.indexOf('Already disabled') >= 0) {
- console.log('bluetooth subsystem already disabled');
- success_cb();
- } else {
- error_cb(e);
- }
- });
- }
-
- function subscribeEvents(event_callback) {
- wsAPI.subscribeEvents(event_callback);
- }
-
- function unsubscribeEvents(event_callback) {
- wsAPI.unsubscribeEvents(event_callback);
- }
-
- function getDefaultAdapter() {
- try {
- if (tizen.bluetooth.getDefaultAdapter() == null) {
- return null;
- } else if (default_adapter == null) {
- default_adapter = new BluetoothAdapter(tizen.bluetooth.getDefaultAdapter());
- }
- return default_adapter;
- } catch (e) {
- console.error('Tizen web api missing ' + e);
- return null;
- }
- };
-
- return {
- BluetoothAdapter: BluetoothAdapter,
- BluetoothDevice: BluetoothDevice,
- subscribeEvents: subscribeEvents,
- unsubscribeEvents: unsubscribeEvents,
- getDefaultAdapter: getDefaultAdapter
- };
-})();
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-/* Namespace */
-var settings = settings || {};
-settings.datetime = settings.datetime || {};
-
-/* Module */
-settings.datetime = (function() {
-
- function isTimeAuto(success_cb, error_cb) {
- wsAPI.sendRequest(WS_REQUEST_TYPE.DATETIME, 'is_time_updates_auto', null, success_cb, error_cb);
- }
-
- function isTimezoneAuto(success_cb, error_cb) {
- wsAPI.sendRequest(WS_REQUEST_TYPE.DATETIME, 'is_timezone_updates_auto', null, success_cb, error_cb);
- }
-
- function setTime(new_time, success_cb, error_cb) {
- wsAPI.sendRequest(WS_REQUEST_TYPE.DATETIME, 'time', new_time, success_cb, error_cb);
- }
-
- function setTimezone(new_timezone, success_cb, error_cb) {
- wsAPI.sendRequest(WS_REQUEST_TYPE.DATETIME, 'timezone', new_timezone, success_cb, error_cb);
- }
-
- function setTimeUpdates(manual_or_auto, success_cb, error_cb) {
- wsAPI.sendRequest(WS_REQUEST_TYPE.DATETIME, 'time_updates', manual_or_auto, success_cb, error_cb);
- }
-
- function setTimezoneUpdates(manual_or_auto, success_cb, error_cb) {
- wsAPI.sendRequest(WS_REQUEST_TYPE.DATETIME, 'timezone_updates', manual_or_auto, success_cb, error_cb);
- }
-
- return {
- isTimeAuto: isTimeAuto,
- isTimezoneAuto: isTimezoneAuto,
- setTime: setTime,
- setTimezone: setTimezone,
- setTimeUpdates: setTimeUpdates,
- setTimezoneUpdates: setTimezoneUpdates
- };
-})();
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-/* Namespace */
-var settings = settings || {};
-settings.wifi = settings.wifi || {};
-
-var WIFI_SECURITY_TYPE = {
- NONE: 0,
- WEP: 1,
- WPA: 2,
- WPA2: 3,
- WPA_ENTERPRISE: 4,
- WPA2_ENTERPRISE: 5
-};
-
-/* Module */
-settings.wifi = (function() {
-
- var default_adapter = null;
-
- /* Adapter class */
- var WiFiAdapter = function(adapter) {
- this.wifi_adapter = adapter;
- this.name = 'Connman-WiFi';
- this.powered = false;
- };
-
- WiFiAdapter.prototype.setPowered = function(powered, success_cb, error_cb) {
- if (wsAPI === undefined) return;
- wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'enable', powered, success_cb, function(e) {
- if (e.indexOf('Already enabled') >= 0) {
- console.log('wifi subsystem already enabled');
- success_cb();
- } else if (e.indexOf('Already disabled') >= 0) {
- console.log('wifi subsystem already disabled');
- success_cb();
- } else {
- error_cb(e);
- }
- });
- };
-
- WiFiAdapter.prototype.getPowered = function(success_cb, error_cb) {
- if (wsAPI === undefined) return;
- var me = this;
- wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'is_enabled', null, function(isEnabled) {
- if (isEnabled === undefined) {
- console.log('Badly formed json message: ' + json_msg);
- }
- me.powered = isEnabled;
- success_cb(me.powered);
- }, error_cb);
- };
-
- WiFiAdapter.prototype.scan = function(success_cb, error_cb) {
- if (wsAPI === undefined) return;
- wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'scan', null, function(results) {
- if (results.length >= 0 && results[0].length >= 0 && results[0][0][0] === undefined) {
- error_cb('Cannot parse scan results');
- return;
- }
-
- var network_list = results[0];
-
- try {
- var results = [];
- for (var i = 0; i < network_list.length; i++) {
- if (network_list[i][1] === undefined) {
- console.log('Badly form json message: ' + json_msg);
- }
- if (network_list[i][1].Type === 'wifi') {
- var network = new settings.wifi.WiFiNetwork(network_list[i][0]);
- if (network_list[i][1].Name !== undefined) {
- network.ssid = network_list[i][1].Name;
- }
- if (network_list[i][1].State === 'ready') {
- network.connected = true;
- } else if (network_list[i][1].State === 'idle') {
- network.connected = false;
- }
- if (network_list[i][1].EncryptionMode !== undefined) {
- network.encryption = network_list[i][1].EncryptionMode;
- }
- if (network_list[i][1].Strength !== undefined) {
- network.strength = network_list[i][1].Strength;
- }
- if (network_list[i][1].IPv4.Address !== undefined) {
- network.ipAddress = network_list[i][1].IPv4.Address;
- }
- if (network_list[i][1].IPv4.Gateway !== undefined) {
- network.gateway = network_list[i][1].IPv4.Gateway;
- }
- if (network_list[i][1].IPv4.Netmask !== undefined) {
- network.netmask = network_list[i][1].IPv4.Netmask;
- }
- results.push(network);
- }
- }
- } catch (e) {
- error_cb(e);
- }
- success_cb(results);
- }, error_cb);
- };
-
- WiFiAdapter.prototype.connectNetwork = function(network_id, security, passcode, success_cb, error_cb) {
- if (wsAPI === undefined) return;
-
- wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'connect', network_id, success_cb, error_cb);
- };
-
- WiFiAdapter.prototype.disconnectNetwork = function(network_id, success_cb, error_cb) {
- if (wsAPI === undefined) return;
- wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'disconnect', network_id, success_cb, error_cb);
- };
-
- /* Network class */
- WiFiNetwork = function(object_path) {
- this.id = object_path;
- this.ssid = '';
- this.connected = false;
- this.security = WIFI_SECURITY_TYPE.NONE;
- this.encryption = 'Unknown';
- this.ipAddress = 'Unknown';
- this.gateway = 'Unknown';
- this.netmask = 'Unknown';
- this.strength = -1;
- };
-
- WiFiNetwork.prototype.getSecurity = function() {
- return this.security;
- }
-
- function subscribeEvents(callback) {
- wsAPI.subscribeEvents(callback);
- }
-
- function unsubscribeEvents(callback) {
- wsAPI.unsubscribeEvents(callback);
- }
-
- function getDefaultAdapter() {
- if (default_adapter === null) {
- default_adapter = new WiFiAdapter(wsAPI);
- }
-
- return default_adapter;
- };
-
- return {
- WiFiAdapter: WiFiAdapter,
- WiFiNetwork: WiFiNetwork,
- subscribeEvents: subscribeEvents,
- unsubscribeEvents: unsubscribeEvents,
- getDefaultAdapter: getDefaultAdapter
- };
-})();
\ No newline at end of file
+++ /dev/null
-/*!
- * jQuery JavaScript Library v1.10.1
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2013-05-30T21:49Z
- */
-(function( window, undefined ) {
-
-// Can't do this because several apps including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-// Support: Firefox 18+
-//"use strict";
-var
- // The deferred used on DOM ready
- readyList,
-
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // Support: IE<10
- // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
- core_strundefined = typeof undefined,
-
- // Use the correct document accordingly with window argument (sandbox)
- location = window.location,
- document = window.document,
- docElem = document.documentElement,
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // [[Class]] -> type pairs
- class2type = {},
-
- // List of deleted data cache ids, so we can reuse them
- core_deletedIds = [],
-
- core_version = "1.10.1",
-
- // Save a reference to some core methods
- core_concat = core_deletedIds.concat,
- core_push = core_deletedIds.push,
- core_slice = core_deletedIds.slice,
- core_indexOf = core_deletedIds.indexOf,
- core_toString = class2type.toString,
- core_hasOwn = class2type.hasOwnProperty,
- core_trim = core_version.trim,
-
- // Define a local copy of jQuery
- jQuery = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Used for matching numbers
- core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
-
- // Used for splitting on whitespace
- core_rnotwhite = /\S+/g,
-
- // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
- // A simple way to check for HTML strings
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- // Strict HTML recognition (#11290: must start with <)
- rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
-
- // Matches dashed string for camelizing
- rmsPrefix = /^-ms-/,
- rdashAlpha = /-([\da-z])/gi,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return letter.toUpperCase();
- },
-
- // The ready event handler
- completed = function( event ) {
-
- // readyState === "complete" is good enough for us to call the dom ready in oldIE
- if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
- detach();
- jQuery.ready();
- }
- },
- // Clean-up method for dom ready events
- detach = function() {
- if ( document.addEventListener ) {
- document.removeEventListener( "DOMContentLoaded", completed, false );
- window.removeEventListener( "load", completed, false );
-
- } else {
- document.detachEvent( "onreadystatechange", completed );
- window.detachEvent( "onload", completed );
- }
- };
-
-jQuery.fn = jQuery.prototype = {
- // The current version of jQuery being used
- jquery: core_version,
-
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem;
-
- // HANDLE: $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = rquickExpr.exec( selector );
- }
-
- // Match html or make sure no context is specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
-
- // scripts is true for back-compat
- jQuery.merge( this, jQuery.parseHTML(
- match[1],
- context && context.nodeType ? context.ownerDocument || context : document,
- true
- ) );
-
- // HANDLE: $(html, props)
- if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
- for ( match in context ) {
- // Properties of context are called as methods if possible
- if ( jQuery.isFunction( this[ match ] ) ) {
- this[ match ]( context[ match ] );
-
- // ...and otherwise set as attributes
- } else {
- this.attr( match, context[ match ] );
- }
- }
- }
-
- return this;
-
- // HANDLE: $(#id)
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(DOMElement)
- } else if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector: "",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- toArray: function() {
- return core_slice.call( this );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems ) {
-
- // Build a new jQuery matched element set
- var ret = jQuery.merge( this.constructor(), elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
- ret.context = this.context;
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready: function( fn ) {
- // Add the callback
- jQuery.ready.promise().done( fn );
-
- return this;
- },
-
- slice: function() {
- return this.pushStack( core_slice.apply( this, arguments ) );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- eq: function( i ) {
- var len = this.length,
- j = +i + ( i < 0 ? len : 0 );
- return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
- end: function() {
- return this.prevObject || this.constructor(null);
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: core_push,
- sort: [].sort,
- splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
- var src, copyIsArray, copy, name, options, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend({
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
-
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
-
- // Abort if there are pending holds or we're already ready
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
- return;
- }
-
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger("ready").off("ready");
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type(obj) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
-
- isWindow: function( obj ) {
- /* jshint eqeqeq: false */
- return obj != null && obj == obj.window;
- },
-
- isNumeric: function( obj ) {
- return !isNaN( parseFloat(obj) ) && isFinite( obj );
- },
-
- type: function( obj ) {
- if ( obj == null ) {
- return String( obj );
- }
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ core_toString.call(obj) ] || "object" :
- typeof obj;
- },
-
- isPlainObject: function( obj ) {
- var key;
-
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- try {
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !core_hasOwn.call(obj, "constructor") &&
- !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
- } catch ( e ) {
- // IE8,9 Will throw exceptions on certain host objects #9897
- return false;
- }
-
- // Support: IE<9
- // Handle iteration over inherited properties before own properties.
- if ( jQuery.support.ownLast ) {
- for ( key in obj ) {
- return core_hasOwn.call( obj, key );
- }
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
- for ( key in obj ) {}
-
- return key === undefined || core_hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- var name;
- for ( name in obj ) {
- return false;
- }
- return true;
- },
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- // data: string of html
- // context (optional): If specified, the fragment will be created in this context, defaults to document
- // keepScripts (optional): If true, will include scripts passed in the html string
- parseHTML: function( data, context, keepScripts ) {
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- if ( typeof context === "boolean" ) {
- keepScripts = context;
- context = false;
- }
- context = context || document;
-
- var parsed = rsingleTag.exec( data ),
- scripts = !keepScripts && [];
-
- // Single tag
- if ( parsed ) {
- return [ context.createElement( parsed[1] ) ];
- }
-
- parsed = jQuery.buildFragment( [ data ], context, scripts );
- if ( scripts ) {
- jQuery( scripts ).remove();
- }
- return jQuery.merge( [], parsed.childNodes );
- },
-
- parseJSON: function( data ) {
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- if ( data === null ) {
- return data;
- }
-
- if ( typeof data === "string" ) {
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- if ( data ) {
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return ( new Function( "return " + data ) )();
- }
- }
- }
-
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- parseXML: function( data ) {
- var xml, tmp;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
- } catch( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && jQuery.trim( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase: function( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
- },
-
- // args is for internal usage only
- each: function( obj, callback, args ) {
- var value,
- i = 0,
- length = obj.length,
- isArray = isArraylike( obj );
-
- if ( args ) {
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback.apply( obj[ i ], args );
-
- if ( value === false ) {
- break;
- }
- }
- } else {
- for ( i in obj ) {
- value = callback.apply( obj[ i ], args );
-
- if ( value === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback.call( obj[ i ], i, obj[ i ] );
-
- if ( value === false ) {
- break;
- }
- }
- } else {
- for ( i in obj ) {
- value = callback.call( obj[ i ], i, obj[ i ] );
-
- if ( value === false ) {
- break;
- }
- }
- }
- }
-
- return obj;
- },
-
- // Use native String.trim function wherever possible
- trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
- function( text ) {
- return text == null ?
- "" :
- core_trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
- },
-
- // results is for internal usage only
- makeArray: function( arr, results ) {
- var ret = results || [];
-
- if ( arr != null ) {
- if ( isArraylike( Object(arr) ) ) {
- jQuery.merge( ret,
- typeof arr === "string" ?
- [ arr ] : arr
- );
- } else {
- core_push.call( ret, arr );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, arr, i ) {
- var len;
-
- if ( arr ) {
- if ( core_indexOf ) {
- return core_indexOf.call( arr, elem, i );
- }
-
- len = arr.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in arr && arr[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var l = second.length,
- i = first.length,
- j = 0;
-
- if ( typeof l === "number" ) {
- for ( ; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, inv ) {
- var retVal,
- ret = [],
- i = 0,
- length = elems.length;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( ; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var value,
- i = 0,
- length = elems.length,
- isArray = isArraylike( elems ),
- ret = [];
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( i in elems ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return core_concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- var args, proxy, tmp;
-
- if ( typeof context === "string" ) {
- tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- args = core_slice.call( arguments, 2 );
- proxy = function() {
- return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Multifunctional method to get and set values of a collection
- // The value/s can optionally be executed if it's a function
- access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
- var i = 0,
- length = elems.length,
- bulk = key == null;
-
- // Sets many values
- if ( jQuery.type( key ) === "object" ) {
- chainable = true;
- for ( i in key ) {
- jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
- }
-
- // Sets one value
- } else if ( value !== undefined ) {
- chainable = true;
-
- if ( !jQuery.isFunction( value ) ) {
- raw = true;
- }
-
- if ( bulk ) {
- // Bulk operations run against the entire set
- if ( raw ) {
- fn.call( elems, value );
- fn = null;
-
- // ...except when executing function values
- } else {
- bulk = fn;
- fn = function( elem, key, value ) {
- return bulk.call( jQuery( elem ), value );
- };
- }
- }
-
- if ( fn ) {
- for ( ; i < length; i++ ) {
- fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
- }
- }
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- length ? fn( elems[0], key ) : emptyGet;
- },
-
- now: function() {
- return ( new Date() ).getTime();
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations.
- // Note: this method belongs to the css module but it's needed here for the support module.
- // If support gets modularized, this method should be moved back to the css module.
- swap: function( elem, options, callback, args ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.apply( elem, args || [] );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
- }
-});
-
-jQuery.ready.promise = function( obj ) {
- if ( !readyList ) {
-
- readyList = jQuery.Deferred();
-
- // Catch cases where $(document).ready() is called after the browser event has already occurred.
- // we once tried to use readyState "interactive" here, but it caused issues like the one
- // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- setTimeout( jQuery.ready );
-
- // Standards-based browsers support DOMContentLoaded
- } else if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", completed, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", completed, false );
-
- // If IE event model is used
- } else {
- // Ensure firing before onload, maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", completed );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", completed );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var top = false;
-
- try {
- top = window.frameElement == null && document.documentElement;
- } catch(e) {}
-
- if ( top && top.doScroll ) {
- (function doScrollCheck() {
- if ( !jQuery.isReady ) {
-
- try {
- // Use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- top.doScroll("left");
- } catch(e) {
- return setTimeout( doScrollCheck, 50 );
- }
-
- // detach all dom ready events
- detach();
-
- // and execute any waiting functions
- jQuery.ready();
- }
- })();
- }
- }
- }
- return readyList.promise( obj );
-};
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-function isArraylike( obj ) {
- var length = obj.length,
- type = jQuery.type( obj );
-
- if ( jQuery.isWindow( obj ) ) {
- return false;
- }
-
- if ( obj.nodeType === 1 && length ) {
- return true;
- }
-
- return type === "array" || type !== "function" &&
- ( length === 0 ||
- typeof length === "number" && length > 0 && ( length - 1 ) in obj );
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-/*!
- * Sizzle CSS Selector Engine v1.9.4-pre
- * http://sizzlejs.com/
- *
- * Copyright 2013 jQuery Foundation, Inc. and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2013-05-27
- */
-(function( window, undefined ) {
-
-var i,
- support,
- cachedruns,
- Expr,
- getText,
- isXML,
- compile,
- outermostContext,
- sortInput,
-
- // Local document vars
- setDocument,
- document,
- docElem,
- documentIsHTML,
- rbuggyQSA,
- rbuggyMatches,
- matches,
- contains,
-
- // Instance-specific data
- expando = "sizzle" + -(new Date()),
- preferredDoc = window.document,
- dirruns = 0,
- done = 0,
- classCache = createCache(),
- tokenCache = createCache(),
- compilerCache = createCache(),
- hasDuplicate = false,
- sortOrder = function() { return 0; },
-
- // General-purpose constants
- strundefined = typeof undefined,
- MAX_NEGATIVE = 1 << 31,
-
- // Instance methods
- hasOwn = ({}).hasOwnProperty,
- arr = [],
- pop = arr.pop,
- push_native = arr.push,
- push = arr.push,
- slice = arr.slice,
- // Use a stripped-down indexOf if we can't use a native one
- indexOf = arr.indexOf || function( elem ) {
- var i = 0,
- len = this.length;
- for ( ; i < len; i++ ) {
- if ( this[i] === elem ) {
- return i;
- }
- }
- return -1;
- },
-
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
- // Regular expressions
-
- // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
- whitespace = "[\\x20\\t\\r\\n\\f]",
- // http://www.w3.org/TR/css3-syntax/#characters
- characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
- // Loosely modeled on CSS identifier characters
- // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
- // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
- identifier = characterEncoding.replace( "w", "w#" ),
-
- // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
- attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
- "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-
- // Prefer arguments quoted,
- // then not containing pseudos/brackets,
- // then attribute selectors/non-parenthetical expressions,
- // then anything else
- // These preferences are here to reduce the number of selectors
- // needing tokenize in the PSEUDO preFilter
- pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
-
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
- rsibling = new RegExp( whitespace + "*[+~]" ),
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
-
- rpseudo = new RegExp( pseudos ),
- ridentifier = new RegExp( "^" + identifier + "$" ),
-
- matchExpr = {
- "ID": new RegExp( "^#(" + characterEncoding + ")" ),
- "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
- "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
- "ATTR": new RegExp( "^" + attributes ),
- "PSEUDO": new RegExp( "^" + pseudos ),
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
- // For use in libraries implementing .is()
- // We use this for POS matching in `select`
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
- },
-
- rnative = /^[^{]+\{\s*\[native \w/,
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
- rinputs = /^(?:input|select|textarea|button)$/i,
- rheader = /^h\d$/i,
-
- rescape = /'|\\/g,
-
- // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
- funescape = function( _, escaped, escapedWhitespace ) {
- var high = "0x" + escaped - 0x10000;
- // NaN means non-codepoint
- // Support: Firefox
- // Workaround erroneous numeric interpretation of +"0x"
- return high !== high || escapedWhitespace ?
- escaped :
- // BMP codepoint
- high < 0 ?
- String.fromCharCode( high + 0x10000 ) :
- // Supplemental Plane codepoint (surrogate pair)
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
- };
-
-// Optimize for push.apply( _, NodeList )
-try {
- push.apply(
- (arr = slice.call( preferredDoc.childNodes )),
- preferredDoc.childNodes
- );
- // Support: Android<4.0
- // Detect silently failing push.apply
- arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
- push = { apply: arr.length ?
-
- // Leverage slice if possible
- function( target, els ) {
- push_native.apply( target, slice.call(els) );
- } :
-
- // Support: IE<9
- // Otherwise append directly
- function( target, els ) {
- var j = target.length,
- i = 0;
- // Can't trust NodeList.length
- while ( (target[j++] = els[i++]) ) {}
- target.length = j - 1;
- }
- };
-}
-
-function Sizzle( selector, context, results, seed ) {
- var match, elem, m, nodeType,
- // QSA vars
- i, groups, old, nid, newContext, newSelector;
-
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
- setDocument( context );
- }
-
- context = context || document;
- results = results || [];
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
- return [];
- }
-
- if ( documentIsHTML && !seed ) {
-
- // Shortcuts
- if ( (match = rquickExpr.exec( selector )) ) {
- // Speed-up: Sizzle("#ID")
- if ( (m = match[1]) ) {
- if ( nodeType === 9 ) {
- elem = context.getElementById( m );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE, Opera, and Webkit return items
- // by name instead of ID
- if ( elem.id === m ) {
- results.push( elem );
- return results;
- }
- } else {
- return results;
- }
- } else {
- // Context is not a document
- if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
- contains( context, elem ) && elem.id === m ) {
- results.push( elem );
- return results;
- }
- }
-
- // Speed-up: Sizzle("TAG")
- } else if ( match[2] ) {
- push.apply( results, context.getElementsByTagName( selector ) );
- return results;
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
- push.apply( results, context.getElementsByClassName( m ) );
- return results;
- }
- }
-
- // QSA path
- if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
- nid = old = expando;
- newContext = context;
- newSelector = nodeType === 9 && selector;
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- groups = tokenize( selector );
-
- if ( (old = context.getAttribute("id")) ) {
- nid = old.replace( rescape, "\\$&" );
- } else {
- context.setAttribute( "id", nid );
- }
- nid = "[id='" + nid + "'] ";
-
- i = groups.length;
- while ( i-- ) {
- groups[i] = nid + toSelector( groups[i] );
- }
- newContext = rsibling.test( selector ) && context.parentNode || context;
- newSelector = groups.join(",");
- }
-
- if ( newSelector ) {
- try {
- push.apply( results,
- newContext.querySelectorAll( newSelector )
- );
- return results;
- } catch(qsaError) {
- } finally {
- if ( !old ) {
- context.removeAttribute("id");
- }
- }
- }
- }
- }
-
- // All others
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * For feature detection
- * @param {Function} fn The function to test for native support
- */
-function isNative( fn ) {
- return rnative.test( fn + "" );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
- * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- * deleting the oldest entry
- */
-function createCache() {
- var keys = [];
-
- function cache( key, value ) {
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
- if ( keys.push( key += " " ) > Expr.cacheLength ) {
- // Only keep the most recent entries
- delete cache[ keys.shift() ];
- }
- return (cache[ key ] = value);
- }
- return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
- fn[ expando ] = true;
- return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created div and expects a boolean result
- */
-function assert( fn ) {
- var div = document.createElement("div");
-
- try {
- return !!fn( div );
- } catch (e) {
- return false;
- } finally {
- // Remove from its parent by default
- if ( div.parentNode ) {
- div.parentNode.removeChild( div );
- }
- // release memory in IE
- div = null;
- }
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied if the test fails
- * @param {Boolean} test The result of a test. If true, null will be set as the handler in leiu of the specified handler
- */
-function addHandle( attrs, handler, test ) {
- attrs = attrs.split("|");
- var current,
- i = attrs.length,
- setHandle = test ? null : handler;
-
- while ( i-- ) {
- // Don't override a user's handler
- if ( !(current = Expr.attrHandle[ attrs[i] ]) || current === handler ) {
- Expr.attrHandle[ attrs[i] ] = setHandle;
- }
- }
-}
-
-/**
- * Fetches boolean attributes by node
- * @param {Element} elem
- * @param {String} name
- */
-function boolHandler( elem, name ) {
- // XML does not need to be checked as this will not be assigned for XML documents
- var val = elem.getAttributeNode( name );
- return val && val.specified ?
- val.value :
- elem[ name ] === true ? name.toLowerCase() : null;
-}
-
-/**
- * Fetches attributes without interpolation
- * http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
- * @param {Element} elem
- * @param {String} name
- */
-function interpolationHandler( elem, name ) {
- // XML does not need to be checked as this will not be assigned for XML documents
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-}
-
-/**
- * Uses defaultValue to retrieve value in IE6/7
- * @param {Element} elem
- * @param {String} name
- */
-function valueHandler( elem ) {
- // Ignore the value *property* on inputs by using defaultValue
- // Fallback to Sizzle.attr by returning undefined where appropriate
- // XML does not need to be checked as this will not be assigned for XML documents
- if ( elem.nodeName.toLowerCase() === "input" ) {
- return elem.defaultValue;
- }
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns Returns -1 if a precedes b, 1 if a follows b
- */
-function siblingCheck( a, b ) {
- var cur = b && a,
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
- ( ~b.sourceIndex || MAX_NEGATIVE ) -
- ( ~a.sourceIndex || MAX_NEGATIVE );
-
- // Use IE sourceIndex if available on both nodes
- if ( diff ) {
- return diff;
- }
-
- // Check if b follows a
- if ( cur ) {
- while ( (cur = cur.nextSibling) ) {
- if ( cur === b ) {
- return -1;
- }
- }
- }
-
- return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
- return markFunction(function( argument ) {
- argument = +argument;
- return markFunction(function( seed, matches ) {
- var j,
- matchIndexes = fn( [], seed.length, argument ),
- i = matchIndexes.length;
-
- // Match elements found at the specified indexes
- while ( i-- ) {
- if ( seed[ (j = matchIndexes[i]) ] ) {
- seed[j] = !(matches[j] = seed[j]);
- }
- }
- });
- });
-}
-
-/**
- * Detect xml
- * @param {Element|Object} elem An element or a document
- */
-isXML = Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
- var doc = node ? node.ownerDocument || node : preferredDoc,
- parent = doc.parentWindow;
-
- // If no document and documentElement is available, return
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
- return document;
- }
-
- // Set our document
- document = doc;
- docElem = doc.documentElement;
-
- // Support tests
- documentIsHTML = !isXML( doc );
-
- // Support: IE>8
- // If iframe document is assigned to "document" variable and if iframe has been reloaded,
- // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
- if ( parent && parent.frameElement ) {
- parent.attachEvent( "onbeforeunload", function() {
- setDocument();
- });
- }
-
- /* Attributes
- ---------------------------------------------------------------------- */
-
- // Support: IE<8
- // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
- support.attributes = assert(function( div ) {
-
- // Support: IE<8
- // Prevent attribute/property "interpolation"
- div.innerHTML = "<a href='#'></a>";
- addHandle( "type|href|height|width", interpolationHandler, div.firstChild.getAttribute("href") === "#" );
-
- // Support: IE<9
- // Use getAttributeNode to fetch booleans when getAttribute lies
- addHandle( booleans, boolHandler, div.getAttribute("disabled") == null );
-
- div.className = "i";
- return !div.getAttribute("className");
- });
-
- // Support: IE<9
- // Retrieving value should defer to defaultValue
- support.input = assert(function( div ) {
- div.innerHTML = "<input>";
- div.firstChild.setAttribute( "value", "" );
- return div.firstChild.getAttribute( "value" ) === "";
- });
-
- // IE6/7 still return empty string for value,
- // but are actually retrieving the property
- addHandle( "value", valueHandler, support.attributes && support.input );
-
- /* getElement(s)By*
- ---------------------------------------------------------------------- */
-
- // Check if getElementsByTagName("*") returns only elements
- support.getElementsByTagName = assert(function( div ) {
- div.appendChild( doc.createComment("") );
- return !div.getElementsByTagName("*").length;
- });
-
- // Check if getElementsByClassName can be trusted
- support.getElementsByClassName = assert(function( div ) {
- div.innerHTML = "<div class='a'></div><div class='a i'></div>";
-
- // Support: Safari<4
- // Catch class over-caching
- div.firstChild.className = "i";
- // Support: Opera<10
- // Catch gEBCN failure to find non-leading classes
- return div.getElementsByClassName("i").length === 2;
- });
-
- // Support: IE<10
- // Check if getElementById returns elements by name
- // The broken getElementById methods don't pick up programatically-set names,
- // so use a roundabout getElementsByName test
- support.getById = assert(function( div ) {
- docElem.appendChild( div ).id = expando;
- return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
- });
-
- // ID find and filter
- if ( support.getById ) {
- Expr.find["ID"] = function( id, context ) {
- if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
- var m = context.getElementById( id );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- };
- Expr.filter["ID"] = function( id ) {
- var attrId = id.replace( runescape, funescape );
- return function( elem ) {
- return elem.getAttribute("id") === attrId;
- };
- };
- } else {
- // Support: IE6/7
- // getElementById is not reliable as a find shortcut
- delete Expr.find["ID"];
-
- Expr.filter["ID"] = function( id ) {
- var attrId = id.replace( runescape, funescape );
- return function( elem ) {
- var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
- return node && node.value === attrId;
- };
- };
- }
-
- // Tag
- Expr.find["TAG"] = support.getElementsByTagName ?
- function( tag, context ) {
- if ( typeof context.getElementsByTagName !== strundefined ) {
- return context.getElementsByTagName( tag );
- }
- } :
- function( tag, context ) {
- var elem,
- tmp = [],
- i = 0,
- results = context.getElementsByTagName( tag );
-
- // Filter out possible comments
- if ( tag === "*" ) {
- while ( (elem = results[i++]) ) {
- if ( elem.nodeType === 1 ) {
- tmp.push( elem );
- }
- }
-
- return tmp;
- }
- return results;
- };
-
- // Class
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
- if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
- return context.getElementsByClassName( className );
- }
- };
-
- /* QSA/matchesSelector
- ---------------------------------------------------------------------- */
-
- // QSA and matchesSelector support
-
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
- rbuggyMatches = [];
-
- // qSa(:focus) reports false when true (Chrome 21)
- // We allow this because of a bug in IE8/9 that throws an error
- // whenever `document.activeElement` is accessed on an iframe
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
- // See http://bugs.jquery.com/ticket/13378
- rbuggyQSA = [];
-
- if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
- // Build QSA regex
- // Regex strategy adopted from Diego Perini
- assert(function( div ) {
- // Select is set to empty string on purpose
- // This is to test IE's treatment of not explicitly
- // setting a boolean content attribute,
- // since its presence should be enough
- // http://bugs.jquery.com/ticket/12359
- div.innerHTML = "<select><option selected=''></option></select>";
-
- // Support: IE8
- // Boolean attributes and "value" are not treated correctly
- if ( !div.querySelectorAll("[selected]").length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
- }
-
- // Webkit/Opera - :checked should return selected option elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- // IE8 throws error here and will not see later tests
- if ( !div.querySelectorAll(":checked").length ) {
- rbuggyQSA.push(":checked");
- }
- });
-
- assert(function( div ) {
-
- // Support: Opera 10-12/IE8
- // ^= $= *= and empty values
- // Should not select anything
- // Support: Windows 8 Native Apps
- // The type attribute is restricted during .innerHTML assignment
- var input = doc.createElement("input");
- input.setAttribute( "type", "hidden" );
- div.appendChild( input ).setAttribute( "t", "" );
-
- if ( div.querySelectorAll("[t^='']").length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
- }
-
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
- // IE8 throws error here and will not see later tests
- if ( !div.querySelectorAll(":enabled").length ) {
- rbuggyQSA.push( ":enabled", ":disabled" );
- }
-
- // Opera 10-11 does not throw on post-comma invalid pseudos
- div.querySelectorAll("*,:x");
- rbuggyQSA.push(",.*:");
- });
- }
-
- if ( (support.matchesSelector = isNative( (matches = docElem.webkitMatchesSelector ||
- docElem.mozMatchesSelector ||
- docElem.oMatchesSelector ||
- docElem.msMatchesSelector) )) ) {
-
- assert(function( div ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9)
- support.disconnectedMatch = matches.call( div, "div" );
-
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( div, "[s!='']:x" );
- rbuggyMatches.push( "!=", pseudos );
- });
- }
-
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
- /* Contains
- ---------------------------------------------------------------------- */
-
- // Element contains another
- // Purposefully does not implement inclusive descendent
- // As in, an element does not contain itself
- contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
- function( a, b ) {
- var adown = a.nodeType === 9 ? a.documentElement : a,
- bup = b && b.parentNode;
- return a === bup || !!( bup && bup.nodeType === 1 && (
- adown.contains ?
- adown.contains( bup ) :
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
- ));
- } :
- function( a, b ) {
- if ( b ) {
- while ( (b = b.parentNode) ) {
- if ( b === a ) {
- return true;
- }
- }
- }
- return false;
- };
-
- /* Sorting
- ---------------------------------------------------------------------- */
-
- // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
- // Detached nodes confoundingly follow *each other*
- support.sortDetached = assert(function( div1 ) {
- // Should return 1, but returns 4 (following)
- return div1.compareDocumentPosition( doc.createElement("div") ) & 1;
- });
-
- // Document order sorting
- sortOrder = docElem.compareDocumentPosition ?
- function( a, b ) {
-
- // Flag for duplicate removal
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
-
- if ( compare ) {
- // Disconnected nodes
- if ( compare & 1 ||
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
- // Choose the first element that is related to our preferred document
- if ( a === doc || contains(preferredDoc, a) ) {
- return -1;
- }
- if ( b === doc || contains(preferredDoc, b) ) {
- return 1;
- }
-
- // Maintain original order
- return sortInput ?
- ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
- 0;
- }
-
- return compare & 4 ? -1 : 1;
- }
-
- // Not directly comparable, sort on existence of method
- return a.compareDocumentPosition ? -1 : 1;
- } :
- function( a, b ) {
- var cur,
- i = 0,
- aup = a.parentNode,
- bup = b.parentNode,
- ap = [ a ],
- bp = [ b ];
-
- // Exit early if the nodes are identical
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Parentless nodes are either documents or disconnected
- } else if ( !aup || !bup ) {
- return a === doc ? -1 :
- b === doc ? 1 :
- aup ? -1 :
- bup ? 1 :
- sortInput ?
- ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
- 0;
-
- // If the nodes are siblings, we can do a quick check
- } else if ( aup === bup ) {
- return siblingCheck( a, b );
- }
-
- // Otherwise we need full lists of their ancestors for comparison
- cur = a;
- while ( (cur = cur.parentNode) ) {
- ap.unshift( cur );
- }
- cur = b;
- while ( (cur = cur.parentNode) ) {
- bp.unshift( cur );
- }
-
- // Walk down the tree looking for a discrepancy
- while ( ap[i] === bp[i] ) {
- i++;
- }
-
- return i ?
- // Do a sibling check if the nodes have a common ancestor
- siblingCheck( ap[i], bp[i] ) :
-
- // Otherwise nodes in our document sort first
- ap[i] === preferredDoc ? -1 :
- bp[i] === preferredDoc ? 1 :
- 0;
- };
-
- return doc;
-};
-
-Sizzle.matches = function( expr, elements ) {
- return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
- // Set document vars if needed
- if ( ( elem.ownerDocument || elem ) !== document ) {
- setDocument( elem );
- }
-
- // Make sure that attribute selectors are quoted
- expr = expr.replace( rattributeQuotes, "='$1']" );
-
- if ( support.matchesSelector && documentIsHTML &&
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
-
- try {
- var ret = matches.call( elem, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || support.disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
- return ret;
- }
- } catch(e) {}
- }
-
- return Sizzle( expr, document, null, [elem] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
- // Set document vars if needed
- if ( ( context.ownerDocument || context ) !== document ) {
- setDocument( context );
- }
- return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
- // Set document vars if needed
- if ( ( elem.ownerDocument || elem ) !== document ) {
- setDocument( elem );
- }
-
- var fn = Expr.attrHandle[ name.toLowerCase() ],
- // Don't get fooled by Object.prototype properties (jQuery #13807)
- val = ( fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
- fn( elem, name, !documentIsHTML ) :
- undefined );
-
- return val === undefined ?
- support.attributes || !documentIsHTML ?
- elem.getAttribute( name ) :
- (val = elem.getAttributeNode(name)) && val.specified ?
- val.value :
- null :
- val;
-};
-
-Sizzle.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
- var elem,
- duplicates = [],
- j = 0,
- i = 0;
-
- // Unless we *know* we can detect duplicates, assume their presence
- hasDuplicate = !support.detectDuplicates;
- sortInput = !support.sortStable && results.slice( 0 );
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- while ( (elem = results[i++]) ) {
- if ( elem === results[ i ] ) {
- j = duplicates.push( i );
- }
- }
- while ( j-- ) {
- results.splice( duplicates[ j ], 1 );
- }
- }
-
- return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
- var node,
- ret = "",
- i = 0,
- nodeType = elem.nodeType;
-
- if ( !nodeType ) {
- // If no nodeType, this is expected to be an array
- for ( ; (node = elem[i]); i++ ) {
- // Do not traverse comment nodes
- ret += getText( node );
- }
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
- // Use textContent for elements
- // innerText usage removed for consistency of new lines (see #11153)
- if ( typeof elem.textContent === "string" ) {
- return elem.textContent;
- } else {
- // Traverse its children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- // Do not include comment or processing instruction nodes
-
- return ret;
-};
-
-Expr = Sizzle.selectors = {
-
- // Can be adjusted by the user
- cacheLength: 50,
-
- createPseudo: markFunction,
-
- match: matchExpr,
-
- attrHandle: {},
-
- find: {},
-
- relative: {
- ">": { dir: "parentNode", first: true },
- " ": { dir: "parentNode" },
- "+": { dir: "previousSibling", first: true },
- "~": { dir: "previousSibling" }
- },
-
- preFilter: {
- "ATTR": function( match ) {
- match[1] = match[1].replace( runescape, funescape );
-
- // Move the given value to match[3] whether quoted or unquoted
- match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
-
- if ( match[2] === "~=" ) {
- match[3] = " " + match[3] + " ";
- }
-
- return match.slice( 0, 4 );
- },
-
- "CHILD": function( match ) {
- /* matches from matchExpr["CHILD"]
- 1 type (only|nth|...)
- 2 what (child|of-type)
- 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
- 4 xn-component of xn+y argument ([+-]?\d*n|)
- 5 sign of xn-component
- 6 x of xn-component
- 7 sign of y-component
- 8 y of y-component
- */
- match[1] = match[1].toLowerCase();
-
- if ( match[1].slice( 0, 3 ) === "nth" ) {
- // nth-* requires argument
- if ( !match[3] ) {
- Sizzle.error( match[0] );
- }
-
- // numeric x and y parameters for Expr.filter.CHILD
- // remember that false/true cast respectively to 0/1
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
- // other types prohibit arguments
- } else if ( match[3] ) {
- Sizzle.error( match[0] );
- }
-
- return match;
- },
-
- "PSEUDO": function( match ) {
- var excess,
- unquoted = !match[5] && match[2];
-
- if ( matchExpr["CHILD"].test( match[0] ) ) {
- return null;
- }
-
- // Accept quoted arguments as-is
- if ( match[3] && match[4] !== undefined ) {
- match[2] = match[4];
-
- // Strip excess characters from unquoted arguments
- } else if ( unquoted && rpseudo.test( unquoted ) &&
- // Get excess from tokenize (recursively)
- (excess = tokenize( unquoted, true )) &&
- // advance to the next closing parenthesis
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
- // excess is a negative index
- match[0] = match[0].slice( 0, excess );
- match[2] = unquoted.slice( 0, excess );
- }
-
- // Return only captures needed by the pseudo filter method (type and argument)
- return match.slice( 0, 3 );
- }
- },
-
- filter: {
-
- "TAG": function( nodeNameSelector ) {
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
- return nodeNameSelector === "*" ?
- function() { return true; } :
- function( elem ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
- };
- },
-
- "CLASS": function( className ) {
- var pattern = classCache[ className + " " ];
-
- return pattern ||
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
- classCache( className, function( elem ) {
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
- });
- },
-
- "ATTR": function( name, operator, check ) {
- return function( elem ) {
- var result = Sizzle.attr( elem, name );
-
- if ( result == null ) {
- return operator === "!=";
- }
- if ( !operator ) {
- return true;
- }
-
- result += "";
-
- return operator === "=" ? result === check :
- operator === "!=" ? result !== check :
- operator === "^=" ? check && result.indexOf( check ) === 0 :
- operator === "*=" ? check && result.indexOf( check ) > -1 :
- operator === "$=" ? check && result.slice( -check.length ) === check :
- operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
- false;
- };
- },
-
- "CHILD": function( type, what, argument, first, last ) {
- var simple = type.slice( 0, 3 ) !== "nth",
- forward = type.slice( -4 ) !== "last",
- ofType = what === "of-type";
-
- return first === 1 && last === 0 ?
-
- // Shortcut for :nth-*(n)
- function( elem ) {
- return !!elem.parentNode;
- } :
-
- function( elem, context, xml ) {
- var cache, outerCache, node, diff, nodeIndex, start,
- dir = simple !== forward ? "nextSibling" : "previousSibling",
- parent = elem.parentNode,
- name = ofType && elem.nodeName.toLowerCase(),
- useCache = !xml && !ofType;
-
- if ( parent ) {
-
- // :(first|last|only)-(child|of-type)
- if ( simple ) {
- while ( dir ) {
- node = elem;
- while ( (node = node[ dir ]) ) {
- if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
- return false;
- }
- }
- // Reverse direction for :only-* (if we haven't yet done so)
- start = dir = type === "only" && !start && "nextSibling";
- }
- return true;
- }
-
- start = [ forward ? parent.firstChild : parent.lastChild ];
-
- // non-xml :nth-child(...) stores cache data on `parent`
- if ( forward && useCache ) {
- // Seek `elem` from a previously-cached index
- outerCache = parent[ expando ] || (parent[ expando ] = {});
- cache = outerCache[ type ] || [];
- nodeIndex = cache[0] === dirruns && cache[1];
- diff = cache[0] === dirruns && cache[2];
- node = nodeIndex && parent.childNodes[ nodeIndex ];
-
- while ( (node = ++nodeIndex && node && node[ dir ] ||
-
- // Fallback to seeking `elem` from the start
- (diff = nodeIndex = 0) || start.pop()) ) {
-
- // When found, cache indexes on `parent` and break
- if ( node.nodeType === 1 && ++diff && node === elem ) {
- outerCache[ type ] = [ dirruns, nodeIndex, diff ];
- break;
- }
- }
-
- // Use previously-cached element index if available
- } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
- diff = cache[1];
-
- // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
- } else {
- // Use the same loop as above to seek `elem` from the start
- while ( (node = ++nodeIndex && node && node[ dir ] ||
- (diff = nodeIndex = 0) || start.pop()) ) {
-
- if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
- // Cache the index of each encountered element
- if ( useCache ) {
- (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
- }
-
- if ( node === elem ) {
- break;
- }
- }
- }
- }
-
- // Incorporate the offset, then check against cycle size
- diff -= last;
- return diff === first || ( diff % first === 0 && diff / first >= 0 );
- }
- };
- },
-
- "PSEUDO": function( pseudo, argument ) {
- // pseudo-class names are case-insensitive
- // http://www.w3.org/TR/selectors/#pseudo-classes
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
- // Remember that setFilters inherits from pseudos
- var args,
- fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
- Sizzle.error( "unsupported pseudo: " + pseudo );
-
- // The user may use createPseudo to indicate that
- // arguments are needed to create the filter function
- // just as Sizzle does
- if ( fn[ expando ] ) {
- return fn( argument );
- }
-
- // But maintain support for old signatures
- if ( fn.length > 1 ) {
- args = [ pseudo, pseudo, "", argument ];
- return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction(function( seed, matches ) {
- var idx,
- matched = fn( seed, argument ),
- i = matched.length;
- while ( i-- ) {
- idx = indexOf.call( seed, matched[i] );
- seed[ idx ] = !( matches[ idx ] = matched[i] );
- }
- }) :
- function( elem ) {
- return fn( elem, 0, args );
- };
- }
-
- return fn;
- }
- },
-
- pseudos: {
- // Potentially complex pseudos
- "not": markFunction(function( selector ) {
- // Trim the selector passed to compile
- // to avoid treating leading and trailing
- // spaces as combinators
- var input = [],
- results = [],
- matcher = compile( selector.replace( rtrim, "$1" ) );
-
- return matcher[ expando ] ?
- markFunction(function( seed, matches, context, xml ) {
- var elem,
- unmatched = matcher( seed, null, xml, [] ),
- i = seed.length;
-
- // Match elements unmatched by `matcher`
- while ( i-- ) {
- if ( (elem = unmatched[i]) ) {
- seed[i] = !(matches[i] = elem);
- }
- }
- }) :
- function( elem, context, xml ) {
- input[0] = elem;
- matcher( input, null, xml, results );
- return !results.pop();
- };
- }),
-
- "has": markFunction(function( selector ) {
- return function( elem ) {
- return Sizzle( selector, elem ).length > 0;
- };
- }),
-
- "contains": markFunction(function( text ) {
- return function( elem ) {
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
- };
- }),
-
- // "Whether an element is represented by a :lang() selector
- // is based solely on the element's language value
- // being equal to the identifier C,
- // or beginning with the identifier C immediately followed by "-".
- // The matching of C against the element's language value is performed case-insensitively.
- // The identifier C does not have to be a valid language name."
- // http://www.w3.org/TR/selectors/#lang-pseudo
- "lang": markFunction( function( lang ) {
- // lang value must be a valid identifier
- if ( !ridentifier.test(lang || "") ) {
- Sizzle.error( "unsupported lang: " + lang );
- }
- lang = lang.replace( runescape, funescape ).toLowerCase();
- return function( elem ) {
- var elemLang;
- do {
- if ( (elemLang = documentIsHTML ?
- elem.lang :
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
- elemLang = elemLang.toLowerCase();
- return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
- }
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
- return false;
- };
- }),
-
- // Miscellaneous
- "target": function( elem ) {
- var hash = window.location && window.location.hash;
- return hash && hash.slice( 1 ) === elem.id;
- },
-
- "root": function( elem ) {
- return elem === docElem;
- },
-
- "focus": function( elem ) {
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
- },
-
- // Boolean properties
- "enabled": function( elem ) {
- return elem.disabled === false;
- },
-
- "disabled": function( elem ) {
- return elem.disabled === true;
- },
-
- "checked": function( elem ) {
- // In CSS3, :checked should return both checked and selected elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- var nodeName = elem.nodeName.toLowerCase();
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
- },
-
- "selected": function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- // Contents
- "empty": function( elem ) {
- // http://www.w3.org/TR/selectors/#empty-pseudo
- // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
- // not comment, processing instructions, or others
- // Thanks to Diego Perini for the nodeName shortcut
- // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
- return false;
- }
- }
- return true;
- },
-
- "parent": function( elem ) {
- return !Expr.pseudos["empty"]( elem );
- },
-
- // Element/input types
- "header": function( elem ) {
- return rheader.test( elem.nodeName );
- },
-
- "input": function( elem ) {
- return rinputs.test( elem.nodeName );
- },
-
- "button": function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === "button" || name === "button";
- },
-
- "text": function( elem ) {
- var attr;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" &&
- elem.type === "text" &&
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
- },
-
- // Position-in-collection
- "first": createPositionalPseudo(function() {
- return [ 0 ];
- }),
-
- "last": createPositionalPseudo(function( matchIndexes, length ) {
- return [ length - 1 ];
- }),
-
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
- return [ argument < 0 ? argument + length : argument ];
- }),
-
- "even": createPositionalPseudo(function( matchIndexes, length ) {
- var i = 0;
- for ( ; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
- var i = 1;
- for ( ; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
- var i = argument < 0 ? argument + length : argument;
- for ( ; --i >= 0; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
- var i = argument < 0 ? argument + length : argument;
- for ( ; ++i < length; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- })
- }
-};
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
- Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
- Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-function tokenize( selector, parseOnly ) {
- var matched, match, tokens, type,
- soFar, groups, preFilters,
- cached = tokenCache[ selector + " " ];
-
- if ( cached ) {
- return parseOnly ? 0 : cached.slice( 0 );
- }
-
- soFar = selector;
- groups = [];
- preFilters = Expr.preFilter;
-
- while ( soFar ) {
-
- // Comma and first run
- if ( !matched || (match = rcomma.exec( soFar )) ) {
- if ( match ) {
- // Don't consume trailing commas as valid
- soFar = soFar.slice( match[0].length ) || soFar;
- }
- groups.push( tokens = [] );
- }
-
- matched = false;
-
- // Combinators
- if ( (match = rcombinators.exec( soFar )) ) {
- matched = match.shift();
- tokens.push({
- value: matched,
- // Cast descendant combinators to space
- type: match[0].replace( rtrim, " " )
- });
- soFar = soFar.slice( matched.length );
- }
-
- // Filters
- for ( type in Expr.filter ) {
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
- (match = preFilters[ type ]( match ))) ) {
- matched = match.shift();
- tokens.push({
- value: matched,
- type: type,
- matches: match
- });
- soFar = soFar.slice( matched.length );
- }
- }
-
- if ( !matched ) {
- break;
- }
- }
-
- // Return the length of the invalid excess
- // if we're just parsing
- // Otherwise, throw an error or return tokens
- return parseOnly ?
- soFar.length :
- soFar ?
- Sizzle.error( selector ) :
- // Cache the tokens
- tokenCache( selector, groups ).slice( 0 );
-}
-
-function toSelector( tokens ) {
- var i = 0,
- len = tokens.length,
- selector = "";
- for ( ; i < len; i++ ) {
- selector += tokens[i].value;
- }
- return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
- var dir = combinator.dir,
- checkNonElements = base && dir === "parentNode",
- doneName = done++;
-
- return combinator.first ?
- // Check against closest ancestor/preceding element
- function( elem, context, xml ) {
- while ( (elem = elem[ dir ]) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- return matcher( elem, context, xml );
- }
- }
- } :
-
- // Check against all ancestor/preceding elements
- function( elem, context, xml ) {
- var data, cache, outerCache,
- dirkey = dirruns + " " + doneName;
-
- // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
- if ( xml ) {
- while ( (elem = elem[ dir ]) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- if ( matcher( elem, context, xml ) ) {
- return true;
- }
- }
- }
- } else {
- while ( (elem = elem[ dir ]) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- outerCache = elem[ expando ] || (elem[ expando ] = {});
- if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
- if ( (data = cache[1]) === true || data === cachedruns ) {
- return data === true;
- }
- } else {
- cache = outerCache[ dir ] = [ dirkey ];
- cache[1] = matcher( elem, context, xml ) || cachedruns;
- if ( cache[1] === true ) {
- return true;
- }
- }
- }
- }
- }
- };
-}
-
-function elementMatcher( matchers ) {
- return matchers.length > 1 ?
- function( elem, context, xml ) {
- var i = matchers.length;
- while ( i-- ) {
- if ( !matchers[i]( elem, context, xml ) ) {
- return false;
- }
- }
- return true;
- } :
- matchers[0];
-}
-
-function condense( unmatched, map, filter, context, xml ) {
- var elem,
- newUnmatched = [],
- i = 0,
- len = unmatched.length,
- mapped = map != null;
-
- for ( ; i < len; i++ ) {
- if ( (elem = unmatched[i]) ) {
- if ( !filter || filter( elem, context, xml ) ) {
- newUnmatched.push( elem );
- if ( mapped ) {
- map.push( i );
- }
- }
- }
- }
-
- return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
- if ( postFilter && !postFilter[ expando ] ) {
- postFilter = setMatcher( postFilter );
- }
- if ( postFinder && !postFinder[ expando ] ) {
- postFinder = setMatcher( postFinder, postSelector );
- }
- return markFunction(function( seed, results, context, xml ) {
- var temp, i, elem,
- preMap = [],
- postMap = [],
- preexisting = results.length,
-
- // Get initial elements from seed or context
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
- // Prefilter to get matcher input, preserving a map for seed-results synchronization
- matcherIn = preFilter && ( seed || !selector ) ?
- condense( elems, preMap, preFilter, context, xml ) :
- elems,
-
- matcherOut = matcher ?
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
- // ...intermediate processing is necessary
- [] :
-
- // ...otherwise use results directly
- results :
- matcherIn;
-
- // Find primary matches
- if ( matcher ) {
- matcher( matcherIn, matcherOut, context, xml );
- }
-
- // Apply postFilter
- if ( postFilter ) {
- temp = condense( matcherOut, postMap );
- postFilter( temp, [], context, xml );
-
- // Un-match failing elements by moving them back to matcherIn
- i = temp.length;
- while ( i-- ) {
- if ( (elem = temp[i]) ) {
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
- }
- }
- }
-
- if ( seed ) {
- if ( postFinder || preFilter ) {
- if ( postFinder ) {
- // Get the final matcherOut by condensing this intermediate into postFinder contexts
- temp = [];
- i = matcherOut.length;
- while ( i-- ) {
- if ( (elem = matcherOut[i]) ) {
- // Restore matcherIn since elem is not yet a final match
- temp.push( (matcherIn[i] = elem) );
- }
- }
- postFinder( null, (matcherOut = []), temp, xml );
- }
-
- // Move matched elements from seed to results to keep them synchronized
- i = matcherOut.length;
- while ( i-- ) {
- if ( (elem = matcherOut[i]) &&
- (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
-
- seed[temp] = !(results[temp] = elem);
- }
- }
- }
-
- // Add elements to results, through postFinder if defined
- } else {
- matcherOut = condense(
- matcherOut === results ?
- matcherOut.splice( preexisting, matcherOut.length ) :
- matcherOut
- );
- if ( postFinder ) {
- postFinder( null, results, matcherOut, xml );
- } else {
- push.apply( results, matcherOut );
- }
- }
- });
-}
-
-function matcherFromTokens( tokens ) {
- var checkContext, matcher, j,
- len = tokens.length,
- leadingRelative = Expr.relative[ tokens[0].type ],
- implicitRelative = leadingRelative || Expr.relative[" "],
- i = leadingRelative ? 1 : 0,
-
- // The foundational matcher ensures that elements are reachable from top-level context(s)
- matchContext = addCombinator( function( elem ) {
- return elem === checkContext;
- }, implicitRelative, true ),
- matchAnyContext = addCombinator( function( elem ) {
- return indexOf.call( checkContext, elem ) > -1;
- }, implicitRelative, true ),
- matchers = [ function( elem, context, xml ) {
- return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- (checkContext = context).nodeType ?
- matchContext( elem, context, xml ) :
- matchAnyContext( elem, context, xml ) );
- } ];
-
- for ( ; i < len; i++ ) {
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
- } else {
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
- // Return special upon seeing a positional matcher
- if ( matcher[ expando ] ) {
- // Find the next relative operator (if any) for proper handling
- j = ++i;
- for ( ; j < len; j++ ) {
- if ( Expr.relative[ tokens[j].type ] ) {
- break;
- }
- }
- return setMatcher(
- i > 1 && elementMatcher( matchers ),
- i > 1 && toSelector(
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
- ).replace( rtrim, "$1" ),
- matcher,
- i < j && matcherFromTokens( tokens.slice( i, j ) ),
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
- j < len && toSelector( tokens )
- );
- }
- matchers.push( matcher );
- }
- }
-
- return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
- // A counter to specify which element is currently being matched
- var matcherCachedRuns = 0,
- bySet = setMatchers.length > 0,
- byElement = elementMatchers.length > 0,
- superMatcher = function( seed, context, xml, results, expandContext ) {
- var elem, j, matcher,
- setMatched = [],
- matchedCount = 0,
- i = "0",
- unmatched = seed && [],
- outermost = expandContext != null,
- contextBackup = outermostContext,
- // We must always have either seed elements or context
- elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
- // Use integer dirruns iff this is the outermost matcher
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
-
- if ( outermost ) {
- outermostContext = context !== document && context;
- cachedruns = matcherCachedRuns;
- }
-
- // Add elements passing elementMatchers directly to results
- // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
- for ( ; (elem = elems[i]) != null; i++ ) {
- if ( byElement && elem ) {
- j = 0;
- while ( (matcher = elementMatchers[j++]) ) {
- if ( matcher( elem, context, xml ) ) {
- results.push( elem );
- break;
- }
- }
- if ( outermost ) {
- dirruns = dirrunsUnique;
- cachedruns = ++matcherCachedRuns;
- }
- }
-
- // Track unmatched elements for set filters
- if ( bySet ) {
- // They will have gone through all possible matchers
- if ( (elem = !matcher && elem) ) {
- matchedCount--;
- }
-
- // Lengthen the array for every element, matched or not
- if ( seed ) {
- unmatched.push( elem );
- }
- }
- }
-
- // Apply set filters to unmatched elements
- matchedCount += i;
- if ( bySet && i !== matchedCount ) {
- j = 0;
- while ( (matcher = setMatchers[j++]) ) {
- matcher( unmatched, setMatched, context, xml );
- }
-
- if ( seed ) {
- // Reintegrate element matches to eliminate the need for sorting
- if ( matchedCount > 0 ) {
- while ( i-- ) {
- if ( !(unmatched[i] || setMatched[i]) ) {
- setMatched[i] = pop.call( results );
- }
- }
- }
-
- // Discard index placeholder values to get only actual matches
- setMatched = condense( setMatched );
- }
-
- // Add matches to results
- push.apply( results, setMatched );
-
- // Seedless set matches succeeding multiple successful matchers stipulate sorting
- if ( outermost && !seed && setMatched.length > 0 &&
- ( matchedCount + setMatchers.length ) > 1 ) {
-
- Sizzle.uniqueSort( results );
- }
- }
-
- // Override manipulation of globals by nested matchers
- if ( outermost ) {
- dirruns = dirrunsUnique;
- outermostContext = contextBackup;
- }
-
- return unmatched;
- };
-
- return bySet ?
- markFunction( superMatcher ) :
- superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
- var i,
- setMatchers = [],
- elementMatchers = [],
- cached = compilerCache[ selector + " " ];
-
- if ( !cached ) {
- // Generate a function of recursive functions that can be used to check each element
- if ( !group ) {
- group = tokenize( selector );
- }
- i = group.length;
- while ( i-- ) {
- cached = matcherFromTokens( group[i] );
- if ( cached[ expando ] ) {
- setMatchers.push( cached );
- } else {
- elementMatchers.push( cached );
- }
- }
-
- // Cache the compiled function
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
- }
- return cached;
-};
-
-function multipleContexts( selector, contexts, results ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results );
- }
- return results;
-}
-
-function select( selector, context, results, seed ) {
- var i, tokens, token, type, find,
- match = tokenize( selector );
-
- if ( !seed ) {
- // Try to minimize operations if there is only one group
- if ( match.length === 1 ) {
-
- // Take a shortcut and set the context if the root selector is an ID
- tokens = match[0] = match[0].slice( 0 );
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
- support.getById && context.nodeType === 9 && documentIsHTML &&
- Expr.relative[ tokens[1].type ] ) {
-
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
- if ( !context ) {
- return results;
- }
- selector = selector.slice( tokens.shift().value.length );
- }
-
- // Fetch a seed set for right-to-left matching
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
- while ( i-- ) {
- token = tokens[i];
-
- // Abort if we hit a combinator
- if ( Expr.relative[ (type = token.type) ] ) {
- break;
- }
- if ( (find = Expr.find[ type ]) ) {
- // Search, expanding context for leading sibling combinators
- if ( (seed = find(
- token.matches[0].replace( runescape, funescape ),
- rsibling.test( tokens[0].type ) && context.parentNode || context
- )) ) {
-
- // If seed is empty or no tokens remain, we can return early
- tokens.splice( i, 1 );
- selector = seed.length && toSelector( tokens );
- if ( !selector ) {
- push.apply( results, seed );
- return results;
- }
-
- break;
- }
- }
- }
- }
- }
-
- // Compile and execute a filtering function
- // Provide `match` to avoid retokenization if we modified the selector above
- compile( selector, match )(
- seed,
- context,
- !documentIsHTML,
- results,
- rsibling.test( selector )
- );
- return results;
-}
-
-// Deprecated
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Chrome<<14
-// Always assume duplicates if they aren't passed to the comparison function
-[0, 0].sort( sortOrder );
-support.detectDuplicates = hasDuplicate;
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})( window );
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
- var object = optionsCache[ options ] = {};
- jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
- object[ flag ] = true;
- });
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * options: an optional list of space-separated options that will change how
- * the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
- // Convert options from String-formatted to Object-formatted if needed
- // (we check in cache first)
- options = typeof options === "string" ?
- ( optionsCache[ options ] || createOptions( options ) ) :
- jQuery.extend( {}, options );
-
- var // Flag to know if list is currently firing
- firing,
- // Last fire value (for non-forgettable lists)
- memory,
- // Flag to know if list was already fired
- fired,
- // End of the loop when firing
- firingLength,
- // Index of currently firing callback (modified by remove if needed)
- firingIndex,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
- // Actual callback list
- list = [],
- // Stack of fire calls for repeatable lists
- stack = !options.once && [],
- // Fire callbacks
- fire = function( data ) {
- memory = options.memory && data;
- fired = true;
- firingIndex = firingStart || 0;
- firingStart = 0;
- firingLength = list.length;
- firing = true;
- for ( ; list && firingIndex < firingLength; firingIndex++ ) {
- if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
- memory = false; // To prevent further calls using add
- break;
- }
- }
- firing = false;
- if ( list ) {
- if ( stack ) {
- if ( stack.length ) {
- fire( stack.shift() );
- }
- } else if ( memory ) {
- list = [];
- } else {
- self.disable();
- }
- }
- },
- // Actual Callbacks object
- self = {
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
- // First, we save the current length
- var start = list.length;
- (function add( args ) {
- jQuery.each( args, function( _, arg ) {
- var type = jQuery.type( arg );
- if ( type === "function" ) {
- if ( !options.unique || !self.has( arg ) ) {
- list.push( arg );
- }
- } else if ( arg && arg.length && type !== "string" ) {
- // Inspect recursively
- add( arg );
- }
- });
- })( arguments );
- // Do we need to add the callbacks to the
- // current firing batch?
- if ( firing ) {
- firingLength = list.length;
- // With memory, if we're not firing then
- // we should call right away
- } else if ( memory ) {
- firingStart = start;
- fire( memory );
- }
- }
- return this;
- },
- // Remove a callback from the list
- remove: function() {
- if ( list ) {
- jQuery.each( arguments, function( _, arg ) {
- var index;
- while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
- list.splice( index, 1 );
- // Handle firing indexes
- if ( firing ) {
- if ( index <= firingLength ) {
- firingLength--;
- }
- if ( index <= firingIndex ) {
- firingIndex--;
- }
- }
- }
- });
- }
- return this;
- },
- // Check if a given callback is in the list.
- // If no argument is given, return whether or not list has callbacks attached.
- has: function( fn ) {
- return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
- },
- // Remove all callbacks from the list
- empty: function() {
- list = [];
- firingLength = 0;
- return this;
- },
- // Have the list do nothing anymore
- disable: function() {
- list = stack = memory = undefined;
- return this;
- },
- // Is it disabled?
- disabled: function() {
- return !list;
- },
- // Lock the list in its current state
- lock: function() {
- stack = undefined;
- if ( !memory ) {
- self.disable();
- }
- return this;
- },
- // Is it locked?
- locked: function() {
- return !stack;
- },
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
- if ( list && ( !fired || stack ) ) {
- if ( firing ) {
- stack.push( args );
- } else {
- fire( args );
- }
- }
- return this;
- },
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!fired;
- }
- };
-
- return self;
-};
-jQuery.extend({
-
- Deferred: function( func ) {
- var tuples = [
- // action, add listener, listener list, final state
- [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
- [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
- [ "notify", "progress", jQuery.Callbacks("memory") ]
- ],
- state = "pending",
- promise = {
- state: function() {
- return state;
- },
- always: function() {
- deferred.done( arguments ).fail( arguments );
- return this;
- },
- then: function( /* fnDone, fnFail, fnProgress */ ) {
- var fns = arguments;
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( tuples, function( i, tuple ) {
- var action = tuple[ 0 ],
- fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
- // deferred[ done | fail | progress ] for forwarding actions to newDefer
- deferred[ tuple[1] ](function() {
- var returned = fn && fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise()
- .done( newDefer.resolve )
- .fail( newDefer.reject )
- .progress( newDefer.notify );
- } else {
- newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
- }
- });
- });
- fns = null;
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- return obj != null ? jQuery.extend( obj, promise ) : promise;
- }
- },
- deferred = {};
-
- // Keep pipe for back-compat
- promise.pipe = promise.then;
-
- // Add list-specific methods
- jQuery.each( tuples, function( i, tuple ) {
- var list = tuple[ 2 ],
- stateString = tuple[ 3 ];
-
- // promise[ done | fail | progress ] = list.add
- promise[ tuple[1] ] = list.add;
-
- // Handle state
- if ( stateString ) {
- list.add(function() {
- // state = [ resolved | rejected ]
- state = stateString;
-
- // [ reject_list | resolve_list ].disable; progress_list.lock
- }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
- }
-
- // deferred[ resolve | reject | notify ]
- deferred[ tuple[0] ] = function() {
- deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
- return this;
- };
- deferred[ tuple[0] + "With" ] = list.fireWith;
- });
-
- // Make the deferred a promise
- promise.promise( deferred );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( subordinate /* , ..., subordinateN */ ) {
- var i = 0,
- resolveValues = core_slice.call( arguments ),
- length = resolveValues.length,
-
- // the count of uncompleted subordinates
- remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
- // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
- deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
- // Update function for both resolve and progress values
- updateFunc = function( i, contexts, values ) {
- return function( value ) {
- contexts[ i ] = this;
- values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
- if( values === progressValues ) {
- deferred.notifyWith( contexts, values );
- } else if ( !( --remaining ) ) {
- deferred.resolveWith( contexts, values );
- }
- };
- },
-
- progressValues, progressContexts, resolveContexts;
-
- // add listeners to Deferred subordinates; treat others as resolved
- if ( length > 1 ) {
- progressValues = new Array( length );
- progressContexts = new Array( length );
- resolveContexts = new Array( length );
- for ( ; i < length; i++ ) {
- if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
- resolveValues[ i ].promise()
- .done( updateFunc( i, resolveContexts, resolveValues ) )
- .fail( deferred.reject )
- .progress( updateFunc( i, progressContexts, progressValues ) );
- } else {
- --remaining;
- }
- }
- }
-
- // if we're not waiting on anything, resolve the master
- if ( !remaining ) {
- deferred.resolveWith( resolveContexts, resolveValues );
- }
-
- return deferred.promise();
- }
-});
-jQuery.support = (function( support ) {
-
- var all, a, input, select, fragment, opt, eventName, isSupported, i,
- div = document.createElement("div");
-
- // Setup
- div.setAttribute( "className", "t" );
- div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
- // Finish early in limited (non-browser) environments
- all = div.getElementsByTagName("*") || [];
- a = div.getElementsByTagName("a")[ 0 ];
- if ( !a || !a.style || !all.length ) {
- return support;
- }
-
- // First batch of tests
- select = document.createElement("select");
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName("input")[ 0 ];
-
- a.style.cssText = "top:1px;float:left;opacity:.5";
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- support.getSetAttribute = div.className !== "t";
-
- // IE strips leading whitespace when .innerHTML is used
- support.leadingWhitespace = div.firstChild.nodeType === 3;
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- support.tbody = !div.getElementsByTagName("tbody").length;
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- support.htmlSerialize = !!div.getElementsByTagName("link").length;
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- support.style = /top/.test( a.getAttribute("style") );
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- support.hrefNormalized = a.getAttribute("href") === "/a";
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- support.opacity = /^0.5/.test( a.style.opacity );
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- support.cssFloat = !!a.style.cssFloat;
-
- // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
- support.checkOn = !!input.value;
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- support.optSelected = opt.selected;
-
- // Tests for enctype support on a form (#6743)
- support.enctype = !!document.createElement("form").enctype;
-
- // Makes sure cloning an html5 element does not cause problems
- // Where outerHTML is undefined, this still works
- support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
-
- // Will be defined later
- support.inlineBlockNeedsLayout = false;
- support.shrinkWrapBlocks = false;
- support.pixelPosition = false;
- support.deleteExpando = true;
- support.noCloneEvent = true;
- support.reliableMarginRight = true;
- support.boxSizingReliable = true;
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Support: IE<9
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
- }
-
- // Check if we can trust getAttribute("value")
- input = document.createElement("input");
- input.setAttribute( "value", "" );
- support.input = input.getAttribute( "value" ) === "";
-
- // Check if an input maintains its value after becoming a radio
- input.value = "t";
- input.setAttribute( "type", "radio" );
- support.radioValue = input.value === "t";
-
- // #11217 - WebKit loses check when the name is after the checked attribute
- input.setAttribute( "checked", "t" );
- input.setAttribute( "name", "t" );
-
- fragment = document.createDocumentFragment();
- fragment.appendChild( input );
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Support: IE<9
- // Opera does not clone events (and typeof div.attachEvent === undefined).
- // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
- if ( div.attachEvent ) {
- div.attachEvent( "onclick", function() {
- support.noCloneEvent = false;
- });
-
- div.cloneNode( true ).click();
- }
-
- // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
- // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
- for ( i in { submit: true, change: true, focusin: true }) {
- div.setAttribute( eventName = "on" + i, "t" );
-
- support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
- }
-
- div.style.backgroundClip = "content-box";
- div.cloneNode( true ).style.backgroundClip = "";
- support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
- // Support: IE<9
- // Iteration over object's inherited properties before its own.
- for ( i in jQuery( support ) ) {
- break;
- }
- support.ownLast = i !== "0";
-
- // Run tests that need a body at doc ready
- jQuery(function() {
- var container, marginDiv, tds,
- divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
- body = document.getElementsByTagName("body")[0];
-
- if ( !body ) {
- // Return for frameset docs that don't have a body
- return;
- }
-
- container = document.createElement("div");
- container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
-
- body.appendChild( container ).appendChild( div );
-
- // Support: IE8
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
- tds = div.getElementsByTagName("td");
- tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Support: IE8
- // Check if empty table cells still have offsetWidth/Height
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
- // Check box-sizing and margin behavior.
- div.innerHTML = "";
- div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-
- // Workaround failing boxSizing test due to offsetWidth returning wrong value
- // with some non-1 values of body zoom, ticket #13543
- jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
- support.boxSizing = div.offsetWidth === 4;
- });
-
- // Use window.getComputedStyle because jsdom on node.js will break without it.
- if ( window.getComputedStyle ) {
- support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
- support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. (#3333)
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- marginDiv = div.appendChild( document.createElement("div") );
- marginDiv.style.cssText = div.style.cssText = divReset;
- marginDiv.style.marginRight = marginDiv.style.width = "0";
- div.style.width = "1px";
-
- support.reliableMarginRight =
- !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
- }
-
- if ( typeof div.style.zoom !== core_strundefined ) {
- // Support: IE<8
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- div.innerHTML = "";
- div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
- // Support: IE6
- // Check if elements with layout shrink-wrap their children
- div.style.display = "block";
- div.innerHTML = "<div></div>";
- div.firstChild.style.width = "5px";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
- if ( support.inlineBlockNeedsLayout ) {
- // Prevent IE 6 from affecting layout for positioned elements #11048
- // Prevent IE from shrinking the body in IE 7 mode #12869
- // Support: IE<8
- body.style.zoom = 1;
- }
- }
-
- body.removeChild( container );
-
- // Null elements to avoid leaks in IE
- container = div = tds = marginDiv = null;
- });
-
- // Null elements to avoid leaks in IE
- all = select = fragment = opt = a = input = null;
-
- return support;
-})({});
-
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
- rmultiDash = /([A-Z])/g;
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ){
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var ret, thisCache,
- internalKey = jQuery.expando,
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
- } else {
- id = internalKey;
- }
- }
-
- if ( !cache[ id ] ) {
- // Avoid exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
- }
-
- thisCache = cache[ id ];
-
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
- }
-
- thisCache = thisCache.data;
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( typeof name === "string" ) {
-
- // First Try to find as-is property data
- ret = thisCache[ name ];
-
- // Test for null|undefined property data
- if ( ret == null ) {
-
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
- }
-
- return ret;
-}
-
-function internalRemoveData( elem, name, pvt ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, i,
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
-
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
- if ( thisCache ) {
-
- // Support array or space separated string names for data keys
- if ( !jQuery.isArray( name ) ) {
-
- // try the string as a key before any manipulation
- if ( name in thisCache ) {
- name = [ name ];
- } else {
-
- // split the camel cased version by spaces unless a key with the spaces exists
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split(" ");
- }
- }
- } else {
- // If "name" is an array of keys...
- // When data is initially created, via ("key", "val") signature,
- // keys will be converted to camelCase.
- // Since there is no way to tell _how_ a key was added, remove
- // both plain key and camelCase key. #12786
- // This will only penalize the array argument path.
- name = name.concat( jQuery.map( name, jQuery.camelCase ) );
- }
-
- i = name.length;
- while ( i-- ) {
- delete thisCache[ name[i] ];
- }
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject( cache[ id ] ) ) {
- return;
- }
- }
-
- // Destroy the cache
- if ( isNode ) {
- jQuery.cleanData( [ elem ], true );
-
- // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
- /* jshint eqeqeq: false */
- } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
- /* jshint eqeqeq: true */
- delete cache[ id ];
-
- // When all else fails, null
- } else {
- cache[ id ] = null;
- }
-}
-
-jQuery.extend({
- cache: {},
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "applet": true,
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data ) {
- return internalData( elem, name, data );
- },
-
- removeData: function( elem, name ) {
- return internalRemoveData( elem, name );
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return internalData( elem, name, data, true );
- },
-
- _removeData: function( elem, name ) {
- return internalRemoveData( elem, name, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- // Do not set data on non-element because it will not be cleared (#8335).
- if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
- return false;
- }
-
- var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- // nodes accept data unless otherwise specified; rejection can be conditional
- return !noData || noData !== true && elem.getAttribute("classid") === noData;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var attrs, name,
- data = null,
- i = 0,
- elem = this[0];
-
- // Special expections of .data basically thwart jQuery.access,
- // so implement the relevant behavior ourselves
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = jQuery.data( elem );
-
- if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- attrs = elem.attributes;
- for ( ; i < attrs.length; i++ ) {
- name = attrs[i].name;
-
- if ( name.indexOf("data-") === 0 ) {
- name = jQuery.camelCase( name.slice(5) );
-
- dataAttr( elem, name, data[ name ] );
- }
- }
- jQuery._data( elem, "parsedAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- return arguments.length > 1 ?
-
- // Sets one value
- this.each(function() {
- jQuery.data( this, key, value );
- }) :
-
- // Gets one value
- // Try to fetch any internally stored data first
- elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
- },
-
- removeData: function( key ) {
- return this.each(function() {
- jQuery.removeData( this, key );
- });
- }
-});
-
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
-
- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- // Only convert to a number if it doesn't change the string
- +data + "" === data ? +data :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
- var name;
- for ( name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
- continue;
- }
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-jQuery.extend({
- queue: function( elem, type, data ) {
- var queue;
-
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- queue = jQuery._data( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !queue || jQuery.isArray(data) ) {
- queue = jQuery._data( elem, type, jQuery.makeArray(data) );
- } else {
- queue.push( data );
- }
- }
- return queue || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- startLength = queue.length,
- fn = queue.shift(),
- hooks = jQuery._queueHooks( elem, type ),
- next = function() {
- jQuery.dequeue( elem, type );
- };
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- startLength--;
- }
-
- if ( fn ) {
-
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- // clear up the last queue stop function
- delete hooks.stop;
- fn.call( elem, next, hooks );
- }
-
- if ( !startLength && hooks ) {
- hooks.empty.fire();
- }
- },
-
- // not intended for public consumption - generates a queueHooks object, or returns the current one
- _queueHooks: function( elem, type ) {
- var key = type + "queueHooks";
- return jQuery._data( elem, key ) || jQuery._data( elem, key, {
- empty: jQuery.Callbacks("once memory").add(function() {
- jQuery._removeData( elem, type + "queue" );
- jQuery._removeData( elem, key );
- })
- });
- }
-});
-
-jQuery.fn.extend({
- queue: function( type, data ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[0], type );
- }
-
- return data === undefined ?
- this :
- this.each(function() {
- var queue = jQuery.queue( this, type, data );
-
- // ensure a hooks for this queue
- jQuery._queueHooks( this, type );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- dequeue: function( type ) {
- return this.each(function() {
- jQuery.dequeue( this, type );
- });
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = setTimeout( next, time );
- hooks.stop = function() {
- clearTimeout( timeout );
- };
- });
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, obj ) {
- var tmp,
- count = 1,
- defer = jQuery.Deferred(),
- elements = this,
- i = this.length,
- resolve = function() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- };
-
- if ( typeof type !== "string" ) {
- obj = type;
- type = undefined;
- }
- type = type || "fx";
-
- while( i-- ) {
- tmp = jQuery._data( elements[ i ], type + "queueHooks" );
- if ( tmp && tmp.empty ) {
- count++;
- tmp.empty.add( resolve );
- }
- }
- resolve();
- return defer.promise( obj );
- }
-});
-var nodeHook, boolHook,
- rclass = /[\t\r\n\f]/g,
- rreturn = /\r/g,
- rfocusable = /^(?:input|select|textarea|button|object)$/i,
- rclickable = /^(?:a|area)$/i,
- ruseDefault = /^(?:checked|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute,
- getSetInput = jQuery.support.input;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- var classes, elem, cur, clazz, j,
- i = 0,
- len = this.length,
- proceed = typeof value === "string" && value;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).addClass( value.call( this, j, this.className ) );
- });
- }
-
- if ( proceed ) {
- // The disjunction here is for better compressibility (see removeClass)
- classes = ( value || "" ).match( core_rnotwhite ) || [];
-
- for ( ; i < len; i++ ) {
- elem = this[ i ];
- cur = elem.nodeType === 1 && ( elem.className ?
- ( " " + elem.className + " " ).replace( rclass, " " ) :
- " "
- );
-
- if ( cur ) {
- j = 0;
- while ( (clazz = classes[j++]) ) {
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
- cur += clazz + " ";
- }
- }
- elem.className = jQuery.trim( cur );
-
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classes, elem, cur, clazz, j,
- i = 0,
- len = this.length,
- proceed = arguments.length === 0 || typeof value === "string" && value;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call( this, j, this.className ) );
- });
- }
- if ( proceed ) {
- classes = ( value || "" ).match( core_rnotwhite ) || [];
-
- for ( ; i < len; i++ ) {
- elem = this[ i ];
- // This expression is here for better compressibility (see addClass)
- cur = elem.nodeType === 1 && ( elem.className ?
- ( " " + elem.className + " " ).replace( rclass, " " ) :
- ""
- );
-
- if ( cur ) {
- j = 0;
- while ( (clazz = classes[j++]) ) {
- // Remove *all* instances
- while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
- cur = cur.replace( " " + clazz + " ", " " );
- }
- }
- elem.className = value ? jQuery.trim( cur ) : "";
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( i ) {
- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.match( core_rnotwhite ) || [];
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space separated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- // Toggle whole class name
- } else if ( type === core_strundefined || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // If the element has a class name or if we're passed "false",
- // then remove the whole classname (if there was one, the above saved it).
- // Otherwise bring back whatever was previously saved (if anything),
- // falling back to the empty string if nothing was stored.
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ",
- i = 0,
- l = this.length;
- for ( ; i < l; i++ ) {
- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var ret, hooks, isFunction,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace(rreturn, "") :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, jQuery( this ).val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // Use proper attribute retrieval(#6932, #12072)
- var val = jQuery.find.attr( elem, "value" );
- return val != null ?
- val :
- elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value, option,
- options = elem.options,
- index = elem.selectedIndex,
- one = elem.type === "select-one" || index < 0,
- values = one ? null : [],
- max = one ? index + 1 : options.length,
- i = index < 0 ?
- max :
- one ? index : 0;
-
- // Loop through all the selected options
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // oldIE doesn't update selected after form reset (#2551)
- if ( ( option.selected || i === index ) &&
- // Don't return options that are disabled or in a disabled optgroup
- ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
- ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var optionSet, option,
- options = elem.options,
- values = jQuery.makeArray( value ),
- i = options.length;
-
- while ( i-- ) {
- option = options[ i ];
- if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
- optionSet = true;
- }
- }
-
- // force browsers to behave consistently when non-matching value is set
- if ( !optionSet ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- attr: function( elem, name, value ) {
- var hooks, ret,
- nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === core_strundefined ) {
- return jQuery.prop( elem, name, value );
- }
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] ||
- ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
-
- } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, value + "" );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- ret = jQuery.find.attr( elem, name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret == null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, value ) {
- var name, propName,
- i = 0,
- attrNames = value && value.match( core_rnotwhite );
-
- if ( attrNames && elem.nodeType === 1 ) {
- while ( (name = attrNames[i++]) ) {
- propName = jQuery.propFix[ name ] || name;
-
- // Boolean attributes get special treatment (#10870)
- if ( jQuery.expr.match.bool.test( name ) ) {
- // Set corresponding property to false
- if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
- elem[ propName ] = false;
- // Support: IE<9
- // Also clear defaultChecked/defaultSelected (if appropriate)
- } else {
- elem[ jQuery.camelCase( "default-" + name ) ] =
- elem[ propName ] = false;
- }
-
- // See #9699 for explanation of this approach (setting first, then removal)
- } else {
- jQuery.attr( elem, name, "" );
- }
-
- elem.removeAttribute( getSetAttribute ? name : propName );
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to default in case type is set after value during creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- }
- },
-
- propFix: {
- "for": "htmlFor",
- "class": "className"
- },
-
- prop: function( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
- ret :
- ( elem[ name ] = value );
-
- } else {
- return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
- ret :
- elem[ name ];
- }
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- // Use proper attribute retrieval(#12072)
- var tabindex = jQuery.find.attr( elem, "tabindex" );
-
- return tabindex ?
- parseInt( tabindex, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- -1;
- }
- }
- }
-});
-
-// Hooks for boolean attributes
-boolHook = {
- set: function( elem, value, name ) {
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
- // IE<8 needs the *property* name
- elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
-
- // Use defaultChecked and defaultSelected for oldIE
- } else {
- elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
- }
-
- return name;
- }
-};
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
- var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
-
- jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
- function( elem, name, isXML ) {
- var fn = jQuery.expr.attrHandle[ name ],
- ret = isXML ?
- undefined :
- /* jshint eqeqeq: false */
- (jQuery.expr.attrHandle[ name ] = undefined) !=
- getter( elem, name, isXML ) ?
-
- name.toLowerCase() :
- null;
- jQuery.expr.attrHandle[ name ] = fn;
- return ret;
- } :
- function( elem, name, isXML ) {
- return isXML ?
- undefined :
- elem[ jQuery.camelCase( "default-" + name ) ] ?
- name.toLowerCase() :
- null;
- };
-});
-
-// fix oldIE attroperties
-if ( !getSetInput || !getSetAttribute ) {
- jQuery.attrHooks.value = {
- set: function( elem, value, name ) {
- if ( jQuery.nodeName( elem, "input" ) ) {
- // Does not return so that setAttribute is also used
- elem.defaultValue = value;
- } else {
- // Use nodeHook if defined (#1954); otherwise setAttribute is fine
- return nodeHook && nodeHook.set( elem, value, name );
- }
- }
- };
-}
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = {
- set: function( elem, value, name ) {
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- elem.setAttributeNode(
- (ret = elem.ownerDocument.createAttribute( name ))
- );
- }
-
- ret.value = value += "";
-
- // Break association with cloned elements by also using setAttribute (#9646)
- return name === "value" || value === elem.getAttribute( name ) ?
- value :
- undefined;
- }
- };
- jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
- // Some attributes are constructed with empty-string values when not defined
- function( elem, name, isXML ) {
- var ret;
- return isXML ?
- undefined :
- (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
- ret.value :
- null;
- };
- jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret = elem.getAttributeNode( name );
- return ret && ret.specified ?
- ret.value :
- undefined;
- },
- set: nodeHook.set
- };
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- set: function( elem, value, name ) {
- nodeHook.set( elem, value === "" ? false : value, name );
- }
- };
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- };
- });
-}
-
-
-// Some attributes require a special call on IE
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !jQuery.support.hrefNormalized ) {
- // href/src property should get the full normalized URL (#10299/#12915)
- jQuery.each([ "href", "src" ], function( i, name ) {
- jQuery.propHooks[ name ] = {
- get: function( elem ) {
- return elem.getAttribute( name, 4 );
- }
- };
- });
-}
-
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Note: IE uppercases css property names, but if we were to .toLowerCase()
- // .cssText, that would destroy case senstitivity in URL's, like in "background"
- return elem.style.cssText || undefined;
- },
- set: function( elem, value ) {
- return ( elem.style.cssText = value + "" );
- }
- };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- };
-}
-
-jQuery.each([
- "tabIndex",
- "readOnly",
- "maxLength",
- "cellSpacing",
- "cellPadding",
- "rowSpan",
- "colSpan",
- "useMap",
- "frameBorder",
- "contentEditable"
-], function() {
- jQuery.propFix[ this.toLowerCase() ] = this;
-});
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
- }
- }
- };
- if ( !jQuery.support.checkOn ) {
- jQuery.valHooks[ this ].get = function( elem ) {
- // Support: Webkit
- // "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- };
- }
-});
-var rformElems = /^(?:input|select|textarea)$/i,
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|contextmenu)|click/,
- rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
-
-function returnTrue() {
- return true;
-}
-
-function returnFalse() {
- return false;
-}
-
-function safeActiveElement() {
- try {
- return document.activeElement;
- } catch ( err ) { }
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- global: {},
-
- add: function( elem, types, handler, data, selector ) {
- var tmp, events, t, handleObjIn,
- special, eventHandle, handleObj,
- handlers, type, namespaces, origType,
- elemData = jQuery._data( elem );
-
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
- if ( !elemData ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- selector = handleObjIn.selector;
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- if ( !(events = elemData.events) ) {
- events = elemData.events = {};
- }
- if ( !(eventHandle = elemData.handle) ) {
- eventHandle = elemData.handle = function( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
- }
-
- // Handle multiple events separated by a space
- types = ( types || "" ).match( core_rnotwhite ) || [""];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[t] ) || [];
- type = origType = tmp[1];
- namespaces = ( tmp[2] || "" ).split( "." ).sort();
-
- // There *must* be a type, no attaching namespace-only handlers
- if ( !type ) {
- continue;
- }
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend({
- type: type,
- origType: origType,
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
- namespace: namespaces.join(".")
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- if ( !(handlers = events[ type ]) ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener/attachEvent if the special events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
- var j, handleObj, tmp,
- origCount, t, events,
- special, handlers, type,
- namespaces, origType,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
- if ( !elemData || !(events = elemData.events) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( core_rnotwhite ) || [""];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[t] ) || [];
- type = origType = tmp[1];
- namespaces = ( tmp[2] || "" ).split( "." ).sort();
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector ? special.delegateType : special.bindType ) || type;
- handlers = events[ type ] || [];
- tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
-
- // Remove matching events
- origCount = j = handlers.length;
- while ( j-- ) {
- handleObj = handlers[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !tmp || tmp.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
- handlers.splice( j, 1 );
-
- if ( handleObj.selector ) {
- handlers.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( origCount && !handlers.length ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- delete elemData.handle;
-
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery._removeData( elem, "events" );
- }
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- var handle, ontype, cur,
- bubbleType, special, tmp, i,
- eventPath = [ elem || document ],
- type = core_hasOwn.call( event, "type" ) ? event.type : event,
- namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
-
- cur = tmp = elem = elem || document;
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf(".") >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split(".");
- type = namespaces.shift();
- namespaces.sort();
- }
- ontype = type.indexOf(":") < 0 && "on" + type;
-
- // Caller can pass in a jQuery.Event object, Object, or just an event type string
- event = event[ jQuery.expando ] ?
- event :
- new jQuery.Event( type, typeof event === "object" && event );
-
- // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
- event.isTrigger = onlyHandlers ? 2 : 3;
- event.namespace = namespaces.join(".");
- event.namespace_re = event.namespace ?
- new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
- null;
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data == null ?
- [ event ] :
- jQuery.makeArray( data, [ event ] );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- if ( !rfocusMorph.test( bubbleType + type ) ) {
- cur = cur.parentNode;
- }
- for ( ; cur; cur = cur.parentNode ) {
- eventPath.push( cur );
- tmp = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( tmp === (elem.ownerDocument || document) ) {
- eventPath.push( tmp.defaultView || tmp.parentWindow || window );
- }
- }
-
- // Fire handlers on the event path
- i = 0;
- while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
-
- event.type = i > 1 ?
- bubbleType :
- special.bindType || type;
-
- // jQuery handler
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Native handler
- handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
- event.preventDefault();
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
- jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- tmp = elem[ ontype ];
-
- if ( tmp ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- try {
- elem[ type ]();
- } catch ( e ) {
- // IE<9 dies on focus/blur to hidden element (#1486,#12518)
- // only reproducible on winXP IE8 native, not IE9 in IE8 mode
- }
- jQuery.event.triggered = undefined;
-
- if ( tmp ) {
- elem[ ontype ] = tmp;
- }
- }
- }
- }
-
- return event.result;
- },
-
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event );
-
- var i, ret, handleObj, matched, j,
- handlerQueue = [],
- args = core_slice.call( arguments ),
- handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
- special = jQuery.event.special[ event.type ] || {};
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[0] = event;
- event.delegateTarget = this;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers
- handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
- // Run delegates first; they may want to stop propagation beneath us
- i = 0;
- while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
- event.currentTarget = matched.elem;
-
- j = 0;
- while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
-
- // Triggered event must either 1) have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
- if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
-
- event.handleObj = handleObj;
- event.data = handleObj.data;
-
- ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
- .apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- if ( (event.result = ret) === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- return event.result;
- },
-
- handlers: function( event, handlers ) {
- var sel, handleObj, matches, i,
- handlerQueue = [],
- delegateCount = handlers.delegateCount,
- cur = event.target;
-
- // Find delegate handlers
- // Black-hole SVG <use> instance trees (#13180)
- // Avoid non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
-
- /* jshint eqeqeq: false */
- for ( ; cur != this; cur = cur.parentNode || this ) {
- /* jshint eqeqeq: true */
-
- // Don't check non-elements (#13208)
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
- matches = [];
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
-
- // Don't conflict with Object.prototype properties (#13203)
- sel = handleObj.selector + " ";
-
- if ( matches[ sel ] === undefined ) {
- matches[ sel ] = handleObj.needsContext ?
- jQuery( sel, this ).index( cur ) >= 0 :
- jQuery.find( sel, this, null, [ cur ] ).length;
- }
- if ( matches[ sel ] ) {
- matches.push( handleObj );
- }
- }
- if ( matches.length ) {
- handlerQueue.push({ elem: cur, handlers: matches });
- }
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( delegateCount < handlers.length ) {
- handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
- }
-
- return handlerQueue;
- },
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop, copy,
- type = event.type,
- originalEvent = event,
- fixHook = this.fixHooks[ type ];
-
- if ( !fixHook ) {
- this.fixHooks[ type ] = fixHook =
- rmouseEvent.test( type ) ? this.mouseHooks :
- rkeyEvent.test( type ) ? this.keyHooks :
- {};
- }
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = new jQuery.Event( originalEvent );
-
- i = copy.length;
- while ( i-- ) {
- prop = copy[ i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Support: IE<9
- // Fix target property (#1925)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Support: Chrome 23+, Safari?
- // Target should not be a text node (#504, #13143)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // Support: IE<9
- // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
- event.metaKey = !!event.metaKey;
-
- return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
- fixHooks: {},
-
- keyHooks: {
- props: "char charCode key keyCode".split(" "),
- filter: function( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks: {
- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
- filter: function( event, original ) {
- var body, eventDoc, doc,
- button = original.button,
- fromElement = original.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
-
- special: {
- load: {
- // Prevent triggered image.load events from bubbling to window.load
- noBubble: true
- },
- focus: {
- // Fire native event if possible so blur/focus sequence is correct
- trigger: function() {
- if ( this !== safeActiveElement() && this.focus ) {
- try {
- this.focus();
- return false;
- } catch ( e ) {
- // Support: IE<9
- // If we error on focus to hidden element (#1486, #12518),
- // let .trigger() run the handlers
- }
- }
- },
- delegateType: "focusin"
- },
- blur: {
- trigger: function() {
- if ( this === safeActiveElement() && this.blur ) {
- this.blur();
- return false;
- }
- },
- delegateType: "focusout"
- },
- click: {
- // For checkbox, fire native event so checked state will be right
- trigger: function() {
- if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
- this.click();
- return false;
- }
- },
-
- // For cross-browser consistency, don't fire native .click() on links
- _default: function( event ) {
- return jQuery.nodeName( event.target, "a" );
- }
- },
-
- beforeunload: {
- postDispatch: function( event ) {
-
- // Even when returnValue equals to undefined Firefox will still show alert
- if ( event.result !== undefined ) {
- event.originalEvent.returnValue = event.result;
- }
- }
- }
- },
-
- simulate: function( type, elem, event, bubble ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- {
- type: type,
- isSimulated: true,
- originalEvent: {}
- }
- );
- if ( bubble ) {
- jQuery.event.trigger( e, null, elem );
- } else {
- jQuery.event.dispatch.call( elem, e );
- }
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
-};
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- var name = "on" + type;
-
- if ( elem.detachEvent ) {
-
- // #8545, #7054, preventing memory leaks for custom events in IE6-8
- // detachEvent needed property on element, by name of that event, to properly expose it to GC
- if ( typeof elem[ name ] === core_strundefined ) {
- elem[ name ] = null;
- }
-
- elem.detachEvent( name, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse,
-
- preventDefault: function() {
- var e = this.originalEvent;
-
- this.isDefaultPrevented = returnTrue;
- if ( !e ) {
- return;
- }
-
- // If preventDefault exists, run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // Support: IE
- // Otherwise set the returnValue property of the original event to false
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- var e = this.originalEvent;
-
- this.isPropagationStopped = returnTrue;
- if ( !e ) {
- return;
- }
- // If stopPropagation exists, run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
-
- // Support: IE
- // Set the cancelBubble property of the original event to true
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- }
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var ret,
- target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj;
-
- // For mousenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !jQuery._data( form, "submitBubbles" ) ) {
- jQuery.event.add( form, "submit._submit", function( event ) {
- event._submit_bubble = true;
- });
- jQuery._data( form, "submitBubbles", true );
- }
- });
- // return undefined since we don't need an event listener
- },
-
- postDispatch: function( event ) {
- // If form was submitted by the user, bubble the event up the tree
- if ( event._submit_bubble ) {
- delete event._submit_bubble;
- if ( this.parentNode && !event.isTrigger ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- }
- },
-
- teardown: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
- }
- };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
- jQuery.event.special.change = {
-
- setup: function() {
-
- if ( rformElems.test( this.nodeName ) ) {
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._just_changed = true;
- }
- });
- jQuery.event.add( this, "click._change", function( event ) {
- if ( this._just_changed && !event.isTrigger ) {
- this._just_changed = false;
- }
- // Allow triggered, simulated change events (#11500)
- jQuery.event.simulate( "change", this, event, true );
- });
- }
- return false;
- }
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function( e ) {
- var elem = e.target;
-
- if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
- jQuery.event.add( elem, "change._change", function( event ) {
- if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
- jQuery.event.simulate( "change", this.parentNode, event, true );
- }
- });
- jQuery._data( elem, "changeBubbles", true );
- }
- });
- },
-
- handle: function( event ) {
- var elem = event.target;
-
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
- return event.handleObj.handler.apply( this, arguments );
- }
- },
-
- teardown: function() {
- jQuery.event.remove( this, "._change" );
-
- return !rformElems.test( this.nodeName );
- }
- };
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0,
- handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
- });
-}
-
-jQuery.fn.extend({
-
- on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var type, origFn;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) {
- // ( types-Object, data )
- data = data || selector;
- selector = undefined;
- }
- for ( type in types ) {
- this.on( type, selector, data, types[ type ], one );
- }
- return this;
- }
-
- if ( data == null && fn == null ) {
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return this;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return this.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- });
- },
- one: function( types, selector, data, fn ) {
- return this.on( types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- var handleObj, type;
- if ( types && types.preventDefault && types.handleObj ) {
- // ( event ) dispatched jQuery.Event
- handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
- // ( types-object [, selector] )
- for ( type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each(function() {
- jQuery.event.remove( this, types, fn, selector );
- });
- },
-
- trigger: function( type, data ) {
- return this.each(function() {
- jQuery.event.trigger( type, data, this );
- });
- },
- triggerHandler: function( type, data ) {
- var elem = this[0];
- if ( elem ) {
- return jQuery.event.trigger( type, data, elem, true );
- }
- }
-});
-var isSimple = /^.[^:#\[\.,]*$/,
- rparentsprev = /^(?:parents|prev(?:Until|All))/,
- rneedsContext = jQuery.expr.match.needsContext,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend({
- find: function( selector ) {
- var i,
- ret = [],
- self = this,
- len = self.length;
-
- if ( typeof selector !== "string" ) {
- return this.pushStack( jQuery( selector ).filter(function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- }) );
- }
-
- for ( i = 0; i < len; i++ ) {
- jQuery.find( selector, self[ i ], ret );
- }
-
- // Needed because $( selector, context ) becomes $( context ).find( selector )
- ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
- ret.selector = this.selector ? this.selector + " " + selector : selector;
- return ret;
- },
-
- has: function( target ) {
- var i,
- targets = jQuery( target, this ),
- len = targets.length;
-
- return this.filter(function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
-
- not: function( selector ) {
- return this.pushStack( winnow(this, selector || [], true) );
- },
-
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector || [], false) );
- },
-
- is: function( selector ) {
- return !!winnow(
- this,
-
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- typeof selector === "string" && rneedsContext.test( selector ) ?
- jQuery( selector ) :
- selector || [],
- false
- ).length;
- },
-
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- ret = [],
- pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( ; i < l; i++ ) {
- for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
- // Always skip document fragments
- if ( cur.nodeType < 11 && (pos ?
- pos.index(cur) > -1 :
-
- // Don't pass non-elements to Sizzle
- cur.nodeType === 1 &&
- jQuery.find.matchesSelector(cur, selectors)) ) {
-
- cur = ret.push( cur );
- break;
- }
- }
- }
-
- return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( jQuery.unique(all) );
- },
-
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter(selector)
- );
- }
-});
-
-function sibling( cur, dir ) {
- do {
- cur = cur[ dir ];
- } while ( cur && cur.nodeType !== 1 );
-
- return cur;
-}
-
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.merge( [], elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until );
-
- if ( name.slice( -5 ) !== "Until" ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- if ( this.length > 1 ) {
- // Remove duplicates
- if ( !guaranteedUnique[ name ] ) {
- ret = jQuery.unique( ret );
- }
-
- // Reverse order for parents* and prev-derivatives
- if ( rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
- }
-
- return this.pushStack( ret );
- };
-});
-
-jQuery.extend({
- filter: function( expr, elems, not ) {
- var elem = elems[ 0 ];
-
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 && elem.nodeType === 1 ?
- jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
- jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
- return elem.nodeType === 1;
- }));
- },
-
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep( elements, function( elem, i ) {
- /* jshint -W018 */
- return !!qualifier.call( elem, i, elem ) !== not;
- });
-
- }
-
- if ( qualifier.nodeType ) {
- return jQuery.grep( elements, function( elem ) {
- return ( elem === qualifier ) !== not;
- });
-
- }
-
- if ( typeof qualifier === "string" ) {
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter( qualifier, elements, not );
- }
-
- qualifier = jQuery.filter( qualifier, elements );
- }
-
- return jQuery.grep( elements, function( elem ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
- });
-}
-function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
- "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
- rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
- rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
- rtagName = /<([\w:]+)/,
- rtbody = /<tbody/i,
- rhtml = /<|&#?\w+;/,
- rnoInnerhtml = /<(?:script|style|link)/i,
- manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /^$|\/(?:java|ecma)script/i,
- rscriptTypeMasked = /^true\/(.*)/,
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
-
- // We have to close these tags to support XHTML (#13200)
- wrapMap = {
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
- legend: [ 1, "<fieldset>", "</fieldset>" ],
- area: [ 1, "<map>", "</map>" ],
- param: [ 1, "<object>", "</object>" ],
- thead: [ 1, "<table>", "</table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
- // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
- // unless wrapped in a div with non-breaking characters in front of it.
- _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
- },
- safeFragment = createSafeFragment( document ),
- fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-jQuery.fn.extend({
- text: function( value ) {
- return jQuery.access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
- }, null, value, arguments.length );
- },
-
- append: function() {
- return this.domManip( arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.appendChild( elem );
- }
- });
- },
-
- prepend: function() {
- return this.domManip( arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.insertBefore( elem, target.firstChild );
- }
- });
- },
-
- before: function() {
- return this.domManip( arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this );
- }
- });
- },
-
- after: function() {
- return this.domManip( arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- }
- });
- },
-
- // keepData is for internal use only--do not document
- remove: function( selector, keepData ) {
- var elem,
- elems = selector ? jQuery.filter( selector, this ) : this,
- i = 0;
-
- for ( ; (elem = elems[i]) != null; i++ ) {
-
- if ( !keepData && elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem ) );
- }
-
- if ( elem.parentNode ) {
- if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
- setGlobalEval( getAll( elem, "script" ) );
- }
- elem.parentNode.removeChild( elem );
- }
- }
-
- return this;
- },
-
- empty: function() {
- var elem,
- i = 0;
-
- for ( ; (elem = this[i]) != null; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem, false ) );
- }
-
- // Remove any remaining nodes
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
-
- // If this is a select, ensure that it displays empty (#12336)
- // Support: IE<9
- if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
- elem.options.length = 0;
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function () {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- });
- },
-
- html: function( value ) {
- return jQuery.access( this, function( value ) {
- var elem = this[0] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined ) {
- return elem.nodeType === 1 ?
- elem.innerHTML.replace( rinlinejQuery, "" ) :
- undefined;
- }
-
- // See if we can take a shortcut and just use innerHTML
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
- ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
- !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-
- value = value.replace( rxhtmlTag, "<$1></$2>" );
-
- try {
- for (; i < l; i++ ) {
- // Remove element nodes and prevent memory leaks
- elem = this[i] || {};
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem, false ) );
- elem.innerHTML = value;
- }
- }
-
- elem = 0;
-
- // If using innerHTML throws an exception, use the fallback method
- } catch(e) {}
- }
-
- if ( elem ) {
- this.empty().append( value );
- }
- }, null, value, arguments.length );
- },
-
- replaceWith: function() {
- var
- // Snapshot the DOM in case .domManip sweeps something relevant into its fragment
- args = jQuery.map( this, function( elem ) {
- return [ elem.nextSibling, elem.parentNode ];
- }),
- i = 0;
-
- // Make the changes, replacing each context element with the new content
- this.domManip( arguments, function( elem ) {
- var next = args[ i++ ],
- parent = args[ i++ ];
-
- if ( parent ) {
- // Don't use the snapshot next if it has moved (#13810)
- if ( next && next.parentNode !== parent ) {
- next = this.nextSibling;
- }
- jQuery( this ).remove();
- parent.insertBefore( elem, next );
- }
- // Allow new content to include elements from the context set
- }, true );
-
- // Force removal if there was no new content (e.g., from empty arguments)
- return i ? this : this.remove();
- },
-
- detach: function( selector ) {
- return this.remove( selector, true );
- },
-
- domManip: function( args, callback, allowIntersection ) {
-
- // Flatten any nested arrays
- args = core_concat.apply( [], args );
-
- var first, node, hasScripts,
- scripts, doc, fragment,
- i = 0,
- l = this.length,
- set = this,
- iNoClone = l - 1,
- value = args[0],
- isFunction = jQuery.isFunction( value );
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
- return this.each(function( index ) {
- var self = set.eq( index );
- if ( isFunction ) {
- args[0] = value.call( this, index, self.html() );
- }
- self.domManip( args, callback, allowIntersection );
- });
- }
-
- if ( l ) {
- fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
- first = fragment.firstChild;
-
- if ( fragment.childNodes.length === 1 ) {
- fragment = first;
- }
-
- if ( first ) {
- scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
- hasScripts = scripts.length;
-
- // Use the original fragment for the last item instead of the first because it can end up
- // being emptied incorrectly in certain situations (#8070).
- for ( ; i < l; i++ ) {
- node = fragment;
-
- if ( i !== iNoClone ) {
- node = jQuery.clone( node, true, true );
-
- // Keep references to cloned scripts for later restoration
- if ( hasScripts ) {
- jQuery.merge( scripts, getAll( node, "script" ) );
- }
- }
-
- callback.call( this[i], node, i );
- }
-
- if ( hasScripts ) {
- doc = scripts[ scripts.length - 1 ].ownerDocument;
-
- // Reenable scripts
- jQuery.map( scripts, restoreScript );
-
- // Evaluate executable scripts on first document insertion
- for ( i = 0; i < hasScripts; i++ ) {
- node = scripts[ i ];
- if ( rscriptType.test( node.type || "" ) &&
- !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
-
- if ( node.src ) {
- // Hope ajax is available...
- jQuery._evalUrl( node.src );
- } else {
- jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
- }
- }
- }
- }
-
- // Fix #11809: Avoid leaking memory
- fragment = first = null;
- }
- }
-
- return this;
- }
-});
-
-// Support: IE<8
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
- return jQuery.nodeName( elem, "table" ) &&
- jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
-
- elem.getElementsByTagName("tbody")[0] ||
- elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
- elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
- elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
- return elem;
-}
-function restoreScript( elem ) {
- var match = rscriptTypeMasked.exec( elem.type );
- if ( match ) {
- elem.type = match[1];
- } else {
- elem.removeAttribute("type");
- }
- return elem;
-}
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
- var elem,
- i = 0;
- for ( ; (elem = elems[i]) != null; i++ ) {
- jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
- }
-}
-
-function cloneCopyEvent( src, dest ) {
-
- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
- return;
- }
-
- var type, i, l,
- oldData = jQuery._data( src ),
- curData = jQuery._data( dest, oldData ),
- events = oldData.events;
-
- if ( events ) {
- delete curData.handle;
- curData.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
-
- // make the cloned public data object a copy from the original
- if ( curData.data ) {
- curData.data = jQuery.extend( {}, curData.data );
- }
-}
-
-function fixCloneNodeIssues( src, dest ) {
- var nodeName, e, data;
-
- // We do not need to do anything for non-Elements
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- nodeName = dest.nodeName.toLowerCase();
-
- // IE6-8 copies events bound via attachEvent when using cloneNode.
- if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
- data = jQuery._data( dest );
-
- for ( e in data.events ) {
- jQuery.removeEvent( dest, e, data.handle );
- }
-
- // Event data gets referenced instead of copied if the expando gets copied too
- dest.removeAttribute( jQuery.expando );
- }
-
- // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
- if ( nodeName === "script" && dest.text !== src.text ) {
- disableScript( dest ).text = src.text;
- restoreScript( dest );
-
- // IE6-10 improperly clones children of object elements using classid.
- // IE10 throws NoModificationAllowedError if parent is null, #12132.
- } else if ( nodeName === "object" ) {
- if ( dest.parentNode ) {
- dest.outerHTML = src.outerHTML;
- }
-
- // This path appears unavoidable for IE9. When cloning an object
- // element in IE9, the outerHTML strategy above is not sufficient.
- // If the src has innerHTML and the destination does not,
- // copy the src.innerHTML into the dest.innerHTML. #10324
- if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
- dest.innerHTML = src.innerHTML;
- }
-
- } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
- // IE6-8 fails to persist the checked state of a cloned checkbox
- // or radio button. Worse, IE6-7 fail to give the cloned element
- // a checked appearance if the defaultChecked value isn't also set
-
- dest.defaultChecked = dest.checked = src.checked;
-
- // IE6-7 get confused and end up setting the value of a cloned
- // checkbox/radio button to an empty string instead of "on"
- if ( dest.value !== src.value ) {
- dest.value = src.value;
- }
-
- // IE6-8 fails to return the selected option to the default selected
- // state when cloning options
- } else if ( nodeName === "option" ) {
- dest.defaultSelected = dest.selected = src.defaultSelected;
-
- // IE6-8 fails to set the defaultValue to the correct value when
- // cloning other types of input fields
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-}
-
-jQuery.each({
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var elems,
- i = 0,
- ret = [],
- insert = jQuery( selector ),
- last = insert.length - 1;
-
- for ( ; i <= last; i++ ) {
- elems = i === last ? this : this.clone(true);
- jQuery( insert[i] )[ original ]( elems );
-
- // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
- core_push.apply( ret, elems.get() );
- }
-
- return this.pushStack( ret );
- };
-});
-
-function getAll( context, tag ) {
- var elems, elem,
- i = 0,
- found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
- typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
- undefined;
-
- if ( !found ) {
- for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
- if ( !tag || jQuery.nodeName( elem, tag ) ) {
- found.push( elem );
- } else {
- jQuery.merge( found, getAll( elem, tag ) );
- }
- }
- }
-
- return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
- jQuery.merge( [ context ], found ) :
- found;
-}
-
-// Used in buildFragment, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
- if ( manipulation_rcheckableType.test( elem.type ) ) {
- elem.defaultChecked = elem.checked;
- }
-}
-
-jQuery.extend({
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var destElements, node, clone, i, srcElements,
- inPage = jQuery.contains( elem.ownerDocument, elem );
-
- if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
- clone = elem.cloneNode( true );
-
- // IE<=8 does not properly clone detached, unknown element nodes
- } else {
- fragmentDiv.innerHTML = elem.outerHTML;
- fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
- }
-
- if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
- (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-
- // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
- destElements = getAll( clone );
- srcElements = getAll( elem );
-
- // Fix all IE cloning issues
- for ( i = 0; (node = srcElements[i]) != null; ++i ) {
- // Ensure that the destination node is not null; Fixes #9587
- if ( destElements[i] ) {
- fixCloneNodeIssues( node, destElements[i] );
- }
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- if ( deepDataAndEvents ) {
- srcElements = srcElements || getAll( elem );
- destElements = destElements || getAll( clone );
-
- for ( i = 0; (node = srcElements[i]) != null; i++ ) {
- cloneCopyEvent( node, destElements[i] );
- }
- } else {
- cloneCopyEvent( elem, clone );
- }
- }
-
- // Preserve script evaluation history
- destElements = getAll( clone, "script" );
- if ( destElements.length > 0 ) {
- setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
- }
-
- destElements = srcElements = node = null;
-
- // Return the cloned set
- return clone;
- },
-
- buildFragment: function( elems, context, scripts, selection ) {
- var j, elem, contains,
- tmp, tag, tbody, wrap,
- l = elems.length,
-
- // Ensure a safe fragment
- safe = createSafeFragment( context ),
-
- nodes = [],
- i = 0;
-
- for ( ; i < l; i++ ) {
- elem = elems[ i ];
-
- if ( elem || elem === 0 ) {
-
- // Add nodes directly
- if ( jQuery.type( elem ) === "object" ) {
- jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
- // Convert non-html into a text node
- } else if ( !rhtml.test( elem ) ) {
- nodes.push( context.createTextNode( elem ) );
-
- // Convert html into DOM nodes
- } else {
- tmp = tmp || safe.appendChild( context.createElement("div") );
-
- // Deserialize a standard representation
- tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
- wrap = wrapMap[ tag ] || wrapMap._default;
-
- tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
-
- // Descend through wrappers to the right content
- j = wrap[0];
- while ( j-- ) {
- tmp = tmp.lastChild;
- }
-
- // Manually add leading whitespace removed by IE
- if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
- nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
- }
-
- // Remove IE's autoinserted <tbody> from table fragments
- if ( !jQuery.support.tbody ) {
-
- // String was a <table>, *may* have spurious <tbody>
- elem = tag === "table" && !rtbody.test( elem ) ?
- tmp.firstChild :
-
- // String was a bare <thead> or <tfoot>
- wrap[1] === "<table>" && !rtbody.test( elem ) ?
- tmp :
- 0;
-
- j = elem && elem.childNodes.length;
- while ( j-- ) {
- if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
- elem.removeChild( tbody );
- }
- }
- }
-
- jQuery.merge( nodes, tmp.childNodes );
-
- // Fix #12392 for WebKit and IE > 9
- tmp.textContent = "";
-
- // Fix #12392 for oldIE
- while ( tmp.firstChild ) {
- tmp.removeChild( tmp.firstChild );
- }
-
- // Remember the top-level container for proper cleanup
- tmp = safe.lastChild;
- }
- }
- }
-
- // Fix #11356: Clear elements from fragment
- if ( tmp ) {
- safe.removeChild( tmp );
- }
-
- // Reset defaultChecked for any radios and checkboxes
- // about to be appended to the DOM in IE 6/7 (#8060)
- if ( !jQuery.support.appendChecked ) {
- jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
- }
-
- i = 0;
- while ( (elem = nodes[ i++ ]) ) {
-
- // #4087 - If origin and destination elements are the same, and this is
- // that element, do not do anything
- if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
- continue;
- }
-
- contains = jQuery.contains( elem.ownerDocument, elem );
-
- // Append to fragment
- tmp = getAll( safe.appendChild( elem ), "script" );
-
- // Preserve script evaluation history
- if ( contains ) {
- setGlobalEval( tmp );
- }
-
- // Capture executables
- if ( scripts ) {
- j = 0;
- while ( (elem = tmp[ j++ ]) ) {
- if ( rscriptType.test( elem.type || "" ) ) {
- scripts.push( elem );
- }
- }
- }
- }
-
- tmp = null;
-
- return safe;
- },
-
- cleanData: function( elems, /* internal */ acceptData ) {
- var elem, type, id, data,
- i = 0,
- internalKey = jQuery.expando,
- cache = jQuery.cache,
- deleteExpando = jQuery.support.deleteExpando,
- special = jQuery.event.special;
-
- for ( ; (elem = elems[i]) != null; i++ ) {
-
- if ( acceptData || jQuery.acceptData( elem ) ) {
-
- id = elem[ internalKey ];
- data = id && cache[ id ];
-
- if ( data ) {
- if ( data.events ) {
- for ( type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
- }
-
- // Remove cache only if it was not already removed by jQuery.event.remove
- if ( cache[ id ] ) {
-
- delete cache[ id ];
-
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( deleteExpando ) {
- delete elem[ internalKey ];
-
- } else if ( typeof elem.removeAttribute !== core_strundefined ) {
- elem.removeAttribute( internalKey );
-
- } else {
- elem[ internalKey ] = null;
- }
-
- core_deletedIds.push( id );
- }
- }
- }
- }
- },
-
- _evalUrl: function( url ) {
- return jQuery.ajax({
- url: url,
- type: "GET",
- dataType: "script",
- async: false,
- global: false,
- "throws": true
- });
- }
-});
-jQuery.fn.extend({
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapAll( html.call(this, i) );
- });
- }
-
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
- if ( this[0].parentNode ) {
- wrap.insertBefore( this[0] );
- }
-
- wrap.map(function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- }).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapInner( html.call(this, i) );
- });
- }
-
- return this.each(function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- });
- },
-
- wrap: function( html ) {
- var isFunction = jQuery.isFunction( html );
-
- return this.each(function(i) {
- jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
- });
- },
-
- unwrap: function() {
- return this.parent().each(function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- }).end();
- }
-});
-var iframe, getStyles, curCSS,
- ralpha = /alpha\([^)]*\)/i,
- ropacity = /opacity\s*=\s*([^)]*)/,
- rposition = /^(top|right|bottom|left)$/,
- // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
- // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
- rmargin = /^margin/,
- rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
- rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
- rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
- elemdisplay = { BODY: "block" },
-
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssNormalTransform = {
- letterSpacing: 0,
- fontWeight: 400
- },
-
- cssExpand = [ "Top", "Right", "Bottom", "Left" ],
- cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
-
- // shortcut for names that are not vendor prefixed
- if ( name in style ) {
- return name;
- }
-
- // check for vendor prefixed names
- var capName = name.charAt(0).toUpperCase() + name.slice(1),
- origName = name,
- i = cssPrefixes.length;
-
- while ( i-- ) {
- name = cssPrefixes[ i ] + capName;
- if ( name in style ) {
- return name;
- }
- }
-
- return origName;
-}
-
-function isHidden( elem, el ) {
- // isHidden might be called from jQuery#filter function;
- // in that case, element will be second argument
- elem = el || elem;
- return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
-
-function showHide( elements, show ) {
- var display, elem, hidden,
- values = [],
- index = 0,
- length = elements.length;
-
- for ( ; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
-
- values[ index ] = jQuery._data( elem, "olddisplay" );
- display = elem.style.display;
- if ( show ) {
- // Reset the inline display of this element to learn if it is
- // being hidden by cascaded rules or not
- if ( !values[ index ] && display === "none" ) {
- elem.style.display = "";
- }
-
- // Set elements which have been overridden with display: none
- // in a stylesheet to whatever the default browser style is
- // for such an element
- if ( elem.style.display === "" && isHidden( elem ) ) {
- values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
- }
- } else {
-
- if ( !values[ index ] ) {
- hidden = isHidden( elem );
-
- if ( display && display !== "none" || !hidden ) {
- jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
- }
- }
- }
- }
-
- // Set the display of most of the elements in a second loop
- // to avoid the constant reflow
- for ( index = 0; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
- if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
- elem.style.display = show ? values[ index ] || "" : "none";
- }
- }
-
- return elements;
-}
-
-jQuery.fn.extend({
- css: function( name, value ) {
- return jQuery.access( this, function( elem, name, value ) {
- var len, styles,
- map = {},
- i = 0;
-
- if ( jQuery.isArray( name ) ) {
- styles = getStyles( elem );
- len = name.length;
-
- for ( ; i < len; i++ ) {
- map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
- }
-
- return map;
- }
-
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- }, name, value, arguments.length > 1 );
- },
- show: function() {
- return showHide( this, true );
- },
- hide: function() {
- return showHide( this );
- },
- toggle: function( state ) {
- var bool = typeof state === "boolean";
-
- return this.each(function() {
- if ( bool ? state : isHidden( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- });
- }
-});
-
-jQuery.extend({
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity" );
- return ret === "" ? "1" : ret;
- }
- }
- }
- },
-
- // Don't automatically add "px" to these possibly-unitless properties
- cssNumber: {
- "columnCount": true,
- "fillOpacity": true,
- "fontWeight": true,
- "lineHeight": true,
- "opacity": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {
- // normalize float css property
- "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
- },
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, hooks,
- origName = jQuery.camelCase( name ),
- style = elem.style;
-
- name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
-
- // gets hook for the prefixed version
- // followed by the unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // convert relative number strings (+= or -=) to relative numbers. #7345
- if ( type === "string" && (ret = rrelNum.exec( value )) ) {
- value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that NaN and null values aren't set. See: #7116
- if ( value == null || type === "number" && isNaN( value ) ) {
- return;
- }
-
- // If a number was passed in, add 'px' to the (except for certain CSS properties)
- if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
- value += "px";
- }
-
- // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
- // but it would mean to define eight (for every problematic property) identical functions
- if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
- style[ name ] = "inherit";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-
- // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
- // Fixes bug #5509
- try {
- style[ name ] = value;
- } catch(e) {}
- }
-
- } else {
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, extra, styles ) {
- var num, val, hooks,
- origName = jQuery.camelCase( name );
-
- // Make sure that we're working with the right name
- name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
-
- // gets hook for the prefixed version
- // followed by the unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks ) {
- val = hooks.get( elem, true, extra );
- }
-
- // Otherwise, if a way to get the computed value exists, use that
- if ( val === undefined ) {
- val = curCSS( elem, name, styles );
- }
-
- //convert "normal" to computed value
- if ( val === "normal" && name in cssNormalTransform ) {
- val = cssNormalTransform[ name ];
- }
-
- // Return, converting to number if forced or a qualifier was provided and val looks numeric
- if ( extra === "" || extra ) {
- num = parseFloat( val );
- return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
- }
- return val;
- }
-});
-
-// NOTE: we've included the "window" in window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
- getStyles = function( elem ) {
- return window.getComputedStyle( elem, null );
- };
-
- curCSS = function( elem, name, _computed ) {
- var width, minWidth, maxWidth,
- computed = _computed || getStyles( elem ),
-
- // getPropertyValue is only needed for .css('filter') in IE9, see #12537
- ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
- style = elem.style;
-
- if ( computed ) {
-
- if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
- ret = jQuery.style( elem, name );
- }
-
- // A tribute to the "awesome hack by Dean Edwards"
- // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
- // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
- // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
- if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
- // Remember the original values
- width = style.width;
- minWidth = style.minWidth;
- maxWidth = style.maxWidth;
-
- // Put in the new values to get a computed value out
- style.minWidth = style.maxWidth = style.width = ret;
- ret = computed.width;
-
- // Revert the changed values
- style.width = width;
- style.minWidth = minWidth;
- style.maxWidth = maxWidth;
- }
- }
-
- return ret;
- };
-} else if ( document.documentElement.currentStyle ) {
- getStyles = function( elem ) {
- return elem.currentStyle;
- };
-
- curCSS = function( elem, name, _computed ) {
- var left, rs, rsLeft,
- computed = _computed || getStyles( elem ),
- ret = computed ? computed[ name ] : undefined,
- style = elem.style;
-
- // Avoid setting ret to empty string here
- // so we don't default to auto
- if ( ret == null && style && style[ name ] ) {
- ret = style[ name ];
- }
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- // but not position css attributes, as those are proportional to the parent element instead
- // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
- if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
- // Remember the original values
- left = style.left;
- rs = elem.runtimeStyle;
- rsLeft = rs && rs.left;
-
- // Put in the new values to get a computed value out
- if ( rsLeft ) {
- rs.left = elem.currentStyle.left;
- }
- style.left = name === "fontSize" ? "1em" : ret;
- ret = style.pixelLeft + "px";
-
- // Revert the changed values
- style.left = left;
- if ( rsLeft ) {
- rs.left = rsLeft;
- }
- }
-
- return ret === "" ? "auto" : ret;
- };
-}
-
-function setPositiveNumber( elem, value, subtract ) {
- var matches = rnumsplit.exec( value );
- return matches ?
- // Guard against undefined "subtract", e.g., when used as in cssHooks
- Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
- value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
- var i = extra === ( isBorderBox ? "border" : "content" ) ?
- // If we already have the right measurement, avoid augmentation
- 4 :
- // Otherwise initialize for horizontal or vertical properties
- name === "width" ? 1 : 0,
-
- val = 0;
-
- for ( ; i < 4; i += 2 ) {
- // both box models exclude margin, so add it if we want it
- if ( extra === "margin" ) {
- val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
- }
-
- if ( isBorderBox ) {
- // border-box includes padding, so remove it if we want content
- if ( extra === "content" ) {
- val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
- }
-
- // at this point, extra isn't border nor margin, so remove border
- if ( extra !== "margin" ) {
- val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
- } else {
- // at this point, extra isn't content, so add padding
- val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
- // at this point, extra isn't content nor padding, so add border
- if ( extra !== "padding" ) {
- val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
- }
- }
-
- return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
- // Start with offset property, which is equivalent to the border-box value
- var valueIsBorderBox = true,
- val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- styles = getStyles( elem ),
- isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
- // some non-html elements return undefined for offsetWidth, so check for null/undefined
- // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
- // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
- if ( val <= 0 || val == null ) {
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name, styles );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ];
- }
-
- // Computed unit is not pixels. Stop here and return.
- if ( rnumnonpx.test(val) ) {
- return val;
- }
-
- // we need the check for style in case a browser which returns unreliable values
- // for getComputedStyle silently falls back to the reliable elem.style
- valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
-
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
- }
-
- // use the active box-sizing model to add/subtract irrelevant styles
- return ( val +
- augmentWidthOrHeight(
- elem,
- name,
- extra || ( isBorderBox ? "border" : "content" ),
- valueIsBorderBox,
- styles
- )
- ) + "px";
-}
-
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
- var doc = document,
- display = elemdisplay[ nodeName ];
-
- if ( !display ) {
- display = actualDisplay( nodeName, doc );
-
- // If the simple way fails, read from inside an iframe
- if ( display === "none" || !display ) {
- // Use the already-created iframe if possible
- iframe = ( iframe ||
- jQuery("<iframe frameborder='0' width='0' height='0'/>")
- .css( "cssText", "display:block !important" )
- ).appendTo( doc.documentElement );
-
- // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
- doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
- doc.write("<!doctype html><html><body>");
- doc.close();
-
- display = actualDisplay( nodeName, doc );
- iframe.detach();
- }
-
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
- }
-
- return display;
-}
-
-// Called ONLY from within css_defaultDisplay
-function actualDisplay( name, doc ) {
- var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
- display = jQuery.css( elem[0], "display" );
- elem.remove();
- return display;
-}
-
-jQuery.each([ "height", "width" ], function( i, name ) {
- jQuery.cssHooks[ name ] = {
- get: function( elem, computed, extra ) {
- if ( computed ) {
- // certain elements can have dimension info if we invisibly show them
- // however, it must have a current display style that would benefit from this
- return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
- jQuery.swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, name, extra );
- }) :
- getWidthOrHeight( elem, name, extra );
- }
- },
-
- set: function( elem, value, extra ) {
- var styles = extra && getStyles( elem );
- return setPositiveNumber( elem, value, extra ?
- augmentWidthOrHeight(
- elem,
- name,
- extra,
- jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- styles
- ) : 0
- );
- }
- };
-});
-
-if ( !jQuery.support.opacity ) {
- jQuery.cssHooks.opacity = {
- get: function( elem, computed ) {
- // IE uses filters for opacity
- return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
- ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
- computed ? "1" : "";
- },
-
- set: function( elem, value ) {
- var style = elem.style,
- currentStyle = elem.currentStyle,
- opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
- filter = currentStyle && currentStyle.filter || style.filter || "";
-
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- style.zoom = 1;
-
- // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
- // if value === "", then remove inline opacity #12685
- if ( ( value >= 1 || value === "" ) &&
- jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
- style.removeAttribute ) {
-
- // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
- // if "filter:" is present at all, clearType is disabled, we want to avoid this
- // style.removeAttribute is IE Only, but so apparently is this code path...
- style.removeAttribute( "filter" );
-
- // if there is no filter style applied in a css rule or unset inline opacity, we are done
- if ( value === "" || currentStyle && !currentStyle.filter ) {
- return;
- }
- }
-
- // otherwise, set new filter values
- style.filter = ralpha.test( filter ) ?
- filter.replace( ralpha, opacity ) :
- filter + " " + opacity;
- }
- };
-}
-
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
- if ( !jQuery.support.reliableMarginRight ) {
- jQuery.cssHooks.marginRight = {
- get: function( elem, computed ) {
- if ( computed ) {
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // Work around by temporarily setting element display to inline-block
- return jQuery.swap( elem, { "display": "inline-block" },
- curCSS, [ elem, "marginRight" ] );
- }
- }
- };
- }
-
- // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
- // getComputedStyle returns percent when specified for top/left/bottom/right
- // rather than make the css module depend on the offset module, we just check for it here
- if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
- jQuery.each( [ "top", "left" ], function( i, prop ) {
- jQuery.cssHooks[ prop ] = {
- get: function( elem, computed ) {
- if ( computed ) {
- computed = curCSS( elem, prop );
- // if curCSS returns percentage, fallback to offset
- return rnumnonpx.test( computed ) ?
- jQuery( elem ).position()[ prop ] + "px" :
- computed;
- }
- }
- };
- });
- }
-
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.hidden = function( elem ) {
- // Support: Opera <= 12.12
- // Opera reports offsetWidths and offsetHeights less than zero on some elements
- return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
- (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
- };
-
- jQuery.expr.filters.visible = function( elem ) {
- return !jQuery.expr.filters.hidden( elem );
- };
-}
-
-// These hooks are used by animate to expand properties
-jQuery.each({
- margin: "",
- padding: "",
- border: "Width"
-}, function( prefix, suffix ) {
- jQuery.cssHooks[ prefix + suffix ] = {
- expand: function( value ) {
- var i = 0,
- expanded = {},
-
- // assumes a single number if not a string
- parts = typeof value === "string" ? value.split(" ") : [ value ];
-
- for ( ; i < 4; i++ ) {
- expanded[ prefix + cssExpand[ i ] + suffix ] =
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
- }
-
- return expanded;
- }
- };
-
- if ( !rmargin.test( prefix ) ) {
- jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
- }
-});
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
- rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-jQuery.fn.extend({
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
- serializeArray: function() {
- return this.map(function(){
- // Can add propHook for "elements" to filter or add form elements
- var elements = jQuery.prop( this, "elements" );
- return elements ? jQuery.makeArray( elements ) : this;
- })
- .filter(function(){
- var type = this.type;
- // Use .is(":disabled") so that fieldset[disabled] works
- return this.name && !jQuery( this ).is( ":disabled" ) &&
- rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
- ( this.checked || !manipulation_rcheckableType.test( type ) );
- })
- .map(function( i, elem ){
- var val = jQuery( this ).val();
-
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val ){
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }).get();
- }
-});
-
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
- var prefix,
- s = [],
- add = function( key, value ) {
- // If value is a function, invoke it and return its value
- value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
- };
-
- // Set traditional to true for jQuery <= 1.3.2 behavior.
- if ( traditional === undefined ) {
- traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- });
-
- } else {
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" ).replace( r20, "+" );
-};
-
-function buildParams( prefix, obj, traditional, add ) {
- var name;
-
- if ( jQuery.isArray( obj ) ) {
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
- // Item is non-scalar (array or object), encode its numeric index.
- buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
- }
- });
-
- } else if ( !traditional && jQuery.type( obj ) === "object" ) {
- // Serialize object item.
- for ( name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-});
-
-jQuery.fn.extend({
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- },
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
- }
-});
-var
- // Document location
- ajaxLocParts,
- ajaxLocation,
- ajax_nonce = jQuery.now(),
-
- ajax_rquery = /\?/,
- rhash = /#.*$/,
- rts = /([?&])_=[^&]*/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
- rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-
- // Keep a copy of the old load method
- _load = jQuery.fn.load,
-
- /* Prefilters
- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
- * 2) These are called:
- * - BEFORE asking for a transport
- * - AFTER param serialization (s.data is a string if s.processData is true)
- * 3) key is the dataType
- * 4) the catchall symbol "*" can be used
- * 5) execution will start with transport dataType and THEN continue down to "*" if needed
- */
- prefilters = {},
-
- /* Transports bindings
- * 1) key is the dataType
- * 2) the catchall symbol "*" can be used
- * 3) selection will start with transport dataType and THEN go to "*" if needed
- */
- transports = {},
-
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
- allTypes = "*/".concat("*");
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
- ajaxLocation = location.href;
-} catch( e ) {
- // Use the href attribute of an A element
- // since IE will modify it given document.location
- ajaxLocation = document.createElement( "a" );
- ajaxLocation.href = "";
- ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
- // dataTypeExpression is optional and defaults to "*"
- return function( dataTypeExpression, func ) {
-
- if ( typeof dataTypeExpression !== "string" ) {
- func = dataTypeExpression;
- dataTypeExpression = "*";
- }
-
- var dataType,
- i = 0,
- dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
-
- if ( jQuery.isFunction( func ) ) {
- // For each dataType in the dataTypeExpression
- while ( (dataType = dataTypes[i++]) ) {
- // Prepend if requested
- if ( dataType[0] === "+" ) {
- dataType = dataType.slice( 1 ) || "*";
- (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
-
- // Otherwise append
- } else {
- (structure[ dataType ] = structure[ dataType ] || []).push( func );
- }
- }
- }
- };
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
- var inspected = {},
- seekingTransport = ( structure === transports );
-
- function inspect( dataType ) {
- var selected;
- inspected[ dataType ] = true;
- jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
- var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
- if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
- options.dataTypes.unshift( dataTypeOrTransport );
- inspect( dataTypeOrTransport );
- return false;
- } else if ( seekingTransport ) {
- return !( selected = dataTypeOrTransport );
- }
- });
- return selected;
- }
-
- return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
- var deep, key,
- flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
- for ( key in src ) {
- if ( src[ key ] !== undefined ) {
- ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
- }
- }
- if ( deep ) {
- jQuery.extend( true, target, deep );
- }
-
- return target;
-}
-
-jQuery.fn.load = function( url, params, callback ) {
- if ( typeof url !== "string" && _load ) {
- return _load.apply( this, arguments );
- }
-
- var selector, response, type,
- self = this,
- off = url.indexOf(" ");
-
- if ( off >= 0 ) {
- selector = url.slice( off, url.length );
- url = url.slice( 0, off );
- }
-
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
-
- // We assume that it's the callback
- callback = params;
- params = undefined;
-
- // Otherwise, build a param string
- } else if ( params && typeof params === "object" ) {
- type = "POST";
- }
-
- // If we have elements to modify, make the request
- if ( self.length > 0 ) {
- jQuery.ajax({
- url: url,
-
- // if "type" variable is undefined, then "GET" method will be used
- type: type,
- dataType: "html",
- data: params
- }).done(function( responseText ) {
-
- // Save response for use in complete callback
- response = arguments;
-
- self.html( selector ?
-
- // If a selector was specified, locate the right elements in a dummy div
- // Exclude scripts to avoid IE 'Permission Denied' errors
- jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
- // Otherwise use the full result
- responseText );
-
- }).complete( callback && function( jqXHR, status ) {
- self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
- });
- }
-
- return this;
-};
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
- jQuery.fn[ type ] = function( fn ){
- return this.on( type, fn );
- };
-});
-
-jQuery.extend({
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {},
-
- ajaxSettings: {
- url: ajaxLocation,
- type: "GET",
- isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
- global: true,
- processData: true,
- async: true,
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
- /*
- timeout: 0,
- data: null,
- dataType: null,
- username: null,
- password: null,
- cache: null,
- throws: false,
- traditional: false,
- headers: {},
- */
-
- accepts: {
- "*": allTypes,
- text: "text/plain",
- html: "text/html",
- xml: "application/xml, text/xml",
- json: "application/json, text/javascript"
- },
-
- contents: {
- xml: /xml/,
- html: /html/,
- json: /json/
- },
-
- responseFields: {
- xml: "responseXML",
- text: "responseText",
- json: "responseJSON"
- },
-
- // Data converters
- // Keys separate source (or catchall "*") and destination types with a single space
- converters: {
-
- // Convert anything to text
- "* text": String,
-
- // Text to html (true = no transformation)
- "text html": true,
-
- // Evaluate text as a json expression
- "text json": jQuery.parseJSON,
-
- // Parse text as xml
- "text xml": jQuery.parseXML
- },
-
- // For options that shouldn't be deep extended:
- // you can add your own custom options here if
- // and when you create one that shouldn't be
- // deep extended (see ajaxExtend)
- flatOptions: {
- url: true,
- context: true
- }
- },
-
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function( target, settings ) {
- return settings ?
-
- // Building a settings object
- ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
- // Extending ajaxSettings
- ajaxExtend( jQuery.ajaxSettings, target );
- },
-
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
- ajaxTransport: addToPrefiltersOrTransports( transports ),
-
- // Main method
- ajax: function( url, options ) {
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- options = url;
- url = undefined;
- }
-
- // Force options to be an object
- options = options || {};
-
- var // Cross-domain detection vars
- parts,
- // Loop variable
- i,
- // URL without anti-cache param
- cacheURL,
- // Response headers as string
- responseHeadersString,
- // timeout handle
- timeoutTimer,
-
- // To know if global events are to be dispatched
- fireGlobals,
-
- transport,
- // Response headers
- responseHeaders,
- // Create the final options object
- s = jQuery.ajaxSetup( {}, options ),
- // Callbacks context
- callbackContext = s.context || s,
- // Context for global events is callbackContext if it is a DOM node or jQuery collection
- globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
- // Deferreds
- deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks("once memory"),
- // Status-dependent callbacks
- statusCode = s.statusCode || {},
- // Headers (they are sent all at once)
- requestHeaders = {},
- requestHeadersNames = {},
- // The jqXHR state
- state = 0,
- // Default abort message
- strAbort = "canceled",
- // Fake xhr
- jqXHR = {
- readyState: 0,
-
- // Builds headers hashtable if needed
- getResponseHeader: function( key ) {
- var match;
- if ( state === 2 ) {
- if ( !responseHeaders ) {
- responseHeaders = {};
- while ( (match = rheaders.exec( responseHeadersString )) ) {
- responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
- }
- }
- match = responseHeaders[ key.toLowerCase() ];
- }
- return match == null ? null : match;
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return state === 2 ? responseHeadersString : null;
- },
-
- // Caches the header
- setRequestHeader: function( name, value ) {
- var lname = name.toLowerCase();
- if ( !state ) {
- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Overrides response content-type header
- overrideMimeType: function( type ) {
- if ( !state ) {
- s.mimeType = type;
- }
- return this;
- },
-
- // Status-dependent callbacks
- statusCode: function( map ) {
- var code;
- if ( map ) {
- if ( state < 2 ) {
- for ( code in map ) {
- // Lazy-add the new callback in a way that preserves old ones
- statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
- }
- } else {
- // Execute the appropriate callbacks
- jqXHR.always( map[ jqXHR.status ] );
- }
- }
- return this;
- },
-
- // Cancel the request
- abort: function( statusText ) {
- var finalText = statusText || strAbort;
- if ( transport ) {
- transport.abort( finalText );
- }
- done( 0, finalText );
- return this;
- }
- };
-
- // Attach deferreds
- deferred.promise( jqXHR ).complete = completeDeferred.add;
- jqXHR.success = jqXHR.done;
- jqXHR.error = jqXHR.fail;
-
- // Remove hash character (#7531: and string promotion)
- // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
- // Handle falsy url in the settings object (#10093: consistency with old signature)
- // We also use the url parameter if available
- s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
- // Alias method option to type as per ticket #12004
- s.type = options.method || options.type || s.method || s.type;
-
- // Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
-
- // A cross-domain request is in order when we have a protocol:host:port mismatch
- if ( s.crossDomain == null ) {
- parts = rurl.exec( s.url.toLowerCase() );
- s.crossDomain = !!( parts &&
- ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
- ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
- ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
- );
- }
-
- // Convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" ) {
- s.data = jQuery.param( s.data, s.traditional );
- }
-
- // Apply prefilters
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
- // If request was aborted inside a prefilter, stop there
- if ( state === 2 ) {
- return jqXHR;
- }
-
- // We can fire global events as of now if asked to
- fireGlobals = s.global;
-
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger("ajaxStart");
- }
-
- // Uppercase the type
- s.type = s.type.toUpperCase();
-
- // Determine if request has content
- s.hasContent = !rnoContent.test( s.type );
-
- // Save the URL in case we're toying with the If-Modified-Since
- // and/or If-None-Match header later on
- cacheURL = s.url;
-
- // More options handling for requests with no content
- if ( !s.hasContent ) {
-
- // If data is available, append data to url
- if ( s.data ) {
- cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
- // #9682: remove data so that it's not used in an eventual retry
- delete s.data;
- }
-
- // Add anti-cache in url if needed
- if ( s.cache === false ) {
- s.url = rts.test( cacheURL ) ?
-
- // If there is already a '_' parameter, set its value
- cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
-
- // Otherwise add one to the end
- cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
- }
- }
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- if ( jQuery.lastModified[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
- }
- if ( jQuery.etag[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
- }
- }
-
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
- // Set the Accepts header for the server, depending on the dataType
- jqXHR.setRequestHeader(
- "Accept",
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
- s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
- s.accepts[ "*" ]
- );
-
- // Check for headers option
- for ( i in s.headers ) {
- jqXHR.setRequestHeader( i, s.headers[ i ] );
- }
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
- // Abort if not done already and return
- return jqXHR.abort();
- }
-
- // aborting is no longer a cancellation
- strAbort = "abort";
-
- // Install callbacks on deferreds
- for ( i in { success: 1, error: 1, complete: 1 } ) {
- jqXHR[ i ]( s[ i ] );
- }
-
- // Get transport
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
- // If no transport, we auto-abort
- if ( !transport ) {
- done( -1, "No Transport" );
- } else {
- jqXHR.readyState = 1;
-
- // Send global event
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
- }
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = setTimeout(function() {
- jqXHR.abort("timeout");
- }, s.timeout );
- }
-
- try {
- state = 1;
- transport.send( requestHeaders, done );
- } catch ( e ) {
- // Propagate exception as error if not done
- if ( state < 2 ) {
- done( -1, e );
- // Simply rethrow otherwise
- } else {
- throw e;
- }
- }
- }
-
- // Callback for when everything is done
- function done( status, nativeStatusText, responses, headers ) {
- var isSuccess, success, error, response, modified,
- statusText = nativeStatusText;
-
- // Called once
- if ( state === 2 ) {
- return;
- }
-
- // State is "done" now
- state = 2;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status > 0 ? 4 : 0;
-
- // Determine if successful
- isSuccess = status >= 200 && status < 300 || status === 304;
-
- // Get response data
- if ( responses ) {
- response = ajaxHandleResponses( s, jqXHR, responses );
- }
-
- // Convert no matter what (that way responseXXX fields are always set)
- response = ajaxConvert( s, response, jqXHR, isSuccess );
-
- // If successful, handle type chaining
- if ( isSuccess ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- modified = jqXHR.getResponseHeader("Last-Modified");
- if ( modified ) {
- jQuery.lastModified[ cacheURL ] = modified;
- }
- modified = jqXHR.getResponseHeader("etag");
- if ( modified ) {
- jQuery.etag[ cacheURL ] = modified;
- }
- }
-
- // if no content
- if ( status === 204 || s.type === "HEAD" ) {
- statusText = "nocontent";
-
- // if not modified
- } else if ( status === 304 ) {
- statusText = "notmodified";
-
- // If we have data, let's convert it
- } else {
- statusText = response.state;
- success = response.data;
- error = response.error;
- isSuccess = !error;
- }
- } else {
- // We extract error from statusText
- // then normalize statusText and status for non-aborts
- error = statusText;
- if ( status || !statusText ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger("ajaxStop");
- }
- }
- }
-
- return jqXHR;
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- },
-
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- }
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
- // shift arguments if data argument was omitted
- if ( jQuery.isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- return jQuery.ajax({
- url: url,
- type: method,
- dataType: type,
- data: data,
- success: callback
- });
- };
-});
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
- var firstDataType, ct, finalDataType, type,
- contents = s.contents,
- dataTypes = s.dataTypes;
-
- // Remove auto dataType and get content-type in the process
- while( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
- }
- }
-
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
- }
- }
- }
-
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
- finalDataType = type;
- break;
- }
- if ( !firstDataType ) {
- firstDataType = type;
- }
- }
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
- }
-
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
- }
- return responses[ finalDataType ];
- }
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
- var conv2, current, conv, tmp, prev,
- converters = {},
- // Work with a copy of dataTypes in case we need to modify it for conversion
- dataTypes = s.dataTypes.slice();
-
- // Create converters map with lowercased keys
- if ( dataTypes[ 1 ] ) {
- for ( conv in s.converters ) {
- converters[ conv.toLowerCase() ] = s.converters[ conv ];
- }
- }
-
- current = dataTypes.shift();
-
- // Convert to each sequential dataType
- while ( current ) {
-
- if ( s.responseFields[ current ] ) {
- jqXHR[ s.responseFields[ current ] ] = response;
- }
-
- // Apply the dataFilter if provided
- if ( !prev && isSuccess && s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
-
- prev = current;
- current = dataTypes.shift();
-
- if ( current ) {
-
- // There's only work to do if current dataType is non-auto
- if ( current === "*" ) {
-
- current = prev;
-
- // Convert response if prev dataType is non-auto and differs from current
- } else if ( prev !== "*" && prev !== current ) {
-
- // Seek a direct converter
- conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
- // If none found, seek a pair
- if ( !conv ) {
- for ( conv2 in converters ) {
-
- // If conv2 outputs current
- tmp = conv2.split( " " );
- if ( tmp[ 1 ] === current ) {
-
- // If prev can be converted to accepted input
- conv = converters[ prev + " " + tmp[ 0 ] ] ||
- converters[ "* " + tmp[ 0 ] ];
- if ( conv ) {
- // Condense equivalence converters
- if ( conv === true ) {
- conv = converters[ conv2 ];
-
- // Otherwise, insert the intermediate dataType
- } else if ( converters[ conv2 ] !== true ) {
- current = tmp[ 0 ];
- dataTypes.unshift( tmp[ 1 ] );
- }
- break;
- }
- }
- }
- }
-
- // Apply converter (if not an equivalence)
- if ( conv !== true ) {
-
- // Unless errors are allowed to bubble, catch and return them
- if ( conv && s[ "throws" ] ) {
- response = conv( response );
- } else {
- try {
- response = conv( response );
- } catch ( e ) {
- return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
- }
- }
- }
- }
- }
- }
-
- return { state: "success", data: response };
-}
-// Install script dataType
-jQuery.ajaxSetup({
- accepts: {
- script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /(?:java|ecma)script/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- s.global = false;
- }
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
- // This transport only deals with cross domain requests
- if ( s.crossDomain ) {
-
- var script,
- head = document.head || jQuery("head")[0] || document.documentElement;
-
- return {
-
- send: function( _, callback ) {
-
- script = document.createElement("script");
-
- script.async = true;
-
- if ( s.scriptCharset ) {
- script.charset = s.scriptCharset;
- }
-
- script.src = s.url;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function( _, isAbort ) {
-
- if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
- // Handle memory leak in IE
- script.onload = script.onreadystatechange = null;
-
- // Remove the script
- if ( script.parentNode ) {
- script.parentNode.removeChild( script );
- }
-
- // Dereference the script
- script = null;
-
- // Callback if not abort
- if ( !isAbort ) {
- callback( 200, "success" );
- }
- }
- };
-
- // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
- // Use native DOM manipulation to avoid our domManip AJAX trickery
- head.insertBefore( script, head.firstChild );
- },
-
- abort: function() {
- if ( script ) {
- script.onload( undefined, true );
- }
- }
- };
- }
-});
-var oldCallbacks = [],
- rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
- jsonp: "callback",
- jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
- this[ callback ] = true;
- return callback;
- }
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var callbackName, overwritten, responseContainer,
- jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
- "url" :
- typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
- );
-
- // Handle iff the expected data type is "jsonp" or we have a parameter to set
- if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
- // Get callback name, remembering preexisting value associated with it
- callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
- s.jsonpCallback() :
- s.jsonpCallback;
-
- // Insert callback into url or form data
- if ( jsonProp ) {
- s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
- } else if ( s.jsonp !== false ) {
- s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
- }
-
- // Use data converter to retrieve json after script execution
- s.converters["script json"] = function() {
- if ( !responseContainer ) {
- jQuery.error( callbackName + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Install callback
- overwritten = window[ callbackName ];
- window[ callbackName ] = function() {
- responseContainer = arguments;
- };
-
- // Clean-up function (fires after converters)
- jqXHR.always(function() {
- // Restore preexisting value
- window[ callbackName ] = overwritten;
-
- // Save back as free
- if ( s[ callbackName ] ) {
- // make sure that re-using the options doesn't screw things around
- s.jsonpCallback = originalSettings.jsonpCallback;
-
- // save the callback name for future use
- oldCallbacks.push( callbackName );
- }
-
- // Call if it was a function and we have a response
- if ( responseContainer && jQuery.isFunction( overwritten ) ) {
- overwritten( responseContainer[ 0 ] );
- }
-
- responseContainer = overwritten = undefined;
- });
-
- // Delegate to script
- return "script";
- }
-});
-var xhrCallbacks, xhrSupported,
- xhrId = 0,
- // #5280: Internet Explorer will keep connections alive if we don't abort on unload
- xhrOnUnloadAbort = window.ActiveXObject && function() {
- // Abort all pending requests
- var key;
- for ( key in xhrCallbacks ) {
- xhrCallbacks[ key ]( undefined, true );
- }
- };
-
-// Functions to create xhrs
-function createStandardXHR() {
- try {
- return new window.XMLHttpRequest();
- } catch( e ) {}
-}
-
-function createActiveXHR() {
- try {
- return new window.ActiveXObject("Microsoft.XMLHTTP");
- } catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
- /* Microsoft failed to properly
- * implement the XMLHttpRequest in IE7 (can't request local files),
- * so we use the ActiveXObject when it is available
- * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
- * we need a fallback.
- */
- function() {
- return !this.isLocal && createStandardXHR() || createActiveXHR();
- } :
- // For all other browsers, use the standard XMLHttpRequest object
- createStandardXHR;
-
-// Determine support properties
-xhrSupported = jQuery.ajaxSettings.xhr();
-jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = jQuery.support.ajax = !!xhrSupported;
-
-// Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
-
- jQuery.ajaxTransport(function( s ) {
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( !s.crossDomain || jQuery.support.cors ) {
-
- var callback;
-
- return {
- send: function( headers, complete ) {
-
- // Get a new xhr
- var handle, i,
- xhr = s.xhr();
-
- // Open the socket
- // Passing null username, generates a login popup on Opera (#2865)
- if ( s.username ) {
- xhr.open( s.type, s.url, s.async, s.username, s.password );
- } else {
- xhr.open( s.type, s.url, s.async );
- }
-
- // Apply custom fields if provided
- if ( s.xhrFields ) {
- for ( i in s.xhrFields ) {
- xhr[ i ] = s.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( s.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( s.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !s.crossDomain && !headers["X-Requested-With"] ) {
- headers["X-Requested-With"] = "XMLHttpRequest";
- }
-
- // Need an extra try/catch for cross domain requests in Firefox 3
- try {
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
- } catch( err ) {}
-
- // Do send the request
- // This may raise an exception which is actually
- // handled in jQuery.ajax (so no try/catch here)
- xhr.send( ( s.hasContent && s.data ) || null );
-
- // Listener
- callback = function( _, isAbort ) {
- var status, responseHeaders, statusText, responses;
-
- // Firefox throws exceptions when accessing properties
- // of an xhr when a network error occurred
- // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
- try {
-
- // Was never called and is aborted or complete
- if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
- // Only called once
- callback = undefined;
-
- // Do not keep as active anymore
- if ( handle ) {
- xhr.onreadystatechange = jQuery.noop;
- if ( xhrOnUnloadAbort ) {
- delete xhrCallbacks[ handle ];
- }
- }
-
- // If it's an abort
- if ( isAbort ) {
- // Abort it manually if needed
- if ( xhr.readyState !== 4 ) {
- xhr.abort();
- }
- } else {
- responses = {};
- status = xhr.status;
- responseHeaders = xhr.getAllResponseHeaders();
-
- // When requesting binary data, IE6-9 will throw an exception
- // on any attempt to access responseText (#11426)
- if ( typeof xhr.responseText === "string" ) {
- responses.text = xhr.responseText;
- }
-
- // Firefox throws an exception when accessing
- // statusText for faulty cross-domain requests
- try {
- statusText = xhr.statusText;
- } catch( e ) {
- // We normalize with Webkit giving an empty statusText
- statusText = "";
- }
-
- // Filter status for non standard behaviors
-
- // If the request is local and we have data: assume a success
- // (success with no data won't get notified, that's the best we
- // can do given current implementations)
- if ( !status && s.isLocal && !s.crossDomain ) {
- status = responses.text ? 200 : 404;
- // IE - #1450: sometimes returns 1223 when it should be 204
- } else if ( status === 1223 ) {
- status = 204;
- }
- }
- }
- } catch( firefoxAccessException ) {
- if ( !isAbort ) {
- complete( -1, firefoxAccessException );
- }
- }
-
- // Call complete if needed
- if ( responses ) {
- complete( status, statusText, responses, responseHeaders );
- }
- };
-
- if ( !s.async ) {
- // if we're in sync mode we fire the callback
- callback();
- } else if ( xhr.readyState === 4 ) {
- // (IE6 & IE7) if it's in cache and has been
- // retrieved directly we need to fire the callback
- setTimeout( callback );
- } else {
- handle = ++xhrId;
- if ( xhrOnUnloadAbort ) {
- // Create the active xhrs callbacks list if needed
- // and attach the unload handler
- if ( !xhrCallbacks ) {
- xhrCallbacks = {};
- jQuery( window ).unload( xhrOnUnloadAbort );
- }
- // Add to list of active xhrs callbacks
- xhrCallbacks[ handle ] = callback;
- }
- xhr.onreadystatechange = callback;
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback( undefined, true );
- }
- }
- };
- }
- });
-}
-var fxNow, timerId,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
- rrun = /queueHooks$/,
- animationPrefilters = [ defaultPrefilter ],
- tweeners = {
- "*": [function( prop, value ) {
- var tween = this.createTween( prop, value ),
- target = tween.cur(),
- parts = rfxnum.exec( value ),
- unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
- // Starting value computation is required for potential unit mismatches
- start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
- rfxnum.exec( jQuery.css( tween.elem, prop ) ),
- scale = 1,
- maxIterations = 20;
-
- if ( start && start[ 3 ] !== unit ) {
- // Trust units reported by jQuery.css
- unit = unit || start[ 3 ];
-
- // Make sure we update the tween properties later on
- parts = parts || [];
-
- // Iteratively approximate from a nonzero starting point
- start = +target || 1;
-
- do {
- // If previous iteration zeroed out, double until we get *something*
- // Use a string for doubling factor so we don't accidentally see scale as unchanged below
- scale = scale || ".5";
-
- // Adjust and apply
- start = start / scale;
- jQuery.style( tween.elem, prop, start + unit );
-
- // Update scale, tolerating zero or NaN from tween.cur()
- // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
- } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
- }
-
- // Update tween properties
- if ( parts ) {
- start = tween.start = +start || +target || 0;
- tween.unit = unit;
- // If a +=/-= token was provided, we're doing a relative animation
- tween.end = parts[ 1 ] ?
- start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
- +parts[ 2 ];
- }
-
- return tween;
- }]
- };
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- setTimeout(function() {
- fxNow = undefined;
- });
- return ( fxNow = jQuery.now() );
-}
-
-function createTween( value, prop, animation ) {
- var tween,
- collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
- index = 0,
- length = collection.length;
- for ( ; index < length; index++ ) {
- if ( (tween = collection[ index ].call( animation, prop, value )) ) {
-
- // we're done with this property
- return tween;
- }
- }
-}
-
-function Animation( elem, properties, options ) {
- var result,
- stopped,
- index = 0,
- length = animationPrefilters.length,
- deferred = jQuery.Deferred().always( function() {
- // don't match elem in the :animated selector
- delete tick.elem;
- }),
- tick = function() {
- if ( stopped ) {
- return false;
- }
- var currentTime = fxNow || createFxNow(),
- remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
- // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
- temp = remaining / animation.duration || 0,
- percent = 1 - temp,
- index = 0,
- length = animation.tweens.length;
-
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( percent );
- }
-
- deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
- if ( percent < 1 && length ) {
- return remaining;
- } else {
- deferred.resolveWith( elem, [ animation ] );
- return false;
- }
- },
- animation = deferred.promise({
- elem: elem,
- props: jQuery.extend( {}, properties ),
- opts: jQuery.extend( true, { specialEasing: {} }, options ),
- originalProperties: properties,
- originalOptions: options,
- startTime: fxNow || createFxNow(),
- duration: options.duration,
- tweens: [],
- createTween: function( prop, end ) {
- var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
- animation.tweens.push( tween );
- return tween;
- },
- stop: function( gotoEnd ) {
- var index = 0,
- // if we are going to the end, we want to run all the tweens
- // otherwise we skip this part
- length = gotoEnd ? animation.tweens.length : 0;
- if ( stopped ) {
- return this;
- }
- stopped = true;
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( 1 );
- }
-
- // resolve when we played the last frame
- // otherwise, reject
- if ( gotoEnd ) {
- deferred.resolveWith( elem, [ animation, gotoEnd ] );
- } else {
- deferred.rejectWith( elem, [ animation, gotoEnd ] );
- }
- return this;
- }
- }),
- props = animation.props;
-
- propFilter( props, animation.opts.specialEasing );
-
- for ( ; index < length ; index++ ) {
- result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
- if ( result ) {
- return result;
- }
- }
-
- jQuery.map( props, createTween, animation );
-
- if ( jQuery.isFunction( animation.opts.start ) ) {
- animation.opts.start.call( elem, animation );
- }
-
- jQuery.fx.timer(
- jQuery.extend( tick, {
- elem: elem,
- anim: animation,
- queue: animation.opts.queue
- })
- );
-
- // attach callbacks from options
- return animation.progress( animation.opts.progress )
- .done( animation.opts.done, animation.opts.complete )
- .fail( animation.opts.fail )
- .always( animation.opts.always );
-}
-
-function propFilter( props, specialEasing ) {
- var index, name, easing, value, hooks;
-
- // camelCase, specialEasing and expand cssHook pass
- for ( index in props ) {
- name = jQuery.camelCase( index );
- easing = specialEasing[ name ];
- value = props[ index ];
- if ( jQuery.isArray( value ) ) {
- easing = value[ 1 ];
- value = props[ index ] = value[ 0 ];
- }
-
- if ( index !== name ) {
- props[ name ] = value;
- delete props[ index ];
- }
-
- hooks = jQuery.cssHooks[ name ];
- if ( hooks && "expand" in hooks ) {
- value = hooks.expand( value );
- delete props[ name ];
-
- // not quite $.extend, this wont overwrite keys already present.
- // also - reusing 'index' from above because we have the correct "name"
- for ( index in value ) {
- if ( !( index in props ) ) {
- props[ index ] = value[ index ];
- specialEasing[ index ] = easing;
- }
- }
- } else {
- specialEasing[ name ] = easing;
- }
- }
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
- tweener: function( props, callback ) {
- if ( jQuery.isFunction( props ) ) {
- callback = props;
- props = [ "*" ];
- } else {
- props = props.split(" ");
- }
-
- var prop,
- index = 0,
- length = props.length;
-
- for ( ; index < length ; index++ ) {
- prop = props[ index ];
- tweeners[ prop ] = tweeners[ prop ] || [];
- tweeners[ prop ].unshift( callback );
- }
- },
-
- prefilter: function( callback, prepend ) {
- if ( prepend ) {
- animationPrefilters.unshift( callback );
- } else {
- animationPrefilters.push( callback );
- }
- }
-});
-
-function defaultPrefilter( elem, props, opts ) {
- /* jshint validthis: true */
- var prop, value, toggle, tween, hooks, oldfire,
- anim = this,
- orig = {},
- style = elem.style,
- hidden = elem.nodeType && isHidden( elem ),
- dataShow = jQuery._data( elem, "fxshow" );
-
- // handle queue: false promises
- if ( !opts.queue ) {
- hooks = jQuery._queueHooks( elem, "fx" );
- if ( hooks.unqueued == null ) {
- hooks.unqueued = 0;
- oldfire = hooks.empty.fire;
- hooks.empty.fire = function() {
- if ( !hooks.unqueued ) {
- oldfire();
- }
- };
- }
- hooks.unqueued++;
-
- anim.always(function() {
- // doing this makes sure that the complete handler will be called
- // before this completes
- anim.always(function() {
- hooks.unqueued--;
- if ( !jQuery.queue( elem, "fx" ).length ) {
- hooks.empty.fire();
- }
- });
- });
- }
-
- // height/width overflow pass
- if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
- // Make sure that nothing sneaks out
- // Record all 3 overflow attributes because IE does not
- // change the overflow attribute when overflowX and
- // overflowY are set to the same value
- opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
- // Set display property to inline-block for height/width
- // animations on inline elements that are having width/height animated
- if ( jQuery.css( elem, "display" ) === "inline" &&
- jQuery.css( elem, "float" ) === "none" ) {
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
- style.display = "inline-block";
-
- } else {
- style.zoom = 1;
- }
- }
- }
-
- if ( opts.overflow ) {
- style.overflow = "hidden";
- if ( !jQuery.support.shrinkWrapBlocks ) {
- anim.always(function() {
- style.overflow = opts.overflow[ 0 ];
- style.overflowX = opts.overflow[ 1 ];
- style.overflowY = opts.overflow[ 2 ];
- });
- }
- }
-
-
- // show/hide pass
- for ( prop in props ) {
- value = props[ prop ];
- if ( rfxtypes.exec( value ) ) {
- delete props[ prop ];
- toggle = toggle || value === "toggle";
- if ( value === ( hidden ? "hide" : "show" ) ) {
- continue;
- }
- orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
- }
- }
-
- if ( !jQuery.isEmptyObject( orig ) ) {
- if ( dataShow ) {
- if ( "hidden" in dataShow ) {
- hidden = dataShow.hidden;
- }
- } else {
- dataShow = jQuery._data( elem, "fxshow", {} );
- }
-
- // store state if its toggle - enables .stop().toggle() to "reverse"
- if ( toggle ) {
- dataShow.hidden = !hidden;
- }
- if ( hidden ) {
- jQuery( elem ).show();
- } else {
- anim.done(function() {
- jQuery( elem ).hide();
- });
- }
- anim.done(function() {
- var prop;
- jQuery._removeData( elem, "fxshow" );
- for ( prop in orig ) {
- jQuery.style( elem, prop, orig[ prop ] );
- }
- });
- for ( prop in orig ) {
- tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-
- if ( !( prop in dataShow ) ) {
- dataShow[ prop ] = tween.start;
- if ( hidden ) {
- tween.end = tween.start;
- tween.start = prop === "width" || prop === "height" ? 1 : 0;
- }
- }
- }
- }
-}
-
-function Tween( elem, options, prop, end, easing ) {
- return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
- constructor: Tween,
- init: function( elem, options, prop, end, easing, unit ) {
- this.elem = elem;
- this.prop = prop;
- this.easing = easing || "swing";
- this.options = options;
- this.start = this.now = this.cur();
- this.end = end;
- this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
- },
- cur: function() {
- var hooks = Tween.propHooks[ this.prop ];
-
- return hooks && hooks.get ?
- hooks.get( this ) :
- Tween.propHooks._default.get( this );
- },
- run: function( percent ) {
- var eased,
- hooks = Tween.propHooks[ this.prop ];
-
- if ( this.options.duration ) {
- this.pos = eased = jQuery.easing[ this.easing ](
- percent, this.options.duration * percent, 0, 1, this.options.duration
- );
- } else {
- this.pos = eased = percent;
- }
- this.now = ( this.end - this.start ) * eased + this.start;
-
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- if ( hooks && hooks.set ) {
- hooks.set( this );
- } else {
- Tween.propHooks._default.set( this );
- }
- return this;
- }
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
- _default: {
- get: function( tween ) {
- var result;
-
- if ( tween.elem[ tween.prop ] != null &&
- (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
- return tween.elem[ tween.prop ];
- }
-
- // passing an empty string as a 3rd parameter to .css will automatically
- // attempt a parseFloat and fallback to a string if the parse fails
- // so, simple values such as "10px" are parsed to Float.
- // complex values such as "rotate(1rad)" are returned as is.
- result = jQuery.css( tween.elem, tween.prop, "" );
- // Empty strings, null, undefined and "auto" are converted to 0.
- return !result || result === "auto" ? 0 : result;
- },
- set: function( tween ) {
- // use step hook for back compat - use cssHook if its there - use .style if its
- // available and use plain properties where available
- if ( jQuery.fx.step[ tween.prop ] ) {
- jQuery.fx.step[ tween.prop ]( tween );
- } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
- jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
- } else {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
- }
-};
-
-// Support: IE <=9
-// Panic based approach to setting things on disconnected nodes
-
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
- set: function( tween ) {
- if ( tween.elem.nodeType && tween.elem.parentNode ) {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
-};
-
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
- var cssFn = jQuery.fn[ name ];
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return speed == null || typeof speed === "boolean" ?
- cssFn.apply( this, arguments ) :
- this.animate( genFx( name, true ), speed, easing, callback );
- };
-});
-
-jQuery.fn.extend({
- fadeTo: function( speed, to, easing, callback ) {
-
- // show any hidden elements after setting opacity to 0
- return this.filter( isHidden ).css( "opacity", 0 ).show()
-
- // animate to the value specified
- .end().animate({ opacity: to }, speed, easing, callback );
- },
- animate: function( prop, speed, easing, callback ) {
- var empty = jQuery.isEmptyObject( prop ),
- optall = jQuery.speed( speed, easing, callback ),
- doAnimation = function() {
- // Operate on a copy of prop so per-property easing won't be lost
- var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
- // Empty animations, or finishing resolves immediately
- if ( empty || jQuery._data( this, "finish" ) ) {
- anim.stop( true );
- }
- };
- doAnimation.finish = doAnimation;
-
- return empty || optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
- },
- stop: function( type, clearQueue, gotoEnd ) {
- var stopQueue = function( hooks ) {
- var stop = hooks.stop;
- delete hooks.stop;
- stop( gotoEnd );
- };
-
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
- }
- if ( clearQueue && type !== false ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each(function() {
- var dequeue = true,
- index = type != null && type + "queueHooks",
- timers = jQuery.timers,
- data = jQuery._data( this );
-
- if ( index ) {
- if ( data[ index ] && data[ index ].stop ) {
- stopQueue( data[ index ] );
- }
- } else {
- for ( index in data ) {
- if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
- stopQueue( data[ index ] );
- }
- }
- }
-
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
- timers[ index ].anim.stop( gotoEnd );
- dequeue = false;
- timers.splice( index, 1 );
- }
- }
-
- // start the next in the queue if the last step wasn't forced
- // timers currently will call their complete callbacks, which will dequeue
- // but only if they were gotoEnd
- if ( dequeue || !gotoEnd ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- finish: function( type ) {
- if ( type !== false ) {
- type = type || "fx";
- }
- return this.each(function() {
- var index,
- data = jQuery._data( this ),
- queue = data[ type + "queue" ],
- hooks = data[ type + "queueHooks" ],
- timers = jQuery.timers,
- length = queue ? queue.length : 0;
-
- // enable finishing flag on private data
- data.finish = true;
-
- // empty the queue first
- jQuery.queue( this, type, [] );
-
- if ( hooks && hooks.stop ) {
- hooks.stop.call( this, true );
- }
-
- // look for any active animations, and finish them
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
- timers[ index ].anim.stop( true );
- timers.splice( index, 1 );
- }
- }
-
- // look for any animations in the old queue and finish them
- for ( index = 0; index < length; index++ ) {
- if ( queue[ index ] && queue[ index ].finish ) {
- queue[ index ].finish.call( this );
- }
- }
-
- // turn off finishing flag
- delete data.finish;
- });
- }
-});
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
- var which,
- attrs = { height: type },
- i = 0;
-
- // if we include width, step value is 1 to do all cssExpand values,
- // if we don't include width, step value is 2 to skip over Left and Right
- includeWidth = includeWidth? 1 : 0;
- for( ; i < 4 ; i += 2 - includeWidth ) {
- which = cssExpand[ i ];
- attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
- }
-
- if ( includeWidth ) {
- attrs.opacity = attrs.width = type;
- }
-
- return attrs;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
- slideDown: genFx("show"),
- slideUp: genFx("hide"),
- slideToggle: genFx("toggle"),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
- };
-});
-
-jQuery.speed = function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
- };
-
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
- // normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
-
- // Queueing
- opt.old = opt.complete;
-
- opt.complete = function() {
- if ( jQuery.isFunction( opt.old ) ) {
- opt.old.call( this );
- }
-
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
- }
- };
-
- return opt;
-};
-
-jQuery.easing = {
- linear: function( p ) {
- return p;
- },
- swing: function( p ) {
- return 0.5 - Math.cos( p*Math.PI ) / 2;
- }
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
- var timer,
- timers = jQuery.timers,
- i = 0;
-
- fxNow = jQuery.now();
-
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
- // Checks the timer has not already been removed
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
- if ( timer() && jQuery.timers.push( timer ) ) {
- jQuery.fx.start();
- }
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.start = function() {
- if ( !timerId ) {
- timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
- }
-};
-
-jQuery.fx.stop = function() {
- clearInterval( timerId );
- timerId = null;
-};
-
-jQuery.fx.speeds = {
- slow: 600,
- fast: 200,
- // Default speed
- _default: 400
-};
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep(jQuery.timers, function( fn ) {
- return elem === fn.elem;
- }).length;
- };
-}
-jQuery.fn.offset = function( options ) {
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each(function( i ) {
- jQuery.offset.setOffset( this, options, i );
- });
- }
-
- var docElem, win,
- box = { top: 0, left: 0 },
- elem = this[ 0 ],
- doc = elem && elem.ownerDocument;
-
- if ( !doc ) {
- return;
- }
-
- docElem = doc.documentElement;
-
- // Make sure it's not a disconnected DOM node
- if ( !jQuery.contains( docElem, elem ) ) {
- return box;
- }
-
- // If we don't have gBCR, just use 0,0 rather than error
- // BlackBerry 5, iOS 3 (original iPhone)
- if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
- box = elem.getBoundingClientRect();
- }
- win = getWindow( doc );
- return {
- top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
- left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
- };
-};
-
-jQuery.offset = {
-
- setOffset: function( elem, options, i ) {
- var position = jQuery.css( elem, "position" );
-
- // set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- var curElem = jQuery( elem ),
- curOffset = curElem.offset(),
- curCSSTop = jQuery.css( elem, "top" ),
- curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
- props = {}, curPosition = {}, curTop, curLeft;
-
- // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( jQuery.isFunction( options ) ) {
- options = options.call( elem, i, curOffset );
- }
-
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
- }
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
- } else {
- curElem.css( props );
- }
- }
-};
-
-
-jQuery.fn.extend({
-
- position: function() {
- if ( !this[ 0 ] ) {
- return;
- }
-
- var offsetParent, offset,
- parentOffset = { top: 0, left: 0 },
- elem = this[ 0 ];
-
- // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
- if ( jQuery.css( elem, "position" ) === "fixed" ) {
- // we assume that getBoundingClientRect is available when computed position is fixed
- offset = elem.getBoundingClientRect();
- } else {
- // Get *real* offsetParent
- offsetParent = this.offsetParent();
-
- // Get correct offsets
- offset = this.offset();
- if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
- parentOffset = offsetParent.offset();
- }
-
- // Add offsetParent borders
- parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
- parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
- }
-
- // Subtract parent offsets and element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
- return {
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
- };
- },
-
- offsetParent: function() {
- return this.map(function() {
- var offsetParent = this.offsetParent || docElem;
- while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
- offsetParent = offsetParent.offsetParent;
- }
- return offsetParent || docElem;
- });
- }
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
- var top = /Y/.test( prop );
-
- jQuery.fn[ method ] = function( val ) {
- return jQuery.access( this, function( elem, method, val ) {
- var win = getWindow( elem );
-
- if ( val === undefined ) {
- return win ? (prop in win) ? win[ prop ] :
- win.document.documentElement[ method ] :
- elem[ method ];
- }
-
- if ( win ) {
- win.scrollTo(
- !top ? val : jQuery( win ).scrollLeft(),
- top ? val : jQuery( win ).scrollTop()
- );
-
- } else {
- elem[ method ] = val;
- }
- }, method, val, arguments.length, null );
- };
-});
-
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ?
- elem :
- elem.nodeType === 9 ?
- elem.defaultView || elem.parentWindow :
- false;
-}
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
- // margin is only for outerHeight, outerWidth
- jQuery.fn[ funcName ] = function( margin, value ) {
- var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
- extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
- return jQuery.access( this, function( elem, type, value ) {
- var doc;
-
- if ( jQuery.isWindow( elem ) ) {
- // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
- // isn't a whole lot we can do. See pull request at this URL for discussion:
- // https://github.com/jquery/jquery/pull/764
- return elem.document.documentElement[ "client" + name ];
- }
-
- // Get document width or height
- if ( elem.nodeType === 9 ) {
- doc = elem.documentElement;
-
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
- // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
- return Math.max(
- elem.body[ "scroll" + name ], doc[ "scroll" + name ],
- elem.body[ "offset" + name ], doc[ "offset" + name ],
- doc[ "client" + name ]
- );
- }
-
- return value === undefined ?
- // Get width or height on the element, requesting but not forcing parseFloat
- jQuery.css( elem, type, extra ) :
-
- // Set width or height on the element
- jQuery.style( elem, type, value, extra );
- }, type, chainable ? margin : undefined, chainable, null );
- };
- });
-});
-// Limit scope pollution from any deprecated API
-// (function() {
-
-// The number of elements contained in the matched element set
-jQuery.fn.size = function() {
- return this.length;
-};
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-// })();
-if ( typeof module === "object" && module && typeof module.exports === "object" ) {
- // Expose jQuery as module.exports in loaders that implement the Node
- // module pattern (including browserify). Do not create the global, since
- // the user will be storing it themselves locally, and globals are frowned
- // upon in the Node module world.
- module.exports = jQuery;
-} else {
- // Otherwise expose jQuery to the global object as usual
- window.jQuery = window.$ = jQuery;
-
- // Register as a named AMD module, since jQuery can be concatenated with other
- // files that may use define, but not via a proper concatenation script that
- // understands anonymous AMD modules. A named AMD is safest and most robust
- // way to register. Lowercase jquery is used because AMD module names are
- // derived from file names, and jQuery is normally delivered in a lowercase
- // file name. Do this after creating the global so that if an AMD module wants
- // to call noConflict to hide this version of jQuery, it will work.
- if ( typeof define === "function" && define.amd ) {
- define( "jquery", [], function () { return jQuery; } );
- }
-}
-
-})( window );
+++ /dev/null
-/*
-* jQuery Mobile 1.3.1
-* Git HEAD hash: 74b4bec049fd93e4fe40205e6157de16eb64eb46 <> Date: Mon Apr 8 2013 19:41:28 UTC
-* http://jquerymobile.com
-*
-* Copyright 2010, 2013 jQuery Foundation, Inc. and other contributors
-* Released under the MIT license.
-* http://jquery.org/license
-*
-*/
-
-
-(function ( root, doc, factory ) {
- if ( typeof define === "function" && define.amd ) {
- // AMD. Register as an anonymous module.
- define( [ "jquery" ], function ( $ ) {
- factory( $, root, doc );
- return $.mobile;
- });
- } else {
- // Browser globals
- factory( root.jQuery, root, doc );
- }
-}( this, document, function ( jQuery, window, document, undefined ) {
-(function( $ ) {
- $.mobile = {};
-}( jQuery ));
-(function( $, window, undefined ) {
- var nsNormalizeDict = {};
-
- // jQuery.mobile configurable options
- $.mobile = $.extend($.mobile, {
-
- // Version of the jQuery Mobile Framework
- version: "1.3.1",
-
- // Namespace used framework-wide for data-attrs. Default is no namespace
- ns: "",
-
- // Define the url parameter used for referencing widget-generated sub-pages.
- // Translates to to example.html&ui-page=subpageIdentifier
- // hash segment before &ui-page= is used to make Ajax request
- subPageUrlKey: "ui-page",
-
- // Class assigned to page currently in view, and during transitions
- activePageClass: "ui-page-active",
-
- // Class used for "active" button state, from CSS framework
- activeBtnClass: "ui-btn-active",
-
- // Class used for "focus" form element state, from CSS framework
- focusClass: "ui-focus",
-
- // Automatically handle clicks and form submissions through Ajax, when same-domain
- ajaxEnabled: true,
-
- // Automatically load and show pages based on location.hash
- hashListeningEnabled: true,
-
- // disable to prevent jquery from bothering with links
- linkBindingEnabled: true,
-
- // Set default page transition - 'none' for no transitions
- defaultPageTransition: "fade",
-
- // Set maximum window width for transitions to apply - 'false' for no limit
- maxTransitionWidth: false,
-
- // Minimum scroll distance that will be remembered when returning to a page
- minScrollBack: 250,
-
- // DEPRECATED: the following property is no longer in use, but defined until 2.0 to prevent conflicts
- touchOverflowEnabled: false,
-
- // Set default dialog transition - 'none' for no transitions
- defaultDialogTransition: "pop",
-
- // Error response message - appears when an Ajax page request fails
- pageLoadErrorMessage: "Error Loading Page",
-
- // For error messages, which theme does the box uses?
- pageLoadErrorMessageTheme: "e",
-
- // replace calls to window.history.back with phonegaps navigation helper
- // where it is provided on the window object
- phonegapNavigationEnabled: false,
-
- //automatically initialize the DOM when it's ready
- autoInitializePage: true,
-
- pushStateEnabled: true,
-
- // allows users to opt in to ignoring content by marking a parent element as
- // data-ignored
- ignoreContentEnabled: false,
-
- // turn of binding to the native orientationchange due to android orientation behavior
- orientationChangeEnabled: true,
-
- buttonMarkup: {
- hoverDelay: 200
- },
-
- // define the window and the document objects
- window: $( window ),
- document: $( document ),
-
- // TODO might be useful upstream in jquery itself ?
- keyCode: {
- ALT: 18,
- BACKSPACE: 8,
- CAPS_LOCK: 20,
- COMMA: 188,
- COMMAND: 91,
- COMMAND_LEFT: 91, // COMMAND
- COMMAND_RIGHT: 93,
- CONTROL: 17,
- DELETE: 46,
- DOWN: 40,
- END: 35,
- ENTER: 13,
- ESCAPE: 27,
- HOME: 36,
- INSERT: 45,
- LEFT: 37,
- MENU: 93, // COMMAND_RIGHT
- NUMPAD_ADD: 107,
- NUMPAD_DECIMAL: 110,
- NUMPAD_DIVIDE: 111,
- NUMPAD_ENTER: 108,
- NUMPAD_MULTIPLY: 106,
- NUMPAD_SUBTRACT: 109,
- PAGE_DOWN: 34,
- PAGE_UP: 33,
- PERIOD: 190,
- RIGHT: 39,
- SHIFT: 16,
- SPACE: 32,
- TAB: 9,
- UP: 38,
- WINDOWS: 91 // COMMAND
- },
-
- // Place to store various widget extensions
- behaviors: {},
-
- // Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value
- silentScroll: function( ypos ) {
- if ( $.type( ypos ) !== "number" ) {
- ypos = $.mobile.defaultHomeScroll;
- }
-
- // prevent scrollstart and scrollstop events
- $.event.special.scrollstart.enabled = false;
-
- setTimeout( function() {
- window.scrollTo( 0, ypos );
- $.mobile.document.trigger( "silentscroll", { x: 0, y: ypos });
- }, 20 );
-
- setTimeout( function() {
- $.event.special.scrollstart.enabled = true;
- }, 150 );
- },
-
- // Expose our cache for testing purposes.
- nsNormalizeDict: nsNormalizeDict,
-
- // Take a data attribute property, prepend the namespace
- // and then camel case the attribute string. Add the result
- // to our nsNormalizeDict so we don't have to do this again.
- nsNormalize: function( prop ) {
- if ( !prop ) {
- return;
- }
-
- return nsNormalizeDict[ prop ] || ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) );
- },
-
- // Find the closest parent with a theme class on it. Note that
- // we are not using $.fn.closest() on purpose here because this
- // method gets called quite a bit and we need it to be as fast
- // as possible.
- getInheritedTheme: function( el, defaultTheme ) {
- var e = el[ 0 ],
- ltr = "",
- re = /ui-(bar|body|overlay)-([a-z])\b/,
- c, m;
-
- while ( e ) {
- c = e.className || "";
- if ( c && ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) {
- // We found a parent with a theme class
- // on it so bail from this loop.
- break;
- }
-
- e = e.parentNode;
- }
-
- // Return the theme letter we found, if none, return the
- // specified default.
-
- return ltr || defaultTheme || "a";
- },
-
- // TODO the following $ and $.fn extensions can/probably should be moved into jquery.mobile.core.helpers
- //
- // Find the closest javascript page element to gather settings data jsperf test
- // http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit
- // possibly naive, but it shows that the parsing overhead for *just* the page selector vs
- // the page and dialog selector is negligable. This could probably be speed up by
- // doing a similar parent node traversal to the one found in the inherited theme code above
- closestPageData: function( $target ) {
- return $target
- .closest( ':jqmData(role="page"), :jqmData(role="dialog")' )
- .data( "mobile-page" );
- },
-
- enhanceable: function( $set ) {
- return this.haveParents( $set, "enhance" );
- },
-
- hijackable: function( $set ) {
- return this.haveParents( $set, "ajax" );
- },
-
- haveParents: function( $set, attr ) {
- if ( !$.mobile.ignoreContentEnabled ) {
- return $set;
- }
-
- var count = $set.length,
- $newSet = $(),
- e, $element, excluded;
-
- for ( var i = 0; i < count; i++ ) {
- $element = $set.eq( i );
- excluded = false;
- e = $set[ i ];
-
- while ( e ) {
- var c = e.getAttribute ? e.getAttribute( "data-" + $.mobile.ns + attr ) : "";
-
- if ( c === "false" ) {
- excluded = true;
- break;
- }
-
- e = e.parentNode;
- }
-
- if ( !excluded ) {
- $newSet = $newSet.add( $element );
- }
- }
-
- return $newSet;
- },
-
- getScreenHeight: function() {
- // Native innerHeight returns more accurate value for this across platforms,
- // jQuery version is here as a normalized fallback for platforms like Symbian
- return window.innerHeight || $.mobile.window.height();
- }
- }, $.mobile );
-
- // Mobile version of data and removeData and hasData methods
- // ensures all data is set and retrieved using jQuery Mobile's data namespace
- $.fn.jqmData = function( prop, value ) {
- var result;
- if ( typeof prop !== "undefined" ) {
- if ( prop ) {
- prop = $.mobile.nsNormalize( prop );
- }
-
- // undefined is permitted as an explicit input for the second param
- // in this case it returns the value and does not set it to undefined
- if( arguments.length < 2 || value === undefined ){
- result = this.data( prop );
- } else {
- result = this.data( prop, value );
- }
- }
- return result;
- };
-
- $.jqmData = function( elem, prop, value ) {
- var result;
- if ( typeof prop !== "undefined" ) {
- result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value );
- }
- return result;
- };
-
- $.fn.jqmRemoveData = function( prop ) {
- return this.removeData( $.mobile.nsNormalize( prop ) );
- };
-
- $.jqmRemoveData = function( elem, prop ) {
- return $.removeData( elem, $.mobile.nsNormalize( prop ) );
- };
-
- $.fn.removeWithDependents = function() {
- $.removeWithDependents( this );
- };
-
- $.removeWithDependents = function( elem ) {
- var $elem = $( elem );
-
- ( $elem.jqmData( 'dependents' ) || $() ).remove();
- $elem.remove();
- };
-
- $.fn.addDependents = function( newDependents ) {
- $.addDependents( $( this ), newDependents );
- };
-
- $.addDependents = function( elem, newDependents ) {
- var dependents = $( elem ).jqmData( 'dependents' ) || $();
-
- $( elem ).jqmData( 'dependents', $.merge( dependents, newDependents ) );
- };
-
- // note that this helper doesn't attempt to handle the callback
- // or setting of an html element's text, its only purpose is
- // to return the html encoded version of the text in all cases. (thus the name)
- $.fn.getEncodedText = function() {
- return $( "<div/>" ).text( $( this ).text() ).html();
- };
-
- // fluent helper function for the mobile namespaced equivalent
- $.fn.jqmEnhanceable = function() {
- return $.mobile.enhanceable( this );
- };
-
- $.fn.jqmHijackable = function() {
- return $.mobile.hijackable( this );
- };
-
- // Monkey-patching Sizzle to filter the :jqmData selector
- var oldFind = $.find,
- jqmDataRE = /:jqmData\(([^)]*)\)/g;
-
- $.find = function( selector, context, ret, extra ) {
- selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" );
-
- return oldFind.call( this, selector, context, ret, extra );
- };
-
- $.extend( $.find, oldFind );
-
- $.find.matches = function( expr, set ) {
- return $.find( expr, null, null, set );
- };
-
- $.find.matchesSelector = function( node, expr ) {
- return $.find( expr, null, null, [ node ] ).length > 0;
- };
-})( jQuery, this );
-
-
-/*!
- * jQuery UI Widget v1.10.0pre - 2012-11-13 (ff055a0c353c3c8ce6e5bfa07ad7cb03e8885bc5)
- * http://jqueryui.com
- *
- * Copyright 2010, 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/jQuery.widget/
- */
-(function( $, undefined ) {
-
-var uuid = 0,
- slice = Array.prototype.slice,
- _cleanData = $.cleanData;
-$.cleanData = function( elems ) {
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- try {
- $( elem ).triggerHandler( "remove" );
- // http://bugs.jquery.com/ticket/8235
- } catch( e ) {}
- }
- _cleanData( elems );
-};
-
-$.widget = function( name, base, prototype ) {
- var fullName, existingConstructor, constructor, basePrototype,
- namespace = name.split( "." )[ 0 ];
-
- name = name.split( "." )[ 1 ];
- fullName = namespace + "-" + name;
-
- if ( !prototype ) {
- prototype = base;
- base = $.Widget;
- }
-
- // create selector for plugin
- $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
- return !!$.data( elem, fullName );
- };
-
- $[ namespace ] = $[ namespace ] || {};
- existingConstructor = $[ namespace ][ name ];
- constructor = $[ namespace ][ name ] = function( options, element ) {
- // allow instantiation without "new" keyword
- if ( !this._createWidget ) {
- return new constructor( options, element );
- }
-
- // allow instantiation without initializing for simple inheritance
- // must use "new" keyword (the code above always passes args)
- if ( arguments.length ) {
- this._createWidget( options, element );
- }
- };
- // extend with the existing constructor to carry over any static properties
- $.extend( constructor, existingConstructor, {
- version: prototype.version,
- // copy the object used to create the prototype in case we need to
- // redefine the widget later
- _proto: $.extend( {}, prototype ),
- // track widgets that inherit from this widget in case this widget is
- // redefined after a widget inherits from it
- _childConstructors: []
- });
-
- basePrototype = new base();
- // we need to make the options hash a property directly on the new instance
- // otherwise we'll modify the options hash on the prototype that we're
- // inheriting from
- basePrototype.options = $.widget.extend( {}, basePrototype.options );
- $.each( prototype, function( prop, value ) {
- if ( $.isFunction( value ) ) {
- prototype[ prop ] = (function() {
- var _super = function() {
- return base.prototype[ prop ].apply( this, arguments );
- },
- _superApply = function( args ) {
- return base.prototype[ prop ].apply( this, args );
- };
- return function() {
- var __super = this._super,
- __superApply = this._superApply,
- returnValue;
-
- this._super = _super;
- this._superApply = _superApply;
-
- returnValue = value.apply( this, arguments );
-
- this._super = __super;
- this._superApply = __superApply;
-
- return returnValue;
- };
- })();
- }
- });
- constructor.prototype = $.widget.extend( basePrototype, {
- // TODO: remove support for widgetEventPrefix
- // always use the name + a colon as the prefix, e.g., draggable:start
- // don't prefix for widgets that aren't DOM-based
- widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
- }, prototype, {
- constructor: constructor,
- namespace: namespace,
- widgetName: name,
- widgetFullName: fullName
- });
-
- // If this widget is being redefined then we need to find all widgets that
- // are inheriting from it and redefine all of them so that they inherit from
- // the new version of this widget. We're essentially trying to replace one
- // level in the prototype chain.
- if ( existingConstructor ) {
- $.each( existingConstructor._childConstructors, function( i, child ) {
- var childPrototype = child.prototype;
-
- // redefine the child widget using the same prototype that was
- // originally used, but inherit from the new version of the base
- $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
- });
- // remove the list of existing child constructors from the old constructor
- // so the old child constructors can be garbage collected
- delete existingConstructor._childConstructors;
- } else {
- base._childConstructors.push( constructor );
- }
-
- $.widget.bridge( name, constructor );
-};
-
-$.widget.extend = function( target ) {
- var input = slice.call( arguments, 1 ),
- inputIndex = 0,
- inputLength = input.length,
- key,
- value;
- for ( ; inputIndex < inputLength; inputIndex++ ) {
- for ( key in input[ inputIndex ] ) {
- value = input[ inputIndex ][ key ];
- if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
- // Clone objects
- if ( $.isPlainObject( value ) ) {
- target[ key ] = $.isPlainObject( target[ key ] ) ?
- $.widget.extend( {}, target[ key ], value ) :
- // Don't extend strings, arrays, etc. with objects
- $.widget.extend( {}, value );
- // Copy everything else by reference
- } else {
- target[ key ] = value;
- }
- }
- }
- }
- return target;
-};
-
-$.widget.bridge = function( name, object ) {
- var fullName = object.prototype.widgetFullName || name;
- $.fn[ name ] = function( options ) {
- var isMethodCall = typeof options === "string",
- args = slice.call( arguments, 1 ),
- returnValue = this;
-
- // allow multiple hashes to be passed on init
- options = !isMethodCall && args.length ?
- $.widget.extend.apply( null, [ options ].concat(args) ) :
- options;
-
- if ( isMethodCall ) {
- this.each(function() {
- var methodValue,
- instance = $.data( this, fullName );
- if ( !instance ) {
- return $.error( "cannot call methods on " + name + " prior to initialization; " +
- "attempted to call method '" + options + "'" );
- }
- if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
- return $.error( "no such method '" + options + "' for " + name + " widget instance" );
- }
- methodValue = instance[ options ].apply( instance, args );
- if ( methodValue !== instance && methodValue !== undefined ) {
- returnValue = methodValue && methodValue.jquery ?
- returnValue.pushStack( methodValue.get() ) :
- methodValue;
- return false;
- }
- });
- } else {
- this.each(function() {
- var instance = $.data( this, fullName );
- if ( instance ) {
- instance.option( options || {} )._init();
- } else {
- $.data( this, fullName, new object( options, this ) );
- }
- });
- }
-
- return returnValue;
- };
-};
-
-$.Widget = function( /* options, element */ ) {};
-$.Widget._childConstructors = [];
-
-$.Widget.prototype = {
- widgetName: "widget",
- widgetEventPrefix: "",
- defaultElement: "<div>",
- options: {
- disabled: false,
-
- // callbacks
- create: null
- },
- _createWidget: function( options, element ) {
- element = $( element || this.defaultElement || this )[ 0 ];
- this.element = $( element );
- this.uuid = uuid++;
- this.eventNamespace = "." + this.widgetName + this.uuid;
- this.options = $.widget.extend( {},
- this.options,
- this._getCreateOptions(),
- options );
-
- this.bindings = $();
- this.hoverable = $();
- this.focusable = $();
-
- if ( element !== this ) {
- $.data( element, this.widgetFullName, this );
- this._on( true, this.element, {
- remove: function( event ) {
- if ( event.target === element ) {
- this.destroy();
- }
- }
- });
- this.document = $( element.style ?
- // element within the document
- element.ownerDocument :
- // element is window or document
- element.document || element );
- this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
- }
-
- this._create();
- this._trigger( "create", null, this._getCreateEventData() );
- this._init();
- },
- _getCreateOptions: $.noop,
- _getCreateEventData: $.noop,
- _create: $.noop,
- _init: $.noop,
-
- destroy: function() {
- this._destroy();
- // we can probably remove the unbind calls in 2.0
- // all event bindings should go through this._on()
- this.element
- .unbind( this.eventNamespace )
- // 1.9 BC for #7810
- // TODO remove dual storage
- .removeData( this.widgetName )
- .removeData( this.widgetFullName )
- // support: jquery <1.6.3
- // http://bugs.jquery.com/ticket/9413
- .removeData( $.camelCase( this.widgetFullName ) );
- this.widget()
- .unbind( this.eventNamespace )
- .removeAttr( "aria-disabled" )
- .removeClass(
- this.widgetFullName + "-disabled " +
- "ui-state-disabled" );
-
- // clean up events and states
- this.bindings.unbind( this.eventNamespace );
- this.hoverable.removeClass( "ui-state-hover" );
- this.focusable.removeClass( "ui-state-focus" );
- },
- _destroy: $.noop,
-
- widget: function() {
- return this.element;
- },
-
- option: function( key, value ) {
- var options = key,
- parts,
- curOption,
- i;
-
- if ( arguments.length === 0 ) {
- // don't return a reference to the internal hash
- return $.widget.extend( {}, this.options );
- }
-
- if ( typeof key === "string" ) {
- // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
- options = {};
- parts = key.split( "." );
- key = parts.shift();
- if ( parts.length ) {
- curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
- for ( i = 0; i < parts.length - 1; i++ ) {
- curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
- curOption = curOption[ parts[ i ] ];
- }
- key = parts.pop();
- if ( value === undefined ) {
- return curOption[ key ] === undefined ? null : curOption[ key ];
- }
- curOption[ key ] = value;
- } else {
- if ( value === undefined ) {
- return this.options[ key ] === undefined ? null : this.options[ key ];
- }
- options[ key ] = value;
- }
- }
-
- this._setOptions( options );
-
- return this;
- },
- _setOptions: function( options ) {
- var key;
-
- for ( key in options ) {
- this._setOption( key, options[ key ] );
- }
-
- return this;
- },
- _setOption: function( key, value ) {
- this.options[ key ] = value;
-
- if ( key === "disabled" ) {
- this.widget()
- .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
- .attr( "aria-disabled", value );
- this.hoverable.removeClass( "ui-state-hover" );
- this.focusable.removeClass( "ui-state-focus" );
- }
-
- return this;
- },
-
- enable: function() {
- return this._setOption( "disabled", false );
- },
- disable: function() {
- return this._setOption( "disabled", true );
- },
-
- _on: function( suppressDisabledCheck, element, handlers ) {
- var delegateElement,
- instance = this;
-
- // no suppressDisabledCheck flag, shuffle arguments
- if ( typeof suppressDisabledCheck !== "boolean" ) {
- handlers = element;
- element = suppressDisabledCheck;
- suppressDisabledCheck = false;
- }
-
- // no element argument, shuffle and use this.element
- if ( !handlers ) {
- handlers = element;
- element = this.element;
- delegateElement = this.widget();
- } else {
- // accept selectors, DOM elements
- element = delegateElement = $( element );
- this.bindings = this.bindings.add( element );
- }
-
- $.each( handlers, function( event, handler ) {
- function handlerProxy() {
- // allow widgets to customize the disabled handling
- // - disabled as an array instead of boolean
- // - disabled class as method for disabling individual parts
- if ( !suppressDisabledCheck &&
- ( instance.options.disabled === true ||
- $( this ).hasClass( "ui-state-disabled" ) ) ) {
- return;
- }
- return ( typeof handler === "string" ? instance[ handler ] : handler )
- .apply( instance, arguments );
- }
-
- // copy the guid so direct unbinding works
- if ( typeof handler !== "string" ) {
- handlerProxy.guid = handler.guid =
- handler.guid || handlerProxy.guid || $.guid++;
- }
-
- var match = event.match( /^(\w+)\s*(.*)$/ ),
- eventName = match[1] + instance.eventNamespace,
- selector = match[2];
- if ( selector ) {
- delegateElement.delegate( selector, eventName, handlerProxy );
- } else {
- element.bind( eventName, handlerProxy );
- }
- });
- },
-
- _off: function( element, eventName ) {
- eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
- element.unbind( eventName ).undelegate( eventName );
- },
-
- _delay: function( handler, delay ) {
- function handlerProxy() {
- return ( typeof handler === "string" ? instance[ handler ] : handler )
- .apply( instance, arguments );
- }
- var instance = this;
- return setTimeout( handlerProxy, delay || 0 );
- },
-
- _hoverable: function( element ) {
- this.hoverable = this.hoverable.add( element );
- this._on( element, {
- mouseenter: function( event ) {
- $( event.currentTarget ).addClass( "ui-state-hover" );
- },
- mouseleave: function( event ) {
- $( event.currentTarget ).removeClass( "ui-state-hover" );
- }
- });
- },
-
- _focusable: function( element ) {
- this.focusable = this.focusable.add( element );
- this._on( element, {
- focusin: function( event ) {
- $( event.currentTarget ).addClass( "ui-state-focus" );
- },
- focusout: function( event ) {
- $( event.currentTarget ).removeClass( "ui-state-focus" );
- }
- });
- },
-
- _trigger: function( type, event, data ) {
- var prop, orig,
- callback = this.options[ type ];
-
- data = data || {};
- event = $.Event( event );
- event.type = ( type === this.widgetEventPrefix ?
- type :
- this.widgetEventPrefix + type ).toLowerCase();
- // the original event may come from any element
- // so we need to reset the target on the new event
- event.target = this.element[ 0 ];
-
- // copy original event properties over to the new event
- orig = event.originalEvent;
- if ( orig ) {
- for ( prop in orig ) {
- if ( !( prop in event ) ) {
- event[ prop ] = orig[ prop ];
- }
- }
- }
-
- this.element.trigger( event, data );
- return !( $.isFunction( callback ) &&
- callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
- event.isDefaultPrevented() );
- }
-};
-
-$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
- $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
- if ( typeof options === "string" ) {
- options = { effect: options };
- }
- var hasOptions,
- effectName = !options ?
- method :
- options === true || typeof options === "number" ?
- defaultEffect :
- options.effect || defaultEffect;
- options = options || {};
- if ( typeof options === "number" ) {
- options = { duration: options };
- }
- hasOptions = !$.isEmptyObject( options );
- options.complete = callback;
- if ( options.delay ) {
- element.delay( options.delay );
- }
- if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
- element[ method ]( options );
- } else if ( effectName !== method && element[ effectName ] ) {
- element[ effectName ]( options.duration, options.easing, callback );
- } else {
- element.queue(function( next ) {
- $( this )[ method ]();
- if ( callback ) {
- callback.call( element[ 0 ] );
- }
- next();
- });
- }
- };
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.widget( "mobile.widget", {
- // decorate the parent _createWidget to trigger `widgetinit` for users
- // who wish to do post post `widgetcreate` alterations/additions
- //
- // TODO create a pull request for jquery ui to trigger this event
- // in the original _createWidget
- _createWidget: function() {
- $.Widget.prototype._createWidget.apply( this, arguments );
- this._trigger( 'init' );
- },
-
- _getCreateOptions: function() {
-
- var elem = this.element,
- options = {};
-
- $.each( this.options, function( option ) {
-
- var value = elem.jqmData( option.replace( /[A-Z]/g, function( c ) {
- return "-" + c.toLowerCase();
- })
- );
-
- if ( value !== undefined ) {
- options[ option ] = value;
- }
- });
-
- return options;
- },
-
- enhanceWithin: function( target, useKeepNative ) {
- this.enhance( $( this.options.initSelector, $( target )), useKeepNative );
- },
-
- enhance: function( targets, useKeepNative ) {
- var page, keepNative, $widgetElements = $( targets ), self = this;
-
- // if ignoreContentEnabled is set to true the framework should
- // only enhance the selected elements when they do NOT have a
- // parent with the data-namespace-ignore attribute
- $widgetElements = $.mobile.enhanceable( $widgetElements );
-
- if ( useKeepNative && $widgetElements.length ) {
- // TODO remove dependency on the page widget for the keepNative.
- // Currently the keepNative value is defined on the page prototype so
- // the method is as well
- page = $.mobile.closestPageData( $widgetElements );
- keepNative = ( page && page.keepNativeSelector()) || "";
-
- $widgetElements = $widgetElements.not( keepNative );
- }
-
- $widgetElements[ this.widgetName ]();
- },
-
- raise: function( msg ) {
- throw "Widget [" + this.widgetName + "]: " + msg;
- }
-});
-
-})( jQuery );
-
-
-(function( $, window ) {
- // DEPRECATED
- // NOTE global mobile object settings
- $.extend( $.mobile, {
- // DEPRECATED Should the text be visble in the loading message?
- loadingMessageTextVisible: undefined,
-
- // DEPRECATED When the text is visible, what theme does the loading box use?
- loadingMessageTheme: undefined,
-
- // DEPRECATED default message setting
- loadingMessage: undefined,
-
- // DEPRECATED
- // Turn on/off page loading message. Theme doubles as an object argument
- // with the following shape: { theme: '', text: '', html: '', textVisible: '' }
- // NOTE that the $.mobile.loading* settings and params past the first are deprecated
- showPageLoadingMsg: function( theme, msgText, textonly ) {
- $.mobile.loading( 'show', theme, msgText, textonly );
- },
-
- // DEPRECATED
- hidePageLoadingMsg: function() {
- $.mobile.loading( 'hide' );
- },
-
- loading: function() {
- this.loaderWidget.loader.apply( this.loaderWidget, arguments );
- }
- });
-
- // TODO move loader class down into the widget settings
- var loaderClass = "ui-loader", $html = $( "html" ), $window = $.mobile.window;
-
- $.widget( "mobile.loader", {
- // NOTE if the global config settings are defined they will override these
- // options
- options: {
- // the theme for the loading message
- theme: "a",
-
- // whether the text in the loading message is shown
- textVisible: false,
-
- // custom html for the inner content of the loading message
- html: "",
-
- // the text to be displayed when the popup is shown
- text: "loading"
- },
-
- defaultHtml: "<div class='" + loaderClass + "'>" +
- "<span class='ui-icon ui-icon-loading'></span>" +
- "<h1></h1>" +
- "</div>",
-
- // For non-fixed supportin browsers. Position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
- fakeFixLoader: function() {
- var activeBtn = $( "." + $.mobile.activeBtnClass ).first();
-
- this.element
- .css({
- top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 ||
- activeBtn.length && activeBtn.offset().top || 100
- });
- },
-
- // check position of loader to see if it appears to be "fixed" to center
- // if not, use abs positioning
- checkLoaderPosition: function() {
- var offset = this.element.offset(),
- scrollTop = $window.scrollTop(),
- screenHeight = $.mobile.getScreenHeight();
-
- if ( offset.top < scrollTop || ( offset.top - scrollTop ) > screenHeight ) {
- this.element.addClass( "ui-loader-fakefix" );
- this.fakeFixLoader();
- $window
- .unbind( "scroll", this.checkLoaderPosition )
- .bind( "scroll", $.proxy( this.fakeFixLoader, this ) );
- }
- },
-
- resetHtml: function() {
- this.element.html( $( this.defaultHtml ).html() );
- },
-
- // Turn on/off page loading message. Theme doubles as an object argument
- // with the following shape: { theme: '', text: '', html: '', textVisible: '' }
- // NOTE that the $.mobile.loading* settings and params past the first are deprecated
- // TODO sweet jesus we need to break some of this out
- show: function( theme, msgText, textonly ) {
- var textVisible, message, $header, loadSettings;
-
- this.resetHtml();
-
- // use the prototype options so that people can set them globally at
- // mobile init. Consistency, it's what's for dinner
- if ( $.type(theme) === "object" ) {
- loadSettings = $.extend( {}, this.options, theme );
-
- // prefer object property from the param then the old theme setting
- theme = loadSettings.theme || $.mobile.loadingMessageTheme;
- } else {
- loadSettings = this.options;
-
- // here we prefer the them value passed as a string argument, then
- // we prefer the global option because we can't use undefined default
- // prototype options, then the prototype option
- theme = theme || $.mobile.loadingMessageTheme || loadSettings.theme;
- }
-
- // set the message text, prefer the param, then the settings object
- // then loading message
- message = msgText || $.mobile.loadingMessage || loadSettings.text;
-
- // prepare the dom
- $html.addClass( "ui-loading" );
-
- if ( $.mobile.loadingMessage !== false || loadSettings.html ) {
- // boolean values require a bit more work :P, supports object properties
- // and old settings
- if ( $.mobile.loadingMessageTextVisible !== undefined ) {
- textVisible = $.mobile.loadingMessageTextVisible;
- } else {
- textVisible = loadSettings.textVisible;
- }
-
- // add the proper css given the options (theme, text, etc)
- // Force text visibility if the second argument was supplied, or
- // if the text was explicitly set in the object args
- this.element.attr("class", loaderClass +
- " ui-corner-all ui-body-" + theme +
- " ui-loader-" + ( textVisible || msgText || theme.text ? "verbose" : "default" ) +
- ( loadSettings.textonly || textonly ? " ui-loader-textonly" : "" ) );
-
- // TODO verify that jquery.fn.html is ok to use in both cases here
- // this might be overly defensive in preventing unknowing xss
- // if the html attribute is defined on the loading settings, use that
- // otherwise use the fallbacks from above
- if ( loadSettings.html ) {
- this.element.html( loadSettings.html );
- } else {
- this.element.find( "h1" ).text( message );
- }
-
- // attach the loader to the DOM
- this.element.appendTo( $.mobile.pageContainer );
-
- // check that the loader is visible
- this.checkLoaderPosition();
-
- // on scroll check the loader position
- $window.bind( "scroll", $.proxy( this.checkLoaderPosition, this ) );
- }
- },
-
- hide: function() {
- $html.removeClass( "ui-loading" );
-
- if ( $.mobile.loadingMessage ) {
- this.element.removeClass( "ui-loader-fakefix" );
- }
-
- $.mobile.window.unbind( "scroll", this.fakeFixLoader );
- $.mobile.window.unbind( "scroll", this.checkLoaderPosition );
- }
- });
-
- $window.bind( 'pagecontainercreate', function() {
- $.mobile.loaderWidget = $.mobile.loaderWidget || $( $.mobile.loader.prototype.defaultHtml ).loader();
- });
-})(jQuery, this);
-
-
-// Script: jQuery hashchange event
-//
-// *Version: 1.3, Last updated: 7/21/2010*
-//
-// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
-// GitHub - http://github.com/cowboy/jquery-hashchange/
-// Source - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
-// (Minified) - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
-//
-// About: License
-//
-// Copyright (c) 2010 "Cowboy" Ben Alman,
-// Dual licensed under the MIT and GPL licenses.
-// http://benalman.com/about/license/
-//
-// About: Examples
-//
-// These working examples, complete with fully commented code, illustrate a few
-// ways in which this plugin can be used.
-//
-// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
-// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
-//
-// About: Support and Testing
-//
-// Information about what version or versions of jQuery this plugin has been
-// tested with, what browsers it has been tested in, and where the unit tests
-// reside (so you can test it yourself).
-//
-// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
-// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
-// Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
-// Unit Tests - http://benalman.com/code/projects/jquery-hashchange/unit/
-//
-// About: Known issues
-//
-// While this jQuery hashchange event implementation is quite stable and
-// robust, there are a few unfortunate browser bugs surrounding expected
-// hashchange event-based behaviors, independent of any JavaScript
-// window.onhashchange abstraction. See the following examples for more
-// information:
-//
-// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
-// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
-// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
-// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
-//
-// Also note that should a browser natively support the window.onhashchange
-// event, but not report that it does, the fallback polling loop will be used.
-//
-// About: Release History
-//
-// 1.3 - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
-// "removable" for mobile-only development. Added IE6/7 document.title
-// support. Attempted to make Iframe as hidden as possible by using
-// techniques from http://www.paciellogroup.com/blog/?p=604. Added
-// support for the "shortcut" format $(window).hashchange( fn ) and
-// $(window).hashchange() like jQuery provides for built-in events.
-// Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
-// lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
-// and <jQuery.fn.hashchange.src> properties plus document-domain.html
-// file to address access denied issues when setting document.domain in
-// IE6/7.
-// 1.2 - (2/11/2010) Fixed a bug where coming back to a page using this plugin
-// from a page on another domain would cause an error in Safari 4. Also,
-// IE6/7 Iframe is now inserted after the body (this actually works),
-// which prevents the page from scrolling when the event is first bound.
-// Event can also now be bound before DOM ready, but it won't be usable
-// before then in IE6/7.
-// 1.1 - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
-// where browser version is incorrectly reported as 8.0, despite
-// inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
-// 1.0 - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
-// window.onhashchange functionality into a separate plugin for users
-// who want just the basic event & back button support, without all the
-// extra awesomeness that BBQ provides. This plugin will be included as
-// part of jQuery BBQ, but also be available separately.
-
-(function( $, window, undefined ) {
- // Reused string.
- var str_hashchange = 'hashchange',
-
- // Method / object references.
- doc = document,
- fake_onhashchange,
- special = $.event.special,
-
- // Does the browser support window.onhashchange? Note that IE8 running in
- // IE7 compatibility mode reports true for 'onhashchange' in window, even
- // though the event isn't supported, so also test document.documentMode.
- doc_mode = doc.documentMode,
- supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
-
- // Get location.hash (or what you'd expect location.hash to be) sans any
- // leading #. Thanks for making this necessary, Firefox!
- function get_fragment( url ) {
- url = url || location.href;
- return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
- };
-
- // Method: jQuery.fn.hashchange
- //
- // Bind a handler to the window.onhashchange event or trigger all bound
- // window.onhashchange event handlers. This behavior is consistent with
- // jQuery's built-in event handlers.
- //
- // Usage:
- //
- // > jQuery(window).hashchange( [ handler ] );
- //
- // Arguments:
- //
- // handler - (Function) Optional handler to be bound to the hashchange
- // event. This is a "shortcut" for the more verbose form:
- // jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
- // all bound window.onhashchange event handlers will be triggered. This
- // is a shortcut for the more verbose
- // jQuery(window).trigger( 'hashchange' ). These forms are described in
- // the <hashchange event> section.
- //
- // Returns:
- //
- // (jQuery) The initial jQuery collection of elements.
-
- // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
- // $(elem).hashchange() for triggering, like jQuery does for built-in events.
- $.fn[ str_hashchange ] = function( fn ) {
- return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
- };
-
- // Property: jQuery.fn.hashchange.delay
- //
- // The numeric interval (in milliseconds) at which the <hashchange event>
- // polling loop executes. Defaults to 50.
-
- // Property: jQuery.fn.hashchange.domain
- //
- // If you're setting document.domain in your JavaScript, and you want hash
- // history to work in IE6/7, not only must this property be set, but you must
- // also set document.domain BEFORE jQuery is loaded into the page. This
- // property is only applicable if you are supporting IE6/7 (or IE8 operating
- // in "IE7 compatibility" mode).
- //
- // In addition, the <jQuery.fn.hashchange.src> property must be set to the
- // path of the included "document-domain.html" file, which can be renamed or
- // modified if necessary (note that the document.domain specified must be the
- // same in both your main JavaScript as well as in this file).
- //
- // Usage:
- //
- // jQuery.fn.hashchange.domain = document.domain;
-
- // Property: jQuery.fn.hashchange.src
- //
- // If, for some reason, you need to specify an Iframe src file (for example,
- // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
- // do so using this property. Note that when using this property, history
- // won't be recorded in IE6/7 until the Iframe src file loads. This property
- // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
- // compatibility" mode).
- //
- // Usage:
- //
- // jQuery.fn.hashchange.src = 'path/to/file.html';
-
- $.fn[ str_hashchange ].delay = 50;
- /*
- $.fn[ str_hashchange ].domain = null;
- $.fn[ str_hashchange ].src = null;
- */
-
- // Event: hashchange event
- //
- // Fired when location.hash changes. In browsers that support it, the native
- // HTML5 window.onhashchange event is used, otherwise a polling loop is
- // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
- // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
- // compatibility" mode), a hidden Iframe is created to allow the back button
- // and hash-based history to work.
- //
- // Usage as described in <jQuery.fn.hashchange>:
- //
- // > // Bind an event handler.
- // > jQuery(window).hashchange( function(e) {
- // > var hash = location.hash;
- // > ...
- // > });
- // >
- // > // Manually trigger the event handler.
- // > jQuery(window).hashchange();
- //
- // A more verbose usage that allows for event namespacing:
- //
- // > // Bind an event handler.
- // > jQuery(window).bind( 'hashchange', function(e) {
- // > var hash = location.hash;
- // > ...
- // > });
- // >
- // > // Manually trigger the event handler.
- // > jQuery(window).trigger( 'hashchange' );
- //
- // Additional Notes:
- //
- // * The polling loop and Iframe are not created until at least one handler
- // is actually bound to the 'hashchange' event.
- // * If you need the bound handler(s) to execute immediately, in cases where
- // a location.hash exists on page load, via bookmark or page refresh for
- // example, use jQuery(window).hashchange() or the more verbose
- // jQuery(window).trigger( 'hashchange' ).
- // * The event can be bound before DOM ready, but since it won't be usable
- // before then in IE6/7 (due to the necessary Iframe), recommended usage is
- // to bind it inside a DOM ready handler.
-
- // Override existing $.event.special.hashchange methods (allowing this plugin
- // to be defined after jQuery BBQ in BBQ's source code).
- special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
-
- // Called only when the first 'hashchange' event is bound to window.
- setup: function() {
- // If window.onhashchange is supported natively, there's nothing to do..
- if ( supports_onhashchange ) { return false; }
-
- // Otherwise, we need to create our own. And we don't want to call this
- // until the user binds to the event, just in case they never do, since it
- // will create a polling loop and possibly even a hidden Iframe.
- $( fake_onhashchange.start );
- },
-
- // Called only when the last 'hashchange' event is unbound from window.
- teardown: function() {
- // If window.onhashchange is supported natively, there's nothing to do..
- if ( supports_onhashchange ) { return false; }
-
- // Otherwise, we need to stop ours (if possible).
- $( fake_onhashchange.stop );
- }
-
- });
-
- // fake_onhashchange does all the work of triggering the window.onhashchange
- // event for browsers that don't natively support it, including creating a
- // polling loop to watch for hash changes and in IE 6/7 creating a hidden
- // Iframe to enable back and forward.
- fake_onhashchange = (function() {
- var self = {},
- timeout_id,
-
- // Remember the initial hash so it doesn't get triggered immediately.
- last_hash = get_fragment(),
-
- fn_retval = function( val ) { return val; },
- history_set = fn_retval,
- history_get = fn_retval;
-
- // Start the polling loop.
- self.start = function() {
- timeout_id || poll();
- };
-
- // Stop the polling loop.
- self.stop = function() {
- timeout_id && clearTimeout( timeout_id );
- timeout_id = undefined;
- };
-
- // This polling loop checks every $.fn.hashchange.delay milliseconds to see
- // if location.hash has changed, and triggers the 'hashchange' event on
- // window when necessary.
- function poll() {
- var hash = get_fragment(),
- history_hash = history_get( last_hash );
-
- if ( hash !== last_hash ) {
- history_set( last_hash = hash, history_hash );
-
- $(window).trigger( str_hashchange );
-
- } else if ( history_hash !== last_hash ) {
- location.href = location.href.replace( /#.*/, '' ) + history_hash;
- }
-
- timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
- };
-
- // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
- // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
- // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
- window.attachEvent && !window.addEventListener && !supports_onhashchange && (function() {
- // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
- // when running in "IE7 compatibility" mode.
-
- var iframe,
- iframe_src;
-
- // When the event is bound and polling starts in IE 6/7, create a hidden
- // Iframe for history handling.
- self.start = function() {
- if ( !iframe ) {
- iframe_src = $.fn[ str_hashchange ].src;
- iframe_src = iframe_src && iframe_src + get_fragment();
-
- // Create hidden Iframe. Attempt to make Iframe as hidden as possible
- // by using techniques from http://www.paciellogroup.com/blog/?p=604.
- iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
-
- // When Iframe has completely loaded, initialize the history and
- // start polling.
- .one( 'load', function() {
- iframe_src || history_set( get_fragment() );
- poll();
- })
-
- // Load Iframe src if specified, otherwise nothing.
- .attr( 'src', iframe_src || 'javascript:0' )
-
- // Append Iframe after the end of the body to prevent unnecessary
- // initial page scrolling (yes, this works).
- .insertAfter( 'body' )[0].contentWindow;
-
- // Whenever `document.title` changes, update the Iframe's title to
- // prettify the back/next history menu entries. Since IE sometimes
- // errors with "Unspecified error" the very first time this is set
- // (yes, very useful) wrap this with a try/catch block.
- doc.onpropertychange = function() {
- try {
- if ( event.propertyName === 'title' ) {
- iframe.document.title = doc.title;
- }
- } catch(e) {}
- };
-
- }
- };
-
- // Override the "stop" method since an IE6/7 Iframe was created. Even
- // if there are no longer any bound event handlers, the polling loop
- // is still necessary for back/next to work at all!
- self.stop = fn_retval;
-
- // Get history by looking at the hidden Iframe's location.hash.
- history_get = function() {
- return get_fragment( iframe.location.href );
- };
-
- // Set a new history item by opening and then closing the Iframe
- // document, *then* setting its location.hash. If document.domain has
- // been set, update that as well.
- history_set = function( hash, history_hash ) {
- var iframe_doc = iframe.document,
- domain = $.fn[ str_hashchange ].domain;
-
- if ( hash !== history_hash ) {
- // Update Iframe with any initial `document.title` that might be set.
- iframe_doc.title = doc.title;
-
- // Opening the Iframe's document after it has been closed is what
- // actually adds a history entry.
- iframe_doc.open();
-
- // Set document.domain for the Iframe document as well, if necessary.
- domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
-
- iframe_doc.close();
-
- // Update the Iframe's hash, for great justice.
- iframe.location.hash = hash;
- }
- };
-
- })();
- // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
- // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- return self;
- })();
-
-})(jQuery,this);
-
-(function( $, undefined ) {
-
- /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
- window.matchMedia = window.matchMedia || (function( doc, undefined ) {
-
-
-
- var bool,
- docElem = doc.documentElement,
- refNode = docElem.firstElementChild || docElem.firstChild,
- // fakeBody required for <FF4 when executed in <head>
- fakeBody = doc.createElement( "body" ),
- div = doc.createElement( "div" );
-
- div.id = "mq-test-1";
- div.style.cssText = "position:absolute;top:-100em";
- fakeBody.style.background = "none";
- fakeBody.appendChild(div);
-
- return function(q){
-
- div.innerHTML = "­<style media=\"" + q + "\"> #mq-test-1 { width: 42px; }</style>";
-
- docElem.insertBefore( fakeBody, refNode );
- bool = div.offsetWidth === 42;
- docElem.removeChild( fakeBody );
-
- return {
- matches: bool,
- media: q
- };
-
- };
-
- }( document ));
-
- // $.mobile.media uses matchMedia to return a boolean.
- $.mobile.media = function( q ) {
- return window.matchMedia( q ).matches;
- };
-
-})(jQuery);
-
- (function( $, undefined ) {
- var support = {
- touch: "ontouchend" in document
- };
-
- $.mobile.support = $.mobile.support || {};
- $.extend( $.support, support );
- $.extend( $.mobile.support, support );
- }( jQuery ));
-
- (function( $, undefined ) {
- $.extend( $.support, {
- orientation: "orientation" in window && "onorientationchange" in window
- });
- }( jQuery ));
-
-(function( $, undefined ) {
-
-// thx Modernizr
-function propExists( prop ) {
- var uc_prop = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 ),
- props = ( prop + " " + vendors.join( uc_prop + " " ) + uc_prop ).split( " " );
-
- for ( var v in props ) {
- if ( fbCSS[ props[ v ] ] !== undefined ) {
- return true;
- }
- }
-}
-
-var fakeBody = $( "<body>" ).prependTo( "html" ),
- fbCSS = fakeBody[ 0 ].style,
- vendors = [ "Webkit", "Moz", "O" ],
- webos = "palmGetResource" in window, //only used to rule out scrollTop
- opera = window.opera,
- operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]",
- bb = window.blackberry && !propExists( "-webkit-transform" ); //only used to rule out box shadow, as it's filled opaque on BB 5 and lower
-
-
-function validStyle( prop, value, check_vend ) {
- var div = document.createElement( 'div' ),
- uc = function( txt ) {
- return txt.charAt( 0 ).toUpperCase() + txt.substr( 1 );
- },
- vend_pref = function( vend ) {
- if( vend === "" ) {
- return "";
- } else {
- return "-" + vend.charAt( 0 ).toLowerCase() + vend.substr( 1 ) + "-";
- }
- },
- check_style = function( vend ) {
- var vend_prop = vend_pref( vend ) + prop + ": " + value + ";",
- uc_vend = uc( vend ),
- propStyle = uc_vend + ( uc_vend === "" ? prop : uc( prop ) );
-
- div.setAttribute( "style", vend_prop );
-
- if ( !!div.style[ propStyle ] ) {
- ret = true;
- }
- },
- check_vends = check_vend ? check_vend : vendors,
- ret;
-
- for( var i = 0; i < check_vends.length; i++ ) {
- check_style( check_vends[i] );
- }
- return !!ret;
-}
-
-function transform3dTest() {
- var mqProp = "transform-3d",
- // Because the `translate3d` test below throws false positives in Android:
- ret = $.mobile.media( "(-" + vendors.join( "-" + mqProp + "),(-" ) + "-" + mqProp + "),(" + mqProp + ")" );
-
- if( ret ) {
- return !!ret;
- }
-
- var el = document.createElement( "div" ),
- transforms = {
- // We’re omitting Opera for the time being; MS uses unprefixed.
- 'MozTransform':'-moz-transform',
- 'transform':'transform'
- };
-
- fakeBody.append( el );
-
- for ( var t in transforms ) {
- if( el.style[ t ] !== undefined ){
- el.style[ t ] = 'translate3d( 100px, 1px, 1px )';
- ret = window.getComputedStyle( el ).getPropertyValue( transforms[ t ] );
- }
- }
- return ( !!ret && ret !== "none" );
-}
-
-// Test for dynamic-updating base tag support ( allows us to avoid href,src attr rewriting )
-function baseTagTest() {
- var fauxBase = location.protocol + "//" + location.host + location.pathname + "ui-dir/",
- base = $( "head base" ),
- fauxEle = null,
- href = "",
- link, rebase;
-
- if ( !base.length ) {
- base = fauxEle = $( "<base>", { "href": fauxBase }).appendTo( "head" );
- } else {
- href = base.attr( "href" );
- }
-
- link = $( "<a href='testurl' />" ).prependTo( fakeBody );
- rebase = link[ 0 ].href;
- base[ 0 ].href = href || location.pathname;
-
- if ( fauxEle ) {
- fauxEle.remove();
- }
- return rebase.indexOf( fauxBase ) === 0;
-}
-
-// Thanks Modernizr
-function cssPointerEventsTest() {
- var element = document.createElement( 'x' ),
- documentElement = document.documentElement,
- getComputedStyle = window.getComputedStyle,
- supports;
-
- if ( !( 'pointerEvents' in element.style ) ) {
- return false;
- }
-
- element.style.pointerEvents = 'auto';
- element.style.pointerEvents = 'x';
- documentElement.appendChild( element );
- supports = getComputedStyle &&
- getComputedStyle( element, '' ).pointerEvents === 'auto';
- documentElement.removeChild( element );
- return !!supports;
-}
-
-function boundingRect() {
- var div = document.createElement( "div" );
- return typeof div.getBoundingClientRect !== "undefined";
-}
-
-// non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683
-// allows for inclusion of IE 6+, including Windows Mobile 7
-$.extend( $.mobile, { browser: {} } );
-$.mobile.browser.oldIE = (function() {
- var v = 3,
- div = document.createElement( "div" ),
- a = div.all || [];
-
- do {
- div.innerHTML = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->";
- } while( a[0] );
-
- return v > 4 ? v : !v;
-})();
-
-function fixedPosition() {
- var w = window,
- ua = navigator.userAgent,
- platform = navigator.platform,
- // Rendering engine is Webkit, and capture major version
- wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
- wkversion = !!wkmatch && wkmatch[ 1 ],
- ffmatch = ua.match( /Fennec\/([0-9]+)/ ),
- ffversion = !!ffmatch && ffmatch[ 1 ],
- operammobilematch = ua.match( /Opera Mobi\/([0-9]+)/ ),
- omversion = !!operammobilematch && operammobilematch[ 1 ];
-
- if(
- // iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5)
- ( ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1 || platform.indexOf( "iPod" ) > -1 ) && wkversion && wkversion < 534 ) ||
- // Opera Mini
- ( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) ||
- ( operammobilematch && omversion < 7458 ) ||
- //Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2)
- ( ua.indexOf( "Android" ) > -1 && wkversion && wkversion < 533 ) ||
- // Firefox Mobile before 6.0 -
- ( ffversion && ffversion < 6 ) ||
- // WebOS less than 3
- ( "palmGetResource" in window && wkversion && wkversion < 534 ) ||
- // MeeGo
- ( ua.indexOf( "MeeGo" ) > -1 && ua.indexOf( "NokiaBrowser/8.5.0" ) > -1 ) ) {
- return false;
- }
-
- return true;
-}
-
-$.extend( $.support, {
- cssTransitions: "WebKitTransitionEvent" in window ||
- validStyle( 'transition', 'height 100ms linear', [ "Webkit", "Moz", "" ] ) &&
- !$.mobile.browser.oldIE && !opera,
-
- // Note, Chrome for iOS has an extremely quirky implementation of popstate.
- // We've chosen to take the shortest path to a bug fix here for issue #5426
- // See the following link for information about the regex chosen
- // https://developers.google.com/chrome/mobile/docs/user-agent#chrome_for_ios_user-agent
- pushState: "pushState" in history &&
- "replaceState" in history &&
- // When running inside a FF iframe, calling replaceState causes an error
- !( window.navigator.userAgent.indexOf( "Firefox" ) >= 0 && window.top !== window ) &&
- ( window.navigator.userAgent.search(/CriOS/) === -1 ),
-
- mediaquery: $.mobile.media( "only all" ),
- cssPseudoElement: !!propExists( "content" ),
- touchOverflow: !!propExists( "overflowScrolling" ),
- cssTransform3d: transform3dTest(),
- boxShadow: !!propExists( "boxShadow" ) && !bb,
- fixedPosition: fixedPosition(),
- scrollTop: ("pageXOffset" in window ||
- "scrollTop" in document.documentElement ||
- "scrollTop" in fakeBody[ 0 ]) && !webos && !operamini,
-
- dynamicBaseTag: baseTagTest(),
- cssPointerEvents: cssPointerEventsTest(),
- boundingRect: boundingRect()
-});
-
-fakeBody.remove();
-
-
-// $.mobile.ajaxBlacklist is used to override ajaxEnabled on platforms that have known conflicts with hash history updates (BB5, Symbian)
-// or that generally work better browsing in regular http for full page refreshes (Opera Mini)
-// Note: This detection below is used as a last resort.
-// We recommend only using these detection methods when all other more reliable/forward-looking approaches are not possible
-var nokiaLTE7_3 = (function() {
-
- var ua = window.navigator.userAgent;
-
- //The following is an attempt to match Nokia browsers that are running Symbian/s60, with webkit, version 7.3 or older
- return ua.indexOf( "Nokia" ) > -1 &&
- ( ua.indexOf( "Symbian/3" ) > -1 || ua.indexOf( "Series60/5" ) > -1 ) &&
- ua.indexOf( "AppleWebKit" ) > -1 &&
- ua.match( /(BrowserNG|NokiaBrowser)\/7\.[0-3]/ );
-})();
-
-// Support conditions that must be met in order to proceed
-// default enhanced qualifications are media query support OR IE 7+
-
-$.mobile.gradeA = function() {
- return ( $.support.mediaquery || $.mobile.browser.oldIE && $.mobile.browser.oldIE >= 7 ) && ( $.support.boundingRect || $.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/) !== null );
-};
-
-$.mobile.ajaxBlacklist =
- // BlackBerry browsers, pre-webkit
- window.blackberry && !window.WebKitPoint ||
- // Opera Mini
- operamini ||
- // Symbian webkits pre 7.3
- nokiaLTE7_3;
-
-// Lastly, this workaround is the only way we've found so far to get pre 7.3 Symbian webkit devices
-// to render the stylesheets when they're referenced before this script, as we'd recommend doing.
-// This simply reappends the CSS in place, which for some reason makes it apply
-if ( nokiaLTE7_3 ) {
- $(function() {
- $( "head link[rel='stylesheet']" ).attr( "rel", "alternate stylesheet" ).attr( "rel", "stylesheet" );
- });
-}
-
-// For ruling out shadows via css
-if ( !$.support.boxShadow ) {
- $( "html" ).addClass( "ui-mobile-nosupport-boxshadow" );
-}
-
-})( jQuery );
-
-
-(function( $, undefined ) {
- var $win = $.mobile.window, self, history;
-
- $.event.special.navigate = self = {
- bound: false,
-
- pushStateEnabled: true,
-
- originalEventName: undefined,
-
- // If pushstate support is present and push state support is defined to
- // be true on the mobile namespace.
- isPushStateEnabled: function() {
- return $.support.pushState &&
- $.mobile.pushStateEnabled === true &&
- this.isHashChangeEnabled();
- },
-
- // !! assumes mobile namespace is present
- isHashChangeEnabled: function() {
- return $.mobile.hashListeningEnabled === true;
- },
-
- // TODO a lot of duplication between popstate and hashchange
- popstate: function( event ) {
- var newEvent = new $.Event( "navigate" ),
- beforeNavigate = new $.Event( "beforenavigate" ),
- state = event.originalEvent.state || {},
- href = location.href;
-
- $win.trigger( beforeNavigate );
-
- if( beforeNavigate.isDefaultPrevented() ){
- return;
- }
-
- if( event.historyState ){
- $.extend(state, event.historyState);
- }
-
- // Make sure the original event is tracked for the end
- // user to inspect incase they want to do something special
- newEvent.originalEvent = event;
-
- // NOTE we let the current stack unwind because any assignment to
- // location.hash will stop the world and run this event handler. By
- // doing this we create a similar behavior to hashchange on hash
- // assignment
- setTimeout(function() {
- $win.trigger( newEvent, {
- state: state
- });
- }, 0);
- },
-
- hashchange: function( event, data ) {
- var newEvent = new $.Event( "navigate" ),
- beforeNavigate = new $.Event( "beforenavigate" );
-
- $win.trigger( beforeNavigate );
-
- if( beforeNavigate.isDefaultPrevented() ){
- return;
- }
-
- // Make sure the original event is tracked for the end
- // user to inspect incase they want to do something special
- newEvent.originalEvent = event;
-
- // Trigger the hashchange with state provided by the user
- // that altered the hash
- $win.trigger( newEvent, {
- // Users that want to fully normalize the two events
- // will need to do history management down the stack and
- // add the state to the event before this binding is fired
- // TODO consider allowing for the explicit addition of callbacks
- // to be fired before this value is set to avoid event timing issues
- state: event.hashchangeState || {}
- });
- },
-
- // TODO We really only want to set this up once
- // but I'm not clear if there's a beter way to achieve
- // this with the jQuery special event structure
- setup: function( data, namespaces ) {
- if( self.bound ) {
- return;
- }
-
- self.bound = true;
-
- if( self.isPushStateEnabled() ) {
- self.originalEventName = "popstate";
- $win.bind( "popstate.navigate", self.popstate );
- } else if ( self.isHashChangeEnabled() ){
- self.originalEventName = "hashchange";
- $win.bind( "hashchange.navigate", self.hashchange );
- }
- }
- };
-})( jQuery );
-
-
-
-(function( $, undefined ) {
- var path, documentBase, $base, dialogHashKey = "&ui-state=dialog";
-
- $.mobile.path = path = {
- uiStateKey: "&ui-state",
-
- // This scary looking regular expression parses an absolute URL or its relative
- // variants (protocol, site, document, query, and hash), into the various
- // components (protocol, host, path, query, fragment, etc that make up the
- // URL as well as some other commonly used sub-parts. When used with RegExp.exec()
- // or String.match, it parses the URL into a results array that looks like this:
- //
- // [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content
- // [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread
- // [2]: http://jblas:password@mycompany.com:8080/mail/inbox
- // [3]: http://jblas:password@mycompany.com:8080
- // [4]: http:
- // [5]: //
- // [6]: jblas:password@mycompany.com:8080
- // [7]: jblas:password
- // [8]: jblas
- // [9]: password
- // [10]: mycompany.com:8080
- // [11]: mycompany.com
- // [12]: 8080
- // [13]: /mail/inbox
- // [14]: /mail/
- // [15]: inbox
- // [16]: ?msg=1234&type=unread
- // [17]: #msg-content
- //
- urlParseRE: /^\s*(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
-
- // Abstraction to address xss (Issue #4787) by removing the authority in
- // browsers that auto decode it. All references to location.href should be
- // replaced with a call to this method so that it can be dealt with properly here
- getLocation: function( url ) {
- var uri = url ? this.parseUrl( url ) : location,
- hash = this.parseUrl( url || location.href ).hash;
-
- // mimic the browser with an empty string when the hash is empty
- hash = hash === "#" ? "" : hash;
-
- // Make sure to parse the url or the location object for the hash because using location.hash
- // is autodecoded in firefox, the rest of the url should be from the object (location unless
- // we're testing) to avoid the inclusion of the authority
- return uri.protocol + "//" + uri.host + uri.pathname + uri.search + hash;
- },
-
- parseLocation: function() {
- return this.parseUrl( this.getLocation() );
- },
-
- //Parse a URL into a structure that allows easy access to
- //all of the URL components by name.
- parseUrl: function( url ) {
- // If we're passed an object, we'll assume that it is
- // a parsed url object and just return it back to the caller.
- if ( $.type( url ) === "object" ) {
- return url;
- }
-
- var matches = path.urlParseRE.exec( url || "" ) || [];
-
- // Create an object that allows the caller to access the sub-matches
- // by name. Note that IE returns an empty string instead of undefined,
- // like all other browsers do, so we normalize everything so its consistent
- // no matter what browser we're running on.
- return {
- href: matches[ 0 ] || "",
- hrefNoHash: matches[ 1 ] || "",
- hrefNoSearch: matches[ 2 ] || "",
- domain: matches[ 3 ] || "",
- protocol: matches[ 4 ] || "",
- doubleSlash: matches[ 5 ] || "",
- authority: matches[ 6 ] || "",
- username: matches[ 8 ] || "",
- password: matches[ 9 ] || "",
- host: matches[ 10 ] || "",
- hostname: matches[ 11 ] || "",
- port: matches[ 12 ] || "",
- pathname: matches[ 13 ] || "",
- directory: matches[ 14 ] || "",
- filename: matches[ 15 ] || "",
- search: matches[ 16 ] || "",
- hash: matches[ 17 ] || ""
- };
- },
-
- //Turn relPath into an asbolute path. absPath is
- //an optional absolute path which describes what
- //relPath is relative to.
- makePathAbsolute: function( relPath, absPath ) {
- if ( relPath && relPath.charAt( 0 ) === "/" ) {
- return relPath;
- }
-
- relPath = relPath || "";
- absPath = absPath ? absPath.replace( /^\/|(\/[^\/]*|[^\/]+)$/g, "" ) : "";
-
- var absStack = absPath ? absPath.split( "/" ) : [],
- relStack = relPath.split( "/" );
- for ( var i = 0; i < relStack.length; i++ ) {
- var d = relStack[ i ];
- switch ( d ) {
- case ".":
- break;
- case "..":
- if ( absStack.length ) {
- absStack.pop();
- }
- break;
- default:
- absStack.push( d );
- break;
- }
- }
- return "/" + absStack.join( "/" );
- },
-
- //Returns true if both urls have the same domain.
- isSameDomain: function( absUrl1, absUrl2 ) {
- return path.parseUrl( absUrl1 ).domain === path.parseUrl( absUrl2 ).domain;
- },
-
- //Returns true for any relative variant.
- isRelativeUrl: function( url ) {
- // All relative Url variants have one thing in common, no protocol.
- return path.parseUrl( url ).protocol === "";
- },
-
- //Returns true for an absolute url.
- isAbsoluteUrl: function( url ) {
- return path.parseUrl( url ).protocol !== "";
- },
-
- //Turn the specified realtive URL into an absolute one. This function
- //can handle all relative variants (protocol, site, document, query, fragment).
- makeUrlAbsolute: function( relUrl, absUrl ) {
- if ( !path.isRelativeUrl( relUrl ) ) {
- return relUrl;
- }
-
- if ( absUrl === undefined ) {
- absUrl = this.documentBase;
- }
-
- var relObj = path.parseUrl( relUrl ),
- absObj = path.parseUrl( absUrl ),
- protocol = relObj.protocol || absObj.protocol,
- doubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ),
- authority = relObj.authority || absObj.authority,
- hasPath = relObj.pathname !== "",
- pathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ),
- search = relObj.search || ( !hasPath && absObj.search ) || "",
- hash = relObj.hash;
-
- return protocol + doubleSlash + authority + pathname + search + hash;
- },
-
- //Add search (aka query) params to the specified url.
- addSearchParams: function( url, params ) {
- var u = path.parseUrl( url ),
- p = ( typeof params === "object" ) ? $.param( params ) : params,
- s = u.search || "?";
- return u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== "?" ? "&" : "" ) + p + ( u.hash || "" );
- },
-
- convertUrlToDataUrl: function( absUrl ) {
- var u = path.parseUrl( absUrl );
- if ( path.isEmbeddedPage( u ) ) {
- // For embedded pages, remove the dialog hash key as in getFilePath(),
- // and remove otherwise the Data Url won't match the id of the embedded Page.
- return u.hash
- .split( dialogHashKey )[0]
- .replace( /^#/, "" )
- .replace( /\?.*$/, "" );
- } else if ( path.isSameDomain( u, this.documentBase ) ) {
- return u.hrefNoHash.replace( this.documentBase.domain, "" ).split( dialogHashKey )[0];
- }
-
- return window.decodeURIComponent(absUrl);
- },
-
- //get path from current hash, or from a file path
- get: function( newPath ) {
- if ( newPath === undefined ) {
- newPath = path.parseLocation().hash;
- }
- return path.stripHash( newPath ).replace( /[^\/]*\.[^\/*]+$/, '' );
- },
-
- //set location hash to path
- set: function( path ) {
- location.hash = path;
- },
-
- //test if a given url (string) is a path
- //NOTE might be exceptionally naive
- isPath: function( url ) {
- return ( /\// ).test( url );
- },
-
- //return a url path with the window's location protocol/hostname/pathname removed
- clean: function( url ) {
- return url.replace( this.documentBase.domain, "" );
- },
-
- //just return the url without an initial #
- stripHash: function( url ) {
- return url.replace( /^#/, "" );
- },
-
- stripQueryParams: function( url ) {
- return url.replace( /\?.*$/, "" );
- },
-
- //remove the preceding hash, any query params, and dialog notations
- cleanHash: function( hash ) {
- return path.stripHash( hash.replace( /\?.*$/, "" ).replace( dialogHashKey, "" ) );
- },
-
- isHashValid: function( hash ) {
- return ( /^#[^#]+$/ ).test( hash );
- },
-
- //check whether a url is referencing the same domain, or an external domain or different protocol
- //could be mailto, etc
- isExternal: function( url ) {
- var u = path.parseUrl( url );
- return u.protocol && u.domain !== this.documentUrl.domain ? true : false;
- },
-
- hasProtocol: function( url ) {
- return ( /^(:?\w+:)/ ).test( url );
- },
-
- isEmbeddedPage: function( url ) {
- var u = path.parseUrl( url );
-
- //if the path is absolute, then we need to compare the url against
- //both the this.documentUrl and the documentBase. The main reason for this
- //is that links embedded within external documents will refer to the
- //application document, whereas links embedded within the application
- //document will be resolved against the document base.
- if ( u.protocol !== "" ) {
- return ( !this.isPath(u.hash) && u.hash && ( u.hrefNoHash === this.documentUrl.hrefNoHash || ( this.documentBaseDiffers && u.hrefNoHash === this.documentBase.hrefNoHash ) ) );
- }
- return ( /^#/ ).test( u.href );
- },
-
- squash: function( url, resolutionUrl ) {
- var state, href, cleanedUrl, search, stateIndex,
- isPath = this.isPath( url ),
- uri = this.parseUrl( url ),
- preservedHash = uri.hash,
- uiState = "";
-
- // produce a url against which we can resole the provided path
- resolutionUrl = resolutionUrl || (path.isPath(url) ? path.getLocation() : path.getDocumentUrl());
-
- // If the url is anything but a simple string, remove any preceding hash
- // eg #foo/bar -> foo/bar
- // #foo -> #foo
- cleanedUrl = isPath ? path.stripHash( url ) : url;
-
- // If the url is a full url with a hash check if the parsed hash is a path
- // if it is, strip the #, and use it otherwise continue without change
- cleanedUrl = path.isPath( uri.hash ) ? path.stripHash( uri.hash ) : cleanedUrl;
-
- // Split the UI State keys off the href
- stateIndex = cleanedUrl.indexOf( this.uiStateKey );
-
- // store the ui state keys for use
- if( stateIndex > -1 ){
- uiState = cleanedUrl.slice( stateIndex );
- cleanedUrl = cleanedUrl.slice( 0, stateIndex );
- }
-
- // make the cleanedUrl absolute relative to the resolution url
- href = path.makeUrlAbsolute( cleanedUrl, resolutionUrl );
-
- // grab the search from the resolved url since parsing from
- // the passed url may not yield the correct result
- search = this.parseUrl( href ).search;
-
- // TODO all this crap is terrible, clean it up
- if ( isPath ) {
- // reject the hash if it's a path or it's just a dialog key
- if( path.isPath( preservedHash ) || preservedHash.replace("#", "").indexOf( this.uiStateKey ) === 0) {
- preservedHash = "";
- }
-
- // Append the UI State keys where it exists and it's been removed
- // from the url
- if( uiState && preservedHash.indexOf( this.uiStateKey ) === -1){
- preservedHash += uiState;
- }
-
- // make sure that pound is on the front of the hash
- if( preservedHash.indexOf( "#" ) === -1 && preservedHash !== "" ){
- preservedHash = "#" + preservedHash;
- }
-
- // reconstruct each of the pieces with the new search string and hash
- href = path.parseUrl( href );
- href = href.protocol + "//" + href.host + href.pathname + search + preservedHash;
- } else {
- href += href.indexOf( "#" ) > -1 ? uiState : "#" + uiState;
- }
-
- return href;
- },
-
- isPreservableHash: function( hash ) {
- return hash.replace( "#", "" ).indexOf( this.uiStateKey ) === 0;
- }
- };
-
- path.documentUrl = path.parseLocation();
-
- $base = $( "head" ).find( "base" );
-
- path.documentBase = $base.length ?
- path.parseUrl( path.makeUrlAbsolute( $base.attr( "href" ), path.documentUrl.href ) ) :
- path.documentUrl;
-
- path.documentBaseDiffers = (path.documentUrl.hrefNoHash !== path.documentBase.hrefNoHash);
-
- //return the original document url
- path.getDocumentUrl = function( asParsedObject ) {
- return asParsedObject ? $.extend( {}, path.documentUrl ) : path.documentUrl.href;
- };
-
- //return the original document base url
- path.getDocumentBase = function( asParsedObject ) {
- return asParsedObject ? $.extend( {}, path.documentBase ) : path.documentBase.href;
- };
-})( jQuery );
-
-
-
-(function( $, undefined ) {
- var path = $.mobile.path;
-
- $.mobile.History = function( stack, index ) {
- this.stack = stack || [];
- this.activeIndex = index || 0;
- };
-
- $.extend($.mobile.History.prototype, {
- getActive: function() {
- return this.stack[ this.activeIndex ];
- },
-
- getLast: function() {
- return this.stack[ this.previousIndex ];
- },
-
- getNext: function() {
- return this.stack[ this.activeIndex + 1 ];
- },
-
- getPrev: function() {
- return this.stack[ this.activeIndex - 1 ];
- },
-
- // addNew is used whenever a new page is added
- add: function( url, data ){
- data = data || {};
-
- //if there's forward history, wipe it
- if ( this.getNext() ) {
- this.clearForward();
- }
-
- // if the hash is included in the data make sure the shape
- // is consistent for comparison
- if( data.hash && data.hash.indexOf( "#" ) === -1) {
- data.hash = "#" + data.hash;
- }
-
- data.url = url;
- this.stack.push( data );
- this.activeIndex = this.stack.length - 1;
- },
-
- //wipe urls ahead of active index
- clearForward: function() {
- this.stack = this.stack.slice( 0, this.activeIndex + 1 );
- },
-
- find: function( url, stack, earlyReturn ) {
- stack = stack || this.stack;
-
- var entry, i, length = stack.length, index;
-
- for ( i = 0; i < length; i++ ) {
- entry = stack[i];
-
- if ( decodeURIComponent(url) === decodeURIComponent(entry.url) ||
- decodeURIComponent(url) === decodeURIComponent(entry.hash) ) {
- index = i;
-
- if( earlyReturn ) {
- return index;
- }
- }
- }
-
- return index;
- },
-
- closest: function( url ) {
- var closest, a = this.activeIndex;
-
- // First, take the slice of the history stack before the current index and search
- // for a url match. If one is found, we'll avoid avoid looking through forward history
- // NOTE the preference for backward history movement is driven by the fact that
- // most mobile browsers only have a dedicated back button, and users rarely use
- // the forward button in desktop browser anyhow
- closest = this.find( url, this.stack.slice(0, a) );
-
- // If nothing was found in backward history check forward. The `true`
- // value passed as the third parameter causes the find method to break
- // on the first match in the forward history slice. The starting index
- // of the slice must then be added to the result to get the element index
- // in the original history stack :( :(
- //
- // TODO this is hyper confusing and should be cleaned up (ugh so bad)
- if( closest === undefined ) {
- closest = this.find( url, this.stack.slice(a), true );
- closest = closest === undefined ? closest : closest + a;
- }
-
- return closest;
- },
-
- direct: function( opts ) {
- var newActiveIndex = this.closest( opts.url ), a = this.activeIndex;
-
- // save new page index, null check to prevent falsey 0 result
- // record the previous index for reference
- if( newActiveIndex !== undefined ) {
- this.activeIndex = newActiveIndex;
- this.previousIndex = a;
- }
-
- // invoke callbacks where appropriate
- //
- // TODO this is also convoluted and confusing
- if ( newActiveIndex < a ) {
- ( opts.present || opts.back || $.noop )( this.getActive(), 'back' );
- } else if ( newActiveIndex > a ) {
- ( opts.present || opts.forward || $.noop )( this.getActive(), 'forward' );
- } else if ( newActiveIndex === undefined && opts.missing ){
- opts.missing( this.getActive() );
- }
- }
- });
-})( jQuery );
-
-
-(function( $, undefined ) {
- var path = $.mobile.path,
- initialHref = location.href;
-
- $.mobile.Navigator = function( history ) {
- this.history = history;
- this.ignoreInitialHashChange = true;
-
- $.mobile.window.bind({
- "popstate.history": $.proxy( this.popstate, this ),
- "hashchange.history": $.proxy( this.hashchange, this )
- });
- };
-
- $.extend($.mobile.Navigator.prototype, {
- squash: function( url, data ) {
- var state, href, hash = path.isPath(url) ? path.stripHash(url) : url;
-
- href = path.squash( url );
-
- // make sure to provide this information when it isn't explicitly set in the
- // data object that was passed to the squash method
- state = $.extend({
- hash: hash,
- url: href
- }, data);
-
- // replace the current url with the new href and store the state
- // Note that in some cases we might be replacing an url with the
- // same url. We do this anyways because we need to make sure that
- // all of our history entries have a state object associated with
- // them. This allows us to work around the case where $.mobile.back()
- // is called to transition from an external page to an embedded page.
- // In that particular case, a hashchange event is *NOT* generated by the browser.
- // Ensuring each history entry has a state object means that onPopState()
- // will always trigger our hashchange callback even when a hashchange event
- // is not fired.
- window.history.replaceState( state, state.title || document.title, href );
-
- return state;
- },
-
- hash: function( url, href ) {
- var parsed, loc, hash;
-
- // Grab the hash for recording. If the passed url is a path
- // we used the parsed version of the squashed url to reconstruct,
- // otherwise we assume it's a hash and store it directly
- parsed = path.parseUrl( url );
- loc = path.parseLocation();
-
- if( loc.pathname + loc.search === parsed.pathname + parsed.search ) {
- // If the pathname and search of the passed url is identical to the current loc
- // then we must use the hash. Otherwise there will be no event
- // eg, url = "/foo/bar?baz#bang", location.href = "http://example.com/foo/bar?baz"
- hash = parsed.hash ? parsed.hash : parsed.pathname + parsed.search;
- } else if ( path.isPath(url) ) {
- var resolved = path.parseUrl( href );
- // If the passed url is a path, make it domain relative and remove any trailing hash
- hash = resolved.pathname + resolved.search + (path.isPreservableHash( resolved.hash )? resolved.hash.replace( "#", "" ) : "");
- } else {
- hash = url;
- }
-
- return hash;
- },
-
- // TODO reconsider name
- go: function( url, data, noEvents ) {
- var state, href, hash, popstateEvent,
- isPopStateEvent = $.event.special.navigate.isPushStateEnabled();
-
- // Get the url as it would look squashed on to the current resolution url
- href = path.squash( url );
-
- // sort out what the hash sould be from the url
- hash = this.hash( url, href );
-
- // Here we prevent the next hash change or popstate event from doing any
- // history management. In the case of hashchange we don't swallow it
- // if there will be no hashchange fired (since that won't reset the value)
- // and will swallow the following hashchange
- if( noEvents && hash !== path.stripHash(path.parseLocation().hash) ) {
- this.preventNextHashChange = noEvents;
- }
-
- // IMPORTANT in the case where popstate is supported the event will be triggered
- // directly, stopping further execution - ie, interupting the flow of this
- // method call to fire bindings at this expression. Below the navigate method
- // there is a binding to catch this event and stop its propagation.
- //
- // We then trigger a new popstate event on the window with a null state
- // so that the navigate events can conclude their work properly
- //
- // if the url is a path we want to preserve the query params that are available on
- // the current url.
- this.preventHashAssignPopState = true;
- window.location.hash = hash;
-
- // If popstate is enabled and the browser triggers `popstate` events when the hash
- // is set (this often happens immediately in browsers like Chrome), then the
- // this flag will be set to false already. If it's a browser that does not trigger
- // a `popstate` on hash assignement or `replaceState` then we need avoid the branch
- // that swallows the event created by the popstate generated by the hash assignment
- // At the time of this writing this happens with Opera 12 and some version of IE
- this.preventHashAssignPopState = false;
-
- state = $.extend({
- url: href,
- hash: hash,
- title: document.title
- }, data);
-
- if( isPopStateEvent ) {
- popstateEvent = new $.Event( "popstate" );
- popstateEvent.originalEvent = {
- type: "popstate",
- state: null
- };
-
- this.squash( url, state );
-
- // Trigger a new faux popstate event to replace the one that we
- // caught that was triggered by the hash setting above.
- if( !noEvents ) {
- this.ignorePopState = true;
- $.mobile.window.trigger( popstateEvent );
- }
- }
-
- // record the history entry so that the information can be included
- // in hashchange event driven navigate events in a similar fashion to
- // the state that's provided by popstate
- this.history.add( state.url, state );
- },
-
-
- // This binding is intended to catch the popstate events that are fired
- // when execution of the `$.navigate` method stops at window.location.hash = url;
- // and completely prevent them from propagating. The popstate event will then be
- // retriggered after execution resumes
- //
- // TODO grab the original event here and use it for the synthetic event in the
- // second half of the navigate execution that will follow this binding
- popstate: function( event ) {
- var active, hash, state, closestIndex;
-
- // Partly to support our test suite which manually alters the support
- // value to test hashchange. Partly to prevent all around weirdness
- if( !$.event.special.navigate.isPushStateEnabled() ){
- return;
- }
-
- // If this is the popstate triggered by the actual alteration of the hash
- // prevent it completely. History is tracked manually
- if( this.preventHashAssignPopState ) {
- this.preventHashAssignPopState = false;
- event.stopImmediatePropagation();
- return;
- }
-
- // if this is the popstate triggered after the `replaceState` call in the go
- // method, then simply ignore it. The history entry has already been captured
- if( this.ignorePopState ) {
- this.ignorePopState = false;
- return;
- }
-
- // If there is no state, and the history stack length is one were
- // probably getting the page load popstate fired by browsers like chrome
- // avoid it and set the one time flag to false.
- // TODO: Do we really need all these conditions? Comparing location hrefs
- // should be sufficient.
- if( !event.originalEvent.state &&
- this.history.stack.length === 1 &&
- this.ignoreInitialHashChange ) {
- this.ignoreInitialHashChange = false;
-
- if ( location.href === initialHref ) {
- event.preventDefault();
- return;
- }
- }
-
- // account for direct manipulation of the hash. That is, we will receive a popstate
- // when the hash is changed by assignment, and it won't have a state associated. We
- // then need to squash the hash. See below for handling of hash assignment that
- // matches an existing history entry
- // TODO it might be better to only add to the history stack
- // when the hash is adjacent to the active history entry
- hash = path.parseLocation().hash;
- if( !event.originalEvent.state && hash ) {
- // squash the hash that's been assigned on the URL with replaceState
- // also grab the resulting state object for storage
- state = this.squash( hash );
-
- // record the new hash as an additional history entry
- // to match the browser's treatment of hash assignment
- this.history.add( state.url, state );
-
- // pass the newly created state information
- // along with the event
- event.historyState = state;
-
- // do not alter history, we've added a new history entry
- // so we know where we are
- return;
- }
-
- // If all else fails this is a popstate that comes from the back or forward buttons
- // make sure to set the state of our history stack properly, and record the directionality
- this.history.direct({
- url: (event.originalEvent.state || {}).url || hash,
-
- // When the url is either forward or backward in history include the entry
- // as data on the event object for merging as data in the navigate event
- present: function( historyEntry, direction ) {
- // make sure to create a new object to pass down as the navigate event data
- event.historyState = $.extend({}, historyEntry);
- event.historyState.direction = direction;
- }
- });
- },
-
- // NOTE must bind before `navigate` special event hashchange binding otherwise the
- // navigation data won't be attached to the hashchange event in time for those
- // bindings to attach it to the `navigate` special event
- // TODO add a check here that `hashchange.navigate` is bound already otherwise it's
- // broken (exception?)
- hashchange: function( event ) {
- var history, hash;
-
- // If hashchange listening is explicitly disabled or pushstate is supported
- // avoid making use of the hashchange handler.
- if(!$.event.special.navigate.isHashChangeEnabled() ||
- $.event.special.navigate.isPushStateEnabled() ) {
- return;
- }
-
- // On occasion explicitly want to prevent the next hash from propogating because we only
- // with to alter the url to represent the new state do so here
- if( this.preventNextHashChange ){
- this.preventNextHashChange = false;
- event.stopImmediatePropagation();
- return;
- }
-
- history = this.history;
- hash = path.parseLocation().hash;
-
- // If this is a hashchange caused by the back or forward button
- // make sure to set the state of our history stack properly
- this.history.direct({
- url: hash,
-
- // When the url is either forward or backward in history include the entry
- // as data on the event object for merging as data in the navigate event
- present: function( historyEntry, direction ) {
- // make sure to create a new object to pass down as the navigate event data
- event.hashchangeState = $.extend({}, historyEntry);
- event.hashchangeState.direction = direction;
- },
-
- // When we don't find a hash in our history clearly we're aiming to go there
- // record the entry as new for future traversal
- //
- // NOTE it's not entirely clear that this is the right thing to do given that we
- // can't know the users intention. It might be better to explicitly _not_
- // support location.hash assignment in preference to $.navigate calls
- // TODO first arg to add should be the href, but it causes issues in identifying
- // embeded pages
- missing: function() {
- history.add( hash, {
- hash: hash,
- title: document.title
- });
- }
- });
- }
- });
-})( jQuery );
-
-
-
-(function( $, undefined ) {
- // TODO consider queueing navigation activity until previous activities have completed
- // so that end users don't have to think about it. Punting for now
- // TODO !! move the event bindings into callbacks on the navigate event
- $.mobile.navigate = function( url, data, noEvents ) {
- $.mobile.navigate.navigator.go( url, data, noEvents );
- };
-
- // expose the history on the navigate method in anticipation of full integration with
- // existing navigation functionalty that is tightly coupled to the history information
- $.mobile.navigate.history = new $.mobile.History();
-
- // instantiate an instance of the navigator for use within the $.navigate method
- $.mobile.navigate.navigator = new $.mobile.Navigator( $.mobile.navigate.history );
-
- var loc = $.mobile.path.parseLocation();
- $.mobile.navigate.history.add( loc.href, {hash: loc.hash} );
-})( jQuery );
-
-
-// This plugin is an experiment for abstracting away the touch and mouse
-// events so that developers don't have to worry about which method of input
-// the device their document is loaded on supports.
-//
-// The idea here is to allow the developer to register listeners for the
-// basic mouse events, such as mousedown, mousemove, mouseup, and click,
-// and the plugin will take care of registering the correct listeners
-// behind the scenes to invoke the listener at the fastest possible time
-// for that device, while still retaining the order of event firing in
-// the traditional mouse environment, should multiple handlers be registered
-// on the same element for different events.
-//
-// The current version exposes the following virtual events to jQuery bind methods:
-// "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel"
-
-(function( $, window, document, undefined ) {
-
-var dataPropertyName = "virtualMouseBindings",
- touchTargetPropertyName = "virtualTouchID",
- virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split( " " ),
- touchEventProps = "clientX clientY pageX pageY screenX screenY".split( " " ),
- mouseHookProps = $.event.mouseHooks ? $.event.mouseHooks.props : [],
- mouseEventProps = $.event.props.concat( mouseHookProps ),
- activeDocHandlers = {},
- resetTimerID = 0,
- startX = 0,
- startY = 0,
- didScroll = false,
- clickBlockList = [],
- blockMouseTriggers = false,
- blockTouchTriggers = false,
- eventCaptureSupported = "addEventListener" in document,
- $document = $( document ),
- nextTouchID = 1,
- lastTouchID = 0, threshold;
-
-$.vmouse = {
- moveDistanceThreshold: 10,
- clickDistanceThreshold: 10,
- resetTimerDuration: 1500
-};
-
-function getNativeEvent( event ) {
-
- while ( event && typeof event.originalEvent !== "undefined" ) {
- event = event.originalEvent;
- }
- return event;
-}
-
-function createVirtualEvent( event, eventType ) {
-
- var t = event.type,
- oe, props, ne, prop, ct, touch, i, j, len;
-
- event = $.Event( event );
- event.type = eventType;
-
- oe = event.originalEvent;
- props = $.event.props;
-
- // addresses separation of $.event.props in to $.event.mouseHook.props and Issue 3280
- // https://github.com/jquery/jquery-mobile/issues/3280
- if ( t.search( /^(mouse|click)/ ) > -1 ) {
- props = mouseEventProps;
- }
-
- // copy original event properties over to the new event
- // this would happen if we could call $.event.fix instead of $.Event
- // but we don't have a way to force an event to be fixed multiple times
- if ( oe ) {
- for ( i = props.length, prop; i; ) {
- prop = props[ --i ];
- event[ prop ] = oe[ prop ];
- }
- }
-
- // make sure that if the mouse and click virtual events are generated
- // without a .which one is defined
- if ( t.search(/mouse(down|up)|click/) > -1 && !event.which ) {
- event.which = 1;
- }
-
- if ( t.search(/^touch/) !== -1 ) {
- ne = getNativeEvent( oe );
- t = ne.touches;
- ct = ne.changedTouches;
- touch = ( t && t.length ) ? t[0] : ( ( ct && ct.length ) ? ct[ 0 ] : undefined );
-
- if ( touch ) {
- for ( j = 0, len = touchEventProps.length; j < len; j++) {
- prop = touchEventProps[ j ];
- event[ prop ] = touch[ prop ];
- }
- }
- }
-
- return event;
-}
-
-function getVirtualBindingFlags( element ) {
-
- var flags = {},
- b, k;
-
- while ( element ) {
-
- b = $.data( element, dataPropertyName );
-
- for ( k in b ) {
- if ( b[ k ] ) {
- flags[ k ] = flags.hasVirtualBinding = true;
- }
- }
- element = element.parentNode;
- }
- return flags;
-}
-
-function getClosestElementWithVirtualBinding( element, eventType ) {
- var b;
- while ( element ) {
-
- b = $.data( element, dataPropertyName );
-
- if ( b && ( !eventType || b[ eventType ] ) ) {
- return element;
- }
- element = element.parentNode;
- }
- return null;
-}
-
-function enableTouchBindings() {
- blockTouchTriggers = false;
-}
-
-function disableTouchBindings() {
- blockTouchTriggers = true;
-}
-
-function enableMouseBindings() {
- lastTouchID = 0;
- clickBlockList.length = 0;
- blockMouseTriggers = false;
-
- // When mouse bindings are enabled, our
- // touch bindings are disabled.
- disableTouchBindings();
-}
-
-function disableMouseBindings() {
- // When mouse bindings are disabled, our
- // touch bindings are enabled.
- enableTouchBindings();
-}
-
-function startResetTimer() {
- clearResetTimer();
- resetTimerID = setTimeout( function() {
- resetTimerID = 0;
- enableMouseBindings();
- }, $.vmouse.resetTimerDuration );
-}
-
-function clearResetTimer() {
- if ( resetTimerID ) {
- clearTimeout( resetTimerID );
- resetTimerID = 0;
- }
-}
-
-function triggerVirtualEvent( eventType, event, flags ) {
- var ve;
-
- if ( ( flags && flags[ eventType ] ) ||
- ( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) {
-
- ve = createVirtualEvent( event, eventType );
-
- $( event.target).trigger( ve );
- }
-
- return ve;
-}
-
-function mouseEventCallback( event ) {
- var touchID = $.data( event.target, touchTargetPropertyName );
-
- if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ) {
- var ve = triggerVirtualEvent( "v" + event.type, event );
- if ( ve ) {
- if ( ve.isDefaultPrevented() ) {
- event.preventDefault();
- }
- if ( ve.isPropagationStopped() ) {
- event.stopPropagation();
- }
- if ( ve.isImmediatePropagationStopped() ) {
- event.stopImmediatePropagation();
- }
- }
- }
-}
-
-function handleTouchStart( event ) {
-
- var touches = getNativeEvent( event ).touches,
- target, flags;
-
- if ( touches && touches.length === 1 ) {
-
- target = event.target;
- flags = getVirtualBindingFlags( target );
-
- if ( flags.hasVirtualBinding ) {
-
- lastTouchID = nextTouchID++;
- $.data( target, touchTargetPropertyName, lastTouchID );
-
- clearResetTimer();
-
- disableMouseBindings();
- didScroll = false;
-
- var t = getNativeEvent( event ).touches[ 0 ];
- startX = t.pageX;
- startY = t.pageY;
-
- triggerVirtualEvent( "vmouseover", event, flags );
- triggerVirtualEvent( "vmousedown", event, flags );
- }
- }
-}
-
-function handleScroll( event ) {
- if ( blockTouchTriggers ) {
- return;
- }
-
- if ( !didScroll ) {
- triggerVirtualEvent( "vmousecancel", event, getVirtualBindingFlags( event.target ) );
- }
-
- didScroll = true;
- startResetTimer();
-}
-
-function handleTouchMove( event ) {
- if ( blockTouchTriggers ) {
- return;
- }
-
- var t = getNativeEvent( event ).touches[ 0 ],
- didCancel = didScroll,
- moveThreshold = $.vmouse.moveDistanceThreshold,
- flags = getVirtualBindingFlags( event.target );
-
- didScroll = didScroll ||
- ( Math.abs( t.pageX - startX ) > moveThreshold ||
- Math.abs( t.pageY - startY ) > moveThreshold );
-
-
- if ( didScroll && !didCancel ) {
- triggerVirtualEvent( "vmousecancel", event, flags );
- }
-
- triggerVirtualEvent( "vmousemove", event, flags );
- startResetTimer();
-}
-
-function handleTouchEnd( event ) {
- if ( blockTouchTriggers ) {
- return;
- }
-
- disableTouchBindings();
-
- var flags = getVirtualBindingFlags( event.target ),
- t;
- triggerVirtualEvent( "vmouseup", event, flags );
-
- if ( !didScroll ) {
- var ve = triggerVirtualEvent( "vclick", event, flags );
- if ( ve && ve.isDefaultPrevented() ) {
- // The target of the mouse events that follow the touchend
- // event don't necessarily match the target used during the
- // touch. This means we need to rely on coordinates for blocking
- // any click that is generated.
- t = getNativeEvent( event ).changedTouches[ 0 ];
- clickBlockList.push({
- touchID: lastTouchID,
- x: t.clientX,
- y: t.clientY
- });
-
- // Prevent any mouse events that follow from triggering
- // virtual event notifications.
- blockMouseTriggers = true;
- }
- }
- triggerVirtualEvent( "vmouseout", event, flags);
- didScroll = false;
-
- startResetTimer();
-}
-
-function hasVirtualBindings( ele ) {
- var bindings = $.data( ele, dataPropertyName ),
- k;
-
- if ( bindings ) {
- for ( k in bindings ) {
- if ( bindings[ k ] ) {
- return true;
- }
- }
- }
- return false;
-}
-
-function dummyMouseHandler() {}
-
-function getSpecialEventObject( eventType ) {
- var realType = eventType.substr( 1 );
-
- return {
- setup: function( data, namespace ) {
- // If this is the first virtual mouse binding for this element,
- // add a bindings object to its data.
-
- if ( !hasVirtualBindings( this ) ) {
- $.data( this, dataPropertyName, {} );
- }
-
- // If setup is called, we know it is the first binding for this
- // eventType, so initialize the count for the eventType to zero.
- var bindings = $.data( this, dataPropertyName );
- bindings[ eventType ] = true;
-
- // If this is the first virtual mouse event for this type,
- // register a global handler on the document.
-
- activeDocHandlers[ eventType ] = ( activeDocHandlers[ eventType ] || 0 ) + 1;
-
- if ( activeDocHandlers[ eventType ] === 1 ) {
- $document.bind( realType, mouseEventCallback );
- }
-
- // Some browsers, like Opera Mini, won't dispatch mouse/click events
- // for elements unless they actually have handlers registered on them.
- // To get around this, we register dummy handlers on the elements.
-
- $( this ).bind( realType, dummyMouseHandler );
-
- // For now, if event capture is not supported, we rely on mouse handlers.
- if ( eventCaptureSupported ) {
- // If this is the first virtual mouse binding for the document,
- // register our touchstart handler on the document.
-
- activeDocHandlers[ "touchstart" ] = ( activeDocHandlers[ "touchstart" ] || 0) + 1;
-
- if ( activeDocHandlers[ "touchstart" ] === 1 ) {
- $document.bind( "touchstart", handleTouchStart )
- .bind( "touchend", handleTouchEnd )
-
- // On touch platforms, touching the screen and then dragging your finger
- // causes the window content to scroll after some distance threshold is
- // exceeded. On these platforms, a scroll prevents a click event from being
- // dispatched, and on some platforms, even the touchend is suppressed. To
- // mimic the suppression of the click event, we need to watch for a scroll
- // event. Unfortunately, some platforms like iOS don't dispatch scroll
- // events until *AFTER* the user lifts their finger (touchend). This means
- // we need to watch both scroll and touchmove events to figure out whether
- // or not a scroll happenens before the touchend event is fired.
-
- .bind( "touchmove", handleTouchMove )
- .bind( "scroll", handleScroll );
- }
- }
- },
-
- teardown: function( data, namespace ) {
- // If this is the last virtual binding for this eventType,
- // remove its global handler from the document.
-
- --activeDocHandlers[ eventType ];
-
- if ( !activeDocHandlers[ eventType ] ) {
- $document.unbind( realType, mouseEventCallback );
- }
-
- if ( eventCaptureSupported ) {
- // If this is the last virtual mouse binding in existence,
- // remove our document touchstart listener.
-
- --activeDocHandlers[ "touchstart" ];
-
- if ( !activeDocHandlers[ "touchstart" ] ) {
- $document.unbind( "touchstart", handleTouchStart )
- .unbind( "touchmove", handleTouchMove )
- .unbind( "touchend", handleTouchEnd )
- .unbind( "scroll", handleScroll );
- }
- }
-
- var $this = $( this ),
- bindings = $.data( this, dataPropertyName );
-
- // teardown may be called when an element was
- // removed from the DOM. If this is the case,
- // jQuery core may have already stripped the element
- // of any data bindings so we need to check it before
- // using it.
- if ( bindings ) {
- bindings[ eventType ] = false;
- }
-
- // Unregister the dummy event handler.
-
- $this.unbind( realType, dummyMouseHandler );
-
- // If this is the last virtual mouse binding on the
- // element, remove the binding data from the element.
-
- if ( !hasVirtualBindings( this ) ) {
- $this.removeData( dataPropertyName );
- }
- }
- };
-}
-
-// Expose our custom events to the jQuery bind/unbind mechanism.
-
-for ( var i = 0; i < virtualEventNames.length; i++ ) {
- $.event.special[ virtualEventNames[ i ] ] = getSpecialEventObject( virtualEventNames[ i ] );
-}
-
-// Add a capture click handler to block clicks.
-// Note that we require event capture support for this so if the device
-// doesn't support it, we punt for now and rely solely on mouse events.
-if ( eventCaptureSupported ) {
- document.addEventListener( "click", function( e ) {
- var cnt = clickBlockList.length,
- target = e.target,
- x, y, ele, i, o, touchID;
-
- if ( cnt ) {
- x = e.clientX;
- y = e.clientY;
- threshold = $.vmouse.clickDistanceThreshold;
-
- // The idea here is to run through the clickBlockList to see if
- // the current click event is in the proximity of one of our
- // vclick events that had preventDefault() called on it. If we find
- // one, then we block the click.
- //
- // Why do we have to rely on proximity?
- //
- // Because the target of the touch event that triggered the vclick
- // can be different from the target of the click event synthesized
- // by the browser. The target of a mouse/click event that is syntehsized
- // from a touch event seems to be implementation specific. For example,
- // some browsers will fire mouse/click events for a link that is near
- // a touch event, even though the target of the touchstart/touchend event
- // says the user touched outside the link. Also, it seems that with most
- // browsers, the target of the mouse/click event is not calculated until the
- // time it is dispatched, so if you replace an element that you touched
- // with another element, the target of the mouse/click will be the new
- // element underneath that point.
- //
- // Aside from proximity, we also check to see if the target and any
- // of its ancestors were the ones that blocked a click. This is necessary
- // because of the strange mouse/click target calculation done in the
- // Android 2.1 browser, where if you click on an element, and there is a
- // mouse/click handler on one of its ancestors, the target will be the
- // innermost child of the touched element, even if that child is no where
- // near the point of touch.
-
- ele = target;
-
- while ( ele ) {
- for ( i = 0; i < cnt; i++ ) {
- o = clickBlockList[ i ];
- touchID = 0;
-
- if ( ( ele === target && Math.abs( o.x - x ) < threshold && Math.abs( o.y - y ) < threshold ) ||
- $.data( ele, touchTargetPropertyName ) === o.touchID ) {
- // XXX: We may want to consider removing matches from the block list
- // instead of waiting for the reset timer to fire.
- e.preventDefault();
- e.stopPropagation();
- return;
- }
- }
- ele = ele.parentNode;
- }
- }
- }, true);
-}
-})( jQuery, window, document );
-
-
-(function( $, window, undefined ) {
- var $document = $( document );
-
- // add new event shortcuts
- $.each( ( "touchstart touchmove touchend " +
- "tap taphold " +
- "swipe swipeleft swiperight " +
- "scrollstart scrollstop" ).split( " " ), function( i, name ) {
-
- $.fn[ name ] = function( fn ) {
- return fn ? this.bind( name, fn ) : this.trigger( name );
- };
-
- // jQuery < 1.8
- if ( $.attrFn ) {
- $.attrFn[ name ] = true;
- }
- });
-
- var supportTouch = $.mobile.support.touch,
- scrollEvent = "touchmove scroll",
- touchStartEvent = supportTouch ? "touchstart" : "mousedown",
- touchStopEvent = supportTouch ? "touchend" : "mouseup",
- touchMoveEvent = supportTouch ? "touchmove" : "mousemove";
-
- function triggerCustomEvent( obj, eventType, event ) {
- var originalType = event.type;
- event.type = eventType;
- $.event.dispatch.call( obj, event );
- event.type = originalType;
- }
-
- // also handles scrollstop
- $.event.special.scrollstart = {
-
- enabled: true,
-
- setup: function() {
-
- var thisObject = this,
- $this = $( thisObject ),
- scrolling,
- timer;
-
- function trigger( event, state ) {
- scrolling = state;
- triggerCustomEvent( thisObject, scrolling ? "scrollstart" : "scrollstop", event );
- }
-
- // iPhone triggers scroll after a small delay; use touchmove instead
- $this.bind( scrollEvent, function( event ) {
-
- if ( !$.event.special.scrollstart.enabled ) {
- return;
- }
-
- if ( !scrolling ) {
- trigger( event, true );
- }
-
- clearTimeout( timer );
- timer = setTimeout( function() {
- trigger( event, false );
- }, 50 );
- });
- }
- };
-
- // also handles taphold
- $.event.special.tap = {
- tapholdThreshold: 750,
-
- setup: function() {
- var thisObject = this,
- $this = $( thisObject );
-
- $this.bind( "vmousedown", function( event ) {
-
- if ( event.which && event.which !== 1 ) {
- return false;
- }
-
- var origTarget = event.target,
- origEvent = event.originalEvent,
- timer;
-
- function clearTapTimer() {
- clearTimeout( timer );
- }
-
- function clearTapHandlers() {
- clearTapTimer();
-
- $this.unbind( "vclick", clickHandler )
- .unbind( "vmouseup", clearTapTimer );
- $document.unbind( "vmousecancel", clearTapHandlers );
- }
-
- function clickHandler( event ) {
- clearTapHandlers();
-
- // ONLY trigger a 'tap' event if the start target is
- // the same as the stop target.
- if ( origTarget === event.target ) {
- triggerCustomEvent( thisObject, "tap", event );
- }
- }
-
- $this.bind( "vmouseup", clearTapTimer )
- .bind( "vclick", clickHandler );
- $document.bind( "vmousecancel", clearTapHandlers );
-
- timer = setTimeout( function() {
- triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) );
- }, $.event.special.tap.tapholdThreshold );
- });
- }
- };
-
- // also handles swipeleft, swiperight
- $.event.special.swipe = {
- scrollSupressionThreshold: 30, // More than this horizontal displacement, and we will suppress scrolling.
-
- durationThreshold: 1000, // More time than this, and it isn't a swipe.
-
- horizontalDistanceThreshold: 30, // Swipe horizontal displacement must be more than this.
-
- verticalDistanceThreshold: 75, // Swipe vertical displacement must be less than this.
-
- start: function( event ) {
- var data = event.originalEvent.touches ?
- event.originalEvent.touches[ 0 ] : event;
- return {
- time: ( new Date() ).getTime(),
- coords: [ data.pageX, data.pageY ],
- origin: $( event.target )
- };
- },
-
- stop: function( event ) {
- var data = event.originalEvent.touches ?
- event.originalEvent.touches[ 0 ] : event;
- return {
- time: ( new Date() ).getTime(),
- coords: [ data.pageX, data.pageY ]
- };
- },
-
- handleSwipe: function( start, stop ) {
- if ( stop.time - start.time < $.event.special.swipe.durationThreshold &&
- Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold &&
- Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) {
-
- start.origin.trigger( "swipe" )
- .trigger( start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight" );
- }
- },
-
- setup: function() {
- var thisObject = this,
- $this = $( thisObject );
-
- $this.bind( touchStartEvent, function( event ) {
- var start = $.event.special.swipe.start( event ),
- stop;
-
- function moveHandler( event ) {
- if ( !start ) {
- return;
- }
-
- stop = $.event.special.swipe.stop( event );
-
- // prevent scrolling
- if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
- event.preventDefault();
- }
- }
-
- $this.bind( touchMoveEvent, moveHandler )
- .one( touchStopEvent, function() {
- $this.unbind( touchMoveEvent, moveHandler );
-
- if ( start && stop ) {
- $.event.special.swipe.handleSwipe( start, stop );
- }
- start = stop = undefined;
- });
- });
- }
- };
- $.each({
- scrollstop: "scrollstart",
- taphold: "tap",
- swipeleft: "swipe",
- swiperight: "swipe"
- }, function( event, sourceEvent ) {
-
- $.event.special[ event ] = {
- setup: function() {
- $( this ).bind( sourceEvent, $.noop );
- }
- };
- });
-
-})( jQuery, this );
-
-
- // throttled resize event
- (function( $ ) {
- $.event.special.throttledresize = {
- setup: function() {
- $( this ).bind( "resize", handler );
- },
- teardown: function() {
- $( this ).unbind( "resize", handler );
- }
- };
-
- var throttle = 250,
- handler = function() {
- curr = ( new Date() ).getTime();
- diff = curr - lastCall;
-
- if ( diff >= throttle ) {
-
- lastCall = curr;
- $( this ).trigger( "throttledresize" );
-
- } else {
-
- if ( heldCall ) {
- clearTimeout( heldCall );
- }
-
- // Promise a held call will still execute
- heldCall = setTimeout( handler, throttle - diff );
- }
- },
- lastCall = 0,
- heldCall,
- curr,
- diff;
- })( jQuery );
-
-(function( $, window ) {
- var win = $( window ),
- event_name = "orientationchange",
- special_event,
- get_orientation,
- last_orientation,
- initial_orientation_is_landscape,
- initial_orientation_is_default,
- portrait_map = { "0": true, "180": true };
-
- // It seems that some device/browser vendors use window.orientation values 0 and 180 to
- // denote the "default" orientation. For iOS devices, and most other smart-phones tested,
- // the default orientation is always "portrait", but in some Android and RIM based tablets,
- // the default orientation is "landscape". The following code attempts to use the window
- // dimensions to figure out what the current orientation is, and then makes adjustments
- // to the to the portrait_map if necessary, so that we can properly decode the
- // window.orientation value whenever get_orientation() is called.
- //
- // Note that we used to use a media query to figure out what the orientation the browser
- // thinks it is in:
- //
- // initial_orientation_is_landscape = $.mobile.media("all and (orientation: landscape)");
- //
- // but there was an iPhone/iPod Touch bug beginning with iOS 4.2, up through iOS 5.1,
- // where the browser *ALWAYS* applied the landscape media query. This bug does not
- // happen on iPad.
-
- if ( $.support.orientation ) {
-
- // Check the window width and height to figure out what the current orientation
- // of the device is at this moment. Note that we've initialized the portrait map
- // values to 0 and 180, *AND* we purposely check for landscape so that if we guess
- // wrong, , we default to the assumption that portrait is the default orientation.
- // We use a threshold check below because on some platforms like iOS, the iPhone
- // form-factor can report a larger width than height if the user turns on the
- // developer console. The actual threshold value is somewhat arbitrary, we just
- // need to make sure it is large enough to exclude the developer console case.
-
- var ww = window.innerWidth || win.width(),
- wh = window.innerHeight || win.height(),
- landscape_threshold = 50;
-
- initial_orientation_is_landscape = ww > wh && ( ww - wh ) > landscape_threshold;
-
-
- // Now check to see if the current window.orientation is 0 or 180.
- initial_orientation_is_default = portrait_map[ window.orientation ];
-
- // If the initial orientation is landscape, but window.orientation reports 0 or 180, *OR*
- // if the initial orientation is portrait, but window.orientation reports 90 or -90, we
- // need to flip our portrait_map values because landscape is the default orientation for
- // this device/browser.
- if ( ( initial_orientation_is_landscape && initial_orientation_is_default ) || ( !initial_orientation_is_landscape && !initial_orientation_is_default ) ) {
- portrait_map = { "-90": true, "90": true };
- }
- }
-
- $.event.special.orientationchange = $.extend( {}, $.event.special.orientationchange, {
- setup: function() {
- // If the event is supported natively, return false so that jQuery
- // will bind to the event using DOM methods.
- if ( $.support.orientation && !$.event.special.orientationchange.disabled ) {
- return false;
- }
-
- // Get the current orientation to avoid initial double-triggering.
- last_orientation = get_orientation();
-
- // Because the orientationchange event doesn't exist, simulate the
- // event by testing window dimensions on resize.
- win.bind( "throttledresize", handler );
- },
- teardown: function() {
- // If the event is not supported natively, return false so that
- // jQuery will unbind the event using DOM methods.
- if ( $.support.orientation && !$.event.special.orientationchange.disabled ) {
- return false;
- }
-
- // Because the orientationchange event doesn't exist, unbind the
- // resize event handler.
- win.unbind( "throttledresize", handler );
- },
- add: function( handleObj ) {
- // Save a reference to the bound event handler.
- var old_handler = handleObj.handler;
-
-
- handleObj.handler = function( event ) {
- // Modify event object, adding the .orientation property.
- event.orientation = get_orientation();
-
- // Call the originally-bound event handler and return its result.
- return old_handler.apply( this, arguments );
- };
- }
- });
-
- // If the event is not supported natively, this handler will be bound to
- // the window resize event to simulate the orientationchange event.
- function handler() {
- // Get the current orientation.
- var orientation = get_orientation();
-
- if ( orientation !== last_orientation ) {
- // The orientation has changed, so trigger the orientationchange event.
- last_orientation = orientation;
- win.trigger( event_name );
- }
- }
-
- // Get the current page orientation. This method is exposed publicly, should it
- // be needed, as jQuery.event.special.orientationchange.orientation()
- $.event.special.orientationchange.orientation = get_orientation = function() {
- var isPortrait = true, elem = document.documentElement;
-
- // prefer window orientation to the calculation based on screensize as
- // the actual screen resize takes place before or after the orientation change event
- // has been fired depending on implementation (eg android 2.3 is before, iphone after).
- // More testing is required to determine if a more reliable method of determining the new screensize
- // is possible when orientationchange is fired. (eg, use media queries + element + opacity)
- if ( $.support.orientation ) {
- // if the window orientation registers as 0 or 180 degrees report
- // portrait, otherwise landscape
- isPortrait = portrait_map[ window.orientation ];
- } else {
- isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;
- }
-
- return isPortrait ? "portrait" : "landscape";
- };
-
- $.fn[ event_name ] = function( fn ) {
- return fn ? this.bind( event_name, fn ) : this.trigger( event_name );
- };
-
- // jQuery < 1.8
- if ( $.attrFn ) {
- $.attrFn[ event_name ] = true;
- }
-
-}( jQuery, this ));
-
-
-
-(function( $, undefined ) {
-
-$.widget( "mobile.page", $.mobile.widget, {
- options: {
- theme: "c",
- domCache: false,
- keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')"
- },
-
- _create: function() {
- // if false is returned by the callbacks do not create the page
- if ( this._trigger( "beforecreate" ) === false ) {
- return false;
- }
-
- this.element
- .attr( "tabindex", "0" )
- .addClass( "ui-page ui-body-" + this.options.theme );
-
- this._on( this.element, {
- pagebeforehide: "removeContainerBackground",
- pagebeforeshow: "_handlePageBeforeShow"
- });
- },
-
- _handlePageBeforeShow: function( e ) {
- this.setContainerBackground();
- },
-
- removeContainerBackground: function() {
- $.mobile.pageContainer.removeClass( "ui-overlay-" + $.mobile.getInheritedTheme( this.element.parent() ) );
- },
-
- // set the page container background to the page theme
- setContainerBackground: function( theme ) {
- if ( this.options.theme ) {
- $.mobile.pageContainer.addClass( "ui-overlay-" + ( theme || this.options.theme ) );
- }
- },
-
- keepNativeSelector: function() {
- var options = this.options,
- keepNativeDefined = options.keepNative && $.trim( options.keepNative );
-
- if ( keepNativeDefined && options.keepNative !== options.keepNativeDefault ) {
- return [options.keepNative, options.keepNativeDefault].join( ", " );
- }
-
- return options.keepNativeDefault;
- }
-});
-})( jQuery );
-
-(function( $, window, undefined ) {
-
-var createHandler = function( sequential ) {
-
- // Default to sequential
- if ( sequential === undefined ) {
- sequential = true;
- }
-
- return function( name, reverse, $to, $from ) {
-
- var deferred = new $.Deferred(),
- reverseClass = reverse ? " reverse" : "",
- active = $.mobile.urlHistory.getActive(),
- toScroll = active.lastScroll || $.mobile.defaultHomeScroll,
- screenHeight = $.mobile.getScreenHeight(),
- maxTransitionOverride = $.mobile.maxTransitionWidth !== false && $.mobile.window.width() > $.mobile.maxTransitionWidth,
- none = !$.support.cssTransitions || maxTransitionOverride || !name || name === "none" || Math.max( $.mobile.window.scrollTop(), toScroll ) > $.mobile.getMaxScrollForTransition(),
- toPreClass = " ui-page-pre-in",
- toggleViewportClass = function() {
- $.mobile.pageContainer.toggleClass( "ui-mobile-viewport-transitioning viewport-" + name );
- },
- scrollPage = function() {
- // By using scrollTo instead of silentScroll, we can keep things better in order
- // Just to be precautios, disable scrollstart listening like silentScroll would
- $.event.special.scrollstart.enabled = false;
-
- window.scrollTo( 0, toScroll );
-
- // reenable scrollstart listening like silentScroll would
- setTimeout( function() {
- $.event.special.scrollstart.enabled = true;
- }, 150 );
- },
- cleanFrom = function() {
- $from
- .removeClass( $.mobile.activePageClass + " out in reverse " + name )
- .height( "" );
- },
- startOut = function() {
- // if it's not sequential, call the doneOut transition to start the TO page animating in simultaneously
- if ( !sequential ) {
- doneOut();
- }
- else {
- $from.animationComplete( doneOut );
- }
-
- // Set the from page's height and start it transitioning out
- // Note: setting an explicit height helps eliminate tiling in the transitions
- $from
- .height( screenHeight + $.mobile.window.scrollTop() )
- .addClass( name + " out" + reverseClass );
- },
-
- doneOut = function() {
-
- if ( $from && sequential ) {
- cleanFrom();
- }
-
- startIn();
- },
-
- startIn = function() {
-
- // Prevent flickering in phonegap container: see comments at #4024 regarding iOS
- $to.css( "z-index", -10 );
-
- $to.addClass( $.mobile.activePageClass + toPreClass );
-
- // Send focus to page as it is now display: block
- $.mobile.focusPage( $to );
-
- // Set to page height
- $to.height( screenHeight + toScroll );
-
- scrollPage();
-
- // Restores visibility of the new page: added together with $to.css( "z-index", -10 );
- $to.css( "z-index", "" );
-
- if ( !none ) {
- $to.animationComplete( doneIn );
- }
-
- $to
- .removeClass( toPreClass )
- .addClass( name + " in" + reverseClass );
-
- if ( none ) {
- doneIn();
- }
-
- },
-
- doneIn = function() {
-
- if ( !sequential ) {
-
- if ( $from ) {
- cleanFrom();
- }
- }
-
- $to
- .removeClass( "out in reverse " + name )
- .height( "" );
-
- toggleViewportClass();
-
- // In some browsers (iOS5), 3D transitions block the ability to scroll to the desired location during transition
- // This ensures we jump to that spot after the fact, if we aren't there already.
- if ( $.mobile.window.scrollTop() !== toScroll ) {
- scrollPage();
- }
-
- deferred.resolve( name, reverse, $to, $from, true );
- };
-
- toggleViewportClass();
-
- if ( $from && !none ) {
- startOut();
- }
- else {
- doneOut();
- }
-
- return deferred.promise();
- };
-};
-
-// generate the handlers from the above
-var sequentialHandler = createHandler(),
- simultaneousHandler = createHandler( false ),
- defaultGetMaxScrollForTransition = function() {
- return $.mobile.getScreenHeight() * 3;
- };
-
-// Make our transition handler the public default.
-$.mobile.defaultTransitionHandler = sequentialHandler;
-
-//transition handler dictionary for 3rd party transitions
-$.mobile.transitionHandlers = {
- "default": $.mobile.defaultTransitionHandler,
- "sequential": sequentialHandler,
- "simultaneous": simultaneousHandler
-};
-
-$.mobile.transitionFallbacks = {};
-
-// If transition is defined, check if css 3D transforms are supported, and if not, if a fallback is specified
-$.mobile._maybeDegradeTransition = function( transition ) {
- if ( transition && !$.support.cssTransform3d && $.mobile.transitionFallbacks[ transition ] ) {
- transition = $.mobile.transitionFallbacks[ transition ];
- }
-
- return transition;
-};
-
-// Set the getMaxScrollForTransition to default if no implementation was set by user
-$.mobile.getMaxScrollForTransition = $.mobile.getMaxScrollForTransition || defaultGetMaxScrollForTransition;
-})( jQuery, this );
-
-(function( $, undefined ) {
-
- //define vars for interal use
- var $window = $.mobile.window,
- $html = $( 'html' ),
- $head = $( 'head' ),
-
- // NOTE: path extensions dependent on core attributes. Moved here to remove deps from
- // $.mobile.path definition
- path = $.extend($.mobile.path, {
-
- //return the substring of a filepath before the sub-page key, for making a server request
- getFilePath: function( path ) {
- var splitkey = '&' + $.mobile.subPageUrlKey;
- return path && path.split( splitkey )[0].split( dialogHashKey )[0];
- },
-
- //check if the specified url refers to the first page in the main application document.
- isFirstPageUrl: function( url ) {
- // We only deal with absolute paths.
- var u = path.parseUrl( path.makeUrlAbsolute( url, this.documentBase ) ),
-
- // Does the url have the same path as the document?
- samePath = u.hrefNoHash === this.documentUrl.hrefNoHash || ( this.documentBaseDiffers && u.hrefNoHash === this.documentBase.hrefNoHash ),
-
- // Get the first page element.
- fp = $.mobile.firstPage,
-
- // Get the id of the first page element if it has one.
- fpId = fp && fp[0] ? fp[0].id : undefined;
-
- // The url refers to the first page if the path matches the document and
- // it either has no hash value, or the hash is exactly equal to the id of the
- // first page element.
- return samePath && ( !u.hash || u.hash === "#" || ( fpId && u.hash.replace( /^#/, "" ) === fpId ) );
- },
-
- // Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR
- // requests if the document doing the request was loaded via the file:// protocol.
- // This is usually to allow the application to "phone home" and fetch app specific
- // data. We normally let the browser handle external/cross-domain urls, but if the
- // allowCrossDomainPages option is true, we will allow cross-domain http/https
- // requests to go through our page loading logic.
- isPermittedCrossDomainRequest: function( docUrl, reqUrl ) {
- return $.mobile.allowCrossDomainPages &&
- docUrl.protocol === "file:" &&
- reqUrl.search( /^https?:/ ) !== -1;
- }
- }),
-
- // used to track last vclicked element to make sure its value is added to form data
- $lastVClicked = null,
-
- //will be defined when a link is clicked and given an active class
- $activeClickedLink = null,
-
- // resolved on domready
- domreadyDeferred = $.Deferred(),
-
- //urlHistory is purely here to make guesses at whether the back or forward button was clicked
- //and provide an appropriate transition
- urlHistory = $.mobile.navigate.history,
-
- //define first selector to receive focus when a page is shown
- focusable = "[tabindex],a,button:visible,select:visible,input",
-
- //queue to hold simultanious page transitions
- pageTransitionQueue = [],
-
- //indicates whether or not page is in process of transitioning
- isPageTransitioning = false,
-
- //nonsense hash change key for dialogs, so they create a history entry
- dialogHashKey = "&ui-state=dialog",
-
- //existing base tag?
- $base = $head.children( "base" ),
-
- //tuck away the original document URL minus any fragment.
- documentUrl = path.documentUrl,
-
- //if the document has an embedded base tag, documentBase is set to its
- //initial value. If a base tag does not exist, then we default to the documentUrl.
- documentBase = path.documentBase,
-
- //cache the comparison once.
- documentBaseDiffers = path.documentBaseDiffers,
-
- getScreenHeight = $.mobile.getScreenHeight;
-
- //base element management, defined depending on dynamic base tag support
- var base = $.support.dynamicBaseTag ? {
-
- //define base element, for use in routing asset urls that are referenced in Ajax-requested markup
- element: ( $base.length ? $base : $( "<base>", { href: documentBase.hrefNoHash } ).prependTo( $head ) ),
-
- //set the generated BASE element's href attribute to a new page's base path
- set: function( href ) {
- href = path.parseUrl(href).hrefNoHash;
- base.element.attr( "href", path.makeUrlAbsolute( href, documentBase ) );
- },
-
- //set the generated BASE element's href attribute to a new page's base path
- reset: function() {
- base.element.attr( "href", documentBase.hrefNoSearch );
- }
-
- } : undefined;
-
-
- //return the original document url
- $.mobile.getDocumentUrl = path.getDocumentUrl;
-
- //return the original document base url
- $.mobile.getDocumentBase = path.getDocumentBase;
-
- /* internal utility functions */
-
- // NOTE Issue #4950 Android phonegap doesn't navigate back properly
- // when a full page refresh has taken place. It appears that hashchange
- // and replacestate history alterations work fine but we need to support
- // both forms of history traversal in our code that uses backward history
- // movement
- $.mobile.back = function() {
- var nav = window.navigator;
-
- // if the setting is on and the navigator object is
- // available use the phonegap navigation capability
- if( this.phonegapNavigationEnabled &&
- nav &&
- nav.app &&
- nav.app.backHistory ){
- nav.app.backHistory();
- } else {
- window.history.back();
- }
- };
-
- //direct focus to the page title, or otherwise first focusable element
- $.mobile.focusPage = function ( page ) {
- var autofocus = page.find( "[autofocus]" ),
- pageTitle = page.find( ".ui-title:eq(0)" );
-
- if ( autofocus.length ) {
- autofocus.focus();
- return;
- }
-
- if ( pageTitle.length ) {
- pageTitle.focus();
- } else{
- page.focus();
- }
- };
-
- //remove active classes after page transition or error
- function removeActiveLinkClass( forceRemoval ) {
- if ( !!$activeClickedLink && ( !$activeClickedLink.closest( "." + $.mobile.activePageClass ).length || forceRemoval ) ) {
- $activeClickedLink.removeClass( $.mobile.activeBtnClass );
- }
- $activeClickedLink = null;
- }
-
- function releasePageTransitionLock() {
- isPageTransitioning = false;
- if ( pageTransitionQueue.length > 0 ) {
- $.mobile.changePage.apply( null, pageTransitionQueue.pop() );
- }
- }
-
- // Save the last scroll distance per page, before it is hidden
- var setLastScrollEnabled = true,
- setLastScroll, delayedSetLastScroll;
-
- setLastScroll = function() {
- // this barrier prevents setting the scroll value based on the browser
- // scrolling the window based on a hashchange
- if ( !setLastScrollEnabled ) {
- return;
- }
-
- var active = $.mobile.urlHistory.getActive();
-
- if ( active ) {
- var lastScroll = $window.scrollTop();
-
- // Set active page's lastScroll prop.
- // If the location we're scrolling to is less than minScrollBack, let it go.
- active.lastScroll = lastScroll < $.mobile.minScrollBack ? $.mobile.defaultHomeScroll : lastScroll;
- }
- };
-
- // bind to scrollstop to gather scroll position. The delay allows for the hashchange
- // event to fire and disable scroll recording in the case where the browser scrolls
- // to the hash targets location (sometimes the top of the page). once pagechange fires
- // getLastScroll is again permitted to operate
- delayedSetLastScroll = function() {
- setTimeout( setLastScroll, 100 );
- };
-
- // disable an scroll setting when a hashchange has been fired, this only works
- // because the recording of the scroll position is delayed for 100ms after
- // the browser might have changed the position because of the hashchange
- $window.bind( $.support.pushState ? "popstate" : "hashchange", function() {
- setLastScrollEnabled = false;
- });
-
- // handle initial hashchange from chrome :(
- $window.one( $.support.pushState ? "popstate" : "hashchange", function() {
- setLastScrollEnabled = true;
- });
-
- // wait until the mobile page container has been determined to bind to pagechange
- $window.one( "pagecontainercreate", function() {
- // once the page has changed, re-enable the scroll recording
- $.mobile.pageContainer.bind( "pagechange", function() {
-
- setLastScrollEnabled = true;
-
- // remove any binding that previously existed on the get scroll
- // which may or may not be different than the scroll element determined for
- // this page previously
- $window.unbind( "scrollstop", delayedSetLastScroll );
-
- // determine and bind to the current scoll element which may be the window
- // or in the case of touch overflow the element with touch overflow
- $window.bind( "scrollstop", delayedSetLastScroll );
- });
- });
-
- // bind to scrollstop for the first page as "pagechange" won't be fired in that case
- $window.bind( "scrollstop", delayedSetLastScroll );
-
- // No-op implementation of transition degradation
- $.mobile._maybeDegradeTransition = $.mobile._maybeDegradeTransition || function( transition ) {
- return transition;
- };
-
- //function for transitioning between two existing pages
- function transitionPages( toPage, fromPage, transition, reverse ) {
- if ( fromPage ) {
- //trigger before show/hide events
- fromPage.data( "mobile-page" )._trigger( "beforehide", null, { nextPage: toPage } );
- }
-
- toPage.data( "mobile-page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } );
-
- //clear page loader
- $.mobile.hidePageLoadingMsg();
-
- transition = $.mobile._maybeDegradeTransition( transition );
-
- //find the transition handler for the specified transition. If there
- //isn't one in our transitionHandlers dictionary, use the default one.
- //call the handler immediately to kick-off the transition.
- var th = $.mobile.transitionHandlers[ transition || "default" ] || $.mobile.defaultTransitionHandler,
- promise = th( transition, reverse, toPage, fromPage );
-
- promise.done(function() {
- //trigger show/hide events
- if ( fromPage ) {
- fromPage.data( "mobile-page" )._trigger( "hide", null, { nextPage: toPage } );
- }
-
- //trigger pageshow, define prevPage as either fromPage or empty jQuery obj
- toPage.data( "mobile-page" )._trigger( "show", null, { prevPage: fromPage || $( "" ) } );
- });
-
- return promise;
- }
-
- //simply set the active page's minimum height to screen height, depending on orientation
- $.mobile.resetActivePageHeight = function resetActivePageHeight( height ) {
- var aPage = $( "." + $.mobile.activePageClass ),
- aPagePadT = parseFloat( aPage.css( "padding-top" ) ),
- aPagePadB = parseFloat( aPage.css( "padding-bottom" ) ),
- aPageBorderT = parseFloat( aPage.css( "border-top-width" ) ),
- aPageBorderB = parseFloat( aPage.css( "border-bottom-width" ) );
-
- height = ( typeof height === "number" )? height : getScreenHeight();
-
- aPage.css( "min-height", height - aPagePadT - aPagePadB - aPageBorderT - aPageBorderB );
- };
-
- //shared page enhancements
- function enhancePage( $page, role ) {
- // If a role was specified, make sure the data-role attribute
- // on the page element is in sync.
- if ( role ) {
- $page.attr( "data-" + $.mobile.ns + "role", role );
- }
-
- //run page plugin
- $page.page();
- }
-
- // determine the current base url
- function findBaseWithDefault() {
- var closestBase = ( $.mobile.activePage && getClosestBaseUrl( $.mobile.activePage ) );
- return closestBase || documentBase.hrefNoHash;
- }
-
- /* exposed $.mobile methods */
-
- //animation complete callback
- $.fn.animationComplete = function( callback ) {
- if ( $.support.cssTransitions ) {
- return $( this ).one( 'webkitAnimationEnd animationend', callback );
- }
- else{
- // defer execution for consistency between webkit/non webkit
- setTimeout( callback, 0 );
- return $( this );
- }
- };
-
- //expose path object on $.mobile
- $.mobile.path = path;
-
- //expose base object on $.mobile
- $.mobile.base = base;
-
- //history stack
- $.mobile.urlHistory = urlHistory;
-
- $.mobile.dialogHashKey = dialogHashKey;
-
- //enable cross-domain page support
- $.mobile.allowCrossDomainPages = false;
-
- $.mobile._bindPageRemove = function() {
- var page = $( this );
-
- // when dom caching is not enabled or the page is embedded bind to remove the page on hide
- if ( !page.data( "mobile-page" ).options.domCache &&
- page.is( ":jqmData(external-page='true')" ) ) {
-
- page.bind( 'pagehide.remove', function( e ) {
- var $this = $( this ),
- prEvent = new $.Event( "pageremove" );
-
- $this.trigger( prEvent );
-
- if ( !prEvent.isDefaultPrevented() ) {
- $this.removeWithDependents();
- }
- });
- }
- };
-
- // Load a page into the DOM.
- $.mobile.loadPage = function( url, options ) {
- // This function uses deferred notifications to let callers
- // know when the page is done loading, or if an error has occurred.
- var deferred = $.Deferred(),
-
- // The default loadPage options with overrides specified by
- // the caller.
- settings = $.extend( {}, $.mobile.loadPage.defaults, options ),
-
- // The DOM element for the page after it has been loaded.
- page = null,
-
- // If the reloadPage option is true, and the page is already
- // in the DOM, dupCachedPage will be set to the page element
- // so that it can be removed after the new version of the
- // page is loaded off the network.
- dupCachedPage = null,
-
- // The absolute version of the URL passed into the function. This
- // version of the URL may contain dialog/subpage params in it.
- absUrl = path.makeUrlAbsolute( url, findBaseWithDefault() );
-
- // If the caller provided data, and we're using "get" request,
- // append the data to the URL.
- if ( settings.data && settings.type === "get" ) {
- absUrl = path.addSearchParams( absUrl, settings.data );
- settings.data = undefined;
- }
-
- // If the caller is using a "post" request, reloadPage must be true
- if ( settings.data && settings.type === "post" ) {
- settings.reloadPage = true;
- }
-
- // The absolute version of the URL minus any dialog/subpage params.
- // In otherwords the real URL of the page to be loaded.
- var fileUrl = path.getFilePath( absUrl ),
-
- // The version of the Url actually stored in the data-url attribute of
- // the page. For embedded pages, it is just the id of the page. For pages
- // within the same domain as the document base, it is the site relative
- // path. For cross-domain pages (Phone Gap only) the entire absolute Url
- // used to load the page.
- dataUrl = path.convertUrlToDataUrl( absUrl );
-
- // Make sure we have a pageContainer to work with.
- settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
-
- // Check to see if the page already exists in the DOM.
- // NOTE do _not_ use the :jqmData psuedo selector because parenthesis
- // are a valid url char and it breaks on the first occurence
- page = settings.pageContainer.children( "[data-" + $.mobile.ns +"url='" + dataUrl + "']" );
-
- // If we failed to find the page, check to see if the url is a
- // reference to an embedded page. If so, it may have been dynamically
- // injected by a developer, in which case it would be lacking a data-url
- // attribute and in need of enhancement.
- if ( page.length === 0 && dataUrl && !path.isPath( dataUrl ) ) {
- page = settings.pageContainer.children( "#" + dataUrl )
- .attr( "data-" + $.mobile.ns + "url", dataUrl )
- .jqmData( "url", dataUrl );
- }
-
-
- // If we failed to find a page in the DOM, check the URL to see if it
- // refers to the first page in the application. If it isn't a reference
- // to the first page and refers to non-existent embedded page, error out.
- if ( page.length === 0 ) {
- if ( $.mobile.firstPage && path.isFirstPageUrl( fileUrl ) ) {
- // Check to make sure our cached-first-page is actually
- // in the DOM. Some user deployed apps are pruning the first
- // page from the DOM for various reasons, we check for this
- // case here because we don't want a first-page with an id
- // falling through to the non-existent embedded page error
- // case. If the first-page is not in the DOM, then we let
- // things fall through to the ajax loading code below so
- // that it gets reloaded.
- if ( $.mobile.firstPage.parent().length ) {
- page = $( $.mobile.firstPage );
- }
- } else if ( path.isEmbeddedPage( fileUrl ) ) {
- deferred.reject( absUrl, options );
- return deferred.promise();
- }
- }
-
- // If the page we are interested in is already in the DOM,
- // and the caller did not indicate that we should force a
- // reload of the file, we are done. Otherwise, track the
- // existing page as a duplicated.
- if ( page.length ) {
- if ( !settings.reloadPage ) {
- enhancePage( page, settings.role );
- deferred.resolve( absUrl, options, page );
- //if we are reloading the page make sure we update the base if its not a prefetch
- if( base && !options.prefetch ){
- base.set(url);
- }
- return deferred.promise();
- }
- dupCachedPage = page;
- }
- var mpc = settings.pageContainer,
- pblEvent = new $.Event( "pagebeforeload" ),
- triggerData = { url: url, absUrl: absUrl, dataUrl: dataUrl, deferred: deferred, options: settings };
-
- // Let listeners know we're about to load a page.
- mpc.trigger( pblEvent, triggerData );
-
- // If the default behavior is prevented, stop here!
- if ( pblEvent.isDefaultPrevented() ) {
- return deferred.promise();
- }
-
- if ( settings.showLoadMsg ) {
-
- // This configurable timeout allows cached pages a brief delay to load without showing a message
- var loadMsgDelay = setTimeout(function() {
- $.mobile.showPageLoadingMsg();
- }, settings.loadMsgDelay ),
-
- // Shared logic for clearing timeout and removing message.
- hideMsg = function() {
-
- // Stop message show timer
- clearTimeout( loadMsgDelay );
-
- // Hide loading message
- $.mobile.hidePageLoadingMsg();
- };
- }
- // Reset base to the default document base.
- // only reset if we are not prefetching
- if ( base && typeof options.prefetch === "undefined" ) {
- base.reset();
- }
-
- if ( !( $.mobile.allowCrossDomainPages || path.isSameDomain( documentUrl, absUrl ) ) ) {
- deferred.reject( absUrl, options );
- } else {
- // Load the new page.
- $.ajax({
- url: fileUrl,
- type: settings.type,
- data: settings.data,
- contentType: settings.contentType,
- dataType: "html",
- success: function( html, textStatus, xhr ) {
- //pre-parse html to check for a data-url,
- //use it as the new fileUrl, base path, etc
- var all = $( "<div></div>" ),
-
- //page title regexp
- newPageTitle = html.match( /<title[^>]*>([^<]*)/ ) && RegExp.$1,
-
- // TODO handle dialogs again
- pageElemRegex = new RegExp( "(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>)" ),
- dataUrlRegex = new RegExp( "\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?" );
-
-
- // data-url must be provided for the base tag so resource requests can be directed to the
- // correct url. loading into a temprorary element makes these requests immediately
- if ( pageElemRegex.test( html ) &&
- RegExp.$1 &&
- dataUrlRegex.test( RegExp.$1 ) &&
- RegExp.$1 ) {
- url = fileUrl = path.getFilePath( $( "<div>" + RegExp.$1 + "</div>" ).text() );
- }
- //dont update the base tag if we are prefetching
- if ( base && typeof options.prefetch === "undefined") {
- base.set( fileUrl );
- }
-
- //workaround to allow scripts to execute when included in page divs
- all.get( 0 ).innerHTML = html;
- page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first();
-
- //if page elem couldn't be found, create one and insert the body element's contents
- if ( !page.length ) {
- page = $( "<div data-" + $.mobile.ns + "role='page'>" + ( html.split( /<\/?body[^>]*>/gmi )[1] || "" ) + "</div>" );
- }
-
- if ( newPageTitle && !page.jqmData( "title" ) ) {
- if ( ~newPageTitle.indexOf( "&" ) ) {
- newPageTitle = $( "<div>" + newPageTitle + "</div>" ).text();
- }
- page.jqmData( "title", newPageTitle );
- }
-
- //rewrite src and href attrs to use a base url
- if ( !$.support.dynamicBaseTag ) {
- var newPath = path.get( fileUrl );
- page.find( "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]" ).each(function() {
- var thisAttr = $( this ).is( '[href]' ) ? 'href' :
- $( this ).is( '[src]' ) ? 'src' : 'action',
- thisUrl = $( this ).attr( thisAttr );
-
- // XXX_jblas: We need to fix this so that it removes the document
- // base URL, and then prepends with the new page URL.
- //if full path exists and is same, chop it - helps IE out
- thisUrl = thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' );
-
- if ( !/^(\w+:|#|\/)/.test( thisUrl ) ) {
- $( this ).attr( thisAttr, newPath + thisUrl );
- }
- });
- }
-
- //append to page and enhance
- // TODO taging a page with external to make sure that embedded pages aren't removed
- // by the various page handling code is bad. Having page handling code in many
- // places is bad. Solutions post 1.0
- page
- .attr( "data-" + $.mobile.ns + "url", path.convertUrlToDataUrl( fileUrl ) )
- .attr( "data-" + $.mobile.ns + "external-page", true )
- .appendTo( settings.pageContainer );
-
- // wait for page creation to leverage options defined on widget
- page.one( 'pagecreate', $.mobile._bindPageRemove );
-
- enhancePage( page, settings.role );
-
- // Enhancing the page may result in new dialogs/sub pages being inserted
- // into the DOM. If the original absUrl refers to a sub-page, that is the
- // real page we are interested in.
- if ( absUrl.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ) {
- page = settings.pageContainer.children( "[data-" + $.mobile.ns +"url='" + dataUrl + "']" );
- }
-
- // Remove loading message.
- if ( settings.showLoadMsg ) {
- hideMsg();
- }
-
- // Add the page reference and xhr to our triggerData.
- triggerData.xhr = xhr;
- triggerData.textStatus = textStatus;
- triggerData.page = page;
-
- // Let listeners know the page loaded successfully.
- settings.pageContainer.trigger( "pageload", triggerData );
-
- deferred.resolve( absUrl, options, page, dupCachedPage );
- },
- error: function( xhr, textStatus, errorThrown ) {
- //set base back to current path
- if ( base ) {
- base.set( path.get() );
- }
-
- // Add error info to our triggerData.
- triggerData.xhr = xhr;
- triggerData.textStatus = textStatus;
- triggerData.errorThrown = errorThrown;
-
- var plfEvent = new $.Event( "pageloadfailed" );
-
- // Let listeners know the page load failed.
- settings.pageContainer.trigger( plfEvent, triggerData );
-
- // If the default behavior is prevented, stop here!
- // Note that it is the responsibility of the listener/handler
- // that called preventDefault(), to resolve/reject the
- // deferred object within the triggerData.
- if ( plfEvent.isDefaultPrevented() ) {
- return;
- }
-
- // Remove loading message.
- if ( settings.showLoadMsg ) {
-
- // Remove loading message.
- hideMsg();
-
- // show error message
- $.mobile.showPageLoadingMsg( $.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true );
-
- // hide after delay
- setTimeout( $.mobile.hidePageLoadingMsg, 1500 );
- }
-
- deferred.reject( absUrl, options );
- }
- });
- }
-
- return deferred.promise();
- };
-
- $.mobile.loadPage.defaults = {
- type: "get",
- data: undefined,
- reloadPage: false,
- role: undefined, // By default we rely on the role defined by the @data-role attribute.
- showLoadMsg: false,
- pageContainer: undefined,
- loadMsgDelay: 50 // This delay allows loads that pull from browser cache to occur without showing the loading message.
- };
-
- // Show a specific page in the page container.
- $.mobile.changePage = function( toPage, options ) {
- // If we are in the midst of a transition, queue the current request.
- // We'll call changePage() once we're done with the current transition to
- // service the request.
- if ( isPageTransitioning ) {
- pageTransitionQueue.unshift( arguments );
- return;
- }
-
- var settings = $.extend( {}, $.mobile.changePage.defaults, options ), isToPageString;
-
- // Make sure we have a pageContainer to work with.
- settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
-
- // Make sure we have a fromPage.
- settings.fromPage = settings.fromPage || $.mobile.activePage;
-
- isToPageString = (typeof toPage === "string");
-
- var mpc = settings.pageContainer,
- pbcEvent = new $.Event( "pagebeforechange" ),
- triggerData = { toPage: toPage, options: settings };
-
- // NOTE: preserve the original target as the dataUrl value will be simplified
- // eg, removing ui-state, and removing query params from the hash
- // this is so that users who want to use query params have access to them
- // in the event bindings for the page life cycle See issue #5085
- if ( isToPageString ) {
- // if the toPage is a string simply convert it
- triggerData.absUrl = path.makeUrlAbsolute( toPage, findBaseWithDefault() );
- } else {
- // if the toPage is a jQuery object grab the absolute url stored
- // in the loadPage callback where it exists
- triggerData.absUrl = toPage.data( 'absUrl' );
- }
-
- // Let listeners know we're about to change the current page.
- mpc.trigger( pbcEvent, triggerData );
-
- // If the default behavior is prevented, stop here!
- if ( pbcEvent.isDefaultPrevented() ) {
- return;
- }
-
- // We allow "pagebeforechange" observers to modify the toPage in the trigger
- // data to allow for redirects. Make sure our toPage is updated.
- //
- // We also need to re-evaluate whether it is a string, because an object can
- // also be replaced by a string
-
- toPage = triggerData.toPage;
- isToPageString = (typeof toPage === "string");
-
- // Set the isPageTransitioning flag to prevent any requests from
- // entering this method while we are in the midst of loading a page
- // or transitioning.
- isPageTransitioning = true;
-
- // If the caller passed us a url, call loadPage()
- // to make sure it is loaded into the DOM. We'll listen
- // to the promise object it returns so we know when
- // it is done loading or if an error ocurred.
- if ( isToPageString ) {
- // preserve the original target as the dataUrl value will be simplified
- // eg, removing ui-state, and removing query params from the hash
- // this is so that users who want to use query params have access to them
- // in the event bindings for the page life cycle See issue #5085
- settings.target = toPage;
-
- $.mobile.loadPage( toPage, settings )
- .done(function( url, options, newPage, dupCachedPage ) {
- isPageTransitioning = false;
- options.duplicateCachedPage = dupCachedPage;
-
- // store the original absolute url so that it can be provided
- // to events in the triggerData of the subsequent changePage call
- newPage.data( 'absUrl', triggerData.absUrl );
- $.mobile.changePage( newPage, options );
- })
- .fail(function( url, options ) {
-
- //clear out the active button state
- removeActiveLinkClass( true );
-
- //release transition lock so navigation is free again
- releasePageTransitionLock();
- settings.pageContainer.trigger( "pagechangefailed", triggerData );
- });
- return;
- }
-
- // If we are going to the first-page of the application, we need to make
- // sure settings.dataUrl is set to the application document url. This allows
- // us to avoid generating a document url with an id hash in the case where the
- // first-page of the document has an id attribute specified.
- if ( toPage[ 0 ] === $.mobile.firstPage[ 0 ] && !settings.dataUrl ) {
- settings.dataUrl = documentUrl.hrefNoHash;
- }
-
- // The caller passed us a real page DOM element. Update our
- // internal state and then trigger a transition to the page.
- var fromPage = settings.fromPage,
- url = ( settings.dataUrl && path.convertUrlToDataUrl( settings.dataUrl ) ) || toPage.jqmData( "url" ),
- // The pageUrl var is usually the same as url, except when url is obscured as a dialog url. pageUrl always contains the file path
- pageUrl = url,
- fileUrl = path.getFilePath( url ),
- active = urlHistory.getActive(),
- activeIsInitialPage = urlHistory.activeIndex === 0,
- historyDir = 0,
- pageTitle = document.title,
- isDialog = settings.role === "dialog" || toPage.jqmData( "role" ) === "dialog";
-
-
- // By default, we prevent changePage requests when the fromPage and toPage
- // are the same element, but folks that generate content manually/dynamically
- // and reuse pages want to be able to transition to the same page. To allow
- // this, they will need to change the default value of allowSamePageTransition
- // to true, *OR*, pass it in as an option when they manually call changePage().
- // It should be noted that our default transition animations assume that the
- // formPage and toPage are different elements, so they may behave unexpectedly.
- // It is up to the developer that turns on the allowSamePageTransitiona option
- // to either turn off transition animations, or make sure that an appropriate
- // animation transition is used.
- if ( fromPage && fromPage[0] === toPage[0] && !settings.allowSamePageTransition ) {
- isPageTransitioning = false;
- mpc.trigger( "pagechange", triggerData );
-
- // Even if there is no page change to be done, we should keep the urlHistory in sync with the hash changes
- if ( settings.fromHashChange ) {
- urlHistory.direct({ url: url });
- }
-
- return;
- }
-
- // We need to make sure the page we are given has already been enhanced.
- enhancePage( toPage, settings.role );
-
- // If the changePage request was sent from a hashChange event, check to see if the
- // page is already within the urlHistory stack. If so, we'll assume the user hit
- // the forward/back button and will try to match the transition accordingly.
- if ( settings.fromHashChange ) {
- historyDir = options.direction === "back" ? -1 : 1;
- }
-
- // Kill the keyboard.
- // XXX_jblas: We need to stop crawling the entire document to kill focus. Instead,
- // we should be tracking focus with a delegate() handler so we already have
- // the element in hand at this point.
- // Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement
- // is undefined when we are in an IFrame.
- try {
- if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== 'body' ) {
- $( document.activeElement ).blur();
- } else {
- $( "input:focus, textarea:focus, select:focus" ).blur();
- }
- } catch( e ) {}
-
- // Record whether we are at a place in history where a dialog used to be - if so, do not add a new history entry and do not change the hash either
- var alreadyThere = false;
-
- // If we're displaying the page as a dialog, we don't want the url
- // for the dialog content to be used in the hash. Instead, we want
- // to append the dialogHashKey to the url of the current page.
- if ( isDialog && active ) {
- // on the initial page load active.url is undefined and in that case should
- // be an empty string. Moving the undefined -> empty string back into
- // urlHistory.addNew seemed imprudent given undefined better represents
- // the url state
-
- // If we are at a place in history that once belonged to a dialog, reuse
- // this state without adding to urlHistory and without modifying the hash.
- // However, if a dialog is already displayed at this point, and we're
- // about to display another dialog, then we must add another hash and
- // history entry on top so that one may navigate back to the original dialog
- if ( active.url &&
- active.url.indexOf( dialogHashKey ) > -1 &&
- $.mobile.activePage &&
- !$.mobile.activePage.is( ".ui-dialog" ) &&
- urlHistory.activeIndex > 0 ) {
- settings.changeHash = false;
- alreadyThere = true;
- }
-
- // Normally, we tack on a dialog hash key, but if this is the location of a stale dialog,
- // we reuse the URL from the entry
- url = ( active.url || "" );
-
- // account for absolute urls instead of just relative urls use as hashes
- if( !alreadyThere && url.indexOf("#") > -1 ) {
- url += dialogHashKey;
- } else {
- url += "#" + dialogHashKey;
- }
-
- // tack on another dialogHashKey if this is the same as the initial hash
- // this makes sure that a history entry is created for this dialog
- if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
- url += dialogHashKey;
- }
- }
-
- // if title element wasn't found, try the page div data attr too
- // If this is a deep-link or a reload ( active === undefined ) then just use pageTitle
- var newPageTitle = ( !active )? pageTitle : toPage.jqmData( "title" ) || toPage.children( ":jqmData(role='header')" ).find( ".ui-title" ).text();
- if ( !!newPageTitle && pageTitle === document.title ) {
- pageTitle = newPageTitle;
- }
- if ( !toPage.jqmData( "title" ) ) {
- toPage.jqmData( "title", pageTitle );
- }
-
- // Make sure we have a transition defined.
- settings.transition = settings.transition ||
- ( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined ) ||
- ( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition );
-
- //add page to history stack if it's not back or forward
- if ( !historyDir && alreadyThere ) {
- urlHistory.getActive().pageUrl = pageUrl;
- }
-
- // Set the location hash.
- if ( url && !settings.fromHashChange ) {
- var params;
-
- // rebuilding the hash here since we loose it earlier on
- // TODO preserve the originally passed in path
- if( !path.isPath( url ) && url.indexOf( "#" ) < 0 ) {
- url = "#" + url;
- }
-
- // TODO the property names here are just silly
- params = {
- transition: settings.transition,
- title: pageTitle,
- pageUrl: pageUrl,
- role: settings.role
- };
-
- if ( settings.changeHash !== false && $.mobile.hashListeningEnabled ) {
- $.mobile.navigate( url, params, true);
- } else if ( toPage[ 0 ] !== $.mobile.firstPage[ 0 ] ) {
- $.mobile.navigate.history.add( url, params );
- }
- }
-
- //set page title
- document.title = pageTitle;
-
- //set "toPage" as activePage
- $.mobile.activePage = toPage;
-
- // If we're navigating back in the URL history, set reverse accordingly.
- settings.reverse = settings.reverse || historyDir < 0;
-
- transitionPages( toPage, fromPage, settings.transition, settings.reverse )
- .done(function( name, reverse, $to, $from, alreadyFocused ) {
- removeActiveLinkClass();
-
- //if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
- if ( settings.duplicateCachedPage ) {
- settings.duplicateCachedPage.remove();
- }
-
- // Send focus to the newly shown page. Moved from promise .done binding in transitionPages
- // itself to avoid ie bug that reports offsetWidth as > 0 (core check for visibility)
- // despite visibility: hidden addresses issue #2965
- // https://github.com/jquery/jquery-mobile/issues/2965
- if ( !alreadyFocused ) {
- $.mobile.focusPage( toPage );
- }
-
- releasePageTransitionLock();
- mpc.trigger( "pagechange", triggerData );
- });
- };
-
- $.mobile.changePage.defaults = {
- transition: undefined,
- reverse: false,
- changeHash: true,
- fromHashChange: false,
- role: undefined, // By default we rely on the role defined by the @data-role attribute.
- duplicateCachedPage: undefined,
- pageContainer: undefined,
- showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage
- dataUrl: undefined,
- fromPage: undefined,
- allowSamePageTransition: false
- };
-
-/* Event Bindings - hashchange, submit, and click */
- function findClosestLink( ele )
- {
- while ( ele ) {
- // Look for the closest element with a nodeName of "a".
- // Note that we are checking if we have a valid nodeName
- // before attempting to access it. This is because the
- // node we get called with could have originated from within
- // an embedded SVG document where some symbol instance elements
- // don't have nodeName defined on them, or strings are of type
- // SVGAnimatedString.
- if ( ( typeof ele.nodeName === "string" ) && ele.nodeName.toLowerCase() === "a" ) {
- break;
- }
- ele = ele.parentNode;
- }
- return ele;
- }
-
- // The base URL for any given element depends on the page it resides in.
- function getClosestBaseUrl( ele )
- {
- // Find the closest page and extract out its url.
- var url = $( ele ).closest( ".ui-page" ).jqmData( "url" ),
- base = documentBase.hrefNoHash;
-
- if ( !url || !path.isPath( url ) ) {
- url = base;
- }
-
- return path.makeUrlAbsolute( url, base);
- }
-
- //The following event bindings should be bound after mobileinit has been triggered
- //the following deferred is resolved in the init file
- $.mobile.navreadyDeferred = $.Deferred();
- $.mobile._registerInternalEvents = function() {
- var getAjaxFormData = function( $form, calculateOnly ) {
- var url, ret = true, formData, vclickedName, method;
-
- if ( !$.mobile.ajaxEnabled ||
- // test that the form is, itself, ajax false
- $form.is( ":jqmData(ajax='false')" ) ||
- // test that $.mobile.ignoreContentEnabled is set and
- // the form or one of it's parents is ajax=false
- !$form.jqmHijackable().length ||
- $form.attr( "target" ) ) {
- return false;
- }
-
- url = $form.attr( "action" );
- method = ( $form.attr( "method" ) || "get" ).toLowerCase();
-
- // If no action is specified, browsers default to using the
- // URL of the document containing the form. Since we dynamically
- // pull in pages from external documents, the form should submit
- // to the URL for the source document of the page containing
- // the form.
- if ( !url ) {
- // Get the @data-url for the page containing the form.
- url = getClosestBaseUrl( $form );
-
- // NOTE: If the method is "get", we need to strip off the query string
- // because it will get replaced with the new form data. See issue #5710.
- if ( method === "get" ) {
- url = path.parseUrl( url ).hrefNoSearch;
- }
-
- if ( url === documentBase.hrefNoHash ) {
- // The url we got back matches the document base,
- // which means the page must be an internal/embedded page,
- // so default to using the actual document url as a browser
- // would.
- url = documentUrl.hrefNoSearch;
- }
- }
-
- url = path.makeUrlAbsolute( url, getClosestBaseUrl( $form ) );
-
- if ( ( path.isExternal( url ) && !path.isPermittedCrossDomainRequest( documentUrl, url ) ) ) {
- return false;
- }
-
- if ( !calculateOnly ) {
- formData = $form.serializeArray();
-
- if ( $lastVClicked && $lastVClicked[ 0 ].form === $form[ 0 ] ) {
- vclickedName = $lastVClicked.attr( "name" );
- if ( vclickedName ) {
- // Make sure the last clicked element is included in the form
- $.each( formData, function( key, value ) {
- if ( value.name === vclickedName ) {
- // Unset vclickedName - we've found it in the serialized data already
- vclickedName = "";
- return false;
- }
- });
- if ( vclickedName ) {
- formData.push( { name: vclickedName, value: $lastVClicked.attr( "value" ) } );
- }
- }
- }
-
- ret = {
- url: url,
- options: {
- type: method,
- data: $.param( formData ),
- transition: $form.jqmData( "transition" ),
- reverse: $form.jqmData( "direction" ) === "reverse",
- reloadPage: true
- }
- };
- }
-
- return ret;
- };
-
- //bind to form submit events, handle with Ajax
- $.mobile.document.delegate( "form", "submit", function( event ) {
- var formData = getAjaxFormData( $( this ) );
-
- if ( formData ) {
- $.mobile.changePage( formData.url, formData.options );
- event.preventDefault();
- }
- });
-
- //add active state on vclick
- $.mobile.document.bind( "vclick", function( event ) {
- var $btn, btnEls, target = event.target, needClosest = false;
- // if this isn't a left click we don't care. Its important to note
- // that when the virtual event is generated it will create the which attr
- if ( event.which > 1 || !$.mobile.linkBindingEnabled ) {
- return;
- }
-
- // Record that this element was clicked, in case we need it for correct
- // form submission during the "submit" handler above
- $lastVClicked = $( target );
-
- // Try to find a target element to which the active class will be applied
- if ( $.data( target, "mobile-button" ) ) {
- // If the form will not be submitted via AJAX, do not add active class
- if ( !getAjaxFormData( $( target ).closest( "form" ), true ) ) {
- return;
- }
- // We will apply the active state to this button widget - the parent
- // of the input that was clicked will have the associated data
- if ( target.parentNode ) {
- target = target.parentNode;
- }
- } else {
- target = findClosestLink( target );
- if ( !( target && path.parseUrl( target.getAttribute( "href" ) || "#" ).hash !== "#" ) ) {
- return;
- }
-
- // TODO teach $.mobile.hijackable to operate on raw dom elements so the
- // link wrapping can be avoided
- if ( !$( target ).jqmHijackable().length ) {
- return;
- }
- }
-
- // Avoid calling .closest by using the data set during .buttonMarkup()
- // List items have the button data in the parent of the element clicked
- if ( !!~target.className.indexOf( "ui-link-inherit" ) ) {
- if ( target.parentNode ) {
- btnEls = $.data( target.parentNode, "buttonElements" );
- }
- // Otherwise, look for the data on the target itself
- } else {
- btnEls = $.data( target, "buttonElements" );
- }
- // If found, grab the button's outer element
- if ( btnEls ) {
- target = btnEls.outer;
- } else {
- needClosest = true;
- }
-
- $btn = $( target );
- // If the outer element wasn't found by the our heuristics, use .closest()
- if ( needClosest ) {
- $btn = $btn.closest( ".ui-btn" );
- }
-
- if ( $btn.length > 0 && !$btn.hasClass( "ui-disabled" ) ) {
- removeActiveLinkClass( true );
- $activeClickedLink = $btn;
- $activeClickedLink.addClass( $.mobile.activeBtnClass );
- }
- });
-
- // click routing - direct to HTTP or Ajax, accordingly
- $.mobile.document.bind( "click", function( event ) {
- if ( !$.mobile.linkBindingEnabled || event.isDefaultPrevented() ) {
- return;
- }
-
- var link = findClosestLink( event.target ), $link = $( link ), httpCleanup;
-
- // If there is no link associated with the click or its not a left
- // click we want to ignore the click
- // TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
- // can be avoided
- if ( !link || event.which > 1 || !$link.jqmHijackable().length ) {
- return;
- }
-
- //remove active link class if external (then it won't be there if you come back)
- httpCleanup = function() {
- window.setTimeout(function() { removeActiveLinkClass( true ); }, 200 );
- };
-
- //if there's a data-rel=back attr, go back in history
- if ( $link.is( ":jqmData(rel='back')" ) ) {
- $.mobile.back();
- return false;
- }
-
- var baseUrl = getClosestBaseUrl( $link ),
-
- //get href, if defined, otherwise default to empty hash
- href = path.makeUrlAbsolute( $link.attr( "href" ) || "#", baseUrl );
-
- //if ajax is disabled, exit early
- if ( !$.mobile.ajaxEnabled && !path.isEmbeddedPage( href ) ) {
- httpCleanup();
- //use default click handling
- return;
- }
-
- // XXX_jblas: Ideally links to application pages should be specified as
- // an url to the application document with a hash that is either
- // the site relative path or id to the page. But some of the
- // internal code that dynamically generates sub-pages for nested
- // lists and select dialogs, just write a hash in the link they
- // create. This means the actual URL path is based on whatever
- // the current value of the base tag is at the time this code
- // is called. For now we are just assuming that any url with a
- // hash in it is an application page reference.
- if ( href.search( "#" ) !== -1 ) {
- href = href.replace( /[^#]*#/, "" );
- if ( !href ) {
- //link was an empty hash meant purely
- //for interaction, so we ignore it.
- event.preventDefault();
- return;
- } else if ( path.isPath( href ) ) {
- //we have apath so make it the href we want to load.
- href = path.makeUrlAbsolute( href, baseUrl );
- } else {
- //we have a simple id so use the documentUrl as its base.
- href = path.makeUrlAbsolute( "#" + href, documentUrl.hrefNoHash );
- }
- }
-
- // Should we handle this link, or let the browser deal with it?
- var useDefaultUrlHandling = $link.is( "[rel='external']" ) || $link.is( ":jqmData(ajax='false')" ) || $link.is( "[target]" ),
-
- // Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR
- // requests if the document doing the request was loaded via the file:// protocol.
- // This is usually to allow the application to "phone home" and fetch app specific
- // data. We normally let the browser handle external/cross-domain urls, but if the
- // allowCrossDomainPages option is true, we will allow cross-domain http/https
- // requests to go through our page loading logic.
-
- //check for protocol or rel and its not an embedded page
- //TODO overlap in logic from isExternal, rel=external check should be
- // moved into more comprehensive isExternalLink
- isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !path.isPermittedCrossDomainRequest( documentUrl, href ) );
-
- if ( isExternal ) {
- httpCleanup();
- //use default click handling
- return;
- }
-
- //use ajax
- var transition = $link.jqmData( "transition" ),
- reverse = $link.jqmData( "direction" ) === "reverse" ||
- // deprecated - remove by 1.0
- $link.jqmData( "back" ),
-
- //this may need to be more specific as we use data-rel more
- role = $link.attr( "data-" + $.mobile.ns + "rel" ) || undefined;
-
- $.mobile.changePage( href, { transition: transition, reverse: reverse, role: role, link: $link } );
- event.preventDefault();
- });
-
- //prefetch pages when anchors with data-prefetch are encountered
- $.mobile.document.delegate( ".ui-page", "pageshow.prefetch", function() {
- var urls = [];
- $( this ).find( "a:jqmData(prefetch)" ).each(function() {
- var $link = $( this ),
- url = $link.attr( "href" );
-
- if ( url && $.inArray( url, urls ) === -1 ) {
- urls.push( url );
-
- $.mobile.loadPage( url, { role: $link.attr( "data-" + $.mobile.ns + "rel" ),prefetch: true } );
- }
- });
- });
-
- $.mobile._handleHashChange = function( url, data ) {
- //find first page via hash
- var to = path.stripHash(url),
- //transition is false if it's the first page, undefined otherwise (and may be overridden by default)
- transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined,
-
- // default options for the changPage calls made after examining the current state
- // of the page and the hash, NOTE that the transition is derived from the previous
- // history entry
- changePageOptions = {
- changeHash: false,
- fromHashChange: true,
- reverse: data.direction === "back"
- };
-
- $.extend( changePageOptions, data, {
- transition: (urlHistory.getLast() || {}).transition || transition
- });
-
- // special case for dialogs
- if ( urlHistory.activeIndex > 0 && to.indexOf( dialogHashKey ) > -1 && urlHistory.initialDst !== to ) {
-
- // If current active page is not a dialog skip the dialog and continue
- // in the same direction
- if ( $.mobile.activePage && !$.mobile.activePage.is( ".ui-dialog" ) ) {
- //determine if we're heading forward or backward and continue accordingly past
- //the current dialog
- if( data.direction === "back" ) {
- $.mobile.back();
- } else {
- window.history.forward();
- }
-
- // prevent changePage call
- return;
- } else {
- // if the current active page is a dialog and we're navigating
- // to a dialog use the dialog objected saved in the stack
- to = data.pageUrl;
- var active = $.mobile.urlHistory.getActive();
-
- // make sure to set the role, transition and reversal
- // as most of this is lost by the domCache cleaning
- $.extend( changePageOptions, {
- role: active.role,
- transition: active.transition,
- reverse: data.direction === "back"
- });
- }
- }
-
- //if to is defined, load it
- if ( to ) {
- // At this point, 'to' can be one of 3 things, a cached page element from
- // a history stack entry, an id, or site-relative/absolute URL. If 'to' is
- // an id, we need to resolve it against the documentBase, not the location.href,
- // since the hashchange could've been the result of a forward/backward navigation
- // that crosses from an external page/dialog to an internal page/dialog.
- to = !path.isPath( to ) ? ( path.makeUrlAbsolute( '#' + to, documentBase ) ) : to;
-
- // If we're about to go to an initial URL that contains a reference to a non-existent
- // internal page, go to the first page instead. We know that the initial hash refers to a
- // non-existent page, because the initial hash did not end up in the initial urlHistory entry
- if ( to === path.makeUrlAbsolute( '#' + urlHistory.initialDst, documentBase ) &&
- urlHistory.stack.length && urlHistory.stack[0].url !== urlHistory.initialDst.replace( dialogHashKey, "" ) ) {
- to = $.mobile.firstPage;
- }
-
- $.mobile.changePage( to, changePageOptions );
- } else {
-
- //there's no hash, go to the first page in the dom
- $.mobile.changePage( $.mobile.firstPage, changePageOptions );
- }
- };
-
- // TODO roll the logic here into the handleHashChange method
- $window.bind( "navigate", function( e, data ) {
- var url;
-
- if ( e.originalEvent && e.originalEvent.isDefaultPrevented() ) {
- return;
- }
-
- url = $.event.special.navigate.originalEventName.indexOf( "hashchange" ) > -1 ? data.state.hash : data.state.url;
-
- if( !url ) {
- url = $.mobile.path.parseLocation().hash;
- }
-
- if( !url || url === "#" || url.indexOf( "#" + $.mobile.path.uiStateKey ) === 0 ){
- url = location.href;
- }
-
- $.mobile._handleHashChange( url, data.state );
- });
-
- //set page min-heights to be device specific
- $.mobile.document.bind( "pageshow", $.mobile.resetActivePageHeight );
- $.mobile.window.bind( "throttledresize", $.mobile.resetActivePageHeight );
-
- };//navreadyDeferred done callback
-
- $( function() { domreadyDeferred.resolve(); } );
-
- $.when( domreadyDeferred, $.mobile.navreadyDeferred ).done( function() { $.mobile._registerInternalEvents(); } );
-})( jQuery );
-
-/*
-* fallback transition for flip in non-3D supporting browsers (which tend to handle complex transitions poorly in general
-*/
-
-(function( $, window, undefined ) {
-
-$.mobile.transitionFallbacks.flip = "fade";
-
-})( jQuery, this );
-/*
-* fallback transition for flow in non-3D supporting browsers (which tend to handle complex transitions poorly in general
-*/
-
-(function( $, window, undefined ) {
-
-$.mobile.transitionFallbacks.flow = "fade";
-
-})( jQuery, this );
-/*
-* fallback transition for pop in non-3D supporting browsers (which tend to handle complex transitions poorly in general
-*/
-
-(function( $, window, undefined ) {
-
-$.mobile.transitionFallbacks.pop = "fade";
-
-})( jQuery, this );
-/*
-* fallback transition for slide in non-3D supporting browsers (which tend to handle complex transitions poorly in general
-*/
-
-(function( $, window, undefined ) {
-
-// Use the simultaneous transitions handler for slide transitions
-$.mobile.transitionHandlers.slide = $.mobile.transitionHandlers.simultaneous;
-
-// Set the slide transitions's fallback to "fade"
-$.mobile.transitionFallbacks.slide = "fade";
-
-})( jQuery, this );
-/*
-* fallback transition for slidedown in non-3D supporting browsers (which tend to handle complex transitions poorly in general
-*/
-
-(function( $, window, undefined ) {
-
-$.mobile.transitionFallbacks.slidedown = "fade";
-
-})( jQuery, this );
-/*
-* fallback transition for slidefade in non-3D supporting browsers (which tend to handle complex transitions poorly in general
-*/
-
-(function( $, window, undefined ) {
-
-// Set the slide transitions's fallback to "fade"
-$.mobile.transitionFallbacks.slidefade = "fade";
-
-})( jQuery, this );
-/*
-* fallback transition for slideup in non-3D supporting browsers (which tend to handle complex transitions poorly in general
-*/
-
-(function( $, window, undefined ) {
-
-$.mobile.transitionFallbacks.slideup = "fade";
-
-})( jQuery, this );
-/*
-* fallback transition for turn in non-3D supporting browsers (which tend to handle complex transitions poorly in general
-*/
-
-(function( $, window, undefined ) {
-
-$.mobile.transitionFallbacks.turn = "fade";
-
-})( jQuery, this );
-
-(function( $, undefined ) {
-
-$.mobile.page.prototype.options.degradeInputs = {
- color: false,
- date: false,
- datetime: false,
- "datetime-local": false,
- email: false,
- month: false,
- number: false,
- range: "number",
- search: "text",
- tel: false,
- time: false,
- url: false,
- week: false
-};
-
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
-
- var page = $.mobile.closestPageData( $( e.target ) ), options;
-
- if ( !page ) {
- return;
- }
-
- options = page.options;
-
- // degrade inputs to avoid poorly implemented native functionality
- $( e.target ).find( "input" ).not( page.keepNativeSelector() ).each(function() {
- var $this = $( this ),
- type = this.getAttribute( "type" ),
- optType = options.degradeInputs[ type ] || "text";
-
- if ( options.degradeInputs[ type ] ) {
- var html = $( "<div>" ).html( $this.clone() ).html(),
- // In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead
- hasType = html.indexOf( " type=" ) > -1,
- findstr = hasType ? /\s+type=["']?\w+['"]?/ : /\/?>/,
- repstr = " type=\"" + optType + "\" data-" + $.mobile.ns + "type=\"" + type + "\"" + ( hasType ? "" : ">" );
-
- $this.replaceWith( html.replace( findstr, repstr ) );
- }
- });
-
-});
-
-})( jQuery );
-
-(function( $, window, undefined ) {
-
-$.widget( "mobile.dialog", $.mobile.widget, {
- options: {
- closeBtn: "left",
- closeBtnText: "Close",
- overlayTheme: "a",
- corners: true,
- initSelector: ":jqmData(role='dialog')"
- },
-
- // Override the theme set by the page plugin on pageshow
- _handlePageBeforeShow: function() {
- this._isCloseable = true;
- if ( this.options.overlayTheme ) {
- this.element
- .page( "removeContainerBackground" )
- .page( "setContainerBackground", this.options.overlayTheme );
- }
- },
-
- _create: function() {
- var self = this,
- $el = this.element,
- cornerClass = !!this.options.corners ? " ui-corner-all" : "",
- dialogWrap = $( "<div/>", {
- "role" : "dialog",
- "class" : "ui-dialog-contain ui-overlay-shadow" + cornerClass
- });
-
- $el.addClass( "ui-dialog ui-overlay-" + this.options.overlayTheme );
-
- // Class the markup for dialog styling
- // Set aria role
- $el.wrapInner( dialogWrap );
-
- /* bind events
- - clicks and submits should use the closing transition that the dialog opened with
- unless a data-transition is specified on the link/form
- - if the click was on the close button, or the link has a data-rel="back" it'll go back in history naturally
- */
- $el.bind( "vclick submit", function( event ) {
- var $target = $( event.target ).closest( event.type === "vclick" ? "a" : "form" ),
- active;
-
- if ( $target.length && !$target.jqmData( "transition" ) ) {
-
- active = $.mobile.urlHistory.getActive() || {};
-
- $target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) )
- .attr( "data-" + $.mobile.ns + "direction", "reverse" );
- }
- });
-
- this._on( $el, {
- pagebeforeshow: "_handlePageBeforeShow"
- });
-
- $.extend( this, {
- _createComplete: false
- });
-
- this._setCloseBtn( this.options.closeBtn );
- },
-
- _setCloseBtn: function( value ) {
- var self = this, btn, location;
-
- if ( this._headerCloseButton ) {
- this._headerCloseButton.remove();
- this._headerCloseButton = null;
- }
- if ( value !== "none" ) {
- // Sanitize value
- location = ( value === "left" ? "left" : "right" );
- btn = $( "<a href='#' class='ui-btn-" + location + "' data-" + $.mobile.ns + "icon='delete' data-" + $.mobile.ns + "iconpos='notext'>"+ this.options.closeBtnText + "</a>" );
- this.element.children().find( ":jqmData(role='header')" ).first().prepend( btn );
- if ( this._createComplete && $.fn.buttonMarkup ) {
- btn.buttonMarkup();
- }
- this._createComplete = true;
-
- // this must be an anonymous function so that select menu dialogs can replace
- // the close method. This is a change from previously just defining data-rel=back
- // on the button and letting nav handle it
- //
- // Use click rather than vclick in order to prevent the possibility of unintentionally
- // reopening the dialog if the dialog opening item was directly under the close button.
- btn.bind( "click", function() {
- self.close();
- });
-
- this._headerCloseButton = btn;
- }
- },
-
- _setOption: function( key, value ) {
- if ( key === "closeBtn" ) {
- this._setCloseBtn( value );
- }
- this._super( key, value );
- },
-
- // Close method goes back in history
- close: function() {
- var idx, dst, hist = $.mobile.navigate.history;
-
- if ( this._isCloseable ) {
- this._isCloseable = false;
- // If the hash listening is enabled and there is at least one preceding history
- // entry it's ok to go back. Initial pages with the dialog hash state are an example
- // where the stack check is necessary
- if ( $.mobile.hashListeningEnabled && hist.activeIndex > 0 ) {
- $.mobile.back();
- } else {
- idx = Math.max( 0, hist.activeIndex - 1 );
- dst = hist.stack[ idx ].pageUrl || hist.stack[ idx ].url;
- hist.previousIndex = hist.activeIndex;
- hist.activeIndex = idx;
- if ( !$.mobile.path.isPath( dst ) ) {
- dst = $.mobile.path.makeUrlAbsolute( "#" + dst );
- }
-
- $.mobile.changePage( dst, { direction: "back", changeHash: false, fromHashChange: true } );
- }
- }
- }
-});
-
-//auto self-init widgets
-$.mobile.document.delegate( $.mobile.dialog.prototype.options.initSelector, "pagecreate", function() {
- $.mobile.dialog.prototype.enhance( this );
-});
-
-})( jQuery, this );
-
-(function( $, undefined ) {
-
-$.mobile.page.prototype.options.backBtnText = "Back";
-$.mobile.page.prototype.options.addBackBtn = false;
-$.mobile.page.prototype.options.backBtnTheme = null;
-$.mobile.page.prototype.options.headerTheme = "a";
-$.mobile.page.prototype.options.footerTheme = "a";
-$.mobile.page.prototype.options.contentTheme = null;
-
-// NOTE bind used to force this binding to run before the buttonMarkup binding
-// which expects .ui-footer top be applied in its gigantic selector
-// TODO remove the buttonMarkup giant selector and move it to the various modules
-// on which it depends
-$.mobile.document.bind( "pagecreate", function( e ) {
- var $page = $( e.target ),
- o = $page.data( "mobile-page" ).options,
- pageRole = $page.jqmData( "role" ),
- pageTheme = o.theme;
-
- $( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", $page )
- .jqmEnhanceable()
- .each(function() {
-
- var $this = $( this ),
- role = $this.jqmData( "role" ),
- theme = $this.jqmData( "theme" ),
- contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ),
- $headeranchors,
- leftbtn,
- rightbtn,
- backBtn;
-
- $this.addClass( "ui-" + role );
-
- //apply theming and markup modifications to page,header,content,footer
- if ( role === "header" || role === "footer" ) {
-
- var thisTheme = theme || ( role === "header" ? o.headerTheme : o.footerTheme ) || pageTheme;
-
- $this
- //add theme class
- .addClass( "ui-bar-" + thisTheme )
- // Add ARIA role
- .attr( "role", role === "header" ? "banner" : "contentinfo" );
-
- if ( role === "header") {
- // Right,left buttons
- $headeranchors = $this.children( "a, button" );
- leftbtn = $headeranchors.hasClass( "ui-btn-left" );
- rightbtn = $headeranchors.hasClass( "ui-btn-right" );
-
- leftbtn = leftbtn || $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length;
-
- rightbtn = rightbtn || $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length;
- }
-
- // Auto-add back btn on pages beyond first view
- if ( o.addBackBtn &&
- role === "header" &&
- $( ".ui-page" ).length > 1 &&
- $page.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) &&
- !leftbtn ) {
-
- backBtn = $( "<a href='javascript:void(0);' class='ui-btn-left' data-"+ $.mobile.ns +"rel='back' data-"+ $.mobile.ns +"icon='arrow-l'>"+ o.backBtnText +"</a>" )
- // If theme is provided, override default inheritance
- .attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme || thisTheme )
- .prependTo( $this );
- }
-
- // Page title
- $this.children( "h1, h2, h3, h4, h5, h6" )
- .addClass( "ui-title" )
- // Regardless of h element number in src, it becomes h1 for the enhanced page
- .attr({
- "role": "heading",
- "aria-level": "1"
- });
-
- } else if ( role === "content" ) {
- if ( contentTheme ) {
- $this.addClass( "ui-body-" + ( contentTheme ) );
- }
-
- // Add ARIA role
- $this.attr( "role", "main" );
- }
- });
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-// This function calls getAttribute, which should be safe for data-* attributes
-var getAttrFixed = function( e, key ) {
- var value = e.getAttribute( key );
-
- return value === "true" ? true :
- value === "false" ? false :
- value === null ? undefined : value;
-};
-
-$.fn.buttonMarkup = function( options ) {
- var $workingSet = this,
- nsKey = "data-" + $.mobile.ns,
- key;
-
- // Enforce options to be of type string
- options = ( options && ( $.type( options ) === "object" ) )? options : {};
- for ( var i = 0; i < $workingSet.length; i++ ) {
- var el = $workingSet.eq( i ),
- e = el[ 0 ],
- o = $.extend( {}, $.fn.buttonMarkup.defaults, {
- icon: options.icon !== undefined ? options.icon : getAttrFixed( e, nsKey + "icon" ),
- iconpos: options.iconpos !== undefined ? options.iconpos : getAttrFixed( e, nsKey + "iconpos" ),
- theme: options.theme !== undefined ? options.theme : getAttrFixed( e, nsKey + "theme" ) || $.mobile.getInheritedTheme( el, "c" ),
- inline: options.inline !== undefined ? options.inline : getAttrFixed( e, nsKey + "inline" ),
- shadow: options.shadow !== undefined ? options.shadow : getAttrFixed( e, nsKey + "shadow" ),
- corners: options.corners !== undefined ? options.corners : getAttrFixed( e, nsKey + "corners" ),
- iconshadow: options.iconshadow !== undefined ? options.iconshadow : getAttrFixed( e, nsKey + "iconshadow" ),
- mini: options.mini !== undefined ? options.mini : getAttrFixed( e, nsKey + "mini" )
- }, options ),
-
- // Classes Defined
- innerClass = "ui-btn-inner",
- textClass = "ui-btn-text",
- buttonClass, iconClass,
- hover = false,
- state = "up",
- // Button inner markup
- buttonInner,
- buttonText,
- buttonIcon,
- buttonElements;
-
- for ( key in o ) {
- if ( o[ key ] === undefined || o[ key ] === null ) {
- el.removeAttr( nsKey + key );
- } else {
- e.setAttribute( nsKey + key, o[ key ] );
- }
- }
-
- if ( getAttrFixed( e, nsKey + "rel" ) === "popup" && el.attr( "href" ) ) {
- e.setAttribute( "aria-haspopup", true );
- e.setAttribute( "aria-owns", el.attr( "href" ) );
- }
-
- // Check if this element is already enhanced
- buttonElements = $.data( ( ( e.tagName === "INPUT" || e.tagName === "BUTTON" ) ? e.parentNode : e ), "buttonElements" );
-
- if ( buttonElements ) {
- e = buttonElements.outer;
- el = $( e );
- buttonInner = buttonElements.inner;
- buttonText = buttonElements.text;
- // We will recreate this icon below
- $( buttonElements.icon ).remove();
- buttonElements.icon = null;
- hover = buttonElements.hover;
- state = buttonElements.state;
- }
- else {
- buttonInner = document.createElement( o.wrapperEls );
- buttonText = document.createElement( o.wrapperEls );
- }
- buttonIcon = o.icon ? document.createElement( "span" ) : null;
-
- if ( attachEvents && !buttonElements ) {
- attachEvents();
- }
-
- // if not, try to find closest theme container
- if ( !o.theme ) {
- o.theme = $.mobile.getInheritedTheme( el, "c" );
- }
-
- buttonClass = "ui-btn ";
- buttonClass += ( hover ? "ui-btn-hover-" + o.theme : "" );
- buttonClass += ( state ? " ui-btn-" + state + "-" + o.theme : "" );
- buttonClass += o.shadow ? " ui-shadow" : "";
- buttonClass += o.corners ? " ui-btn-corner-all" : "";
-
- if ( o.mini !== undefined ) {
- // Used to control styling in headers/footers, where buttons default to `mini` style.
- buttonClass += o.mini === true ? " ui-mini" : " ui-fullsize";
- }
-
- if ( o.inline !== undefined ) {
- // Used to control styling in headers/footers, where buttons default to `inline` style.
- buttonClass += o.inline === true ? " ui-btn-inline" : " ui-btn-block";
- }
-
- if ( o.icon ) {
- o.icon = "ui-icon-" + o.icon;
- o.iconpos = o.iconpos || "left";
-
- iconClass = "ui-icon " + o.icon;
-
- if ( o.iconshadow ) {
- iconClass += " ui-icon-shadow";
- }
- }
-
- if ( o.iconpos ) {
- buttonClass += " ui-btn-icon-" + o.iconpos;
-
- if ( o.iconpos === "notext" && !el.attr( "title" ) ) {
- el.attr( "title", el.getEncodedText() );
- }
- }
-
- if ( buttonElements ) {
- el.removeClass( buttonElements.bcls || "" );
- }
- el.removeClass( "ui-link" ).addClass( buttonClass );
-
- buttonInner.className = innerClass;
- buttonText.className = textClass;
- if ( !buttonElements ) {
- buttonInner.appendChild( buttonText );
- }
- if ( buttonIcon ) {
- buttonIcon.className = iconClass;
- if ( !( buttonElements && buttonElements.icon ) ) {
- buttonIcon.innerHTML = " ";
- buttonInner.appendChild( buttonIcon );
- }
- }
-
- while ( e.firstChild && !buttonElements ) {
- buttonText.appendChild( e.firstChild );
- }
-
- if ( !buttonElements ) {
- e.appendChild( buttonInner );
- }
-
- // Assign a structure containing the elements of this button to the elements of this button. This
- // will allow us to recognize this as an already-enhanced button in future calls to buttonMarkup().
- buttonElements = {
- hover : hover,
- state : state,
- bcls : buttonClass,
- outer : e,
- inner : buttonInner,
- text : buttonText,
- icon : buttonIcon
- };
-
- $.data( e, 'buttonElements', buttonElements );
- $.data( buttonInner, 'buttonElements', buttonElements );
- $.data( buttonText, 'buttonElements', buttonElements );
- if ( buttonIcon ) {
- $.data( buttonIcon, 'buttonElements', buttonElements );
- }
- }
-
- return this;
-};
-
-$.fn.buttonMarkup.defaults = {
- corners: true,
- shadow: true,
- iconshadow: true,
- wrapperEls: "span"
-};
-
-function closestEnabledButton( element ) {
- var cname;
-
- while ( element ) {
- // Note that we check for typeof className below because the element we
- // handed could be in an SVG DOM where className on SVG elements is defined to
- // be of a different type (SVGAnimatedString). We only operate on HTML DOM
- // elements, so we look for plain "string".
- cname = ( typeof element.className === 'string' ) && ( element.className + ' ' );
- if ( cname && cname.indexOf( "ui-btn " ) > -1 && cname.indexOf( "ui-disabled " ) < 0 ) {
- break;
- }
-
- element = element.parentNode;
- }
-
- return element;
-}
-
-function updateButtonClass( $btn, classToRemove, classToAdd, hover, state ) {
- var buttonElements = $.data( $btn[ 0 ], "buttonElements" );
- $btn.removeClass( classToRemove ).addClass( classToAdd );
- if ( buttonElements ) {
- buttonElements.bcls = $( document.createElement( "div" ) )
- .addClass( buttonElements.bcls + " " + classToAdd )
- .removeClass( classToRemove )
- .attr( "class" );
- if ( hover !== undefined ) {
- buttonElements.hover = hover;
- }
- buttonElements.state = state;
- }
-}
-
-var attachEvents = function() {
- var hoverDelay = $.mobile.buttonMarkup.hoverDelay, hov, foc;
-
- $.mobile.document.bind( {
- "vmousedown vmousecancel vmouseup vmouseover vmouseout focus blur scrollstart": function( event ) {
- var theme,
- $btn = $( closestEnabledButton( event.target ) ),
- isTouchEvent = event.originalEvent && /^touch/.test( event.originalEvent.type ),
- evt = event.type;
-
- if ( $btn.length ) {
- theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
-
- if ( evt === "vmousedown" ) {
- if ( isTouchEvent ) {
- // Use a short delay to determine if the user is scrolling before highlighting
- hov = setTimeout( function() {
- updateButtonClass( $btn, "ui-btn-up-" + theme, "ui-btn-down-" + theme, undefined, "down" );
- }, hoverDelay );
- } else {
- updateButtonClass( $btn, "ui-btn-up-" + theme, "ui-btn-down-" + theme, undefined, "down" );
- }
- } else if ( evt === "vmousecancel" || evt === "vmouseup" ) {
- updateButtonClass( $btn, "ui-btn-down-" + theme, "ui-btn-up-" + theme, undefined, "up" );
- } else if ( evt === "vmouseover" || evt === "focus" ) {
- if ( isTouchEvent ) {
- // Use a short delay to determine if the user is scrolling before highlighting
- foc = setTimeout( function() {
- updateButtonClass( $btn, "ui-btn-up-" + theme, "ui-btn-hover-" + theme, true, "" );
- }, hoverDelay );
- } else {
- updateButtonClass( $btn, "ui-btn-up-" + theme, "ui-btn-hover-" + theme, true, "" );
- }
- } else if ( evt === "vmouseout" || evt === "blur" || evt === "scrollstart" ) {
- updateButtonClass( $btn, "ui-btn-hover-" + theme + " ui-btn-down-" + theme, "ui-btn-up-" + theme, false, "up" );
- if ( hov ) {
- clearTimeout( hov );
- }
- if ( foc ) {
- clearTimeout( foc );
- }
- }
- }
- },
- "focusin focus": function( event ) {
- $( closestEnabledButton( event.target ) ).addClass( $.mobile.focusClass );
- },
- "focusout blur": function( event ) {
- $( closestEnabledButton( event.target ) ).removeClass( $.mobile.focusClass );
- }
- });
-
- attachEvents = null;
-};
-
-//links in bars, or those with data-role become buttons
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
-
- $( ":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a", e.target )
- .jqmEnhanceable()
- .not( "button, input, .ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" )
- .buttonMarkup();
-});
-
-})( jQuery );
-
-
-(function( $, undefined ) {
-
-$.widget( "mobile.collapsible", $.mobile.widget, {
- options: {
- expandCueText: " click to expand contents",
- collapseCueText: " click to collapse contents",
- collapsed: true,
- heading: "h1,h2,h3,h4,h5,h6,legend",
- collapsedIcon: "plus",
- expandedIcon: "minus",
- iconpos: "left",
- theme: null,
- contentTheme: null,
- inset: true,
- corners: true,
- mini: false,
- initSelector: ":jqmData(role='collapsible')"
- },
- _create: function() {
-
- var $el = this.element,
- o = this.options,
- collapsible = $el.addClass( "ui-collapsible" ),
- collapsibleHeading = $el.children( o.heading ).first(),
- collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).children( ".ui-collapsible-content" ),
- collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ),
- collapsibleClasses = "";
-
- // Replace collapsibleHeading if it's a legend
- if ( collapsibleHeading.is( "legend" ) ) {
- collapsibleHeading = $( "<div role='heading'>"+ collapsibleHeading.html() +"</div>" ).insertBefore( collapsibleHeading );
- collapsibleHeading.next().remove();
- }
-
- // If we are in a collapsible set
- if ( collapsibleSet.length ) {
- // Inherit the theme from collapsible-set
- if ( !o.theme ) {
- o.theme = collapsibleSet.jqmData( "theme" ) || $.mobile.getInheritedTheme( collapsibleSet, "c" );
- }
- // Inherit the content-theme from collapsible-set
- if ( !o.contentTheme ) {
- o.contentTheme = collapsibleSet.jqmData( "content-theme" );
- }
-
- // Get the preference for collapsed icon in the set, but override with data- attribute on the individual collapsible
- o.collapsedIcon = $el.jqmData( "collapsed-icon" ) || collapsibleSet.jqmData( "collapsed-icon" ) || o.collapsedIcon;
-
- // Get the preference for expanded icon in the set, but override with data- attribute on the individual collapsible
- o.expandedIcon = $el.jqmData( "expanded-icon" ) || collapsibleSet.jqmData( "expanded-icon" ) || o.expandedIcon;
-
- // Gets the preference icon position in the set, but override with data- attribute on the individual collapsible
- o.iconpos = $el.jqmData( "iconpos" ) || collapsibleSet.jqmData( "iconpos" ) || o.iconpos;
-
- // Inherit the preference for inset from collapsible-set or set the default value to ensure equalty within a set
- if ( collapsibleSet.jqmData( "inset" ) !== undefined ) {
- o.inset = collapsibleSet.jqmData( "inset" );
- } else {
- o.inset = true;
- }
- // Set corners for individual collapsibles to false when in a collapsible-set
- o.corners = false;
- // Gets the preference for mini in the set
- if ( !o.mini ) {
- o.mini = collapsibleSet.jqmData( "mini" );
- }
- } else {
- // get inherited theme if not a set and no theme has been set
- if ( !o.theme ) {
- o.theme = $.mobile.getInheritedTheme( $el, "c" );
- }
- }
-
- if ( !!o.inset ) {
- collapsibleClasses += " ui-collapsible-inset";
- if ( !!o.corners ) {
- collapsibleClasses += " ui-corner-all" ;
- }
- }
- if ( o.contentTheme ) {
- collapsibleClasses += " ui-collapsible-themed-content";
- collapsibleContent.addClass( "ui-body-" + o.contentTheme );
- }
- if ( collapsibleClasses !== "" ) {
- collapsible.addClass( collapsibleClasses );
- }
-
- collapsibleHeading
- //drop heading in before content
- .insertBefore( collapsibleContent )
- //modify markup & attributes
- .addClass( "ui-collapsible-heading" )
- .append( "<span class='ui-collapsible-heading-status'></span>" )
- .wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" )
- .find( "a" )
- .first()
- .buttonMarkup({
- shadow: false,
- corners: false,
- iconpos: o.iconpos,
- icon: o.collapsedIcon,
- mini: o.mini,
- theme: o.theme
- });
-
- //events
- collapsible
- .bind( "expand collapse", function( event ) {
- if ( !event.isDefaultPrevented() ) {
- var $this = $( this ),
- isCollapse = ( event.type === "collapse" );
-
- event.preventDefault();
-
- collapsibleHeading
- .toggleClass( "ui-collapsible-heading-collapsed", isCollapse )
- .find( ".ui-collapsible-heading-status" )
- .text( isCollapse ? o.expandCueText : o.collapseCueText )
- .end()
- .find( ".ui-icon" )
- .toggleClass( "ui-icon-" + o.expandedIcon, !isCollapse )
- // logic or cause same icon for expanded/collapsed state would remove the ui-icon-class
- .toggleClass( "ui-icon-" + o.collapsedIcon, ( isCollapse || o.expandedIcon === o.collapsedIcon ) )
- .end()
- .find( "a" ).first().removeClass( $.mobile.activeBtnClass );
-
- $this.toggleClass( "ui-collapsible-collapsed", isCollapse );
- collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse );
-
- collapsibleContent.trigger( "updatelayout" );
- }
- })
- .trigger( o.collapsed ? "collapse" : "expand" );
-
- collapsibleHeading
- .bind( "tap", function( event ) {
- collapsibleHeading.find( "a" ).first().addClass( $.mobile.activeBtnClass );
- })
- .bind( "click", function( event ) {
-
- var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ? "expand" : "collapse";
-
- collapsible.trigger( type );
-
- event.preventDefault();
- event.stopPropagation();
- });
- }
-});
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.collapsible.prototype.enhanceWithin( e.target );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.mobile.behaviors.addFirstLastClasses = {
- _getVisibles: function( $els, create ) {
- var visibles;
-
- if ( create ) {
- visibles = $els.not( ".ui-screen-hidden" );
- } else {
- visibles = $els.filter( ":visible" );
- if ( visibles.length === 0 ) {
- visibles = $els.not( ".ui-screen-hidden" );
- }
- }
-
- return visibles;
- },
-
- _addFirstLastClasses: function( $els, $visibles, create ) {
- $els.removeClass( "ui-first-child ui-last-child" );
- $visibles.eq( 0 ).addClass( "ui-first-child" ).end().last().addClass( "ui-last-child" );
- if ( !create ) {
- this.element.trigger( "updatelayout" );
- }
- }
-};
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.widget( "mobile.collapsibleset", $.mobile.widget, $.extend( {
- options: {
- initSelector: ":jqmData(role='collapsible-set')"
- },
- _create: function() {
- var $el = this.element.addClass( "ui-collapsible-set" ),
- o = this.options;
-
- // Inherit the theme from collapsible-set
- if ( !o.theme ) {
- o.theme = $.mobile.getInheritedTheme( $el, "c" );
- }
- // Inherit the content-theme from collapsible-set
- if ( !o.contentTheme ) {
- o.contentTheme = $el.jqmData( "content-theme" );
- }
- // Inherit the corner styling from collapsible-set
- if ( !o.corners ) {
- o.corners = $el.jqmData( "corners" );
- }
-
- if ( $el.jqmData( "inset" ) !== undefined ) {
- o.inset = $el.jqmData( "inset" );
- }
- o.inset = o.inset !== undefined ? o.inset : true;
- o.corners = o.corners !== undefined ? o.corners : true;
-
- if ( !!o.corners && !!o.inset ) {
- $el.addClass( "ui-corner-all" );
- }
-
- // Initialize the collapsible set if it's not already initialized
- if ( !$el.jqmData( "collapsiblebound" ) ) {
- $el
- .jqmData( "collapsiblebound", true )
- .bind( "expand", function( event ) {
- var closestCollapsible = $( event.target )
- .closest( ".ui-collapsible" );
- if ( closestCollapsible.parent().is( ":jqmData(role='collapsible-set')" ) ) {
- closestCollapsible
- .siblings( ".ui-collapsible" )
- .trigger( "collapse" );
- }
- });
- }
- },
-
- _init: function() {
- var $el = this.element,
- collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" ),
- expanded = collapsiblesInSet.filter( ":jqmData(collapsed='false')" );
- this._refresh( "true" );
-
- // Because the corners are handled by the collapsible itself and the default state is collapsed
- // That was causing https://github.com/jquery/jquery-mobile/issues/4116
- expanded.trigger( "expand" );
- },
-
- _refresh: function( create ) {
- var collapsiblesInSet = this.element.children( ":jqmData(role='collapsible')" );
-
- $.mobile.collapsible.prototype.enhance( collapsiblesInSet.not( ".ui-collapsible" ) );
-
- this._addFirstLastClasses( collapsiblesInSet, this._getVisibles( collapsiblesInSet, create ), create );
- },
-
- refresh: function() {
- this._refresh( false );
- }
-}, $.mobile.behaviors.addFirstLastClasses ) );
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.collapsibleset.prototype.enhanceWithin( e.target );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-// filter function removes whitespace between label and form element so we can use inline-block (nodeType 3 = text)
-$.fn.fieldcontain = function( options ) {
- return this
- .addClass( "ui-field-contain ui-body ui-br" )
- .contents().filter( function() {
- return ( this.nodeType === 3 && !/\S/.test( this.nodeValue ) );
- }).remove();
-};
-
-//auto self-init widgets
-$( document ).bind( "pagecreate create", function( e ) {
- $( ":jqmData(role='fieldcontain')", e.target ).jqmEnhanceable().fieldcontain();
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.fn.grid = function( options ) {
- return this.each(function() {
-
- var $this = $( this ),
- o = $.extend({
- grid: null
- }, options ),
- $kids = $this.children(),
- gridCols = { solo:1, a:2, b:3, c:4, d:5 },
- grid = o.grid,
- iterator;
-
- if ( !grid ) {
- if ( $kids.length <= 5 ) {
- for ( var letter in gridCols ) {
- if ( gridCols[ letter ] === $kids.length ) {
- grid = letter;
- }
- }
- } else {
- grid = "a";
- $this.addClass( "ui-grid-duo" );
- }
- }
- iterator = gridCols[grid];
-
- $this.addClass( "ui-grid-" + grid );
-
- $kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" );
-
- if ( iterator > 1 ) {
- $kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" );
- }
- if ( iterator > 2 ) {
- $kids.filter( ":nth-child(" + iterator + "n+3)" ).addClass( "ui-block-c" );
- }
- if ( iterator > 3 ) {
- $kids.filter( ":nth-child(" + iterator + "n+4)" ).addClass( "ui-block-d" );
- }
- if ( iterator > 4 ) {
- $kids.filter( ":nth-child(" + iterator + "n+5)" ).addClass( "ui-block-e" );
- }
- });
-};
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.widget( "mobile.navbar", $.mobile.widget, {
- options: {
- iconpos: "top",
- grid: null,
- initSelector: ":jqmData(role='navbar')"
- },
-
- _create: function() {
-
- var $navbar = this.element,
- $navbtns = $navbar.find( "a" ),
- iconpos = $navbtns.filter( ":jqmData(icon)" ).length ?
- this.options.iconpos : undefined;
-
- $navbar.addClass( "ui-navbar ui-mini" )
- .attr( "role", "navigation" )
- .find( "ul" )
- .jqmEnhanceable()
- .grid({ grid: this.options.grid });
-
- $navbtns.buttonMarkup({
- corners: false,
- shadow: false,
- inline: true,
- iconpos: iconpos
- });
-
- $navbar.delegate( "a", "vclick", function( event ) {
- // ui-btn-inner is returned as target
- var target = $( event.target ).is( "a" ) ? $( this ) : $( this ).parent( "a" );
-
- if ( !target.is( ".ui-disabled, .ui-btn-active" ) ) {
- $navbtns.removeClass( $.mobile.activeBtnClass );
- $( this ).addClass( $.mobile.activeBtnClass );
-
- // The code below is a workaround to fix #1181
- var activeBtn = $( this );
-
- $( document ).one( "pagehide", function() {
- activeBtn.removeClass( $.mobile.activeBtnClass );
- });
- }
- });
-
- // Buttons in the navbar with ui-state-persist class should regain their active state before page show
- $navbar.closest( ".ui-page" ).bind( "pagebeforeshow", function() {
- $navbtns.filter( ".ui-state-persist" ).addClass( $.mobile.activeBtnClass );
- });
- }
-});
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.navbar.prototype.enhanceWithin( e.target );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-//Keeps track of the number of lists per page UID
-//This allows support for multiple nested list in the same page
-//https://github.com/jquery/jquery-mobile/issues/1617
-var listCountPerPage = {};
-
-$.widget( "mobile.listview", $.mobile.widget, $.extend( {
-
- options: {
- theme: null,
- countTheme: "c",
- headerTheme: "b",
- dividerTheme: "b",
- icon: "arrow-r",
- splitIcon: "arrow-r",
- splitTheme: "b",
- corners: true,
- shadow: true,
- inset: false,
- initSelector: ":jqmData(role='listview')"
- },
-
- _create: function() {
- var t = this,
- listviewClasses = "";
-
- listviewClasses += t.options.inset ? " ui-listview-inset" : "";
-
- if ( !!t.options.inset ) {
- listviewClasses += t.options.corners ? " ui-corner-all" : "";
- listviewClasses += t.options.shadow ? " ui-shadow" : "";
- }
-
- // create listview markup
- t.element.addClass(function( i, orig ) {
- return orig + " ui-listview" + listviewClasses;
- });
-
- t.refresh( true );
- },
-
- // This is a generic utility method for finding the first
- // node with a given nodeName. It uses basic DOM traversal
- // to be fast and is meant to be a substitute for simple
- // $.fn.closest() and $.fn.children() calls on a single
- // element. Note that callers must pass both the lowerCase
- // and upperCase version of the nodeName they are looking for.
- // The main reason for this is that this function will be
- // called many times and we want to avoid having to lowercase
- // the nodeName from the element every time to ensure we have
- // a match. Note that this function lives here for now, but may
- // be moved into $.mobile if other components need a similar method.
- _findFirstElementByTagName: function( ele, nextProp, lcName, ucName ) {
- var dict = {};
- dict[ lcName ] = dict[ ucName ] = true;
- while ( ele ) {
- if ( dict[ ele.nodeName ] ) {
- return ele;
- }
- ele = ele[ nextProp ];
- }
- return null;
- },
- _getChildrenByTagName: function( ele, lcName, ucName ) {
- var results = [],
- dict = {};
- dict[ lcName ] = dict[ ucName ] = true;
- ele = ele.firstChild;
- while ( ele ) {
- if ( dict[ ele.nodeName ] ) {
- results.push( ele );
- }
- ele = ele.nextSibling;
- }
- return $( results );
- },
-
- _addThumbClasses: function( containers ) {
- var i, img, len = containers.length;
- for ( i = 0; i < len; i++ ) {
- img = $( this._findFirstElementByTagName( containers[ i ].firstChild, "nextSibling", "img", "IMG" ) );
- if ( img.length ) {
- img.addClass( "ui-li-thumb" );
- $( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
- }
- }
- },
-
- refresh: function( create ) {
- this.parentPage = this.element.closest( ".ui-page" );
- this._createSubPages();
-
- var o = this.options,
- $list = this.element,
- self = this,
- dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,
- listsplittheme = $list.jqmData( "splittheme" ),
- listspliticon = $list.jqmData( "spliticon" ),
- listicon = $list.jqmData( "icon" ),
- li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ),
- ol = !!$.nodeName( $list[ 0 ], "ol" ),
- jsCount = !$.support.cssPseudoElement,
- start = $list.attr( "start" ),
- itemClassDict = {},
- item, itemClass, itemTheme,
- a, last, splittheme, counter, startCount, newStartCount, countParent, icon, imgParents, img, linkIcon;
-
- if ( ol && jsCount ) {
- $list.find( ".ui-li-dec" ).remove();
- }
-
- if ( ol ) {
- // Check if a start attribute has been set while taking a value of 0 into account
- if ( start || start === 0 ) {
- if ( !jsCount ) {
- startCount = parseInt( start , 10 ) - 1;
- $list.css( "counter-reset", "listnumbering " + startCount );
- } else {
- counter = parseInt( start , 10 );
- }
- } else if ( jsCount ) {
- counter = 1;
- }
- }
-
- if ( !o.theme ) {
- o.theme = $.mobile.getInheritedTheme( this.element, "c" );
- }
-
- for ( var pos = 0, numli = li.length; pos < numli; pos++ ) {
- item = li.eq( pos );
- itemClass = "ui-li";
-
- // If we're creating the element, we update it regardless
- if ( create || !item.hasClass( "ui-li" ) ) {
- itemTheme = item.jqmData( "theme" ) || o.theme;
- a = this._getChildrenByTagName( item[ 0 ], "a", "A" );
- var isDivider = ( item.jqmData( "role" ) === "list-divider" );
-
- if ( a.length && !isDivider ) {
- icon = item.jqmData( "icon" );
-
- item.buttonMarkup({
- wrapperEls: "div",
- shadow: false,
- corners: false,
- iconpos: "right",
- icon: a.length > 1 || icon === false ? false : icon || listicon || o.icon,
- theme: itemTheme
- });
-
- if ( ( icon !== false ) && ( a.length === 1 ) ) {
- item.addClass( "ui-li-has-arrow" );
- }
-
- a.first().removeClass( "ui-link" ).addClass( "ui-link-inherit" );
-
- if ( a.length > 1 ) {
- itemClass += " ui-li-has-alt";
-
- last = a.last();
- splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;
- linkIcon = last.jqmData( "icon" );
-
- last.appendTo( item )
- .attr( "title", $.trim(last.getEncodedText()) )
- .addClass( "ui-li-link-alt" )
- .empty()
- .buttonMarkup({
- shadow: false,
- corners: false,
- theme: itemTheme,
- icon: false,
- iconpos: "notext"
- })
- .find( ".ui-btn-inner" )
- .append(
- $( document.createElement( "span" ) ).buttonMarkup({
- shadow: true,
- corners: true,
- theme: splittheme,
- iconpos: "notext",
- // link icon overrides list item icon overrides ul element overrides options
- icon: linkIcon || icon || listspliticon || o.splitIcon
- })
- );
- }
- } else if ( isDivider ) {
-
- itemClass += " ui-li-divider ui-bar-" + ( item.jqmData( "theme" ) || dividertheme );
- item.attr( "role", "heading" );
-
- if ( ol ) {
- //reset counter when a divider heading is encountered
- if ( start || start === 0 ) {
- if ( !jsCount ) {
- newStartCount = parseInt( start , 10 ) - 1;
- item.css( "counter-reset", "listnumbering " + newStartCount );
- } else {
- counter = parseInt( start , 10 );
- }
- } else if ( jsCount ) {
- counter = 1;
- }
- }
-
- } else {
- itemClass += " ui-li-static ui-btn-up-" + itemTheme;
- }
- }
-
- if ( ol && jsCount && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
- countParent = itemClass.indexOf( "ui-li-static" ) > 0 ? item : item.find( ".ui-link-inherit" );
-
- countParent.addClass( "ui-li-jsnumbering" )
- .prepend( "<span class='ui-li-dec'>" + ( counter++ ) + ". </span>" );
- }
-
- // Instead of setting item class directly on the list item and its
- // btn-inner at this point in time, push the item into a dictionary
- // that tells us what class to set on it so we can do this after this
- // processing loop is finished.
-
- if ( !itemClassDict[ itemClass ] ) {
- itemClassDict[ itemClass ] = [];
- }
-
- itemClassDict[ itemClass ].push( item[ 0 ] );
- }
-
- // Set the appropriate listview item classes on each list item
- // and their btn-inner elements. The main reason we didn't do this
- // in the for-loop above is because we can eliminate per-item function overhead
- // by calling addClass() and children() once or twice afterwards. This
- // can give us a significant boost on platforms like WP7.5.
-
- for ( itemClass in itemClassDict ) {
- $( itemClassDict[ itemClass ] ).addClass( itemClass ).children( ".ui-btn-inner" ).addClass( itemClass );
- }
-
- $list.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" )
- .end()
-
- .find( "p, dl" ).addClass( "ui-li-desc" )
- .end()
-
- .find( ".ui-li-aside" ).each(function() {
- var $this = $( this );
- $this.prependTo( $this.parent() ); //shift aside to front for css float
- })
- .end()
-
- .find( ".ui-li-count" ).each(function() {
- $( this ).closest( "li" ).addClass( "ui-li-has-count" );
- }).addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" );
-
- // The idea here is to look at the first image in the list item
- // itself, and any .ui-link-inherit element it may contain, so we
- // can place the appropriate classes on the image and list item.
- // Note that we used to use something like:
- //
- // li.find(">img:eq(0), .ui-link-inherit>img:eq(0)").each( ... );
- //
- // But executing a find() like that on Windows Phone 7.5 took a
- // really long time. Walking things manually with the code below
- // allows the 400 listview item page to load in about 3 seconds as
- // opposed to 30 seconds.
-
- this._addThumbClasses( li );
- this._addThumbClasses( $list.find( ".ui-link-inherit" ) );
-
- this._addFirstLastClasses( li, this._getVisibles( li, create ), create );
- // autodividers binds to this to redraw dividers after the listview refresh
- this._trigger( "afterrefresh" );
- },
-
- //create a string for ID/subpage url creation
- _idStringEscape: function( str ) {
- return str.replace(/[^a-zA-Z0-9]/g, '-');
- },
-
- _createSubPages: function() {
- var parentList = this.element,
- parentPage = parentList.closest( ".ui-page" ),
- parentUrl = parentPage.jqmData( "url" ),
- parentId = parentUrl || parentPage[ 0 ][ $.expando ],
- parentListId = parentList.attr( "id" ),
- o = this.options,
- dns = "data-" + $.mobile.ns,
- self = this,
- persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),
- hasSubPages;
-
- if ( typeof listCountPerPage[ parentId ] === "undefined" ) {
- listCountPerPage[ parentId ] = -1;
- }
-
- parentListId = parentListId || ++listCountPerPage[ parentId ];
-
- $( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) {
- var self = this,
- list = $( this ),
- listId = list.attr( "id" ) || parentListId + "-" + i,
- parent = list.parent(),
- nodeElsFull = $( list.prevAll().toArray().reverse() ),
- nodeEls = nodeElsFull.length ? nodeElsFull : $( "<span>" + $.trim(parent.contents()[ 0 ].nodeValue) + "</span>" ),
- title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text
- id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,
- theme = list.jqmData( "theme" ) || o.theme,
- countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,
- newPage, anchor;
-
- //define hasSubPages for use in later removal
- hasSubPages = true;
-
- newPage = list.detach()
- .wrap( "<div " + dns + "role='page' " + dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )
- .parent()
- .before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )
- .after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='"+ persistentFooterID +"'>" ) : "" )
- .parent()
- .appendTo( $.mobile.pageContainer );
-
- newPage.page();
-
- anchor = parent.find( 'a:first' );
-
- if ( !anchor.length ) {
- anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );
- }
-
- anchor.attr( "href", "#" + id );
-
- }).listview();
-
- // on pagehide, remove any nested pages along with the parent page, as long as they aren't active
- // and aren't embedded
- if ( hasSubPages &&
- parentPage.is( ":jqmData(external-page='true')" ) &&
- parentPage.data( "mobile-page" ).options.domCache === false ) {
-
- var newRemove = function( e, ui ) {
- var nextPage = ui.nextPage, npURL,
- prEvent = new $.Event( "pageremove" );
-
- if ( ui.nextPage ) {
- npURL = nextPage.jqmData( "url" );
- if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {
- self.childPages().remove();
- parentPage.trigger( prEvent );
- if ( !prEvent.isDefaultPrevented() ) {
- parentPage.removeWithDependents();
- }
- }
- }
- };
-
- // unbind the original page remove and replace with our specialized version
- parentPage
- .unbind( "pagehide.remove" )
- .bind( "pagehide.remove", newRemove);
- }
- },
-
- // TODO sort out a better way to track sub pages of the listview this is brittle
- childPages: function() {
- var parentUrl = this.parentPage.jqmData( "url" );
-
- return $( ":jqmData(url^='"+ parentUrl + "&" + $.mobile.subPageUrlKey + "')" );
- }
-}, $.mobile.behaviors.addFirstLastClasses ) );
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.listview.prototype.enhanceWithin( e.target );
-});
-
-})( jQuery );
-
-(function( $ ) {
- var meta = $( "meta[name=viewport]" ),
- initialContent = meta.attr( "content" ),
- disabledZoom = initialContent + ",maximum-scale=1, user-scalable=no",
- enabledZoom = initialContent + ",maximum-scale=10, user-scalable=yes",
- disabledInitially = /(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test( initialContent );
-
- $.mobile.zoom = $.extend( {}, {
- enabled: !disabledInitially,
- locked: false,
- disable: function( lock ) {
- if ( !disabledInitially && !$.mobile.zoom.locked ) {
- meta.attr( "content", disabledZoom );
- $.mobile.zoom.enabled = false;
- $.mobile.zoom.locked = lock || false;
- }
- },
- enable: function( unlock ) {
- if ( !disabledInitially && ( !$.mobile.zoom.locked || unlock === true ) ) {
- meta.attr( "content", enabledZoom );
- $.mobile.zoom.enabled = true;
- $.mobile.zoom.locked = false;
- }
- },
- restore: function() {
- if ( !disabledInitially ) {
- meta.attr( "content", initialContent );
- $.mobile.zoom.enabled = true;
- }
- }
- });
-
-}( jQuery ));
-
-(function( $, undefined ) {
-
-$.widget( "mobile.textinput", $.mobile.widget, {
- options: {
- theme: null,
- mini: false,
- // This option defaults to true on iOS devices.
- preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
- initSelector: "input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type]), input[type='file']",
- clearBtn: false,
- clearSearchButtonText: null, //deprecating for 1.3...
- clearBtnText: "clear text",
- disabled: false
- },
-
- _create: function() {
-
- var self = this,
- input = this.element,
- o = this.options,
- theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
- themeclass = " ui-body-" + theme,
- miniclass = o.mini ? " ui-mini" : "",
- isSearch = input.is( "[type='search'], :jqmData(type='search')" ),
- focusedEl,
- clearbtn,
- clearBtnText = o.clearSearchButtonText || o.clearBtnText,
- clearBtnBlacklist = input.is( "textarea, :jqmData(type='range')" ),
- inputNeedsClearBtn = !!o.clearBtn && !clearBtnBlacklist,
- inputNeedsWrap = input.is( "input" ) && !input.is( ":jqmData(type='range')" );
-
- function toggleClear() {
- setTimeout( function() {
- clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() );
- }, 0 );
- }
-
- $( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
-
- focusedEl = input.addClass( "ui-input-text ui-body-"+ theme );
-
- // XXX: Temporary workaround for issue 785 (Apple bug 8910589).
- // Turn off autocorrect and autocomplete on non-iOS 5 devices
- // since the popup they use can't be dismissed by the user. Note
- // that we test for the presence of the feature by looking for
- // the autocorrect property on the input element. We currently
- // have no test for iOS 5 or newer so we're temporarily using
- // the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas
- if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) {
- // Set the attribute instead of the property just in case there
- // is code that attempts to make modifications via HTML.
- input[0].setAttribute( "autocorrect", "off" );
- input[0].setAttribute( "autocomplete", "off" );
- }
-
- //"search" and "text" input widgets
- if ( isSearch ) {
- focusedEl = input.wrap( "<div class='ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield" + themeclass + miniclass + "'></div>" ).parent();
- } else if ( inputNeedsWrap ) {
- focusedEl = input.wrap( "<div class='ui-input-text ui-shadow-inset ui-corner-all ui-btn-shadow" + themeclass + miniclass + "'></div>" ).parent();
- }
-
- if( inputNeedsClearBtn || isSearch ) {
- clearbtn = $( "<a href='#' class='ui-input-clear' title='" + clearBtnText + "'>" + clearBtnText + "</a>" )
- .bind( "click", function( event ) {
- input
- .val( "" )
- .focus()
- .trigger( "change" );
- clearbtn.addClass( "ui-input-clear-hidden" );
- event.preventDefault();
- })
- .appendTo( focusedEl )
- .buttonMarkup({
- icon: "delete",
- iconpos: "notext",
- corners: true,
- shadow: true,
- mini: o.mini
- });
-
- if ( !isSearch ) {
- focusedEl.addClass( "ui-input-has-clear" );
- }
-
- toggleClear();
-
- input.bind( "paste cut keyup input focus change blur", toggleClear );
- }
- else if ( !inputNeedsWrap && !isSearch ) {
- input.addClass( "ui-corner-all ui-shadow-inset" + themeclass + miniclass );
- }
-
- input.focus(function() {
- // In many situations, iOS will zoom into the input upon tap, this prevents that from happening
- if ( o.preventFocusZoom ) {
- $.mobile.zoom.disable( true );
- }
- focusedEl.addClass( $.mobile.focusClass );
- })
- .blur(function() {
- focusedEl.removeClass( $.mobile.focusClass );
- if ( o.preventFocusZoom ) {
- $.mobile.zoom.enable( true );
- }
- });
-
- // Autogrow
- if ( input.is( "textarea" ) ) {
- var extraLineHeight = 15,
- keyupTimeoutBuffer = 100,
- keyupTimeout;
-
- this._keyup = function() {
- var scrollHeight = input[ 0 ].scrollHeight,
- clientHeight = input[ 0 ].clientHeight;
-
- if ( clientHeight < scrollHeight ) {
- var paddingTop = parseFloat( input.css( "padding-top" ) ),
- paddingBottom = parseFloat( input.css( "padding-bottom" ) ),
- paddingHeight = paddingTop + paddingBottom;
-
- input.height( scrollHeight - paddingHeight + extraLineHeight );
- }
- };
-
- input.on( "keyup change input paste", function() {
- clearTimeout( keyupTimeout );
- keyupTimeout = setTimeout( self._keyup, keyupTimeoutBuffer );
- });
-
- // binding to pagechange here ensures that for pages loaded via
- // ajax the height is recalculated without user input
- this._on( true, $.mobile.document, { "pagechange": "_keyup" });
-
- // Issue 509: the browser is not providing scrollHeight properly until the styles load
- if ( $.trim( input.val() ) ) {
- // bind to the window load to make sure the height is calculated based on BOTH
- // the DOM and CSS
- this._on( true, $.mobile.window, {"load": "_keyup"});
- }
- }
- if ( input.attr( "disabled" ) ) {
- this.disable();
- }
- },
-
- disable: function() {
- var $el,
- isSearch = this.element.is( "[type='search'], :jqmData(type='search')" ),
- inputNeedsWrap = this.element.is( "input" ) && !this.element.is( ":jqmData(type='range')" ),
- parentNeedsDisabled = this.element.attr( "disabled", true ) && ( inputNeedsWrap || isSearch );
-
- if ( parentNeedsDisabled ) {
- $el = this.element.parent();
- } else {
- $el = this.element;
- }
- $el.addClass( "ui-disabled" );
- return this._setOption( "disabled", true );
- },
-
- enable: function() {
- var $el,
- isSearch = this.element.is( "[type='search'], :jqmData(type='search')" ),
- inputNeedsWrap = this.element.is( "input" ) && !this.element.is( ":jqmData(type='range')" ),
- parentNeedsEnabled = this.element.attr( "disabled", false ) && ( inputNeedsWrap || isSearch );
-
- if ( parentNeedsEnabled ) {
- $el = this.element.parent();
- } else {
- $el = this.element;
- }
- $el.removeClass( "ui-disabled" );
- return this._setOption( "disabled", false );
- }
-});
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.textinput.prototype.enhanceWithin( e.target, true );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.mobile.listview.prototype.options.filter = false;
-$.mobile.listview.prototype.options.filterPlaceholder = "Filter items...";
-$.mobile.listview.prototype.options.filterTheme = "c";
-$.mobile.listview.prototype.options.filterReveal = false;
-// TODO rename callback/deprecate and default to the item itself as the first argument
-var defaultFilterCallback = function( text, searchValue, item ) {
- return text.toString().toLowerCase().indexOf( searchValue ) === -1;
- };
-
-$.mobile.listview.prototype.options.filterCallback = defaultFilterCallback;
-
-$.mobile.document.delegate( "ul, ol", "listviewcreate", function() {
- var list = $( this ),
- listview = list.data( "mobile-listview" );
-
- if ( !listview || !listview.options.filter ) {
- return;
- }
-
- if ( listview.options.filterReveal ) {
- list.children().addClass( "ui-screen-hidden" );
- }
-
- var wrapper = $( "<form>", {
- "class": "ui-listview-filter ui-bar-" + listview.options.filterTheme,
- "role": "search"
- }).submit( function( e ) {
- e.preventDefault();
- search.blur();
- }),
- onKeyUp = function( e ) {
- var $this = $( this ),
- val = this.value.toLowerCase(),
- listItems = null,
- li = list.children(),
- lastval = $this.jqmData( "lastval" ) + "",
- childItems = false,
- itemtext = "",
- item,
- // Check if a custom filter callback applies
- isCustomFilterCallback = listview.options.filterCallback !== defaultFilterCallback;
-
- if ( lastval && lastval === val ) {
- // Execute the handler only once per value change
- return;
- }
-
- listview._trigger( "beforefilter", "beforefilter", { input: this } );
-
- // Change val as lastval for next execution
- $this.jqmData( "lastval" , val );
- if ( isCustomFilterCallback || val.length < lastval.length || val.indexOf( lastval ) !== 0 ) {
-
- // Custom filter callback applies or removed chars or pasted something totally different, check all items
- listItems = list.children();
- } else {
-
- // Only chars added, not removed, only use visible subset
- listItems = list.children( ":not(.ui-screen-hidden)" );
-
- if ( !listItems.length && listview.options.filterReveal ) {
- listItems = list.children( ".ui-screen-hidden" );
- }
- }
-
- if ( val ) {
-
- // This handles hiding regular rows without the text we search for
- // and any list dividers without regular rows shown under it
-
- for ( var i = listItems.length - 1; i >= 0; i-- ) {
- item = $( listItems[ i ] );
- itemtext = item.jqmData( "filtertext" ) || item.text();
-
- if ( item.is( "li:jqmData(role=list-divider)" ) ) {
-
- item.toggleClass( "ui-filter-hidequeue" , !childItems );
-
- // New bucket!
- childItems = false;
-
- } else if ( listview.options.filterCallback( itemtext, val, item ) ) {
-
- //mark to be hidden
- item.toggleClass( "ui-filter-hidequeue" , true );
- } else {
-
- // There's a shown item in the bucket
- childItems = true;
- }
- }
-
- // Show items, not marked to be hidden
- listItems
- .filter( ":not(.ui-filter-hidequeue)" )
- .toggleClass( "ui-screen-hidden", false );
-
- // Hide items, marked to be hidden
- listItems
- .filter( ".ui-filter-hidequeue" )
- .toggleClass( "ui-screen-hidden", true )
- .toggleClass( "ui-filter-hidequeue", false );
-
- } else {
-
- //filtervalue is empty => show all
- listItems.toggleClass( "ui-screen-hidden", !!listview.options.filterReveal );
- }
- listview._addFirstLastClasses( li, listview._getVisibles( li, false ), false );
- },
- search = $( "<input>", {
- placeholder: listview.options.filterPlaceholder
- })
- .attr( "data-" + $.mobile.ns + "type", "search" )
- .jqmData( "lastval", "" )
- .bind( "keyup change input", onKeyUp )
- .appendTo( wrapper )
- .textinput();
-
- if ( listview.options.inset ) {
- wrapper.addClass( "ui-listview-filter-inset" );
- }
-
- wrapper.bind( "submit", function() {
- return false;
- })
- .insertBefore( list );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.mobile.listview.prototype.options.autodividers = false;
-$.mobile.listview.prototype.options.autodividersSelector = function( elt ) {
- // look for the text in the given element
- var text = $.trim( elt.text() ) || null;
-
- if ( !text ) {
- return null;
- }
-
- // create the text for the divider (first uppercased letter)
- text = text.slice( 0, 1 ).toUpperCase();
-
- return text;
-};
-
-$.mobile.document.delegate( "ul,ol", "listviewcreate", function() {
-
- var list = $( this ),
- listview = list.data( "mobile-listview" );
-
- if ( !listview || !listview.options.autodividers ) {
- return;
- }
-
- var replaceDividers = function () {
- list.find( "li:jqmData(role='list-divider')" ).remove();
-
- var lis = list.find( 'li' ),
- lastDividerText = null, li, dividerText;
-
- for ( var i = 0; i < lis.length ; i++ ) {
- li = lis[i];
- dividerText = listview.options.autodividersSelector( $( li ) );
-
- if ( dividerText && lastDividerText !== dividerText ) {
- var divider = document.createElement( 'li' );
- divider.appendChild( document.createTextNode( dividerText ) );
- divider.setAttribute( 'data-' + $.mobile.ns + 'role', 'list-divider' );
- li.parentNode.insertBefore( divider, li );
- }
-
- lastDividerText = dividerText;
- }
- };
-
- var afterListviewRefresh = function () {
- list.unbind( 'listviewafterrefresh', afterListviewRefresh );
- replaceDividers();
- listview.refresh();
- list.bind( 'listviewafterrefresh', afterListviewRefresh );
- };
-
- afterListviewRefresh();
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$( document ).bind( "pagecreate create", function( e ) {
- $( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" );
-
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.mobile.behaviors.formReset = {
- _handleFormReset: function() {
- this._on( this.element.closest( "form" ), {
- reset: function() {
- this._delay( "_reset" );
- }
- });
- }
-};
-
-})( jQuery );
-
-/*
-* "checkboxradio" plugin
-*/
-
-(function( $, undefined ) {
-
-$.widget( "mobile.checkboxradio", $.mobile.widget, $.extend( {
- options: {
- theme: null,
- mini: false,
- initSelector: "input[type='checkbox'],input[type='radio']"
- },
- _create: function() {
- var self = this,
- input = this.element,
- o = this.options,
- inheritAttr = function( input, dataAttr ) {
- return input.jqmData( dataAttr ) || input.closest( "form, fieldset" ).jqmData( dataAttr );
- },
- // NOTE: Windows Phone could not find the label through a selector
- // filter works though.
- parentLabel = $( input ).closest( "label" ),
- label = parentLabel.length ? parentLabel : $( input ).closest( "form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')" ).find( "label" ).filter( "[for='" + input[0].id + "']" ).first(),
- inputtype = input[0].type,
- mini = inheritAttr( input, "mini" ) || o.mini,
- checkedState = inputtype + "-on",
- uncheckedState = inputtype + "-off",
- iconpos = inheritAttr( input, "iconpos" ),
- checkedClass = "ui-" + checkedState,
- uncheckedClass = "ui-" + uncheckedState;
-
- if ( inputtype !== "checkbox" && inputtype !== "radio" ) {
- return;
- }
-
- // Expose for other methods
- $.extend( this, {
- label: label,
- inputtype: inputtype,
- checkedClass: checkedClass,
- uncheckedClass: uncheckedClass,
- checkedicon: checkedState,
- uncheckedicon: uncheckedState
- });
-
- // If there's no selected theme check the data attr
- if ( !o.theme ) {
- o.theme = $.mobile.getInheritedTheme( this.element, "c" );
- }
-
- label.buttonMarkup({
- theme: o.theme,
- icon: uncheckedState,
- shadow: false,
- mini: mini,
- iconpos: iconpos
- });
-
- // Wrap the input + label in a div
- var wrapper = document.createElement('div');
- wrapper.className = 'ui-' + inputtype;
-
- input.add( label ).wrapAll( wrapper );
-
- label.bind({
- vmouseover: function( event ) {
- if ( $( this ).parent().is( ".ui-disabled" ) ) {
- event.stopPropagation();
- }
- },
-
- vclick: function( event ) {
- if ( input.is( ":disabled" ) ) {
- event.preventDefault();
- return;
- }
-
- self._cacheVals();
-
- input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) );
-
- // trigger click handler's bound directly to the input as a substitute for
- // how label clicks behave normally in the browsers
- // TODO: it would be nice to let the browser's handle the clicks and pass them
- // through to the associate input. we can swallow that click at the parent
- // wrapper element level
- input.triggerHandler( 'click' );
-
- // Input set for common radio buttons will contain all the radio
- // buttons, but will not for checkboxes. clearing the checked status
- // of other radios ensures the active button state is applied properly
- self._getInputSet().not( input ).prop( "checked", false );
-
- self._updateAll();
- return false;
- }
- });
-
- input
- .bind({
- vmousedown: function() {
- self._cacheVals();
- },
-
- vclick: function() {
- var $this = $( this );
-
- // Adds checked attribute to checked input when keyboard is used
- if ( $this.is( ":checked" ) ) {
-
- $this.prop( "checked", true);
- self._getInputSet().not( $this ).prop( "checked", false );
- } else {
-
- $this.prop( "checked", false );
- }
-
- self._updateAll();
- },
-
- focus: function() {
- label.addClass( $.mobile.focusClass );
- },
-
- blur: function() {
- label.removeClass( $.mobile.focusClass );
- }
- });
-
- this._handleFormReset();
- this.refresh();
- },
-
- _cacheVals: function() {
- this._getInputSet().each(function() {
- $( this ).jqmData( "cacheVal", this.checked );
- });
- },
-
- //returns either a set of radios with the same name attribute, or a single checkbox
- _getInputSet: function() {
- if ( this.inputtype === "checkbox" ) {
- return this.element;
- }
-
- return this.element.closest( "form, :jqmData(role='page'), :jqmData(role='dialog')" )
- .find( "input[name='" + this.element[0].name + "'][type='" + this.inputtype + "']" );
- },
-
- _updateAll: function() {
- var self = this;
-
- this._getInputSet().each(function() {
- var $this = $( this );
-
- if ( this.checked || self.inputtype === "checkbox" ) {
- $this.trigger( "change" );
- }
- })
- .checkboxradio( "refresh" );
- },
-
- _reset: function() {
- this.refresh();
- },
-
- refresh: function() {
- var input = this.element[ 0 ],
- active = " " + $.mobile.activeBtnClass,
- checkedClass = this.checkedClass + ( this.element.parents( ".ui-controlgroup-horizontal" ).length ? active : "" ),
- label = this.label;
-
- if ( input.checked ) {
- label.removeClass( this.uncheckedClass + active ).addClass( checkedClass ).buttonMarkup( { icon: this.checkedicon } );
- } else {
- label.removeClass( checkedClass ).addClass( this.uncheckedClass ).buttonMarkup( { icon: this.uncheckedicon } );
- }
-
- if ( input.disabled ) {
- this.disable();
- } else {
- this.enable();
- }
- },
-
- disable: function() {
- this.element.prop( "disabled", true ).parent().addClass( "ui-disabled" );
- },
-
- enable: function() {
- this.element.prop( "disabled", false ).parent().removeClass( "ui-disabled" );
- }
-}, $.mobile.behaviors.formReset ) );
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.checkboxradio.prototype.enhanceWithin( e.target, true );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.widget( "mobile.button", $.mobile.widget, {
- options: {
- theme: null,
- icon: null,
- iconpos: null,
- corners: true,
- shadow: true,
- iconshadow: true,
- inline: null,
- mini: null,
- initSelector: "button, [type='button'], [type='submit'], [type='reset']"
- },
- _create: function() {
- var $el = this.element,
- $button,
- // create a copy of this.options we can pass to buttonMarkup
- o = ( function( tdo ) {
- var key, ret = {};
-
- for ( key in tdo ) {
- if ( tdo[ key ] !== null && key !== "initSelector" ) {
- ret[ key ] = tdo[ key ];
- }
- }
-
- return ret;
- } )( this.options ),
- classes = "",
- $buttonPlaceholder;
-
- // if this is a link, check if it's been enhanced and, if not, use the right function
- if ( $el[ 0 ].tagName === "A" ) {
- if ( !$el.hasClass( "ui-btn" ) ) {
- $el.buttonMarkup();
- }
- return;
- }
-
- // get the inherited theme
- // TODO centralize for all widgets
- if ( !this.options.theme ) {
- this.options.theme = $.mobile.getInheritedTheme( this.element, "c" );
- }
-
- // TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
- /* if ( $el[0].className.length ) {
- classes = $el[0].className;
- } */
- if ( !!~$el[0].className.indexOf( "ui-btn-left" ) ) {
- classes = "ui-btn-left";
- }
-
- if ( !!~$el[0].className.indexOf( "ui-btn-right" ) ) {
- classes = "ui-btn-right";
- }
-
- if ( $el.attr( "type" ) === "submit" || $el.attr( "type" ) === "reset" ) {
- if ( classes ) {
- classes += " ui-submit";
- } else {
- classes = "ui-submit";
- }
- }
- $( "label[for='" + $el.attr( "id" ) + "']" ).addClass( "ui-submit" );
-
- // Add ARIA role
- this.button = $( "<div></div>" )
- [ $el.html() ? "html" : "text" ]( $el.html() || $el.val() )
- .insertBefore( $el )
- .buttonMarkup( o )
- .addClass( classes )
- .append( $el.addClass( "ui-btn-hidden" ) );
-
- $button = this.button;
-
- $el.bind({
- focus: function() {
- $button.addClass( $.mobile.focusClass );
- },
-
- blur: function() {
- $button.removeClass( $.mobile.focusClass );
- }
- });
-
- this.refresh();
- },
-
- _setOption: function( key, value ) {
- var op = {};
-
- op[ key ] = value;
- if ( key !== "initSelector" ) {
- this.button.buttonMarkup( op );
- // Record the option change in the options and in the DOM data-* attributes
- this.element.attr( "data-" + ( $.mobile.ns || "" ) + ( key.replace( /([A-Z])/, "-$1" ).toLowerCase() ), value );
- }
- this._super( "_setOption", key, value );
- },
-
- enable: function() {
- this.element.attr( "disabled", false );
- this.button.removeClass( "ui-disabled" ).attr( "aria-disabled", false );
- return this._setOption( "disabled", false );
- },
-
- disable: function() {
- this.element.attr( "disabled", true );
- this.button.addClass( "ui-disabled" ).attr( "aria-disabled", true );
- return this._setOption( "disabled", true );
- },
-
- refresh: function() {
- var $el = this.element;
-
- if ( $el.prop("disabled") ) {
- this.disable();
- } else {
- this.enable();
- }
-
- // Grab the button's text element from its implementation-independent data item
- $( this.button.data( 'buttonElements' ).text )[ $el.html() ? "html" : "text" ]( $el.html() || $el.val() );
- }
-});
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.button.prototype.enhanceWithin( e.target, true );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.widget( "mobile.slider", $.mobile.widget, $.extend( {
- widgetEventPrefix: "slide",
-
- options: {
- theme: null,
- trackTheme: null,
- disabled: false,
- initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",
- mini: false,
- highlight: false
- },
-
- _create: function() {
-
- // TODO: Each of these should have comments explain what they're for
- var self = this,
- control = this.element,
- parentTheme = $.mobile.getInheritedTheme( control, "c" ),
- theme = this.options.theme || parentTheme,
- trackTheme = this.options.trackTheme || parentTheme,
- cType = control[ 0 ].nodeName.toLowerCase(),
- isSelect = this.isToggleSwitch = cType === "select",
- isRangeslider = control.parent().is( ":jqmData(role='rangeslider')" ),
- selectClass = ( this.isToggleSwitch ) ? "ui-slider-switch" : "",
- controlID = control.attr( "id" ),
- $label = $( "[for='" + controlID + "']" ),
- labelID = $label.attr( "id" ) || controlID + "-label",
- label = $label.attr( "id", labelID ),
- min = !this.isToggleSwitch ? parseFloat( control.attr( "min" ) ) : 0,
- max = !this.isToggleSwitch ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length-1,
- step = window.parseFloat( control.attr( "step" ) || 1 ),
- miniClass = ( this.options.mini || control.jqmData( "mini" ) ) ? " ui-mini" : "",
- domHandle = document.createElement( "a" ),
- handle = $( domHandle ),
- domSlider = document.createElement( "div" ),
- slider = $( domSlider ),
- valuebg = this.options.highlight && !this.isToggleSwitch ? (function() {
- var bg = document.createElement( "div" );
- bg.className = "ui-slider-bg " + $.mobile.activeBtnClass + " ui-btn-corner-all";
- return $( bg ).prependTo( slider );
- })() : false,
- options,
- wrapper;
-
- domHandle.setAttribute( "href", "#" );
- domSlider.setAttribute( "role", "application" );
- domSlider.className = [this.isToggleSwitch ? "ui-slider " : "ui-slider-track ",selectClass," ui-btn-down-",trackTheme," ui-btn-corner-all", miniClass].join( "" );
- domHandle.className = "ui-slider-handle";
- domSlider.appendChild( domHandle );
-
- handle.buttonMarkup({ corners: true, theme: theme, shadow: true })
- .attr({
- "role": "slider",
- "aria-valuemin": min,
- "aria-valuemax": max,
- "aria-valuenow": this._value(),
- "aria-valuetext": this._value(),
- "title": this._value(),
- "aria-labelledby": labelID
- });
-
- $.extend( this, {
- slider: slider,
- handle: handle,
- type: cType,
- step: step,
- max: max,
- min: min,
- valuebg: valuebg,
- isRangeslider: isRangeslider,
- dragging: false,
- beforeStart: null,
- userModified: false,
- mouseMoved: false
- });
-
- if ( this.isToggleSwitch ) {
- wrapper = document.createElement( "div" );
- wrapper.className = "ui-slider-inneroffset";
-
- for ( var j = 0, length = domSlider.childNodes.length; j < length; j++ ) {
- wrapper.appendChild( domSlider.childNodes[j] );
- }
-
- domSlider.appendChild( wrapper );
-
- // slider.wrapInner( "<div class='ui-slider-inneroffset'></div>" );
-
- // make the handle move with a smooth transition
- handle.addClass( "ui-slider-handle-snapping" );
-
- options = control.find( "option" );
-
- for ( var i = 0, optionsCount = options.length; i < optionsCount; i++ ) {
- var side = !i ? "b" : "a",
- sliderTheme = !i ? " ui-btn-down-" + trackTheme : ( " " + $.mobile.activeBtnClass ),
- sliderLabel = document.createElement( "div" ),
- sliderImg = document.createElement( "span" );
-
- sliderImg.className = ["ui-slider-label ui-slider-label-", side, sliderTheme, " ui-btn-corner-all"].join( "" );
- sliderImg.setAttribute( "role", "img" );
- sliderImg.appendChild( document.createTextNode( options[i].innerHTML ) );
- $( sliderImg ).prependTo( slider );
- }
-
- self._labels = $( ".ui-slider-label", slider );
-
- }
-
- label.addClass( "ui-slider" );
-
- // monitor the input for updated values
- control.addClass( this.isToggleSwitch ? "ui-slider-switch" : "ui-slider-input" );
-
- this._on( control, {
- "change": "_controlChange",
- "keyup": "_controlKeyup",
- "blur": "_controlBlur",
- "vmouseup": "_controlVMouseUp"
- });
-
- slider.bind( "vmousedown", $.proxy( this._sliderVMouseDown, this ) )
- .bind( "vclick", false );
-
- // We have to instantiate a new function object for the unbind to work properly
- // since the method itself is defined in the prototype (causing it to unbind everything)
- this._on( document, { "vmousemove": "_preventDocumentDrag" });
- this._on( slider.add( document ), { "vmouseup": "_sliderVMouseUp" });
-
- slider.insertAfter( control );
-
- // wrap in a div for styling purposes
- if ( !this.isToggleSwitch && !isRangeslider ) {
- wrapper = this.options.mini ? "<div class='ui-slider ui-mini'>" : "<div class='ui-slider'>";
-
- control.add( slider ).wrapAll( wrapper );
- }
-
- // Only add focus class to toggle switch, sliders get it automatically from ui-btn
- if ( this.isToggleSwitch ) {
- this.handle.bind({
- focus: function() {
- slider.addClass( $.mobile.focusClass );
- },
-
- blur: function() {
- slider.removeClass( $.mobile.focusClass );
- }
- });
- }
-
- // bind the handle event callbacks and set the context to the widget instance
- this._on( this.handle, {
- "vmousedown": "_handleVMouseDown",
- "keydown": "_handleKeydown",
- "keyup": "_handleKeyup"
- });
-
- this.handle.bind( "vclick", false );
-
- this._handleFormReset();
-
- this.refresh( undefined, undefined, true );
- },
-
- _controlChange: function( event ) {
- // if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again
- if ( this._trigger( "controlchange", event ) === false ) {
- return false;
- }
- if ( !this.mouseMoved ) {
- this.refresh( this._value(), true );
- }
- },
-
- _controlKeyup: function( event ) { // necessary?
- this.refresh( this._value(), true, true );
- },
-
- _controlBlur: function( event ) {
- this.refresh( this._value(), true );
- },
-
- // it appears the clicking the up and down buttons in chrome on
- // range/number inputs doesn't trigger a change until the field is
- // blurred. Here we check thif the value has changed and refresh
- _controlVMouseUp: function( event ) {
- this._checkedRefresh();
- },
-
- // NOTE force focus on handle
- _handleVMouseDown: function( event ) {
- this.handle.focus();
- },
-
- _handleKeydown: function( event ) {
- var index = this._value();
- if ( this.options.disabled ) {
- return;
- }
-
- // In all cases prevent the default and mark the handle as active
- switch ( event.keyCode ) {
- case $.mobile.keyCode.HOME:
- case $.mobile.keyCode.END:
- case $.mobile.keyCode.PAGE_UP:
- case $.mobile.keyCode.PAGE_DOWN:
- case $.mobile.keyCode.UP:
- case $.mobile.keyCode.RIGHT:
- case $.mobile.keyCode.DOWN:
- case $.mobile.keyCode.LEFT:
- event.preventDefault();
-
- if ( !this._keySliding ) {
- this._keySliding = true;
- this.handle.addClass( "ui-state-active" );
- }
-
- break;
- }
-
- // move the slider according to the keypress
- switch ( event.keyCode ) {
- case $.mobile.keyCode.HOME:
- this.refresh( this.min );
- break;
- case $.mobile.keyCode.END:
- this.refresh( this.max );
- break;
- case $.mobile.keyCode.PAGE_UP:
- case $.mobile.keyCode.UP:
- case $.mobile.keyCode.RIGHT:
- this.refresh( index + this.step );
- break;
- case $.mobile.keyCode.PAGE_DOWN:
- case $.mobile.keyCode.DOWN:
- case $.mobile.keyCode.LEFT:
- this.refresh( index - this.step );
- break;
- }
- }, // remove active mark
-
- _handleKeyup: function( event ) {
- if ( this._keySliding ) {
- this._keySliding = false;
- this.handle.removeClass( "ui-state-active" );
- }
- },
-
- _sliderVMouseDown: function( event ) {
- // NOTE: we don't do this in refresh because we still want to
- // support programmatic alteration of disabled inputs
- if ( this.options.disabled || !( event.which === 1 || event.which === 0 ) ) {
- return false;
- }
- if ( this._trigger( "beforestart", event ) === false ) {
- return false;
- }
- this.dragging = true;
- this.userModified = false;
- this.mouseMoved = false;
-
- if ( this.isToggleSwitch ) {
- this.beforeStart = this.element[0].selectedIndex;
- }
-
-
- this.refresh( event );
- this._trigger( "start" );
- return false;
- },
-
- _sliderVMouseUp: function() {
- if ( this.dragging ) {
- this.dragging = false;
-
- if ( this.isToggleSwitch ) {
- // make the handle move with a smooth transition
- this.handle.addClass( "ui-slider-handle-snapping" );
-
- if ( this.mouseMoved ) {
- // this is a drag, change the value only if user dragged enough
- if ( this.userModified ) {
- this.refresh( this.beforeStart === 0 ? 1 : 0 );
- } else {
- this.refresh( this.beforeStart );
- }
- } else {
- // this is just a click, change the value
- this.refresh( this.beforeStart === 0 ? 1 : 0 );
- }
- }
-
- this.mouseMoved = false;
- this._trigger( "stop" );
- return false;
- }
- },
-
- _preventDocumentDrag: function( event ) {
- // NOTE: we don't do this in refresh because we still want to
- // support programmatic alteration of disabled inputs
- if ( this._trigger( "drag", event ) === false) {
- return false;
- }
- if ( this.dragging && !this.options.disabled ) {
-
- // this.mouseMoved must be updated before refresh() because it will be used in the control "change" event
- this.mouseMoved = true;
-
- if ( this.isToggleSwitch ) {
- // make the handle move in sync with the mouse
- this.handle.removeClass( "ui-slider-handle-snapping" );
- }
-
- this.refresh( event );
-
- // only after refresh() you can calculate this.userModified
- this.userModified = this.beforeStart !== this.element[0].selectedIndex;
- return false;
- }
- },
-
- _checkedRefresh: function() {
- if ( this.value !== this._value() ) {
- this.refresh( this._value() );
- }
- },
-
- _value: function() {
- return this.isToggleSwitch ? this.element[0].selectedIndex : parseFloat( this.element.val() ) ;
- },
-
-
- _reset: function() {
- this.refresh( undefined, false, true );
- },
-
- refresh: function( val, isfromControl, preventInputUpdate ) {
- // NOTE: we don't return here because we want to support programmatic
- // alteration of the input value, which should still update the slider
-
- var self = this,
- parentTheme = $.mobile.getInheritedTheme( this.element, "c" ),
- theme = this.options.theme || parentTheme,
- trackTheme = this.options.trackTheme || parentTheme,
- left, width, data, tol;
-
- self.slider[0].className = [ this.isToggleSwitch ? "ui-slider ui-slider-switch" : "ui-slider-track"," ui-btn-down-" + trackTheme,' ui-btn-corner-all', ( this.options.mini ) ? " ui-mini":""].join( "" );
- if ( this.options.disabled || this.element.attr( "disabled" ) ) {
- this.disable();
- }
-
- // set the stored value for comparison later
- this.value = this._value();
- if ( this.options.highlight && !this.isToggleSwitch && this.slider.find( ".ui-slider-bg" ).length === 0 ) {
- this.valuebg = (function() {
- var bg = document.createElement( "div" );
- bg.className = "ui-slider-bg " + $.mobile.activeBtnClass + " ui-btn-corner-all";
- return $( bg ).prependTo( self.slider );
- })();
- }
- this.handle.buttonMarkup({ corners: true, theme: theme, shadow: true });
-
- var pxStep, percent,
- control = this.element,
- isInput = !this.isToggleSwitch,
- optionElements = isInput ? [] : control.find( "option" ),
- min = isInput ? parseFloat( control.attr( "min" ) ) : 0,
- max = isInput ? parseFloat( control.attr( "max" ) ) : optionElements.length - 1,
- step = ( isInput && parseFloat( control.attr( "step" ) ) > 0 ) ? parseFloat( control.attr( "step" ) ) : 1;
-
- if ( typeof val === "object" ) {
- data = val;
- // a slight tolerance helped get to the ends of the slider
- tol = 8;
-
- left = this.slider.offset().left;
- width = this.slider.width();
- pxStep = width/((max-min)/step);
- if ( !this.dragging ||
- data.pageX < left - tol ||
- data.pageX > left + width + tol ) {
- return;
- }
- if ( pxStep > 1 ) {
- percent = ( ( data.pageX - left ) / width ) * 100;
- } else {
- percent = Math.round( ( ( data.pageX - left ) / width ) * 100 );
- }
- } else {
- if ( val == null ) {
- val = isInput ? parseFloat( control.val() || 0 ) : control[0].selectedIndex;
- }
- percent = ( parseFloat( val ) - min ) / ( max - min ) * 100;
- }
-
- if ( isNaN( percent ) ) {
- return;
- }
-
- var newval = ( percent / 100 ) * ( max - min ) + min;
-
- //from jQuery UI slider, the following source will round to the nearest step
- var valModStep = ( newval - min ) % step;
- var alignValue = newval - valModStep;
-
- if ( Math.abs( valModStep ) * 2 >= step ) {
- alignValue += ( valModStep > 0 ) ? step : ( -step );
- }
-
- var percentPerStep = 100/((max-min)/step);
- // Since JavaScript has problems with large floats, round
- // the final value to 5 digits after the decimal point (see jQueryUI: #4124)
- newval = parseFloat( alignValue.toFixed(5) );
-
- if ( typeof pxStep === "undefined" ) {
- pxStep = width / ( (max-min) / step );
- }
- if ( pxStep > 1 && isInput ) {
- percent = ( newval - min ) * percentPerStep * ( 1 / step );
- }
- if ( percent < 0 ) {
- percent = 0;
- }
-
- if ( percent > 100 ) {
- percent = 100;
- }
-
- if ( newval < min ) {
- newval = min;
- }
-
- if ( newval > max ) {
- newval = max;
- }
-
- this.handle.css( "left", percent + "%" );
-
- this.handle[0].setAttribute( "aria-valuenow", isInput ? newval : optionElements.eq( newval ).attr( "value" ) );
-
- this.handle[0].setAttribute( "aria-valuetext", isInput ? newval : optionElements.eq( newval ).getEncodedText() );
-
- this.handle[0].setAttribute( "title", isInput ? newval : optionElements.eq( newval ).getEncodedText() );
-
- if ( this.valuebg ) {
- this.valuebg.css( "width", percent + "%" );
- }
-
- // drag the label widths
- if ( this._labels ) {
- var handlePercent = this.handle.width() / this.slider.width() * 100,
- aPercent = percent && handlePercent + ( 100 - handlePercent ) * percent / 100,
- bPercent = percent === 100 ? 0 : Math.min( handlePercent + 100 - aPercent, 100 );
-
- this._labels.each(function() {
- var ab = $( this ).is( ".ui-slider-label-a" );
- $( this ).width( ( ab ? aPercent : bPercent ) + "%" );
- });
- }
-
- if ( !preventInputUpdate ) {
- var valueChanged = false;
-
- // update control"s value
- if ( isInput ) {
- valueChanged = control.val() !== newval;
- control.val( newval );
- } else {
- valueChanged = control[ 0 ].selectedIndex !== newval;
- control[ 0 ].selectedIndex = newval;
- }
- if ( this._trigger( "beforechange", val ) === false) {
- return false;
- }
- if ( !isfromControl && valueChanged ) {
- control.trigger( "change" );
- }
- }
- },
-
- enable: function() {
- this.element.attr( "disabled", false );
- this.slider.removeClass( "ui-disabled" ).attr( "aria-disabled", false );
- return this._setOption( "disabled", false );
- },
-
- disable: function() {
- this.element.attr( "disabled", true );
- this.slider.addClass( "ui-disabled" ).attr( "aria-disabled", true );
- return this._setOption( "disabled", true );
- }
-
-}, $.mobile.behaviors.formReset ) );
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.slider.prototype.enhanceWithin( e.target, true );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
- $.widget( "mobile.rangeslider", $.mobile.widget, {
-
- options: {
- theme: null,
- trackTheme: null,
- disabled: false,
- initSelector: ":jqmData(role='rangeslider')",
- mini: false,
- highlight: true
- },
-
- _create: function() {
- var secondLabel,
- $el = this.element,
- elClass = this.options.mini ? "ui-rangeslider ui-mini" : "ui-rangeslider",
- _inputFirst = $el.find( "input" ).first(),
- _inputLast = $el.find( "input" ).last(),
- label = $el.find( "label" ).first(),
- _sliderFirst = $.data( _inputFirst.get(0), "mobileSlider" ).slider,
- _sliderLast = $.data( _inputLast.get(0), "mobileSlider" ).slider,
- firstHandle = $.data( _inputFirst.get(0), "mobileSlider" ).handle,
- _sliders = $( "<div class=\"ui-rangeslider-sliders\" />" ).appendTo( $el );
-
- if ( $el.find( "label" ).length > 1 ) {
- secondLabel = $el.find( "label" ).last().hide();
- }
-
- _inputFirst.addClass( "ui-rangeslider-first" );
- _inputLast.addClass( "ui-rangeslider-last" );
- $el.addClass( elClass );
-
- _sliderFirst.appendTo( _sliders );
- _sliderLast.appendTo( _sliders );
- label.prependTo( $el );
- firstHandle.prependTo( _sliderLast );
-
- $.extend( this, {
- _inputFirst: _inputFirst,
- _inputLast: _inputLast,
- _sliderFirst: _sliderFirst,
- _sliderLast: _sliderLast,
- _targetVal: null,
- _sliderTarget: false,
- _sliders: _sliders,
- _proxy: false
- });
-
- this.refresh();
- this._on( this.element.find( "input.ui-slider-input" ), {
- "slidebeforestart": "_slidebeforestart",
- "slidestop": "_slidestop",
- "slidedrag": "_slidedrag",
- "slidebeforechange": "_change",
- "blur": "_change",
- "keyup": "_change"
- });
- this._on({
- "mousedown":"_change"
- });
- this._on( this.element.closest( "form" ), {
- "reset":"_handleReset"
- });
- this._on( firstHandle, {
- "vmousedown": "_dragFirstHandle"
- });
- },
- _handleReset: function(){
- var self = this;
- //we must wait for the stack to unwind before updateing other wise sliders will not have updated yet
- setTimeout( function(){
- self._updateHighlight();
- },0);
- },
-
- _dragFirstHandle: function( event ) {
- //if the first handle is dragged send the event to the first slider
- $.data( this._inputFirst.get(0), "mobileSlider" ).dragging = true;
- $.data( this._inputFirst.get(0), "mobileSlider" ).refresh( event );
- return false;
- },
-
- _slidedrag: function( event ) {
- var first = $( event.target ).is( this._inputFirst ),
- otherSlider = ( first ) ? this._inputLast : this._inputFirst;
-
- this._sliderTarget = false;
- //if the drag was initiated on an extreme and the other handle is focused send the events to
- //the closest handle
- if ( ( this._proxy === "first" && first ) || ( this._proxy === "last" && !first ) ) {
- $.data( otherSlider.get(0), "mobileSlider" ).dragging = true;
- $.data( otherSlider.get(0), "mobileSlider" ).refresh( event );
- return false;
- }
- },
-
- _slidestop: function( event ) {
- var first = $( event.target ).is( this._inputFirst );
-
- this._proxy = false;
- //this stops dragging of the handle and brings the active track to the front
- //this makes clicks on the track go the the last handle used
- this.element.find( "input" ).trigger( "vmouseup" );
- this._sliderFirst.css( "z-index", first ? 1 : "" );
- },
-
- _slidebeforestart: function( event ) {
- this._sliderTarget = false;
- //if the track is the target remember this and the original value
- if ( $( event.originalEvent.target ).hasClass( "ui-slider-track" ) ) {
- this._sliderTarget = true;
- this._targetVal = $( event.target ).val();
- }
- },
-
- _setOption: function( options ) {
- this._superApply( options );
- this.refresh();
- },
-
- refresh: function() {
- var $el = this.element,
- o = this.options;
-
- $el.find( "input" ).slider({
- theme: o.theme,
- trackTheme: o.trackTheme,
- disabled: o.disabled,
- mini: o.mini,
- highlight: o.highlight
- }).slider( "refresh" );
- this._updateHighlight();
- },
-
- _change: function( event ) {
- if ( event.type === "keyup" ) {
- this._updateHighlight();
- return false;
- }
-
- var self = this,
- min = parseFloat( this._inputFirst.val(), 10 ),
- max = parseFloat( this._inputLast.val(), 10 ),
- first = $( event.target ).hasClass( "ui-rangeslider-first" ),
- thisSlider = first ? this._inputFirst : this._inputLast,
- otherSlider = first ? this._inputLast : this._inputFirst;
-
-
- if( ( this._inputFirst.val() > this._inputLast.val() && event.type === "mousedown" && !$(event.target).hasClass("ui-slider-handle")) ){
- thisSlider.blur();
- } else if( event.type === "mousedown" ){
- return;
- }
- if ( min > max && !this._sliderTarget ) {
- //this prevents min from being greater then max
- thisSlider.val( first ? max: min ).slider( "refresh" );
- this._trigger( "normalize" );
- } else if ( min > max ) {
- //this makes it so clicks on the target on either extreme go to the closest handle
- thisSlider.val( this._targetVal ).slider( "refresh" );
-
- //You must wait for the stack to unwind so first slider is updated before updating second
- setTimeout( function() {
- otherSlider.val( first ? min: max ).slider( "refresh" );
- $.data( otherSlider.get(0), "mobileSlider" ).handle.focus();
- self._sliderFirst.css( "z-index", first ? "" : 1 );
- self._trigger( "normalize" );
- }, 0 );
- this._proxy = ( first ) ? "first" : "last";
- }
- //fixes issue where when both _sliders are at min they cannot be adjusted
- if ( min === max ) {
- $.data( thisSlider.get(0), "mobileSlider" ).handle.css( "z-index", 1 );
- $.data( otherSlider.get(0), "mobileSlider" ).handle.css( "z-index", 0 );
- } else {
- $.data( otherSlider.get(0), "mobileSlider" ).handle.css( "z-index", "" );
- $.data( thisSlider.get(0), "mobileSlider" ).handle.css( "z-index", "" );
- }
-
- this._updateHighlight();
-
- if ( min >= max ) {
- return false;
- }
- },
-
- _updateHighlight: function() {
- var min = parseInt( $.data( this._inputFirst.get(0), "mobileSlider" ).handle.get(0).style.left, 10 ),
- max = parseInt( $.data( this._inputLast.get(0), "mobileSlider" ).handle.get(0).style.left, 10 ),
- width = (max - min);
-
- this.element.find( ".ui-slider-bg" ).css({
- "margin-left": min + "%",
- "width": width + "%"
- });
- },
-
- _destroy: function() {
- this.element.removeClass( "ui-rangeslider ui-mini" ).find( "label" ).show();
- this._inputFirst.after( this._sliderFirst );
- this._inputLast.after( this._sliderLast );
- this._sliders.remove();
- this.element.find( "input" ).removeClass( "ui-rangeslider-first ui-rangeslider-last" ).slider( "destroy" );
- }
-
- });
-
-$.widget( "mobile.rangeslider", $.mobile.rangeslider, $.mobile.behaviors.formReset );
-
-//auto self-init widgets
-$( document ).bind( "pagecreate create", function( e ) {
- $.mobile.rangeslider.prototype.enhanceWithin( e.target, true );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.widget( "mobile.selectmenu", $.mobile.widget, $.extend( {
- options: {
- theme: null,
- disabled: false,
- icon: "arrow-d",
- iconpos: "right",
- inline: false,
- corners: true,
- shadow: true,
- iconshadow: true,
- overlayTheme: "a",
- dividerTheme: "b",
- hidePlaceholderMenuItems: true,
- closeText: "Close",
- nativeMenu: true,
- // This option defaults to true on iOS devices.
- preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
- initSelector: "select:not( :jqmData(role='slider') )",
- mini: false
- },
-
- _button: function() {
- return $( "<div/>" );
- },
-
- _setDisabled: function( value ) {
- this.element.attr( "disabled", value );
- this.button.attr( "aria-disabled", value );
- return this._setOption( "disabled", value );
- },
-
- _focusButton : function() {
- var self = this;
-
- setTimeout( function() {
- self.button.focus();
- }, 40);
- },
-
- _selectOptions: function() {
- return this.select.find( "option" );
- },
-
- // setup items that are generally necessary for select menu extension
- _preExtension: function() {
- var classes = "";
- // TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
- /* if ( $el[0].className.length ) {
- classes = $el[0].className;
- } */
- if ( !!~this.element[0].className.indexOf( "ui-btn-left" ) ) {
- classes = " ui-btn-left";
- }
-
- if ( !!~this.element[0].className.indexOf( "ui-btn-right" ) ) {
- classes = " ui-btn-right";
- }
-
- this.select = this.element.removeClass( "ui-btn-left ui-btn-right" ).wrap( "<div class='ui-select" + classes + "'>" );
- this.selectID = this.select.attr( "id" );
- this.label = $( "label[for='"+ this.selectID +"']" ).addClass( "ui-select" );
- this.isMultiple = this.select[ 0 ].multiple;
- if ( !this.options.theme ) {
- this.options.theme = $.mobile.getInheritedTheme( this.select, "c" );
- }
- },
-
- _destroy: function() {
- var wrapper = this.element.parents( ".ui-select" );
- if ( wrapper.length > 0 ) {
- if ( wrapper.is( ".ui-btn-left, .ui-btn-right" ) ) {
- this.element.addClass( wrapper.is( ".ui-btn-left" ) ? "ui-btn-left" : "ui-btn-right" );
- }
- this.element.insertAfter( wrapper );
- wrapper.remove();
- }
- },
-
- _create: function() {
- this._preExtension();
-
- // Allows for extension of the native select for custom selects and other plugins
- // see select.custom for example extension
- // TODO explore plugin registration
- this._trigger( "beforeCreate" );
-
- this.button = this._button();
-
- var self = this,
-
- options = this.options,
-
- inline = options.inline || this.select.jqmData( "inline" ),
- mini = options.mini || this.select.jqmData( "mini" ),
- iconpos = options.icon ? ( options.iconpos || this.select.jqmData( "iconpos" ) ) : false,
-
- // IE throws an exception at options.item() function when
- // there is no selected item
- // select first in this case
- selectedIndex = this.select[ 0 ].selectedIndex === -1 ? 0 : this.select[ 0 ].selectedIndex,
-
- // TODO values buttonId and menuId are undefined here
- button = this.button
- .insertBefore( this.select )
- .buttonMarkup( {
- theme: options.theme,
- icon: options.icon,
- iconpos: iconpos,
- inline: inline,
- corners: options.corners,
- shadow: options.shadow,
- iconshadow: options.iconshadow,
- mini: mini
- });
-
- this.setButtonText();
-
- // Opera does not properly support opacity on select elements
- // In Mini, it hides the element, but not its text
- // On the desktop,it seems to do the opposite
- // for these reasons, using the nativeMenu option results in a full native select in Opera
- if ( options.nativeMenu && window.opera && window.opera.version ) {
- button.addClass( "ui-select-nativeonly" );
- }
-
- // Add counter for multi selects
- if ( this.isMultiple ) {
- this.buttonCount = $( "<span>" )
- .addClass( "ui-li-count ui-btn-up-c ui-btn-corner-all" )
- .hide()
- .appendTo( button.addClass('ui-li-has-count') );
- }
-
- // Disable if specified
- if ( options.disabled || this.element.attr('disabled')) {
- this.disable();
- }
-
- // Events on native select
- this.select.change(function() {
- self.refresh();
-
- if ( !!options.nativeMenu ) {
- this.blur();
- }
- });
-
- this._handleFormReset();
-
- this.build();
- },
-
- build: function() {
- var self = this;
-
- this.select
- .appendTo( self.button )
- .bind( "vmousedown", function() {
- // Add active class to button
- self.button.addClass( $.mobile.activeBtnClass );
- })
- .bind( "focus", function() {
- self.button.addClass( $.mobile.focusClass );
- })
- .bind( "blur", function() {
- self.button.removeClass( $.mobile.focusClass );
- })
- .bind( "focus vmouseover", function() {
- self.button.trigger( "vmouseover" );
- })
- .bind( "vmousemove", function() {
- // Remove active class on scroll/touchmove
- self.button.removeClass( $.mobile.activeBtnClass );
- })
- .bind( "change blur vmouseout", function() {
- self.button.trigger( "vmouseout" )
- .removeClass( $.mobile.activeBtnClass );
- })
- .bind( "change blur", function() {
- self.button.removeClass( "ui-btn-down-" + self.options.theme );
- });
-
- // In many situations, iOS will zoom into the select upon tap, this prevents that from happening
- self.button.bind( "vmousedown", function() {
- if ( self.options.preventFocusZoom ) {
- $.mobile.zoom.disable( true );
- }
- });
- self.label.bind( "click focus", function() {
- if ( self.options.preventFocusZoom ) {
- $.mobile.zoom.disable( true );
- }
- });
- self.select.bind( "focus", function() {
- if ( self.options.preventFocusZoom ) {
- $.mobile.zoom.disable( true );
- }
- });
- self.button.bind( "mouseup", function() {
- if ( self.options.preventFocusZoom ) {
- setTimeout(function() {
- $.mobile.zoom.enable( true );
- }, 0 );
- }
- });
- self.select.bind( "blur", function() {
- if ( self.options.preventFocusZoom ) {
- $.mobile.zoom.enable( true );
- }
- });
-
- },
-
- selected: function() {
- return this._selectOptions().filter( ":selected" );
- },
-
- selectedIndices: function() {
- var self = this;
-
- return this.selected().map(function() {
- return self._selectOptions().index( this );
- }).get();
- },
-
- setButtonText: function() {
- var self = this,
- selected = this.selected(),
- text = this.placeholder,
- span = $( document.createElement( "span" ) );
-
- this.button.find( ".ui-btn-text" ).html(function() {
- if ( selected.length ) {
- text = selected.map(function() {
- return $( this ).text();
- }).get().join( ", " );
- } else {
- text = self.placeholder;
- }
-
- // TODO possibly aggregate multiple select option classes
- return span.text( text )
- .addClass( self.select.attr( "class" ) )
- .addClass( selected.attr( "class" ) );
- });
- },
-
- setButtonCount: function() {
- var selected = this.selected();
-
- // multiple count inside button
- if ( this.isMultiple ) {
- this.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length );
- }
- },
-
- _reset: function() {
- this.refresh();
- },
-
- refresh: function() {
- this.setButtonText();
- this.setButtonCount();
- },
-
- // open and close preserved in native selects
- // to simplify users code when looping over selects
- open: $.noop,
- close: $.noop,
-
- disable: function() {
- this._setDisabled( true );
- this.button.addClass( "ui-disabled" );
- },
-
- enable: function() {
- this._setDisabled( false );
- this.button.removeClass( "ui-disabled" );
- }
-}, $.mobile.behaviors.formReset ) );
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.selectmenu.prototype.enhanceWithin( e.target, true );
-});
-})( jQuery );
-
-(function( $, undefined ) {
-
- function fitSegmentInsideSegment( winSize, segSize, offset, desired ) {
- var ret = desired;
-
- if ( winSize < segSize ) {
- // Center segment if it's bigger than the window
- ret = offset + ( winSize - segSize ) / 2;
- } else {
- // Otherwise center it at the desired coordinate while keeping it completely inside the window
- ret = Math.min( Math.max( offset, desired - segSize / 2 ), offset + winSize - segSize );
- }
-
- return ret;
- }
-
- function windowCoords() {
- var $win = $.mobile.window;
-
- return {
- x: $win.scrollLeft(),
- y: $win.scrollTop(),
- cx: ( window.innerWidth || $win.width() ),
- cy: ( window.innerHeight || $win.height() )
- };
- }
-
- $.widget( "mobile.popup", $.mobile.widget, {
- options: {
- theme: null,
- overlayTheme: null,
- shadow: true,
- corners: true,
- transition: "none",
- positionTo: "origin",
- tolerance: null,
- initSelector: ":jqmData(role='popup')",
- closeLinkSelector: "a:jqmData(rel='back')",
- closeLinkEvents: "click.popup",
- navigateEvents: "navigate.popup",
- closeEvents: "navigate.popup pagebeforechange.popup",
- dismissible: true,
-
- // NOTE Windows Phone 7 has a scroll position caching issue that
- // requires us to disable popup history management by default
- // https://github.com/jquery/jquery-mobile/issues/4784
- //
- // NOTE this option is modified in _create!
- history: !$.mobile.browser.oldIE
- },
-
- _eatEventAndClose: function( e ) {
- e.preventDefault();
- e.stopImmediatePropagation();
- if ( this.options.dismissible ) {
- this.close();
- }
- return false;
- },
-
- // Make sure the screen size is increased beyond the page height if the popup's causes the document to increase in height
- _resizeScreen: function() {
- var popupHeight = this._ui.container.outerHeight( true );
-
- this._ui.screen.removeAttr( "style" );
- if ( popupHeight > this._ui.screen.height() ) {
- this._ui.screen.height( popupHeight );
- }
- },
-
- _handleWindowKeyUp: function( e ) {
- if ( this._isOpen && e.keyCode === $.mobile.keyCode.ESCAPE ) {
- return this._eatEventAndClose( e );
- }
- },
-
- _expectResizeEvent: function() {
- var winCoords = windowCoords();
-
- if ( this._resizeData ) {
- if ( winCoords.x === this._resizeData.winCoords.x &&
- winCoords.y === this._resizeData.winCoords.y &&
- winCoords.cx === this._resizeData.winCoords.cx &&
- winCoords.cy === this._resizeData.winCoords.cy ) {
- // timeout not refreshed
- return false;
- } else {
- // clear existing timeout - it will be refreshed below
- clearTimeout( this._resizeData.timeoutId );
- }
- }
-
- this._resizeData = {
- timeoutId: setTimeout( $.proxy( this, "_resizeTimeout" ), 200 ),
- winCoords: winCoords
- };
-
- return true;
- },
-
- _resizeTimeout: function() {
- if ( this._isOpen ) {
- if ( !this._expectResizeEvent() ) {
- if ( this._ui.container.hasClass( "ui-popup-hidden" ) ) {
- // effectively rapid-open the popup while leaving the screen intact
- this._ui.container.removeClass( "ui-popup-hidden" );
- this.reposition( { positionTo: "window" } );
- this._ignoreResizeEvents();
- }
-
- this._resizeScreen();
- this._resizeData = null;
- this._orientationchangeInProgress = false;
- }
- } else {
- this._resizeData = null;
- this._orientationchangeInProgress = false;
- }
- },
-
- _ignoreResizeEvents: function() {
- var self = this;
-
- if ( this._ignoreResizeTo ) {
- clearTimeout( this._ignoreResizeTo );
- }
- this._ignoreResizeTo = setTimeout( function() { self._ignoreResizeTo = 0; }, 1000 );
- },
-
- _handleWindowResize: function( e ) {
- if ( this._isOpen && this._ignoreResizeTo === 0 ) {
- if ( ( this._expectResizeEvent() || this._orientationchangeInProgress ) &&
- !this._ui.container.hasClass( "ui-popup-hidden" ) ) {
- // effectively rapid-close the popup while leaving the screen intact
- this._ui.container
- .addClass( "ui-popup-hidden" )
- .removeAttr( "style" );
- }
- }
- },
-
- _handleWindowOrientationchange: function( e ) {
- if ( !this._orientationchangeInProgress && this._isOpen && this._ignoreResizeTo === 0 ) {
- this._expectResizeEvent();
- this._orientationchangeInProgress = true;
- }
- },
-
- // When the popup is open, attempting to focus on an element that is not a
- // child of the popup will redirect focus to the popup
- _handleDocumentFocusIn: function( e ) {
- var tgt = e.target, $tgt, ui = this._ui;
-
- if ( !this._isOpen ) {
- return;
- }
-
- if ( tgt !== ui.container[ 0 ] ) {
- $tgt = $( e.target );
- if ( 0 === $tgt.parents().filter( ui.container[ 0 ] ).length ) {
- $( document.activeElement ).one( "focus", function( e ) {
- $tgt.blur();
- });
- ui.focusElement.focus();
- e.preventDefault();
- e.stopImmediatePropagation();
- return false;
- } else if ( ui.focusElement[ 0 ] === ui.container[ 0 ] ) {
- ui.focusElement = $tgt;
- }
- }
-
- this._ignoreResizeEvents();
- },
-
- _create: function() {
- var ui = {
- screen: $( "<div class='ui-screen-hidden ui-popup-screen'></div>" ),
- placeholder: $( "<div style='display: none;'><!-- placeholder --></div>" ),
- container: $( "<div class='ui-popup-container ui-popup-hidden'></div>" )
- },
- thisPage = this.element.closest( ".ui-page" ),
- myId = this.element.attr( "id" ),
- self = this;
-
- // We need to adjust the history option to be false if there's no AJAX nav.
- // We can't do it in the option declarations because those are run before
- // it is determined whether there shall be AJAX nav.
- this.options.history = this.options.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled;
-
- if ( thisPage.length === 0 ) {
- thisPage = $( "body" );
- }
-
- // define the container for navigation event bindings
- // TODO this would be nice at the the mobile widget level
- this.options.container = this.options.container || $.mobile.pageContainer;
-
- // Apply the proto
- thisPage.append( ui.screen );
- ui.container.insertAfter( ui.screen );
- // Leave a placeholder where the element used to be
- ui.placeholder.insertAfter( this.element );
- if ( myId ) {
- ui.screen.attr( "id", myId + "-screen" );
- ui.container.attr( "id", myId + "-popup" );
- ui.placeholder.html( "<!-- placeholder for " + myId + " -->" );
- }
- ui.container.append( this.element );
- ui.focusElement = ui.container;
-
- // Add class to popup element
- this.element.addClass( "ui-popup" );
-
- // Define instance variables
- $.extend( this, {
- _scrollTop: 0,
- _page: thisPage,
- _ui: ui,
- _fallbackTransition: "",
- _currentTransition: false,
- _prereqs: null,
- _isOpen: false,
- _tolerance: null,
- _resizeData: null,
- _ignoreResizeTo: 0,
- _orientationchangeInProgress: false
- });
-
- $.each( this.options, function( key, value ) {
- // Cause initial options to be applied by their handler by temporarily setting the option to undefined
- // - the handler then sets it to the initial value
- self.options[ key ] = undefined;
- self._setOption( key, value, true );
- });
-
- ui.screen.bind( "vclick", $.proxy( this, "_eatEventAndClose" ) );
-
- this._on( $.mobile.window, {
- orientationchange: $.proxy( this, "_handleWindowOrientationchange" ),
- resize: $.proxy( this, "_handleWindowResize" ),
- keyup: $.proxy( this, "_handleWindowKeyUp" )
- });
- this._on( $.mobile.document, {
- focusin: $.proxy( this, "_handleDocumentFocusIn" )
- });
- },
-
- _applyTheme: function( dst, theme, prefix ) {
- var classes = ( dst.attr( "class" ) || "").split( " " ),
- alreadyAdded = true,
- currentTheme = null,
- matches,
- themeStr = String( theme );
-
- while ( classes.length > 0 ) {
- currentTheme = classes.pop();
- matches = ( new RegExp( "^ui-" + prefix + "-([a-z])$" ) ).exec( currentTheme );
- if ( matches && matches.length > 1 ) {
- currentTheme = matches[ 1 ];
- break;
- } else {
- currentTheme = null;
- }
- }
-
- if ( theme !== currentTheme ) {
- dst.removeClass( "ui-" + prefix + "-" + currentTheme );
- if ( ! ( theme === null || theme === "none" ) ) {
- dst.addClass( "ui-" + prefix + "-" + themeStr );
- }
- }
- },
-
- _setTheme: function( value ) {
- this._applyTheme( this.element, value, "body" );
- },
-
- _setOverlayTheme: function( value ) {
- this._applyTheme( this._ui.screen, value, "overlay" );
-
- if ( this._isOpen ) {
- this._ui.screen.addClass( "in" );
- }
- },
-
- _setShadow: function( value ) {
- this.element.toggleClass( "ui-overlay-shadow", value );
- },
-
- _setCorners: function( value ) {
- this.element.toggleClass( "ui-corner-all", value );
- },
-
- _applyTransition: function( value ) {
- this._ui.container.removeClass( this._fallbackTransition );
- if ( value && value !== "none" ) {
- this._fallbackTransition = $.mobile._maybeDegradeTransition( value );
- if ( this._fallbackTransition === "none" ) {
- this._fallbackTransition = "";
- }
- this._ui.container.addClass( this._fallbackTransition );
- }
- },
-
- _setTransition: function( value ) {
- if ( !this._currentTransition ) {
- this._applyTransition( value );
- }
- },
-
- _setTolerance: function( value ) {
- var tol = { t: 30, r: 15, b: 30, l: 15 };
-
- if ( value !== undefined ) {
- var ar = String( value ).split( "," );
-
- $.each( ar, function( idx, val ) { ar[ idx ] = parseInt( val, 10 ); } );
-
- switch( ar.length ) {
- // All values are to be the same
- case 1:
- if ( !isNaN( ar[ 0 ] ) ) {
- tol.t = tol.r = tol.b = tol.l = ar[ 0 ];
- }
- break;
-
- // The first value denotes top/bottom tolerance, and the second value denotes left/right tolerance
- case 2:
- if ( !isNaN( ar[ 0 ] ) ) {
- tol.t = tol.b = ar[ 0 ];
- }
- if ( !isNaN( ar[ 1 ] ) ) {
- tol.l = tol.r = ar[ 1 ];
- }
- break;
-
- // The array contains values in the order top, right, bottom, left
- case 4:
- if ( !isNaN( ar[ 0 ] ) ) {
- tol.t = ar[ 0 ];
- }
- if ( !isNaN( ar[ 1 ] ) ) {
- tol.r = ar[ 1 ];
- }
- if ( !isNaN( ar[ 2 ] ) ) {
- tol.b = ar[ 2 ];
- }
- if ( !isNaN( ar[ 3 ] ) ) {
- tol.l = ar[ 3 ];
- }
- break;
-
- default:
- break;
- }
- }
-
- this._tolerance = tol;
- },
-
- _setOption: function( key, value ) {
- var exclusions, setter = "_set" + key.charAt( 0 ).toUpperCase() + key.slice( 1 );
-
- if ( this[ setter ] !== undefined ) {
- this[ setter ]( value );
- }
-
- // TODO REMOVE FOR 1.2.1 by moving them out to a default options object
- exclusions = [
- "initSelector",
- "closeLinkSelector",
- "closeLinkEvents",
- "navigateEvents",
- "closeEvents",
- "history",
- "container"
- ];
-
- $.mobile.widget.prototype._setOption.apply( this, arguments );
- if ( $.inArray( key, exclusions ) === -1 ) {
- // Record the option change in the options and in the DOM data-* attributes
- this.element.attr( "data-" + ( $.mobile.ns || "" ) + ( key.replace( /([A-Z])/, "-$1" ).toLowerCase() ), value );
- }
- },
-
- // Try and center the overlay over the given coordinates
- _placementCoords: function( desired ) {
- // rectangle within which the popup must fit
- var
- winCoords = windowCoords(),
- rc = {
- x: this._tolerance.l,
- y: winCoords.y + this._tolerance.t,
- cx: winCoords.cx - this._tolerance.l - this._tolerance.r,
- cy: winCoords.cy - this._tolerance.t - this._tolerance.b
- },
- menuSize, ret;
-
- // Clamp the width of the menu before grabbing its size
- this._ui.container.css( "max-width", rc.cx );
- menuSize = {
- cx: this._ui.container.outerWidth( true ),
- cy: this._ui.container.outerHeight( true )
- };
-
- // Center the menu over the desired coordinates, while not going outside
- // the window tolerances. This will center wrt. the window if the popup is too large.
- ret = {
- x: fitSegmentInsideSegment( rc.cx, menuSize.cx, rc.x, desired.x ),
- y: fitSegmentInsideSegment( rc.cy, menuSize.cy, rc.y, desired.y )
- };
-
- // Make sure the top of the menu is visible
- ret.y = Math.max( 0, ret.y );
-
- // If the height of the menu is smaller than the height of the document
- // align the bottom with the bottom of the document
-
- // fix for $.mobile.document.height() bug in core 1.7.2.
- var docEl = document.documentElement, docBody = document.body,
- docHeight = Math.max( docEl.clientHeight, docBody.scrollHeight, docBody.offsetHeight, docEl.scrollHeight, docEl.offsetHeight );
-
- ret.y -= Math.min( ret.y, Math.max( 0, ret.y + menuSize.cy - docHeight ) );
-
- return { left: ret.x, top: ret.y };
- },
-
- _createPrereqs: function( screenPrereq, containerPrereq, whenDone ) {
- var self = this, prereqs;
-
- // It is important to maintain both the local variable prereqs and self._prereqs. The local variable remains in
- // the closure of the functions which call the callbacks passed in. The comparison between the local variable and
- // self._prereqs is necessary, because once a function has been passed to .animationComplete() it will be called
- // next time an animation completes, even if that's not the animation whose end the function was supposed to catch
- // (for example, if an abort happens during the opening animation, the .animationComplete handler is not called for
- // that animation anymore, but the handler remains attached, so it is called the next time the popup is opened
- // - making it stale. Comparing the local variable prereqs to the widget-level variable self._prereqs ensures that
- // callbacks triggered by a stale .animationComplete will be ignored.
-
- prereqs = {
- screen: $.Deferred(),
- container: $.Deferred()
- };
-
- prereqs.screen.then( function() {
- if ( prereqs === self._prereqs ) {
- screenPrereq();
- }
- });
-
- prereqs.container.then( function() {
- if ( prereqs === self._prereqs ) {
- containerPrereq();
- }
- });
-
- $.when( prereqs.screen, prereqs.container ).done( function() {
- if ( prereqs === self._prereqs ) {
- self._prereqs = null;
- whenDone();
- }
- });
-
- self._prereqs = prereqs;
- },
-
- _animate: function( args ) {
- // NOTE before removing the default animation of the screen
- // this had an animate callback that would resolve the deferred
- // now the deferred is resolved immediately
- // TODO remove the dependency on the screen deferred
- this._ui.screen
- .removeClass( args.classToRemove )
- .addClass( args.screenClassToAdd );
-
- args.prereqs.screen.resolve();
-
- if ( args.transition && args.transition !== "none" ) {
- if ( args.applyTransition ) {
- this._applyTransition( args.transition );
- }
- if ( this._fallbackTransition ) {
- this._ui.container
- .animationComplete( $.proxy( args.prereqs.container, "resolve" ) )
- .addClass( args.containerClassToAdd )
- .removeClass( args.classToRemove );
- return;
- }
- }
- this._ui.container.removeClass( args.classToRemove );
- args.prereqs.container.resolve();
- },
-
- // The desired coordinates passed in will be returned untouched if no reference element can be identified via
- // desiredPosition.positionTo. Nevertheless, this function ensures that its return value always contains valid
- // x and y coordinates by specifying the center middle of the window if the coordinates are absent.
- // options: { x: coordinate, y: coordinate, positionTo: string: "origin", "window", or jQuery selector
- _desiredCoords: function( o ) {
- var dst = null, offset, winCoords = windowCoords(), x = o.x, y = o.y, pTo = o.positionTo;
-
- // Establish which element will serve as the reference
- if ( pTo && pTo !== "origin" ) {
- if ( pTo === "window" ) {
- x = winCoords.cx / 2 + winCoords.x;
- y = winCoords.cy / 2 + winCoords.y;
- } else {
- try {
- dst = $( pTo );
- } catch( e ) {
- dst = null;
- }
- if ( dst ) {
- dst.filter( ":visible" );
- if ( dst.length === 0 ) {
- dst = null;
- }
- }
- }
- }
-
- // If an element was found, center over it
- if ( dst ) {
- offset = dst.offset();
- x = offset.left + dst.outerWidth() / 2;
- y = offset.top + dst.outerHeight() / 2;
- }
-
- // Make sure x and y are valid numbers - center over the window
- if ( $.type( x ) !== "number" || isNaN( x ) ) {
- x = winCoords.cx / 2 + winCoords.x;
- }
- if ( $.type( y ) !== "number" || isNaN( y ) ) {
- y = winCoords.cy / 2 + winCoords.y;
- }
-
- return { x: x, y: y };
- },
-
- _reposition: function( o ) {
- // We only care about position-related parameters for repositioning
- o = { x: o.x, y: o.y, positionTo: o.positionTo };
- this._trigger( "beforeposition", o );
- this._ui.container.offset( this._placementCoords( this._desiredCoords( o ) ) );
- },
-
- reposition: function( o ) {
- if ( this._isOpen ) {
- this._reposition( o );
- }
- },
-
- _openPrereqsComplete: function() {
- this._ui.container.addClass( "ui-popup-active" );
- this._isOpen = true;
- this._resizeScreen();
- this._ui.container.attr( "tabindex", "0" ).focus();
- this._ignoreResizeEvents();
- this._trigger( "afteropen" );
- },
-
- _open: function( options ) {
- var o = $.extend( {}, this.options, options ),
- // TODO move blacklist to private method
- androidBlacklist = ( function() {
- var w = window,
- ua = navigator.userAgent,
- // Rendering engine is Webkit, and capture major version
- wkmatch = ua.match( /AppleWebKit\/([0-9\.]+)/ ),
- wkversion = !!wkmatch && wkmatch[ 1 ],
- androidmatch = ua.match( /Android (\d+(?:\.\d+))/ ),
- andversion = !!androidmatch && androidmatch[ 1 ],
- chromematch = ua.indexOf( "Chrome" ) > -1;
-
- // Platform is Android, WebKit version is greater than 534.13 ( Android 3.2.1 ) and not Chrome.
- if( androidmatch !== null && andversion === "4.0" && wkversion && wkversion > 534.13 && !chromematch ) {
- return true;
- }
- return false;
- }());
-
- // Count down to triggering "popupafteropen" - we have two prerequisites:
- // 1. The popup window animation completes (container())
- // 2. The screen opacity animation completes (screen())
- this._createPrereqs(
- $.noop,
- $.noop,
- $.proxy( this, "_openPrereqsComplete" ) );
-
- this._currentTransition = o.transition;
- this._applyTransition( o.transition );
-
- if ( !this.options.theme ) {
- this._setTheme( this._page.jqmData( "theme" ) || $.mobile.getInheritedTheme( this._page, "c" ) );
- }
-
- this._ui.screen.removeClass( "ui-screen-hidden" );
- this._ui.container.removeClass( "ui-popup-hidden" );
-
- // Give applications a chance to modify the contents of the container before it appears
- this._reposition( o );
-
- if ( this.options.overlayTheme && androidBlacklist ) {
- /* TODO:
- The native browser on Android 4.0.X ("Ice Cream Sandwich") suffers from an issue where the popup overlay appears to be z-indexed
- above the popup itself when certain other styles exist on the same page -- namely, any element set to `position: fixed` and certain
- types of input. These issues are reminiscent of previously uncovered bugs in older versions of Android's native browser:
- https://github.com/scottjehl/Device-Bugs/issues/3
-
- This fix closes the following bugs ( I use "closes" with reluctance, and stress that this issue should be revisited as soon as possible ):
-
- https://github.com/jquery/jquery-mobile/issues/4816
- https://github.com/jquery/jquery-mobile/issues/4844
- https://github.com/jquery/jquery-mobile/issues/4874
- */
-
- // TODO sort out why this._page isn't working
- this.element.closest( ".ui-page" ).addClass( "ui-popup-open" );
- }
- this._animate({
- additionalCondition: true,
- transition: o.transition,
- classToRemove: "",
- screenClassToAdd: "in",
- containerClassToAdd: "in",
- applyTransition: false,
- prereqs: this._prereqs
- });
- },
-
- _closePrereqScreen: function() {
- this._ui.screen
- .removeClass( "out" )
- .addClass( "ui-screen-hidden" );
- },
-
- _closePrereqContainer: function() {
- this._ui.container
- .removeClass( "reverse out" )
- .addClass( "ui-popup-hidden" )
- .removeAttr( "style" );
- },
-
- _closePrereqsDone: function() {
- var opts = this.options;
-
- this._ui.container.removeAttr( "tabindex" );
-
- // remove the global mutex for popups
- $.mobile.popup.active = undefined;
-
- // alert users that the popup is closed
- this._trigger( "afterclose" );
- },
-
- _close: function( immediate ) {
- this._ui.container.removeClass( "ui-popup-active" );
- this._page.removeClass( "ui-popup-open" );
-
- this._isOpen = false;
-
- // Count down to triggering "popupafterclose" - we have two prerequisites:
- // 1. The popup window reverse animation completes (container())
- // 2. The screen opacity animation completes (screen())
- this._createPrereqs(
- $.proxy( this, "_closePrereqScreen" ),
- $.proxy( this, "_closePrereqContainer" ),
- $.proxy( this, "_closePrereqsDone" ) );
-
- this._animate( {
- additionalCondition: this._ui.screen.hasClass( "in" ),
- transition: ( immediate ? "none" : ( this._currentTransition ) ),
- classToRemove: "in",
- screenClassToAdd: "out",
- containerClassToAdd: "reverse out",
- applyTransition: true,
- prereqs: this._prereqs
- });
- },
-
- _unenhance: function() {
- // Put the element back to where the placeholder was and remove the "ui-popup" class
- this._setTheme( "none" );
- this.element
- // Cannot directly insertAfter() - we need to detach() first, because
- // insertAfter() will do nothing if the payload div was not attached
- // to the DOM at the time the widget was created, and so the payload
- // will remain inside the container even after we call insertAfter().
- // If that happens and we remove the container a few lines below, we
- // will cause an infinite recursion - #5244
- .detach()
- .insertAfter( this._ui.placeholder )
- .removeClass( "ui-popup ui-overlay-shadow ui-corner-all" );
- this._ui.screen.remove();
- this._ui.container.remove();
- this._ui.placeholder.remove();
- },
-
- _destroy: function() {
- if ( $.mobile.popup.active === this ) {
- this.element.one( "popupafterclose", $.proxy( this, "_unenhance" ) );
- this.close();
- } else {
- this._unenhance();
- }
- },
-
- _closePopup: function( e, data ) {
- var parsedDst, toUrl, o = this.options, immediate = false;
-
- // restore location on screen
- window.scrollTo( 0, this._scrollTop );
-
- if ( e && e.type === "pagebeforechange" && data ) {
- // Determine whether we need to rapid-close the popup, or whether we can
- // take the time to run the closing transition
- if ( typeof data.toPage === "string" ) {
- parsedDst = data.toPage;
- } else {
- parsedDst = data.toPage.jqmData( "url" );
- }
- parsedDst = $.mobile.path.parseUrl( parsedDst );
- toUrl = parsedDst.pathname + parsedDst.search + parsedDst.hash;
-
- if ( this._myUrl !== $.mobile.path.makeUrlAbsolute( toUrl ) ) {
- // Going to a different page - close immediately
- immediate = true;
- } else {
- e.preventDefault();
- }
- }
-
- // remove nav bindings
- o.container.unbind( o.closeEvents );
- // unbind click handlers added when history is disabled
- this.element.undelegate( o.closeLinkSelector, o.closeLinkEvents );
-
- this._close( immediate );
- },
-
- // any navigation event after a popup is opened should close the popup
- // NOTE the pagebeforechange is bound to catch navigation events that don't
- // alter the url (eg, dialogs from popups)
- _bindContainerClose: function() {
- this.options.container
- .one( this.options.closeEvents, $.proxy( this, "_closePopup" ) );
- },
-
- // TODO no clear deliniation of what should be here and
- // what should be in _open. Seems to be "visual" vs "history" for now
- open: function( options ) {
- var self = this, opts = this.options, url, hashkey, activePage, currentIsDialog, hasHash, urlHistory;
-
- // make sure open is idempotent
- if( $.mobile.popup.active ) {
- return;
- }
-
- // set the global popup mutex
- $.mobile.popup.active = this;
- this._scrollTop = $.mobile.window.scrollTop();
-
- // if history alteration is disabled close on navigate events
- // and leave the url as is
- if( !( opts.history ) ) {
- self._open( options );
- self._bindContainerClose();
-
- // When histoy is disabled we have to grab the data-rel
- // back link clicks so we can close the popup instead of
- // relying on history to do it for us
- self.element
- .delegate( opts.closeLinkSelector, opts.closeLinkEvents, function( e ) {
- self.close();
- e.preventDefault();
- });
-
- return;
- }
-
- // cache some values for min/readability
- urlHistory = $.mobile.urlHistory;
- hashkey = $.mobile.dialogHashKey;
- activePage = $.mobile.activePage;
- currentIsDialog = activePage.is( ".ui-dialog" );
- this._myUrl = url = urlHistory.getActive().url;
- hasHash = ( url.indexOf( hashkey ) > -1 ) && !currentIsDialog && ( urlHistory.activeIndex > 0 );
-
- if ( hasHash ) {
- self._open( options );
- self._bindContainerClose();
- return;
- }
-
- // if the current url has no dialog hash key proceed as normal
- // otherwise, if the page is a dialog simply tack on the hash key
- if ( url.indexOf( hashkey ) === -1 && !currentIsDialog ){
- url = url + (url.indexOf( "#" ) > -1 ? hashkey : "#" + hashkey);
- } else {
- url = $.mobile.path.parseLocation().hash + hashkey;
- }
-
- // Tack on an extra hashkey if this is the first page and we've just reconstructed the initial hash
- if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
- url += hashkey;
- }
-
- // swallow the the initial navigation event, and bind for the next
- $(window).one( "beforenavigate", function( e ) {
- e.preventDefault();
- self._open( options );
- self._bindContainerClose();
- });
-
- this.urlAltered = true;
- $.mobile.navigate( url, {role: "dialog"} );
- },
-
- close: function() {
- // make sure close is idempotent
- if( $.mobile.popup.active !== this ) {
- return;
- }
-
- this._scrollTop = $.mobile.window.scrollTop();
-
- if( this.options.history && this.urlAltered ) {
- $.mobile.back();
- this.urlAltered = false;
- } else {
- // simulate the nav bindings having fired
- this._closePopup();
- }
- }
- });
-
-
- // TODO this can be moved inside the widget
- $.mobile.popup.handleLink = function( $link ) {
- var closestPage = $link.closest( ":jqmData(role='page')" ),
- scope = ( ( closestPage.length === 0 ) ? $( "body" ) : closestPage ),
- // NOTE make sure to get only the hash, ie7 (wp7) return the absolute href
- // in this case ruining the element selection
- popup = $( $.mobile.path.parseUrl($link.attr( "href" )).hash, scope[0] ),
- offset;
-
- if ( popup.data( "mobile-popup" ) ) {
- offset = $link.offset();
- popup.popup( "open", {
- x: offset.left + $link.outerWidth() / 2,
- y: offset.top + $link.outerHeight() / 2,
- transition: $link.jqmData( "transition" ),
- positionTo: $link.jqmData( "position-to" )
- });
- }
-
- //remove after delay
- setTimeout( function() {
- // Check if we are in a listview
- var $parent = $link.parent().parent();
- if ($parent.hasClass("ui-li")) {
- $link = $parent.parent();
- }
- $link.removeClass( $.mobile.activeBtnClass );
- }, 300 );
- };
-
- // TODO move inside _create
- $.mobile.document.bind( "pagebeforechange", function( e, data ) {
- if ( data.options.role === "popup" ) {
- $.mobile.popup.handleLink( data.options.link );
- e.preventDefault();
- }
- });
-
- $.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.popup.prototype.enhanceWithin( e.target, true );
- });
-
-})( jQuery );
-
-/*
-* custom "selectmenu" plugin
-*/
-
-(function( $, undefined ) {
- var extendSelect = function( widget ) {
-
- var select = widget.select,
- origDestroy = widget._destroy,
- selectID = widget.selectID,
- prefix = ( selectID ? selectID : ( ( $.mobile.ns || "" ) + "uuid-" + widget.uuid ) ),
- popupID = prefix + "-listbox",
- dialogID = prefix + "-dialog",
- label = widget.label,
- thisPage = widget.select.closest( ".ui-page" ),
- selectOptions = widget._selectOptions(),
- isMultiple = widget.isMultiple = widget.select[ 0 ].multiple,
- buttonId = selectID + "-button",
- menuId = selectID + "-menu",
- menuPage = $( "<div data-" + $.mobile.ns + "role='dialog' id='" + dialogID + "' data-" +$.mobile.ns + "theme='"+ widget.options.theme +"' data-" +$.mobile.ns + "overlay-theme='"+ widget.options.overlayTheme +"'>" +
- "<div data-" + $.mobile.ns + "role='header'>" +
- "<div class='ui-title'>" + label.getEncodedText() + "</div>"+
- "</div>"+
- "<div data-" + $.mobile.ns + "role='content'></div>"+
- "</div>" ),
-
- listbox = $( "<div id='" + popupID + "' class='ui-selectmenu'>" ).insertAfter( widget.select ).popup( { theme: widget.options.overlayTheme } ),
-
- list = $( "<ul>", {
- "class": "ui-selectmenu-list",
- "id": menuId,
- "role": "listbox",
- "aria-labelledby": buttonId
- }).attr( "data-" + $.mobile.ns + "theme", widget.options.theme )
- .attr( "data-" + $.mobile.ns + "divider-theme", widget.options.dividerTheme )
- .appendTo( listbox ),
-
-
- header = $( "<div>", {
- "class": "ui-header ui-bar-" + widget.options.theme
- }).prependTo( listbox ),
-
- headerTitle = $( "<h1>", {
- "class": "ui-title"
- }).appendTo( header ),
-
- menuPageContent,
- menuPageClose,
- headerClose;
-
- if ( widget.isMultiple ) {
- headerClose = $( "<a>", {
- "text": widget.options.closeText,
- "href": "#",
- "class": "ui-btn-left"
- }).attr( "data-" + $.mobile.ns + "iconpos", "notext" ).attr( "data-" + $.mobile.ns + "icon", "delete" ).appendTo( header ).buttonMarkup();
- }
-
- $.extend( widget, {
- select: widget.select,
- selectID: selectID,
- buttonId: buttonId,
- menuId: menuId,
- popupID: popupID,
- dialogID: dialogID,
- thisPage: thisPage,
- menuPage: menuPage,
- label: label,
- selectOptions: selectOptions,
- isMultiple: isMultiple,
- theme: widget.options.theme,
- listbox: listbox,
- list: list,
- header: header,
- headerTitle: headerTitle,
- headerClose: headerClose,
- menuPageContent: menuPageContent,
- menuPageClose: menuPageClose,
- placeholder: "",
-
- build: function() {
- var self = this;
-
- // Create list from select, update state
- self.refresh();
-
- if ( self._origTabIndex === undefined ) {
- // Map undefined to false, because self._origTabIndex === undefined
- // indicates that we have not yet checked whether the select has
- // originally had a tabindex attribute, whereas false indicates that
- // we have checked the select for such an attribute, and have found
- // none present.
- self._origTabIndex = ( self.select[ 0 ].getAttribute( "tabindex" ) === null ) ? false : self.select.attr( "tabindex" );
- }
- self.select.attr( "tabindex", "-1" ).focus(function() {
- $( this ).blur();
- self.button.focus();
- });
-
- // Button events
- self.button.bind( "vclick keydown" , function( event ) {
- if ( self.options.disabled || self.isOpen ) {
- return;
- }
-
- if (event.type === "vclick" ||
- event.keyCode && (event.keyCode === $.mobile.keyCode.ENTER ||
- event.keyCode === $.mobile.keyCode.SPACE)) {
-
- self._decideFormat();
- if ( self.menuType === "overlay" ) {
- self.button.attr( "href", "#" + self.popupID ).attr( "data-" + ( $.mobile.ns || "" ) + "rel", "popup" );
- } else {
- self.button.attr( "href", "#" + self.dialogID ).attr( "data-" + ( $.mobile.ns || "" ) + "rel", "dialog" );
- }
- self.isOpen = true;
- // Do not prevent default, so the navigation may have a chance to actually open the chosen format
- }
- });
-
- // Events for list items
- self.list.attr( "role", "listbox" )
- .bind( "focusin", function( e ) {
- $( e.target )
- .attr( "tabindex", "0" )
- .trigger( "vmouseover" );
-
- })
- .bind( "focusout", function( e ) {
- $( e.target )
- .attr( "tabindex", "-1" )
- .trigger( "vmouseout" );
- })
- .delegate( "li:not(.ui-disabled, .ui-li-divider)", "click", function( event ) {
-
- // index of option tag to be selected
- var oldIndex = self.select[ 0 ].selectedIndex,
- newIndex = self.list.find( "li:not(.ui-li-divider)" ).index( this ),
- option = self._selectOptions().eq( newIndex )[ 0 ];
-
- // toggle selected status on the tag for multi selects
- option.selected = self.isMultiple ? !option.selected : true;
-
- // toggle checkbox class for multiple selects
- if ( self.isMultiple ) {
- $( this ).find( ".ui-icon" )
- .toggleClass( "ui-icon-checkbox-on", option.selected )
- .toggleClass( "ui-icon-checkbox-off", !option.selected );
- }
-
- // trigger change if value changed
- if ( self.isMultiple || oldIndex !== newIndex ) {
- self.select.trigger( "change" );
- }
-
- // hide custom select for single selects only - otherwise focus clicked item
- // We need to grab the clicked item the hard way, because the list may have been rebuilt
- if ( self.isMultiple ) {
- self.list.find( "li:not(.ui-li-divider)" ).eq( newIndex )
- .addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
- }
- else {
- self.close();
- }
-
- event.preventDefault();
- })
- .keydown(function( event ) { //keyboard events for menu items
- var target = $( event.target ),
- li = target.closest( "li" ),
- prev, next;
-
- // switch logic based on which key was pressed
- switch ( event.keyCode ) {
- // up or left arrow keys
- case 38:
- prev = li.prev().not( ".ui-selectmenu-placeholder" );
-
- if ( prev.is( ".ui-li-divider" ) ) {
- prev = prev.prev();
- }
-
- // if there's a previous option, focus it
- if ( prev.length ) {
- target
- .blur()
- .attr( "tabindex", "-1" );
-
- prev.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
- }
-
- return false;
- // down or right arrow keys
- case 40:
- next = li.next();
-
- if ( next.is( ".ui-li-divider" ) ) {
- next = next.next();
- }
-
- // if there's a next option, focus it
- if ( next.length ) {
- target
- .blur()
- .attr( "tabindex", "-1" );
-
- next.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
- }
-
- return false;
- // If enter or space is pressed, trigger click
- case 13:
- case 32:
- target.trigger( "click" );
-
- return false;
- }
- });
-
- // button refocus ensures proper height calculation
- // by removing the inline style and ensuring page inclusion
- self.menuPage.bind( "pagehide", function() {
- // TODO centralize page removal binding / handling in the page plugin.
- // Suggestion from @jblas to do refcounting
- //
- // TODO extremely confusing dependency on the open method where the pagehide.remove
- // bindings are stripped to prevent the parent page from disappearing. The way
- // we're keeping pages in the DOM right now sucks
- //
- // rebind the page remove that was unbound in the open function
- // to allow for the parent page removal from actions other than the use
- // of a dialog sized custom select
- //
- // doing this here provides for the back button on the custom select dialog
- $.mobile._bindPageRemove.call( self.thisPage );
- });
-
- // Events on the popup
- self.listbox.bind( "popupafterclose", function( event ) {
- self.close();
- });
-
- // Close button on small overlays
- if ( self.isMultiple ) {
- self.headerClose.click(function() {
- if ( self.menuType === "overlay" ) {
- self.close();
- return false;
- }
- });
- }
-
- // track this dependency so that when the parent page
- // is removed on pagehide it will also remove the menupage
- self.thisPage.addDependents( this.menuPage );
- },
-
- _isRebuildRequired: function() {
- var list = this.list.find( "li" ),
- options = this._selectOptions();
-
- // TODO exceedingly naive method to determine difference
- // ignores value changes etc in favor of a forcedRebuild
- // from the user in the refresh method
- return options.text() !== list.text();
- },
-
- selected: function() {
- return this._selectOptions().filter( ":selected:not( :jqmData(placeholder='true') )" );
- },
-
- refresh: function( forceRebuild , foo ) {
- var self = this,
- select = this.element,
- isMultiple = this.isMultiple,
- indicies;
-
- if ( forceRebuild || this._isRebuildRequired() ) {
- self._buildList();
- }
-
- indicies = this.selectedIndices();
-
- self.setButtonText();
- self.setButtonCount();
-
- self.list.find( "li:not(.ui-li-divider)" )
- .removeClass( $.mobile.activeBtnClass )
- .attr( "aria-selected", false )
- .each(function( i ) {
-
- if ( $.inArray( i, indicies ) > -1 ) {
- var item = $( this );
-
- // Aria selected attr
- item.attr( "aria-selected", true );
-
- // Multiple selects: add the "on" checkbox state to the icon
- if ( self.isMultiple ) {
- item.find( ".ui-icon" ).removeClass( "ui-icon-checkbox-off" ).addClass( "ui-icon-checkbox-on" );
- } else {
- if ( item.is( ".ui-selectmenu-placeholder" ) ) {
- item.next().addClass( $.mobile.activeBtnClass );
- } else {
- item.addClass( $.mobile.activeBtnClass );
- }
- }
- }
- });
- },
-
- close: function() {
- if ( this.options.disabled || !this.isOpen ) {
- return;
- }
-
- var self = this;
-
- if ( self.menuType === "page" ) {
- self.menuPage.dialog( "close" );
- self.list.appendTo( self.listbox );
- } else {
- self.listbox.popup( "close" );
- }
-
- self._focusButton();
- // allow the dialog to be closed again
- self.isOpen = false;
- },
-
- open: function() {
- this.button.click();
- },
-
- _decideFormat: function() {
- var self = this,
- $window = $.mobile.window,
- selfListParent = self.list.parent(),
- menuHeight = selfListParent.outerHeight(),
- menuWidth = selfListParent.outerWidth(),
- activePage = $( "." + $.mobile.activePageClass ),
- scrollTop = $window.scrollTop(),
- btnOffset = self.button.offset().top,
- screenHeight = $window.height(),
- screenWidth = $window.width();
-
- function focusMenuItem() {
- var selector = self.list.find( "." + $.mobile.activeBtnClass + " a" );
- if ( selector.length === 0 ) {
- selector = self.list.find( "li.ui-btn:not( :jqmData(placeholder='true') ) a" );
- }
- selector.first().focus().closest( "li" ).addClass( "ui-btn-down-" + widget.options.theme );
- }
-
- if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
-
- self.menuPage.appendTo( $.mobile.pageContainer ).page();
- self.menuPageContent = menuPage.find( ".ui-content" );
- self.menuPageClose = menuPage.find( ".ui-header a" );
-
- // prevent the parent page from being removed from the DOM,
- // otherwise the results of selecting a list item in the dialog
- // fall into a black hole
- self.thisPage.unbind( "pagehide.remove" );
-
- //for WebOS/Opera Mini (set lastscroll using button offset)
- if ( scrollTop === 0 && btnOffset > screenHeight ) {
- self.thisPage.one( "pagehide", function() {
- $( this ).jqmData( "lastScroll", btnOffset );
- });
- }
-
- self.menuPage
- .one( "pageshow", function() {
- focusMenuItem();
- })
- .one( "pagehide", function() {
- self.close();
- });
-
- self.menuType = "page";
- self.menuPageContent.append( self.list );
- self.menuPage.find("div .ui-title").text(self.label.text());
- } else {
- self.menuType = "overlay";
-
- self.listbox.one( "popupafteropen", focusMenuItem );
- }
- },
-
- _buildList: function() {
- var self = this,
- o = this.options,
- placeholder = this.placeholder,
- needPlaceholder = true,
- optgroups = [],
- lis = [],
- dataIcon = self.isMultiple ? "checkbox-off" : "false";
-
- self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
-
- var $options = self.select.find( "option" ),
- numOptions = $options.length,
- select = this.select[ 0 ],
- dataPrefix = 'data-' + $.mobile.ns,
- dataIndexAttr = dataPrefix + 'option-index',
- dataIconAttr = dataPrefix + 'icon',
- dataRoleAttr = dataPrefix + 'role',
- dataPlaceholderAttr = dataPrefix + 'placeholder',
- fragment = document.createDocumentFragment(),
- isPlaceholderItem = false,
- optGroup;
-
- for (var i = 0; i < numOptions;i++, isPlaceholderItem = false) {
- var option = $options[i],
- $option = $( option ),
- parent = option.parentNode,
- text = $option.text(),
- anchor = document.createElement( 'a' ),
- classes = [];
-
- anchor.setAttribute( 'href', '#' );
- anchor.appendChild( document.createTextNode( text ) );
-
- // Are we inside an optgroup?
- if ( parent !== select && parent.nodeName.toLowerCase() === "optgroup" ) {
- var optLabel = parent.getAttribute( 'label' );
- if ( optLabel !== optGroup ) {
- var divider = document.createElement( 'li' );
- divider.setAttribute( dataRoleAttr, 'list-divider' );
- divider.setAttribute( 'role', 'option' );
- divider.setAttribute( 'tabindex', '-1' );
- divider.appendChild( document.createTextNode( optLabel ) );
- fragment.appendChild( divider );
- optGroup = optLabel;
- }
- }
-
- if ( needPlaceholder && ( !option.getAttribute( "value" ) || text.length === 0 || $option.jqmData( "placeholder" ) ) ) {
- needPlaceholder = false;
- isPlaceholderItem = true;
-
- // If we have identified a placeholder, record the fact that it was
- // us who have added the placeholder to the option and mark it
- // retroactively in the select as well
- if ( null === option.getAttribute( dataPlaceholderAttr ) ) {
- this._removePlaceholderAttr = true;
- }
- option.setAttribute( dataPlaceholderAttr, true );
- if ( o.hidePlaceholderMenuItems ) {
- classes.push( "ui-selectmenu-placeholder" );
- }
- if ( placeholder !== text ) {
- placeholder = self.placeholder = text;
- }
- }
-
- var item = document.createElement('li');
- if ( option.disabled ) {
- classes.push( "ui-disabled" );
- item.setAttribute('aria-disabled',true);
- }
- item.setAttribute( dataIndexAttr,i );
- item.setAttribute( dataIconAttr, dataIcon );
- if ( isPlaceholderItem ) {
- item.setAttribute( dataPlaceholderAttr, true );
- }
- item.className = classes.join( " " );
- item.setAttribute( 'role', 'option' );
- anchor.setAttribute( 'tabindex', '-1' );
- item.appendChild( anchor );
- fragment.appendChild( item );
- }
-
- self.list[0].appendChild( fragment );
-
- // Hide header if it's not a multiselect and there's no placeholder
- if ( !this.isMultiple && !placeholder.length ) {
- this.header.hide();
- } else {
- this.headerTitle.text( this.placeholder );
- }
-
- // Now populated, create listview
- self.list.listview();
- },
-
- _button: function() {
- return $( "<a>", {
- "href": "#",
- "role": "button",
- // TODO value is undefined at creation
- "id": this.buttonId,
- "aria-haspopup": "true",
-
- // TODO value is undefined at creation
- "aria-owns": this.menuId
- });
- },
-
- _destroy: function() {
- this.close();
-
- // Restore the tabindex attribute to its original value
- if ( this._origTabIndex !== undefined ) {
- if ( this._origTabIndex !== false ) {
- this.select.attr( "tabindex", this._origTabIndex );
- } else {
- this.select.removeAttr( "tabindex" );
- }
- }
-
- // Remove the placeholder attribute if we were the ones to add it
- if ( this._removePlaceholderAttr ) {
- this._selectOptions().removeAttr( "data-" + $.mobile.ns + "placeholder" );
- }
-
- // Remove the popup
- this.listbox.remove();
-
- // Chain up
- origDestroy.apply( this, arguments );
- }
- });
- };
-
- // issue #3894 - core doesn't trigger events on disabled delegates
- $.mobile.document.bind( "selectmenubeforecreate", function( event ) {
- var selectmenuWidget = $( event.target ).data( "mobile-selectmenu" );
-
- if ( !selectmenuWidget.options.nativeMenu &&
- selectmenuWidget.element.parents( ":jqmData(role='popup')" ).length === 0 ) {
- extendSelect( selectmenuWidget );
- }
- });
-})( jQuery );
-
-(function( $, undefined ) {
-
- $.widget( "mobile.controlgroup", $.mobile.widget, $.extend( {
- options: {
- shadow: false,
- corners: true,
- excludeInvisible: true,
- type: "vertical",
- mini: false,
- initSelector: ":jqmData(role='controlgroup')"
- },
-
- _create: function() {
- var $el = this.element,
- ui = {
- inner: $( "<div class='ui-controlgroup-controls'></div>" ),
- legend: $( "<div role='heading' class='ui-controlgroup-label'></div>" )
- },
- grouplegend = $el.children( "legend" ),
- self = this;
-
- // Apply the proto
- $el.wrapInner( ui.inner );
- if ( grouplegend.length ) {
- ui.legend.append( grouplegend ).insertBefore( $el.children( 0 ) );
- }
- $el.addClass( "ui-corner-all ui-controlgroup" );
-
- $.extend( this, {
- _initialRefresh: true
- });
-
- $.each( this.options, function( key, value ) {
- // Cause initial options to be applied by their handler by temporarily setting the option to undefined
- // - the handler then sets it to the initial value
- self.options[ key ] = undefined;
- self._setOption( key, value, true );
- });
- },
-
- _init: function() {
- this.refresh();
- },
-
- _setOption: function( key, value ) {
- var setter = "_set" + key.charAt( 0 ).toUpperCase() + key.slice( 1 );
-
- if ( this[ setter ] !== undefined ) {
- this[ setter ]( value );
- }
-
- this._super( key, value );
- this.element.attr( "data-" + ( $.mobile.ns || "" ) + ( key.replace( /([A-Z])/, "-$1" ).toLowerCase() ), value );
- },
-
- _setType: function( value ) {
- this.element
- .removeClass( "ui-controlgroup-horizontal ui-controlgroup-vertical" )
- .addClass( "ui-controlgroup-" + value );
- this.refresh();
- },
-
- _setCorners: function( value ) {
- this.element.toggleClass( "ui-corner-all", value );
- },
-
- _setShadow: function( value ) {
- this.element.toggleClass( "ui-shadow", value );
- },
-
- _setMini: function( value ) {
- this.element.toggleClass( "ui-mini", value );
- },
-
- container: function() {
- return this.element.children( ".ui-controlgroup-controls" );
- },
-
- refresh: function() {
- var els = this.element.find( ".ui-btn" ).not( ".ui-slider-handle" ),
- create = this._initialRefresh;
- if ( $.mobile.checkboxradio ) {
- this.element.find( ":mobile-checkboxradio" ).checkboxradio( "refresh" );
- }
- this._addFirstLastClasses( els, this.options.excludeInvisible ? this._getVisibles( els, create ) : els, create );
- this._initialRefresh = false;
- }
- }, $.mobile.behaviors.addFirstLastClasses ) );
-
- // TODO: Implement a mechanism to allow widgets to become enhanced in the
- // correct order when their correct enhancement depends on other widgets in
- // the page being correctly enhanced already.
- //
- // For now, we wait until dom-ready to attach the controlgroup's enhancement
- // hook, because by that time, all the other widgets' enhancement hooks should
- // already be in place, ensuring that all widgets that need to be grouped will
- // already have been enhanced by the time the controlgroup is created.
- $( function() {
- $.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.controlgroup.prototype.enhanceWithin( e.target, true );
- });
- });
-})(jQuery);
-
-(function( $, undefined ) {
-
-$( document ).bind( "pagecreate create", function( e ) {
-
- //links within content areas, tests included with page
- $( e.target )
- .find( "a" )
- .jqmEnhanceable()
- .not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" )
- .addClass( "ui-link" );
-
-});
-
-})( jQuery );
-
-
-(function( $, undefined ) {
-
-
- $.widget( "mobile.fixedtoolbar", $.mobile.widget, {
- options: {
- visibleOnPageShow: true,
- disablePageZoom: true,
- transition: "slide", //can be none, fade, slide (slide maps to slideup or slidedown)
- fullscreen: false,
- tapToggle: true,
- tapToggleBlacklist: "a, button, input, select, textarea, .ui-header-fixed, .ui-footer-fixed, .ui-popup, .ui-panel, .ui-panel-dismiss-open",
- hideDuringFocus: "input, textarea, select",
- updatePagePadding: true,
- trackPersistentToolbars: true,
-
- // Browser detection! Weeee, here we go...
- // Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately.
- // Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience.
- // Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window
- // The following function serves to rule out some popular browsers with known fixed-positioning issues
- // This is a plugin option like any other, so feel free to improve or overwrite it
- supportBlacklist: function() {
- return !$.support.fixedPosition;
- },
- initSelector: ":jqmData(position='fixed')"
- },
-
- _create: function() {
-
- var self = this,
- o = self.options,
- $el = self.element,
- tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer",
- $page = $el.closest( ".ui-page" );
-
- // Feature detecting support for
- if ( o.supportBlacklist() ) {
- self.destroy();
- return;
- }
-
- $el.addClass( "ui-"+ tbtype +"-fixed" );
-
- // "fullscreen" overlay positioning
- if ( o.fullscreen ) {
- $el.addClass( "ui-"+ tbtype +"-fullscreen" );
- $page.addClass( "ui-page-" + tbtype + "-fullscreen" );
- }
- // If not fullscreen, add class to page to set top or bottom padding
- else{
- $page.addClass( "ui-page-" + tbtype + "-fixed" );
- }
-
- $.extend( this, {
- _thisPage: null
- });
-
- self._addTransitionClass();
- self._bindPageEvents();
- self._bindToggleHandlers();
- },
-
- _addTransitionClass: function() {
- var tclass = this.options.transition;
-
- if ( tclass && tclass !== "none" ) {
- // use appropriate slide for header or footer
- if ( tclass === "slide" ) {
- tclass = this.element.is( ".ui-header" ) ? "slidedown" : "slideup";
- }
-
- this.element.addClass( tclass );
- }
- },
-
- _bindPageEvents: function() {
- this._thisPage = this.element.closest( ".ui-page" );
- //page event bindings
- // Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up
- // This method is meant to disable zoom while a fixed-positioned toolbar page is visible
- this._on( this._thisPage, {
- "pagebeforeshow": "_handlePageBeforeShow",
- "webkitAnimationStart":"_handleAnimationStart",
- "animationstart":"_handleAnimationStart",
- "updatelayout": "_handleAnimationStart",
- "pageshow": "_handlePageShow",
- "pagebeforehide": "_handlePageBeforeHide"
- });
- },
-
- _handlePageBeforeShow: function() {
- var o = this.options;
- if ( o.disablePageZoom ) {
- $.mobile.zoom.disable( true );
- }
- if ( !o.visibleOnPageShow ) {
- this.hide( true );
- }
- },
-
- _handleAnimationStart: function() {
- if ( this.options.updatePagePadding ) {
- this.updatePagePadding( this._thisPage );
- }
- },
-
- _handlePageShow: function() {
- this.updatePagePadding( this._thisPage );
- if ( this.options.updatePagePadding ) {
- this._on( $.mobile.window, { "throttledresize": "updatePagePadding" } );
- }
- },
-
- _handlePageBeforeHide: function( e, ui ) {
- var o = this.options;
-
- if ( o.disablePageZoom ) {
- $.mobile.zoom.enable( true );
- }
- if ( o.updatePagePadding ) {
- this._off( $.mobile.window, "throttledresize" );
- }
-
- if ( o.trackPersistentToolbars ) {
- var thisFooter = $( ".ui-footer-fixed:jqmData(id)", this._thisPage ),
- thisHeader = $( ".ui-header-fixed:jqmData(id)", this._thisPage ),
- nextFooter = thisFooter.length && ui.nextPage && $( ".ui-footer-fixed:jqmData(id='" + thisFooter.jqmData( "id" ) + "')", ui.nextPage ) || $(),
- nextHeader = thisHeader.length && ui.nextPage && $( ".ui-header-fixed:jqmData(id='" + thisHeader.jqmData( "id" ) + "')", ui.nextPage ) || $();
-
- if ( nextFooter.length || nextHeader.length ) {
-
- nextFooter.add( nextHeader ).appendTo( $.mobile.pageContainer );
-
- ui.nextPage.one( "pageshow", function() {
- nextHeader.prependTo( this );
- nextFooter.appendTo( this );
- });
- }
- }
- },
-
- _visible: true,
-
- // This will set the content element's top or bottom padding equal to the toolbar's height
- updatePagePadding: function( tbPage ) {
- var $el = this.element,
- header = $el.is( ".ui-header" ),
- pos = parseFloat( $el.css( header ? "top" : "bottom" ) );
-
- // This behavior only applies to "fixed", not "fullscreen"
- if ( this.options.fullscreen ) { return; }
-
- // tbPage argument can be a Page object or an event, if coming from throttled resize.
- tbPage = ( tbPage && tbPage.type === undefined && tbPage ) || this._thisPage || $el.closest( ".ui-page" );
- $( tbPage ).css( "padding-" + ( header ? "top" : "bottom" ), $el.outerHeight() + pos );
- },
-
- _useTransition: function( notransition ) {
- var $win = $.mobile.window,
- $el = this.element,
- scroll = $win.scrollTop(),
- elHeight = $el.height(),
- pHeight = $el.closest( ".ui-page" ).height(),
- viewportHeight = $.mobile.getScreenHeight(),
- tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer";
-
- return !notransition &&
- ( this.options.transition && this.options.transition !== "none" &&
- (
- ( tbtype === "header" && !this.options.fullscreen && scroll > elHeight ) ||
- ( tbtype === "footer" && !this.options.fullscreen && scroll + viewportHeight < pHeight - elHeight )
- ) || this.options.fullscreen
- );
- },
-
- show: function( notransition ) {
- var hideClass = "ui-fixed-hidden",
- $el = this.element;
-
- if ( this._useTransition( notransition ) ) {
- $el
- .removeClass( "out " + hideClass )
- .addClass( "in" )
- .animationComplete(function () {
- $el.removeClass('in');
- });
- }
- else {
- $el.removeClass( hideClass );
- }
- this._visible = true;
- },
-
- hide: function( notransition ) {
- var hideClass = "ui-fixed-hidden",
- $el = this.element,
- // if it's a slide transition, our new transitions need the reverse class as well to slide outward
- outclass = "out" + ( this.options.transition === "slide" ? " reverse" : "" );
-
- if( this._useTransition( notransition ) ) {
- $el
- .addClass( outclass )
- .removeClass( "in" )
- .animationComplete(function() {
- $el.addClass( hideClass ).removeClass( outclass );
- });
- }
- else {
- $el.addClass( hideClass ).removeClass( outclass );
- }
- this._visible = false;
- },
-
- toggle: function() {
- this[ this._visible ? "hide" : "show" ]();
- },
-
- _bindToggleHandlers: function() {
- var self = this,
- o = self.options,
- $el = self.element,
- delayShow, delayHide,
- isVisible = true;
-
- // tap toggle
- $el.closest( ".ui-page" )
- .bind( "vclick", function( e ) {
- if ( o.tapToggle && !$( e.target ).closest( o.tapToggleBlacklist ).length ) {
- self.toggle();
- }
- })
- .bind( "focusin focusout", function( e ) {
- //this hides the toolbars on a keyboard pop to give more screen room and prevent ios bug which
- //positions fixed toolbars in the middle of the screen on pop if the input is near the top or
- //bottom of the screen addresses issues #4410 Footer navbar moves up when clicking on a textbox in an Android environment
- //and issue #4113 Header and footer change their position after keyboard popup - iOS
- //and issue #4410 Footer navbar moves up when clicking on a textbox in an Android environment
- if ( screen.width < 1025 && $( e.target ).is( o.hideDuringFocus ) && !$( e.target ).closest( ".ui-header-fixed, .ui-footer-fixed" ).length ) {
- //Fix for issue #4724 Moving through form in Mobile Safari with "Next" and "Previous" system
- //controls causes fixed position, tap-toggle false Header to reveal itself
- // isVisible instead of self._visible because the focusin and focusout events fire twice at the same time
- // Also use a delay for hiding the toolbars because on Android native browser focusin is direclty followed
- // by a focusout when a native selects opens and the other way around when it closes.
- if ( e.type === "focusout" && !isVisible ) {
- isVisible = true;
- //wait for the stack to unwind and see if we have jumped to another input
- clearTimeout( delayHide );
- delayShow = setTimeout( function() {
- self.show();
- }, 0 );
- } else if ( e.type === "focusin" && !!isVisible ) {
- //if we have jumped to another input clear the time out to cancel the show.
- clearTimeout( delayShow );
- isVisible = false;
- delayHide = setTimeout( function() {
- self.hide();
- }, 0 );
- }
- }
- });
- },
-
- _destroy: function() {
- var $el = this.element,
- header = $el.is( ".ui-header" );
-
- $el.closest( ".ui-page" ).css( "padding-" + ( header ? "top" : "bottom" ), "" );
- $el.removeClass( "ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden" );
- $el.closest( ".ui-page" ).removeClass( "ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen" );
- }
-
- });
-
- //auto self-init widgets
- $.mobile.document
- .bind( "pagecreate create", function( e ) {
-
- // DEPRECATED in 1.1: support for data-fullscreen=true|false on the page element.
- // This line ensures it still works, but we recommend moving the attribute to the toolbars themselves.
- if ( $( e.target ).jqmData( "fullscreen" ) ) {
- $( $.mobile.fixedtoolbar.prototype.options.initSelector, e.target ).not( ":jqmData(fullscreen)" ).jqmData( "fullscreen", true );
- }
-
- $.mobile.fixedtoolbar.prototype.enhanceWithin( e.target );
- });
-
-})( jQuery );
-
-(function( $, undefined ) {
- $.widget( "mobile.fixedtoolbar", $.mobile.fixedtoolbar, {
-
- _create: function() {
- this._super();
- this._workarounds();
- },
-
- //check the browser and version and run needed workarounds
- _workarounds: function() {
- var ua = navigator.userAgent,
- platform = navigator.platform,
- // Rendering engine is Webkit, and capture major version
- wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
- wkversion = !!wkmatch && wkmatch[ 1 ],
- os = null,
- self = this;
- //set the os we are working in if it dosent match one with workarounds return
- if( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1 || platform.indexOf( "iPod" ) > -1 ){
- os = "ios";
- } else if( ua.indexOf( "Android" ) > -1 ){
- os = "android";
- } else {
- return;
- }
- //check os version if it dosent match one with workarounds return
- if( os === "ios" ) {
- //iOS workarounds
- self._bindScrollWorkaround();
- } else if( os === "android" && wkversion && wkversion < 534 ) {
- //Android 2.3 run all Android 2.3 workaround
- self._bindScrollWorkaround();
- self._bindListThumbWorkaround();
- } else {
- return;
- }
- },
-
- //Utility class for checking header and footer positions relative to viewport
- _viewportOffset: function() {
- var $el = this.element,
- header = $el.is( ".ui-header" ),
- offset = Math.abs($el.offset().top - $.mobile.window.scrollTop());
- if( !header ) {
- offset = Math.round(offset - $.mobile.window.height() + $el.outerHeight())-60;
- }
- return offset;
- },
-
- //bind events for _triggerRedraw() function
- _bindScrollWorkaround: function() {
- var self = this;
- //bind to scrollstop and check if the toolbars are correctly positioned
- this._on( $.mobile.window, { scrollstop: function() {
- var viewportOffset = self._viewportOffset();
- //check if the header is visible and if its in the right place
- if( viewportOffset > 2 && self._visible) {
- self._triggerRedraw();
- }
- }});
- },
-
- //this addresses issue #4250 Persistent footer instability in v1.1 with long select lists in Android 2.3.3
- //and issue #3748 Android 2.x: Page transitions broken when fixed toolbars used
- //the absolutely positioned thumbnail in a list view causes problems with fixed position buttons above in a nav bar
- //setting the li's to -webkit-transform:translate3d(0,0,0); solves this problem to avoide potential issues in other
- //platforms we scope this with the class ui-android-2x-fix
- _bindListThumbWorkaround: function() {
- this.element.closest(".ui-page").addClass( "ui-android-2x-fixed" );
- },
- //this addresses issues #4337 Fixed header problem after scrolling content on iOS and Android
- //and device bugs project issue #1 Form elements can lose click hit area in position: fixed containers.
- //this also addresses not on fixed toolbars page in docs
- //adding 1px of padding to the bottom then removing it causes a "redraw"
- //which positions the toolbars correctly (they will always be visually correct)
- _triggerRedraw: function() {
- var paddingBottom = parseFloat( $( ".ui-page-active" ).css( "padding-bottom" ) );
- //trigger page redraw to fix incorrectly positioned fixed elements
- $( ".ui-page-active" ).css( "padding-bottom", ( paddingBottom + 1 ) +"px" );
- //if the padding is reset with out a timeout the reposition will not occure.
- //this is independant of JQM the browser seems to need the time to react.
- setTimeout( function() {
- $( ".ui-page-active" ).css( "padding-bottom", paddingBottom + "px" );
- }, 0 );
- },
-
- destroy: function() {
- this._super();
- //Remove the class we added to the page previously in android 2.x
- this.element.closest(".ui-page-active").removeClass( "ui-android-2x-fix" );
- }
- });
-
- })( jQuery );
-
-(function( $, undefined ) {
-
-$.widget( "mobile.panel", $.mobile.widget, {
- options: {
- classes: {
- panel: "ui-panel",
- panelOpen: "ui-panel-open",
- panelClosed: "ui-panel-closed",
- panelFixed: "ui-panel-fixed",
- panelInner: "ui-panel-inner",
- modal: "ui-panel-dismiss",
- modalOpen: "ui-panel-dismiss-open",
- pagePanel: "ui-page-panel",
- pagePanelOpen: "ui-page-panel-open",
- contentWrap: "ui-panel-content-wrap",
- contentWrapOpen: "ui-panel-content-wrap-open",
- contentWrapClosed: "ui-panel-content-wrap-closed",
- contentFixedToolbar: "ui-panel-content-fixed-toolbar",
- contentFixedToolbarOpen: "ui-panel-content-fixed-toolbar-open",
- contentFixedToolbarClosed: "ui-panel-content-fixed-toolbar-closed",
- animate: "ui-panel-animate"
- },
- animate: true,
- theme: "c",
- position: "left",
- dismissible: true,
- display: "reveal", //accepts reveal, push, overlay
- initSelector: ":jqmData(role='panel')",
- swipeClose: true,
- positionFixed: false
- },
-
- _panelID: null,
- _closeLink: null,
- _page: null,
- _modal: null,
- _panelInner: null,
- _wrapper: null,
- _fixedToolbar: null,
-
- _create: function() {
- var self = this,
- $el = self.element,
- page = $el.closest( ":jqmData(role='page')" ),
- _getPageTheme = function() {
- var $theme = $.data( page[0], "mobilePage" ).options.theme,
- $pageThemeClass = "ui-body-" + $theme;
- return $pageThemeClass;
- },
- _getPanelInner = function() {
- var $panelInner = $el.find( "." + self.options.classes.panelInner );
- if ( $panelInner.length === 0 ) {
- $panelInner = $el.children().wrapAll( '<div class="' + self.options.classes.panelInner + '" />' ).parent();
- }
- return $panelInner;
- },
- _getWrapper = function() {
- var $wrapper = page.find( "." + self.options.classes.contentWrap );
- if ( $wrapper.length === 0 ) {
- $wrapper = page.children( ".ui-header:not(:jqmData(position='fixed')), .ui-content:not(:jqmData(role='popup')), .ui-footer:not(:jqmData(position='fixed'))" ).wrapAll( '<div class="' + self.options.classes.contentWrap + ' ' + _getPageTheme() + '" />' ).parent();
- if ( $.support.cssTransform3d && !!self.options.animate ) {
- $wrapper.addClass( self.options.classes.animate );
- }
- }
- return $wrapper;
- },
- _getFixedToolbar = function() {
- var $fixedToolbar = page.find( "." + self.options.classes.contentFixedToolbar );
- if ( $fixedToolbar.length === 0 ) {
- $fixedToolbar = page.find( ".ui-header:jqmData(position='fixed'), .ui-footer:jqmData(position='fixed')" ).addClass( self.options.classes.contentFixedToolbar );
- if ( $.support.cssTransform3d && !!self.options.animate ) {
- $fixedToolbar.addClass( self.options.classes.animate );
- }
- }
- return $fixedToolbar;
- };
-
- // expose some private props to other methods
- $.extend( this, {
- _panelID: $el.attr( "id" ),
- _closeLink: $el.find( ":jqmData(rel='close')" ),
- _page: $el.closest( ":jqmData(role='page')" ),
- _pageTheme: _getPageTheme(),
- _panelInner: _getPanelInner(),
- _wrapper: _getWrapper(),
- _fixedToolbar: _getFixedToolbar()
- });
-
- self._addPanelClasses();
- self._wrapper.addClass( this.options.classes.contentWrapClosed );
- self._fixedToolbar.addClass( this.options.classes.contentFixedToolbarClosed );
- // add class to page so we can set "overflow-x: hidden;" for it to fix Android zoom issue
- self._page.addClass( self.options.classes.pagePanel );
-
- // if animating, add the class to do so
- if ( $.support.cssTransform3d && !!self.options.animate ) {
- this.element.addClass( self.options.classes.animate );
- }
-
- self._bindUpdateLayout();
- self._bindCloseEvents();
- self._bindLinkListeners();
- self._bindPageEvents();
-
- if ( !!self.options.dismissible ) {
- self._createModal();
- }
-
- self._bindSwipeEvents();
- },
-
- _createModal: function( options ) {
- var self = this;
-
- self._modal = $( "<div class='" + self.options.classes.modal + "' data-panelid='" + self._panelID + "'></div>" )
- .on( "mousedown", function() {
- self.close();
- })
- .appendTo( this._page );
- },
-
- _getPosDisplayClasses: function( prefix ) {
- return prefix + "-position-" + this.options.position + " " + prefix + "-display-" + this.options.display;
- },
-
- _getPanelClasses: function() {
- var panelClasses = this.options.classes.panel +
- " " + this._getPosDisplayClasses( this.options.classes.panel ) +
- " " + this.options.classes.panelClosed;
-
- if ( this.options.theme ) {
- panelClasses += " ui-body-" + this.options.theme;
- }
- if ( !!this.options.positionFixed ) {
- panelClasses += " " + this.options.classes.panelFixed;
- }
- return panelClasses;
- },
-
- _addPanelClasses: function() {
- this.element.addClass( this._getPanelClasses() );
- },
-
- _bindCloseEvents: function() {
- var self = this;
-
- self._closeLink.on( "click.panel" , function( e ) {
- e.preventDefault();
- self.close();
- return false;
- });
- self.element.on( "click.panel" , "a:jqmData(ajax='false')", function( e ) {
- self.close();
- });
- },
-
- _positionPanel: function() {
- var self = this,
- panelInnerHeight = self._panelInner.outerHeight(),
- expand = panelInnerHeight > $.mobile.getScreenHeight();
-
- if ( expand || !self.options.positionFixed ) {
- if ( expand ) {
- self._unfixPanel();
- $.mobile.resetActivePageHeight( panelInnerHeight );
- }
- self._scrollIntoView( panelInnerHeight );
- } else {
- self._fixPanel();
- }
- },
-
- _scrollIntoView: function( panelInnerHeight ) {
- if ( panelInnerHeight < $( window ).scrollTop() ) {
- window.scrollTo( 0, 0 );
- }
- },
-
- _bindFixListener: function() {
- this._on( $( window ), { "throttledresize": "_positionPanel" });
- },
-
- _unbindFixListener: function() {
- this._off( $( window ), "throttledresize" );
- },
-
- _unfixPanel: function() {
- if ( !!this.options.positionFixed && $.support.fixedPosition ) {
- this.element.removeClass( this.options.classes.panelFixed );
- }
- },
-
- _fixPanel: function() {
- if ( !!this.options.positionFixed && $.support.fixedPosition ) {
- this.element.addClass( this.options.classes.panelFixed );
- }
- },
-
- _bindUpdateLayout: function() {
- var self = this;
-
- self.element.on( "updatelayout", function( e ) {
- if ( self._open ) {
- self._positionPanel();
- }
- });
- },
-
- _bindLinkListeners: function() {
- var self = this;
-
- self._page.on( "click.panel" , "a", function( e ) {
- if ( this.href.split( "#" )[ 1 ] === self._panelID && self._panelID !== undefined ) {
- e.preventDefault();
- var $link = $( this );
- if ( ! $link.hasClass( "ui-link" ) ) {
- $link.addClass( $.mobile.activeBtnClass );
- self.element.one( "panelopen panelclose", function() {
- $link.removeClass( $.mobile.activeBtnClass );
- });
- }
- self.toggle();
- return false;
- }
- });
- },
-
- _bindSwipeEvents: function() {
- var self = this,
- area = self._modal ? self.element.add( self._modal ) : self.element;
-
- // on swipe, close the panel
- if( !!self.options.swipeClose ) {
- if ( self.options.position === "left" ) {
- area.on( "swipeleft.panel", function( e ) {
- self.close();
- });
- } else {
- area.on( "swiperight.panel", function( e ) {
- self.close();
- });
- }
- }
- },
-
- _bindPageEvents: function() {
- var self = this;
-
- self._page
- // Close the panel if another panel on the page opens
- .on( "panelbeforeopen", function( e ) {
- if ( self._open && e.target !== self.element[ 0 ] ) {
- self.close();
- }
- })
- // clean up open panels after page hide
- .on( "pagehide", function( e ) {
- if ( self._open ) {
- self.close( true );
- }
- })
- // on escape, close? might need to have a target check too...
- .on( "keyup.panel", function( e ) {
- if ( e.keyCode === 27 && self._open ) {
- self.close();
- }
- });
- },
-
- // state storage of open or closed
- _open: false,
-
- _contentWrapOpenClasses: null,
- _fixedToolbarOpenClasses: null,
- _modalOpenClasses: null,
-
- open: function( immediate ) {
- if ( !this._open ) {
- var self = this,
- o = self.options,
- _openPanel = function() {
- self._page.off( "panelclose" );
- self._page.jqmData( "panel", "open" );
-
- if ( !immediate && $.support.cssTransform3d && !!o.animate ) {
- self.element.add( self._wrapper ).on( self._transitionEndEvents, complete );
- } else {
- setTimeout( complete, 0 );
- }
-
- if ( self.options.theme && self.options.display !== "overlay" ) {
- self._page
- .removeClass( self._pageTheme )
- .addClass( "ui-body-" + self.options.theme );
- }
-
- self.element.removeClass( o.classes.panelClosed ).addClass( o.classes.panelOpen );
-
- self._positionPanel();
-
- // Fix for IE7 min-height bug
- if ( self.options.theme && self.options.display !== "overlay" ) {
- self._wrapper.css( "min-height", self._page.css( "min-height" ) );
- }
-
- self._contentWrapOpenClasses = self._getPosDisplayClasses( o.classes.contentWrap );
- self._wrapper
- .removeClass( o.classes.contentWrapClosed )
- .addClass( self._contentWrapOpenClasses + " " + o.classes.contentWrapOpen );
-
- self._fixedToolbarOpenClasses = self._getPosDisplayClasses( o.classes.contentFixedToolbar );
- self._fixedToolbar
- .removeClass( o.classes.contentFixedToolbarClosed )
- .addClass( self._fixedToolbarOpenClasses + " " + o.classes.contentFixedToolbarOpen );
-
- self._modalOpenClasses = self._getPosDisplayClasses( o.classes.modal ) + " " + o.classes.modalOpen;
- if ( self._modal ) {
- self._modal.addClass( self._modalOpenClasses );
- }
- },
- complete = function() {
- self.element.add( self._wrapper ).off( self._transitionEndEvents, complete );
-
- self._page.addClass( o.classes.pagePanelOpen );
-
- self._bindFixListener();
-
- self._trigger( "open" );
- };
-
- if ( this.element.closest( ".ui-page-active" ).length < 0 ) {
- immediate = true;
- }
-
- self._trigger( "beforeopen" );
-
- if ( self._page.jqmData('panel') === "open" ) {
- self._page.on( "panelclose", function() {
- _openPanel();
- });
- } else {
- _openPanel();
- }
-
- self._open = true;
- }
- },
-
- close: function( immediate ) {
- if ( this._open ) {
- var o = this.options,
- self = this,
- _closePanel = function() {
- if ( !immediate && $.support.cssTransform3d && !!o.animate ) {
- self.element.add( self._wrapper ).on( self._transitionEndEvents, complete );
- } else {
- setTimeout( complete, 0 );
- }
-
- self._page.removeClass( o.classes.pagePanelOpen );
- self.element.removeClass( o.classes.panelOpen );
- self._wrapper.removeClass( o.classes.contentWrapOpen );
- self._fixedToolbar.removeClass( o.classes.contentFixedToolbarOpen );
-
- if ( self._modal ) {
- self._modal.removeClass( self._modalOpenClasses );
- }
- },
- complete = function() {
- if ( self.options.theme && self.options.display !== "overlay" ) {
- self._page.removeClass( "ui-body-" + self.options.theme ).addClass( self._pageTheme );
- // reset fix for IE7 min-height bug
- self._wrapper.css( "min-height", "" );
- }
- self.element.add( self._wrapper ).off( self._transitionEndEvents, complete );
- self.element.addClass( o.classes.panelClosed );
-
- self._wrapper
- .removeClass( self._contentWrapOpenClasses )
- .addClass( o.classes.contentWrapClosed );
-
- self._fixedToolbar
- .removeClass( self._fixedToolbarOpenClasses )
- .addClass( o.classes.contentFixedToolbarClosed );
-
- self._fixPanel();
- self._unbindFixListener();
- $.mobile.resetActivePageHeight();
-
- self._page.jqmRemoveData( "panel" );
- self._trigger( "close" );
- };
-
- if ( this.element.closest( ".ui-page-active" ).length < 0 ) {
- immediate = true;
- }
- self._trigger( "beforeclose" );
-
- _closePanel();
-
- self._open = false;
- }
- },
-
- toggle: function( options ) {
- this[ this._open ? "close" : "open" ]();
- },
-
- _transitionEndEvents: "webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd",
-
- _destroy: function() {
- var classes = this.options.classes,
- theme = this.options.theme,
- hasOtherSiblingPanels = this.element.siblings( "." + classes.panel ).length;
-
- // create
- if ( !hasOtherSiblingPanels ) {
- this._wrapper.children().unwrap();
- this._page.find( "a" ).unbind( "panelopen panelclose" );
- this._page.removeClass( classes.pagePanel );
- if ( this._open ) {
- this._page.jqmRemoveData( "panel" );
- this._page.removeClass( classes.pagePanelOpen );
- if ( theme ) {
- this._page.removeClass( "ui-body-" + theme ).addClass( this._pageTheme );
- }
- $.mobile.resetActivePageHeight();
- }
- } else if ( this._open ) {
- this._wrapper.removeClass( classes.contentWrapOpen );
- this._fixedToolbar.removeClass( classes.contentFixedToolbarOpen );
- this._page.jqmRemoveData( "panel" );
- this._page.removeClass( classes.pagePanelOpen );
- if ( theme ) {
- this._page.removeClass( "ui-body-" + theme ).addClass( this._pageTheme );
- }
- }
-
- this._panelInner.children().unwrap();
-
- this.element.removeClass( [ this._getPanelClasses(), classes.panelAnimate ].join( " " ) )
- .off( "swipeleft.panel swiperight.panel" )
- .off( "panelbeforeopen" )
- .off( "panelhide" )
- .off( "keyup.panel" )
- .off( "updatelayout" );
-
- this._closeLink.off( "click.panel" );
-
- if ( this._modal ) {
- this._modal.remove();
- }
-
- // open and close
- this.element.off( this._transitionEndEvents )
- .removeClass( [ classes.panelUnfixed, classes.panelClosed, classes.panelOpen ].join( " " ) );
- }
-});
-
-//auto self-init widgets
-$( document ).bind( "pagecreate create", function( e ) {
- $.mobile.panel.prototype.enhanceWithin( e.target );
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.widget( "mobile.table", $.mobile.widget, {
-
- options: {
- classes: {
- table: "ui-table"
- },
- initSelector: ":jqmData(role='table')"
- },
-
- _create: function() {
- var self = this;
- self.refresh( true );
- },
-
- refresh: function (create) {
- var self = this,
- trs = this.element.find( "thead tr" );
-
- if ( create ) {
- this.element.addClass( this.options.classes.table );
- }
-
- // Expose headers and allHeaders properties on the widget
- // headers references the THs within the first TR in the table
- self.headers = this.element.find( "tr:eq(0)" ).children();
-
- // allHeaders references headers, plus all THs in the thead, which may include several rows, or not
- self.allHeaders = self.headers.add( trs.children() );
-
- trs.each(function(){
-
- var coltally = 0;
-
- $( this ).children().each(function( i ){
-
- var span = parseInt( $( this ).attr( "colspan" ), 10 ),
- sel = ":nth-child(" + ( coltally + 1 ) + ")";
- $( this )
- .jqmData( "colstart", coltally + 1 );
-
- if( span ){
- for( var j = 0; j < span - 1; j++ ){
- coltally++;
- sel += ", :nth-child(" + ( coltally + 1 ) + ")";
- }
- }
-
- if ( create === undefined ) {
- $(this).jqmData("cells", "");
- }
- // Store "cells" data on header as a reference to all cells in the same column as this TH
- $( this )
- .jqmData( "cells", self.element.find( "tr" ).not( trs.eq(0) ).not( this ).children( sel ) );
-
- coltally++;
-
- });
-
- });
-
- // update table modes
- if ( create === undefined ) {
- this.element.trigger( 'refresh' );
- }
- }
-
-});
-
-//auto self-init widgets
-$.mobile.document.bind( "pagecreate create", function( e ) {
- $.mobile.table.prototype.enhanceWithin( e.target );
-});
-
-})( jQuery );
-
-
-(function( $, undefined ) {
-
-$.mobile.table.prototype.options.mode = "columntoggle";
-
-$.mobile.table.prototype.options.columnBtnTheme = null;
-
-$.mobile.table.prototype.options.columnPopupTheme = null;
-
-$.mobile.table.prototype.options.columnBtnText = "Columns...";
-
-$.mobile.table.prototype.options.classes = $.extend(
- $.mobile.table.prototype.options.classes,
- {
- popup: "ui-table-columntoggle-popup",
- columnBtn: "ui-table-columntoggle-btn",
- priorityPrefix: "ui-table-priority-",
- columnToggleTable: "ui-table-columntoggle"
- }
-);
-
-$.mobile.document.delegate( ":jqmData(role='table')", "tablecreate refresh", function( e ) {
-
- var $table = $( this ),
- self = $table.data( "mobile-table" ),
- event = e.type,
- o = self.options,
- ns = $.mobile.ns,
- id = ( $table.attr( "id" ) || o.classes.popup ) + "-popup", /* TODO BETTER FALLBACK ID HERE */
- $menuButton,
- $popup,
- $menu,
- $switchboard;
-
- if ( o.mode !== "columntoggle" ) {
- return;
- }
-
- if ( event !== "refresh" ) {
- self.element.addClass( o.classes.columnToggleTable );
-
- $menuButton = $( "<a href='#" + id + "' class='" + o.classes.columnBtn + "' data-" + ns + "rel='popup' data-" + ns + "mini='true'>" + o.columnBtnText + "</a>" ),
- $popup = $( "<div data-" + ns + "role='popup' data-" + ns + "role='fieldcontain' class='" + o.classes.popup + "' id='" + id + "'></div>"),
- $menu = $("<fieldset data-" + ns + "role='controlgroup'></fieldset>");
- }
-
- // create the hide/show toggles
- self.headers.not( "td" ).each(function( i ) {
-
- var priority = $( this ).jqmData( "priority" ),
- $cells = $( this ).add( $( this ).jqmData( "cells" ) );
-
- if ( priority ) {
-
- $cells.addClass( o.classes.priorityPrefix + priority );
-
- if ( event !== "refresh" ) {
- $("<label><input type='checkbox' checked />" + $( this ).text() + "</label>" )
- .appendTo( $menu )
- .children( 0 )
- .jqmData( "cells", $cells )
- .checkboxradio({
- theme: o.columnPopupTheme
- });
- } else {
- $( '#' + id + ' fieldset div:eq(' + i +')').find('input').jqmData( 'cells', $cells );
- }
- }
- });
-
- if ( event !== "refresh" ) {
- $menu.appendTo( $popup );
- }
-
- // bind change event listeners to inputs - TODO: move to a private method?
- if ( $menu === undefined ) {
- $switchboard = $('#' + id + ' fieldset');
- } else {
- $switchboard = $menu;
- }
-
- if ( event !== "refresh" ) {
- $switchboard.on( "change", "input", function( e ){
- if( this.checked ){
- $( this ).jqmData( "cells" ).removeClass( "ui-table-cell-hidden" ).addClass( "ui-table-cell-visible" );
- } else {
- $( this ).jqmData( "cells" ).removeClass( "ui-table-cell-visible" ).addClass( "ui-table-cell-hidden" );
- }
- });
-
- $menuButton
- .insertBefore( $table )
- .buttonMarkup({
- theme: o.columnBtnTheme
- });
-
- $popup
- .insertBefore( $table )
- .popup();
- }
-
- // refresh method
- self.update = function(){
- $switchboard.find( "input" ).each( function(){
- if (this.checked) {
- this.checked = $( this ).jqmData( "cells" ).eq(0).css( "display" ) === "table-cell";
- if (event === "refresh") {
- $( this ).jqmData( "cells" ).addClass('ui-table-cell-visible');
- }
- } else {
- $( this ).jqmData( "cells" ).addClass('ui-table-cell-hidden');
- }
- $( this ).checkboxradio( "refresh" );
- });
- };
-
- $.mobile.window.on( "throttledresize", self.update );
-
- self.update();
-
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.mobile.table.prototype.options.mode = "reflow";
-
-$.mobile.table.prototype.options.classes = $.extend(
- $.mobile.table.prototype.options.classes,
- {
- reflowTable: "ui-table-reflow",
- cellLabels: "ui-table-cell-label"
- }
-);
-
-$.mobile.document.delegate( ":jqmData(role='table')", "tablecreate refresh", function( e ) {
-
- var $table = $( this ),
- event = e.type,
- self = $table.data( "mobile-table" ),
- o = self.options;
-
- // If it's not reflow mode, return here.
- if( o.mode !== "reflow" ){
- return;
- }
-
- if ( event !== "refresh" ) {
- self.element.addClass( o.classes.reflowTable );
- }
-
- // get headers in reverse order so that top-level headers are appended last
- var reverseHeaders = $( self.allHeaders.get().reverse() );
-
- // create the hide/show toggles
- reverseHeaders.each(function( i ){
- var $cells = $( this ).jqmData( "cells" ),
- colstart = $( this ).jqmData( "colstart" ),
- hierarchyClass = $cells.not( this ).filter( "thead th" ).length && " ui-table-cell-label-top",
- text = $(this).text();
-
- if( text !== "" ){
-
- if( hierarchyClass ){
- var iteration = parseInt( $( this ).attr( "colspan" ), 10 ),
- filter = "";
-
- if( iteration ){
- filter = "td:nth-child("+ iteration +"n + " + ( colstart ) +")";
- }
- $cells.filter( filter ).prepend( "<b class='" + o.classes.cellLabels + hierarchyClass + "'>" + text + "</b>" );
- }
- else {
- $cells.prepend( "<b class='" + o.classes.cellLabels + "'>" + text + "</b>" );
- }
-
- }
- });
-
-});
-
-})( jQuery );
-
-(function( $, window ) {
-
- $.mobile.iosorientationfixEnabled = true;
-
- // This fix addresses an iOS bug, so return early if the UA claims it's something else.
- var ua = navigator.userAgent;
- if( !( /iPhone|iPad|iPod/.test( navigator.platform ) && /OS [1-5]_[0-9_]* like Mac OS X/i.test( ua ) && ua.indexOf( "AppleWebKit" ) > -1 ) ){
- $.mobile.iosorientationfixEnabled = false;
- return;
- }
-
- var zoom = $.mobile.zoom,
- evt, x, y, z, aig;
-
- function checkTilt( e ) {
- evt = e.originalEvent;
- aig = evt.accelerationIncludingGravity;
-
- x = Math.abs( aig.x );
- y = Math.abs( aig.y );
- z = Math.abs( aig.z );
-
- // If portrait orientation and in one of the danger zones
- if ( !window.orientation && ( x > 7 || ( ( z > 6 && y < 8 || z < 8 && y > 6 ) && x > 5 ) ) ) {
- if ( zoom.enabled ) {
- zoom.disable();
- }
- } else if ( !zoom.enabled ) {
- zoom.enable();
- }
- }
-
- $.mobile.document.on( "mobileinit", function(){
- if( $.mobile.iosorientationfixEnabled ){
- $.mobile.window
- .bind( "orientationchange.iosorientationfix", zoom.enable )
- .bind( "devicemotion.iosorientationfix", checkTilt );
- }
- });
-
-}( jQuery, this ));
-
-(function( $, window, undefined ) {
- var $html = $( "html" ),
- $head = $( "head" ),
- $window = $.mobile.window;
-
- //remove initial build class (only present on first pageshow)
- function hideRenderingClass() {
- $html.removeClass( "ui-mobile-rendering" );
- }
-
- // trigger mobileinit event - useful hook for configuring $.mobile settings before they're used
- $( window.document ).trigger( "mobileinit" );
-
- // support conditions
- // if device support condition(s) aren't met, leave things as they are -> a basic, usable experience,
- // otherwise, proceed with the enhancements
- if ( !$.mobile.gradeA() ) {
- return;
- }
-
- // override ajaxEnabled on platforms that have known conflicts with hash history updates
- // or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini)
- if ( $.mobile.ajaxBlacklist ) {
- $.mobile.ajaxEnabled = false;
- }
-
- // Add mobile, initial load "rendering" classes to docEl
- $html.addClass( "ui-mobile ui-mobile-rendering" );
-
- // This is a fallback. If anything goes wrong (JS errors, etc), or events don't fire,
- // this ensures the rendering class is removed after 5 seconds, so content is visible and accessible
- setTimeout( hideRenderingClass, 5000 );
-
- $.extend( $.mobile, {
- // find and enhance the pages in the dom and transition to the first page.
- initializePage: function() {
- // find present pages
- var path = $.mobile.path,
- $pages = $( ":jqmData(role='page'), :jqmData(role='dialog')" ),
- hash = path.stripHash( path.stripQueryParams(path.parseLocation().hash) ),
- hashPage = document.getElementById( hash );
-
- // if no pages are found, create one with body's inner html
- if ( !$pages.length ) {
- $pages = $( "body" ).wrapInner( "<div data-" + $.mobile.ns + "role='page'></div>" ).children( 0 );
- }
-
- // add dialogs, set data-url attrs
- $pages.each(function() {
- var $this = $( this );
-
- // unless the data url is already set set it to the pathname
- if ( !$this.jqmData( "url" ) ) {
- $this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search );
- }
- });
-
- // define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback)
- $.mobile.firstPage = $pages.first();
-
- // define page container
- $.mobile.pageContainer = $.mobile.firstPage.parent().addClass( "ui-mobile-viewport" );
-
- // alert listeners that the pagecontainer has been determined for binding
- // to events triggered on it
- $window.trigger( "pagecontainercreate" );
-
- // cue page loading message
- $.mobile.showPageLoadingMsg();
-
- //remove initial build class (only present on first pageshow)
- hideRenderingClass();
-
- // if hashchange listening is disabled, there's no hash deeplink,
- // the hash is not valid (contains more than one # or does not start with #)
- // or there is no page with that hash, change to the first page in the DOM
- // Remember, however, that the hash can also be a path!
- if ( ! ( $.mobile.hashListeningEnabled &&
- $.mobile.path.isHashValid( location.hash ) &&
- ( $( hashPage ).is( ':jqmData(role="page")' ) ||
- $.mobile.path.isPath( hash ) ||
- hash === $.mobile.dialogHashKey ) ) ) {
-
- // Store the initial destination
- if ( $.mobile.path.isHashValid( location.hash ) ) {
- $.mobile.urlHistory.initialDst = hash.replace( "#", "" );
- }
-
- // make sure to set initial popstate state if it exists
- // so that navigation back to the initial page works properly
- if( $.event.special.navigate.isPushStateEnabled() ) {
- $.mobile.navigate.navigator.squash( path.parseLocation().href );
- }
-
- $.mobile.changePage( $.mobile.firstPage, {
- transition: "none",
- reverse: true,
- changeHash: false,
- fromHashChange: true
- });
- } else {
- // trigger hashchange or navigate to squash and record the correct
- // history entry for an initial hash path
- if( !$.event.special.navigate.isPushStateEnabled() ) {
- $window.trigger( "hashchange", [true] );
- } else {
- // TODO figure out how to simplify this interaction with the initial history entry
- // at the bottom js/navigate/navigate.js
- $.mobile.navigate.history.stack = [];
- $.mobile.navigate( $.mobile.path.isPath( location.hash ) ? location.hash : location.href );
- }
- }
- }
- });
-
- // initialize events now, after mobileinit has occurred
- $.mobile.navreadyDeferred.resolve();
-
- // check which scrollTop value should be used by scrolling to 1 immediately at domready
- // then check what the scroll top is. Android will report 0... others 1
- // note that this initial scroll won't hide the address bar. It's just for the check.
- $(function() {
- window.scrollTo( 0, 1 );
-
- // if defaultHomeScroll hasn't been set yet, see if scrollTop is 1
- // it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar)
- // so if it's 1, use 0 from now on
- $.mobile.defaultHomeScroll = ( !$.support.scrollTop || $.mobile.window.scrollTop() === 1 ) ? 0 : 1;
-
- //dom-ready inits
- if ( $.mobile.autoInitializePage ) {
- $.mobile.initializePage();
- }
-
- // window load event
- // hide iOS browser chrome on load
- $window.load( $.mobile.silentScroll );
-
- if ( !$.support.cssPointerEvents ) {
- // IE and Opera don't support CSS pointer-events: none that we use to disable link-based buttons
- // by adding the 'ui-disabled' class to them. Using a JavaScript workaround for those browser.
- // https://github.com/jquery/jquery-mobile/issues/3558
-
- $.mobile.document.delegate( ".ui-disabled", "vclick",
- function( e ) {
- e.preventDefault();
- e.stopImmediatePropagation();
- }
- );
- }
- });
-}( jQuery, this ));
-
-
-}));
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-(function() {
-
- function connected() {
- console.log('Settings daemon connected');
- }
-
- function disconnected(e) {
- console.log('Settings daemon disconnected...');
- if (e == null) {
- showMsg('Error', 'Cannot connect to settings daemon');
- } else {
- showMsg('Error', e);
- }
- }
-
- function init() {
- console.log('Settings started...');
- $('#quit').on('click', function() {
- console.log('Settings exiting...');
- tizen.application.getCurrentApplication().exit();
- });
-
- wsAPI.connect('ws://localhost:16000/', 'http-only', connected, disconnected);
-
- try {
- /* Settings Panel */
- $('#main').on('pageshow', function(event, data) {
- /* TODO: unsubscribe events if neccessary */
- if (data.prevPage.attr('id') === 'page_wifi') {
- console.log('Wi-Fi settings exited');
- settings.wifi.unsubscribeEvents(wifiEventReceived);
- } else if (data.prevPage.attr('id') === 'page_bluetooth') {
- console.log('Bluetooth settings exited');
- settings.wifi.unsubscribeEvents(bluetoothEventReceived);
- } else if (data.prevPage.attr('id') === 'page_datetime') {
- console.log('Date and Time settings exited');
- }
- });
-
- /* Different sub panels */
- wifiPanelInit();
- bluetoothPanelInit();
- datetimePanelInit();
- } catch (e) {
- showMsg('Error', 'Javascript Exception Caught: ' + e);
- }
- }
-
- $(document).ready(function() {
- init();
- })
-})();
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-function bluetoothPanelInit() {
-
- /* Bluetooth Settings Panel */
- $('#page_bluetooth').on('pageshow', function(event, data) {
- if (data.prevPage.attr('id') === 'page_bluetooth_detail') return;
-
- settings.bluetooth.subscribeEvents(bluetoothEventReceived);
- var adapter = settings.bluetooth.getDefaultAdapter();
- if (adapter === null) {
- showMsg('Error', 'Bluetooth adapter not found');
- return;
- }
- console.log('Default BT adapter: ', adapter.name);
-
- if (adapter.name != undefined) {
- $('#label_bluetooth_adapter').html(adapter.name);
- } else {
- $('#label_bluetooth_adapter').html('Bluetooth adapter not found');
- }
-
- if (adapter.powered) {
- bluetoothToggleOn();
- adapter.stopScanDevices(function() {
- bluetoothStartScan(adapter);
- }, null);
- } else {
- bluetoothToggleOff();
- }
- });
-
- $('#toggle_bluetooth').change(function() {
- var adapter = settings.bluetooth.getDefaultAdapter();
- if (adapter === null) {
- showMsg('Error', 'Bluetooth adapter not found');
- bluetoothToggleOff();
- return;
- }
-
- if ($('#toggle_bluetooth').val() === 'off') {
- /* stop scan, then disable bluetooth */
- adapter.stopScanDevices(function() {
- /* success */
- console.log('Bluetooth scan canceled');
- $('#button_bluetooth_scan .ui-btn-text').text('Scan');
- adapter.setPowered(false, function() {
- /* success */
- console.log('Power off adapter success, adapter is powered: ' + adapter.powered);
- bluetoothToggleOff();
- }, function(e) {
- /* error */
- bluetoothToggleOn();
- showMsg('Error', 'Cannot turn off bluetooth adapter: ' + e);
- });
- }, function(e) {
- /* error */
- $('#toggle_bluetooth').val('on').slider('refresh');
- showMsg('Error', 'Cannot cancel scan: ' + e);
- });
- } else {
- adapter.setPowered(true, function() {
- /* success */
- console.log('Power on adapter success, adapter is powered: ' + adapter.powered);
- bluetoothToggleOn();
- bluetoothStartScan(adapter);
- }, function(e) {
- /* error */
- bluetoothToggleOff();
- showMsg('Error', 'Cannot turn on bluetooth adapter: ' + e);
- });
- }
- });
-
- $('#button_bluetooth_scan').on('click', function() {
- var adapter = settings.bluetooth.getDefaultAdapter();
- if (adapter === null) {
- showMsg('Error', 'Bluetooth adapter not found');
- return;
- }
- if ($('#button_bluetooth_scan').text() === 'Scan') {
- bluetoothStartScan(adapter);
- } else {
- bluetoothStopScan(adapter);
- }
- });
-
- /* Bluetooth device detail page */
- $('#page_bluetooth_detail').on('pageshow', function(event, data) {
- var device_id = localStorage.getItem('bluetooth_device_id');
- if (device_id == undefined) return;
- var device = $(jqId(device_id)).data('device-object');
- bluetoothConstructDetailPanel(device);
- });
-}
-
-function bluetoothEventReceived(event) {
- if (event.type !== WS_EVENT_TYPE.BLUETOOTH) return;
- if ($.mobile.activePage.attr('id') !== 'page_bluetooth' || $.mobile.activePage.attr('id') !== 'page_bluetooth_detail') {
- return;
- }
-
- if (event.name === 'PropertyChanged') {
- bluetoothHandlePropertyChanged(event.value);
- } else {
- console.log('Unsupported bluetooth event received: ' + event.name);
- }
-}
-
-function bluetoothHandlePropertyChanged(property) {
- if (property[0] === 'Powered') {
- if (property[1] === true) {
- bluetoothToggleOn();
- adapter.stopScanDevices(function() {
- bluetoothStartScan(adapter);
- }, null);
- } else {
- bluetoothToggleOff();
- }
- }
-}
-
-function bluetoothClearAvailableList() {
- $('#listview_device_available').html('');
-}
-
-function bluetoothStartScan(adapter) {
- /* clear the device list with new scan */
- bluetoothClearAvailableList();
-
- adapter.startScanDevices({
- /* success */
- onstarted: function() {
- console.log('Bluetooth scan started...');
- $('#button_bluetooth_scan .ui-btn-text').text('Stop');
- },
- ondevicefound: function(device) {
- console.log('Bluetoth device found - name: ' + device.name + ', address: ' + device.address + ', is paired: ' + device.paired + ', is connected: ' + device.connected);
- bluetoothUpdateDevice(device);
- },
- ondevicedisappeared: function(address) {
- if ($(jqId(address)).length) {
- bluetoothRemoveFromAvailableList(address);
- }
- },
- onfinished: function(devices) {
- $('#button_bluetooth_scan .ui-btn-text').text('Scan');
- for (var i = 0; i < devices.length; i++) {
- if (!$(jqId(devices[i].address)).length) {
- bluetoothUpdateDevice(devices[i]);
- }
- }
- }
- }, function(e) {
- /* error */
- showMsg('Error', 'Cannot scan: ' + e);
- });
-}
-
-function bluetoothRefreshList() {
- $('#listview_device_paired').listview('refresh');
- $('#listview_device_available').listview('refresh');
-}
-
-function bluetoothStopScan(adapter) {
- adapter.stopScanDevices(function() {
- /* success */
- console.log('Bluetooth scan canceled');
- $('#button_bluetooth_scan .ui-btn-text').text('Scan');
- }, function(e) {
- /* error */
- showMsg('Error', 'Cannot cancel scan: ' + e);
- });
-}
-
-function bluetoothAppendToPairedList(device) {
- if ($('#listview_device_paired').find(jqId(device.address)).length != 0) return;
-
- var parent = '#listview_device_paired';
- bluetoothConstructDeviceElement(parent, device);
- bluetoothUpdateDeviceButton(device);
- bluetoothRefreshList();
-}
-
-function bluetoothRemoveFromPairedList(device_addr) {
- var removeThis = $('#listview_device_paired li').filter(function() {
- return $(this).find(jqId(device_addr)).length === 1;
- });
-
- if (removeThis.length !== 0) {
- removeThis.remove();
- bluetoothRefreshList();
- }
-}
-
-function bluetoothAppendToAvailableList(device) {
- if ($('#listview_device_available').find(jqId(device.address)).length != 0) return;
-
- var parent = '#listview_device_available';
- bluetoothConstructDeviceElement(parent, device);
- bluetoothUpdateDeviceButton(device);
- bluetoothRefreshList();
-}
-
-function bluetoothRemoveFromAvailableList(device_addr) {
- var removeThis = $('#listview_device_available li').filter(function() {
- return $(this).find(jqId(device_addr)).length === 1;
- });
-
- if (removeThis.length !== 0) {
- removeThis.remove();
- bluetoothRefreshList();
- }
-}
-
-function bluetoothConstructDeviceElement(parent, device) {
- var html = '<li data-icon="false"><a href="#" id="' + jqId(device.address).replace('#', '') + '">';
- html += '<img src="images/bluetooth.png" class="device-icon ui-li-icon"></img>';
- html += '<div class="device-name">' + device.name + '</div>';
- html += '<div class="device-address">' + device.address + '</div>';
- html += '<div class="device-status"></div>';
- html += '<div data-role="button" class="device-action-button ui-li-aside" data-inline="true"></div>';
- html += '</a></li>';
- $(parent).append(html).trigger('create');
-
- /* store device object in the element so we can reference it later */
- $(jqId(device.address)).data('device-object', device);
-
- $(jqId(device.address)).on('click', function() {
- localStorage.setItem('bluetooth_device_id', device.address);
- $.mobile.changePage('#page_bluetooth_detail');
- });
-
- $(jqId(device.address)).find('div.device-action-button').on('click', function(e) {
- var parent = $(this).parent().attr('id');
-
- /*
- * prevent the click event to propagate up
- */
- e.stopImmediatePropagation();
- e.preventDefault();
-
- var adapter = settings.bluetooth.getDefaultAdapter();
- if (adapter === null) return;
-
- /* retrieve the device object from element */
- var device = $(jqId(parent)).data('device-object');
- if (device == undefined) {
- console.error('Bluetooth device not found');
- return;
- }
-
- if (!device.paired) {
- createPopupDialog(false, false, 'Pair with', device.name, 'Pair', 'Cancel', function() {
- console.log('Bluetooth pair with device: ' + device.address);
- showSpinner(false, 'Pairing...');
- adapter.pairDevice(device.address, function() {
- /* success */
- hideSpinner();
- device.paired = true;
-
- /* changing from unpaired to paried */
- bluetoothUpdateDevice(device);
- }, function(e) {
- /* error */
- hideSpinner();
- showMsg('Error', 'Bluetooth pair failed: ' + e);
- });
- });
- } else if (device.paired && !device.connected) {
- console.log('Bluetooth connect with device: ' + device.address);
- showMsg('Error', 'Not suppported');
- } else if (device.connected) {
- console.log('Bluetooth disconnect with device: ' + device.address);
- showMsg('Error', 'Not suppported');
- }
- });
-}
-
-function bluetoothUpdateDevice(device) {
- /* reposition device if it's paired or unpaired */
- if (device.paired) {
- bluetoothRemoveFromAvailableList(device.address);
- bluetoothAppendToPairedList(device);
- } else {
- bluetoothRemoveFromPairedList(device.address);
- bluetoothAppendToAvailableList(device);
- }
-
- /* update device button for allowed action */
- bluetoothUpdateDeviceButton(device);
-
- /* update device connection status */
- bluetoothUpdateConnectionStatus(device);
-}
-
-function bluetoothUpdateDeviceButton(device) {
- if (device.paired) {
- if (device.connected) {
- $(jqId(device.address)).find('div.device-action-button').find('span').text('Disconnect');
- } else {
- $(jqId(device.address)).find('div.device-action-button').find('span').text('Connect');
- }
- } else {
- $(jqId(device.address)).find('div.device-action-button').find('span').text('Pair');
- }
-}
-
-function bluetoothUpdateConnectionStatus(device) {
- var status = 'unpaired';
- if (device.paired) {
- $(jqId(device.address)).addClass('device-paired');
- if (device.connected) {
- status = 'connected';
- $(jqId(device.address)).addClass('device-connected');
- } else {
- status = 'disconnected';
- $(jqId(device.address)).removeClass('device-connected');
- }
- } else {
- $(jqId(device.address)).removeClass('device-paired');
- $(jqId(device.address)).removeClass('device-connected');
- }
-
- bluetoothUpdateConnectionStatusText(device, status);
-}
-
-function bluetoothUpdateConnectionStatusText(device, status) {
- $(jqId(device.address)).find('div.device-status').text(status);
-}
-
-function bluetoothConstructDetailPanel(device) {
- var status_paired = 'No';
- var status_connected = 'No';
-
- if (device == null) return;
- if (device.paired) status_paired = 'Yes';
- if (device.connected) status_connected = 'Yes';
-
- $('#page_bluetooth_detail_content').html('');
- var html = '<ul data-role="listview" id="listview_bluetooth_detail" data-inset="true" ' + 'class="device-list ui-listview">';
- html += '<li id="bluetooth_detail_name"><h2>Device Name: ' + device.name + '</h2></li>';
- html += '<li id="bluetooth_detail_address"><h2>Device Address: ' + device.address + '</h2></li>';
- html += '<li id="bluetooth_detail_paired"><h2>Paired: ' + status_paired + '</h2></li>';
- html += '<li id="bluetooth_detail_connected"><h2>Connected: ' + status_connected + '</h2></li>';
- html += '</ul>';
- $('#page_bluetooth_detail_content').append(html).trigger('create');
-
- if (device.paired) {
- html = '<div data-role="button" id="button_bluetooth_unpair">Unpair</div>';
- $('#page_bluetooth_detail_content').append(html).trigger('create');
-
- $('#button_bluetooth_unpair').on('click', function(e) {
- console.log('Bluetooth unpair with device: ' + device.address);
- var adapter = settings.bluetooth.getDefaultAdapter();
- if (adapter === null) return;
-
- createPopupDialog(false, false, 'Unpair with device', device.name, 'Unpair', 'Cancel', function() {
- showSpinner(false, 'Unpairing...');
- adapter.unpairDevice(device.address, function() {
- /* success */
- hideSpinner();
- device.paired = false;
- device.connected = false;
- $('#button_bluetooth_unpair').remove();
-
- /* changing from paired to unparied */
- bluetoothUpdateDevice(device);
- setTimeout(function() {
- $.mobile.changePage('#page_bluetooth');
- }, 1000);
- }, function(e) {
- /* error */
- hideSpinner();
- showMsg('Error', 'Bluetooth unpair failed: ' + e);
-
- /* Something is wrong, remove from paired list */
- bluetoothRemoveFromPairedList(device.address);
- });
- });
- });
- }
- $('#listview_bluetooth_detail').listview('refresh');
-}
-
-function bluetoothUpdateDetailPanel(device) {
- var status_paired = 'No';
- var status_connected = 'No';
-
- if (device == null) return;
- if (device.paired) status_paired = 'Yes';
- if (device.connected) status_connected = 'Yes';
- $('#bluetooth_detail_paired').text(connected);
- $('#bluetooth_detail_connected').text(status_connected);
- $('#listview_bluetooth_detail').listview('refresh');
-}
-
-function bluetoothToggleOn() {
- setTimeout(function() {
- $('#bluetooth_devices').show();
- $('#toggle_bluetooth').val('on').slider('refresh');
- }, 100);
-}
-
-function bluetoothToggleOff() {
- setTimeout(function() {
- $('#bluetooth_devices').hide();
- $('#toggle_bluetooth').val('off').slider('refresh');
- }, 100);
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-var clockTimer = null;
-var timeChanged = false;
-var dateChanged = false;
-var timezoneChanged = false;
-var automaticTime = false;
-var automaticTimezone = false;
-
-function datetimePanelInit() {
-
- /* Display Settings Panel */
- $('#page_datetime').on('pageshow', function() {
- datetimePageReload();
- });
-
- $('#toggle_timeupdates').change(function() {
- if ($('#toggle_timeupdates').val() === 'auto') {
- settings.datetime.setTimeUpdates("auto", function() {
- datetimePageReload();
- }, function(e) {
- timeUpdatesToggle('manual');
- datetimePageReload();
- showMsg('Error', 'Cannot set time updates to automatic: ' + e);
- });
- } else {
- settings.datetime.setTimeUpdates("manual", function() {
- datetimePageReload();
- }, function(e) {
- timeUpdatesToggle('auto');
- datetimePageReload();
- showMsg('Error', 'Cannot set time updates to manual: ' + e);
- });
- }
- });
-
- $('#input_time').on('change', function(event, data) {
- console.log('input_time changed');
- if (automaticTime) return;
-
- var re = /^([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/;
- if (this.value === '' || !this.value.match(re)) {
- datetimeHideOption();
- showMsg('Error', 'Invalid time format (hh:mm:ss): ' + this.value);
- return;
- }
-
- timeChanged = true;
- datetimeShowOption();
- });
-
- $('#input_date').on('change', function(event, data) {
- console.log('input_date changed');
- if (automaticTime) return;
-
- var re = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$/;
- if (this.value === '' || !this.value.match(re)) {
- datetimeHideOption();
- showMsg('Error', 'Invalid date format (yyyy-mm-dd): ' + this.value);
- return;
- }
-
- dateChanged = true;
- datetimeShowOption();
- });
-
- $('#toggle_timezoneupdates').change(function() {
- if ($('#toggle_timezoneupdates').val() === 'auto') {
- settings.datetime.setTimezoneUpdates("auto", function() {
- datetimePageReload();
- automaticTimezone = true;
- }, function(e) {
- timezoneUpdatesToggle('manual');
- datetimePageReload();
- showMsg('Error', 'Cannot set timezone updates to automatic: ' + e);
- });
- } else {
- settings.datetime.setTimezoneUpdates("manual", function() {
- datetimePageReload();
- automaticTimezone = false;
- }, function(e) {
- timezoneUpdatesToggle('auto');
- datetimePageReload();
- showMsg('Error', 'Cannot set time zone updates to manual: ' + e);
- });
- }
- });
-
- $('#select_timezone').on('change', function(event, data) {
- console.log('select_timezone changed');
- if (automaticTimezone) return;
-
- /* ignore change due to getLocalTimezone() */
- if (data === false) return;
-
- timezoneChanged = true;
- var timezone = this.value;
- console.log('time zone show option');
- datetimeShowOption();
- });
-
- $('#button_datetime_apply').on('click', function(event, data) {
- if (timeChanged || dateChanged) {
- timeChanged = false;
- dateChanged = false;
- updateSystemTime();
- }
-
- if (timezoneChanged) {
- timezoneChanged = false;
- updateSystemTimezone();
- }
-
- datetimeHideOption();
- });
-
- $('#button_datetime_cancel').on('click', function(event, data) {
- datetimePageReload();
- });
-
- $('#page_datetime_button_back').on('click', function() {
- datetimeStopTimer();
- });
-}
-
-function datetimePageReload() {
- var current = null;
- timeChanged = false;
- dateChanged = false;
- timezoneChanged = false;
-
- datetimeHideOption();
-
- settings.datetime.isTimeAuto(function(isAuto) {
- automaticTime = isAuto;
- if (isAuto) {
- timeUpdatesToggle('auto');
- } else {
- timeUpdatesToggle('manual');
- }
- }, function(e) {
- showMsg('Error', e);
- });
-
- settings.datetime.isTimezoneAuto(function(isAuto) {
- automaticTimezone = isAuto;
- if (isAuto) {
- timezoneUpdatesToggle('auto');
- } else {
- timezoneUpdatesToggle('manual');
- }
- }, function(e) {
- showMsg('Error', e);
- });
-
- current = new Date();
- console.log('Local datetime is ' + current.toISOString());
-
- timeStr = datetimeGetStr(current.getHours()) + ':';
- timeStr += datetimeGetStr(current.getMinutes()) + ':';
- timeStr += datetimeGetStr(current.getSeconds());
- $('#input_time').val(timeStr);
-
- dateStr = datetimeGetStr(current.getFullYear()) + '-';
- dateStr += datetimeGetStr(current.getMonth()) + '-';
- dateStr += datetimeGetStr(current.getDate());
- $('#input_date').val(dateStr);
-
- datetimeStartTimer();
-
- if (tizen.time) {
- var alltimezones = tizen.time.getAvailableTimezones();
- console.log('Local timezone: ' + tizen.time.getLocalTimezone());
- if (alltimezones.length > 0) {
- $('#select_timezone').empty();
- for (var i = 0; i < alltimezones.length; i++) {
- $('#select_timezone').append(new Option(alltimezones[i], alltimezones[i]));
- }
- }
- $('#select_timezone').val(tizen.time.getLocalTimezone()).trigger('change', false);
- }
-}
-
-function datetimeShowOption() {
- $('#button_datetime_apply').show();
- $('#button_datetime_cancel').show();
-}
-
-function datetimeHideOption() {
- $('#button_datetime_apply').hide();
- $('#button_datetime_cancel').hide();
-}
-
-function datetimeStartTimer() {
- datetimeStopTimer();
- clockTimer = setInterval(dateTimeUpdateClock, 1000);
-}
-
-function datetimeStopTimer() {
- if (clockTimer) {
- clearInterval(clockTimer);
- }
-}
-
-function dateTimeUpdateClock() {
- var current = new Date();
-
- var timeStr = datetimeGetStr(current.getHours()) + ':';
- timeStr += datetimeGetStr(current.getMinutes()) + ':';
- timeStr += datetimeGetStr(current.getSeconds());
-
- var dateStr = datetimeGetStr(current.getFullYear()) + '-';
- dateStr += datetimeGetStr(current.getMonth()) + '-';
- dateStr += datetimeGetStr(current.getDate());
-
- if (!timeChanged && !$("#input_time").is(":focus")) {
- $('#input_time').val(timeStr);
- }
-
- if (!dateChanged && !$("#input_date").is(":focus")) {
- $('#input_date').val(dateStr);
- }
-}
-
-function updateSystemTime() {
- var time = $('#input_date').val() + ' ' + $('#input_time').val();
-
- if (time.split(":").length - 1 == 1) {
- /* this is a bug where seconds are not set after date picker is launched */
- time += ':00';
- }
-
- /* settings daemon expects number of seconds since midnight Jan 1, 1970 */
- var year = Number(time.split(" ")[0].split('-')[0]);
- var month = Number(time.split(" ")[0].split('-')[1]);
- var day = time.split(" ")[0].split('-')[2];
- var hour = Number(time.split(" ")[1].split(':')[0]);
- var minute = Number(time.split(" ")[1].split(':')[1]);
- var second = Number(time.split(" ")[1].split(':')[2]);
- var date = new Date(year, month, day, hour, minute, second, 0);
- var epoch_time = date.getTime() / 1000;
-
- settings.datetime.setTime(epoch_time, function() {
- console.log('System time is set to: ' + date + ' or ' + epoch_time + ' seconds since 1/1/1970');
- datetimePageReload();
- }, function(e) {
- showMsg('Error', 'Cannot set system time: ' + e);
- datetimePageReload();
- });
-}
-
-function updateSystemTimezone() {
- var value = $('#select_timezone').val();
- settings.datetime.setTimezone(value, function() {
- console.log('System timezone is set to: ' + value);
- }, function(e) {
- showMsg('Error', 'Cannot set system timezone: ' + e);
- });
-}
-
-function datetimeGetStr(value) {
- if (0 < value && value < 10) {
- return '0' + value;
- } else {
- return '' + value;
- }
-}
-
-function timeUpdatesToggle(value) {
- if (value !== 'auto' && value !== 'manual') return;
-
- if (value === 'auto') {
- $('#input_time').attr('readonly', true);
- $('#input_date').attr('readonly', true);
- } else {
- $('#input_time').attr('readonly', false);
- $('#input_date').attr('readonly', false);
- }
- setTimeout(function() {
- $('#toggle_timeupdates').val(value).slider('refresh');
- }, 100);
-}
-
-function timezoneUpdatesToggle(value) {
- if (value !== 'auto' && value !== 'manual') return;
-
- if (value === 'auto') {
- $('#select_timezone').selectmenu('disable');
- } else {
- $('#select_timezone').selectmenu('enable');
- }
- setTimeout(function() {
- $('#toggle_timezoneupdates').val(value).slider('refresh');
- }, 100);
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-var wifiScanInProgress = false;
-
-function wifiPanelInit() {
-
- /* WiFi Settings Panel */
- $('#page_wifi').on('pageshow', function(event, data) {
- if (data.prevPage.attr('id') === 'page_wifi_detail') return;
-
- settings.wifi.subscribeEvents(wifiEventReceived);
- var adapter = settings.wifi.getDefaultAdapter();
- if (adapter === null) {
- showMsg('Error', 'WiFi adapter not found');
- return;
- }
-
- if (adapter.name != undefined) {
- $('#label_wifi_adapter').html(adapter.name);
- } else {
- $('#label_wifi_adapter').html('WiFi adapter not found');
- }
-
- adapter.getPowered(function(is_powered) {
- if (is_powered) {
- wifiClearKnownList();
- wifiClearAvailableList();
- wifiToggleOn();
- setTimeout(function() {
- wifiScan(adapter);
- }, 1000);
- } else {
- wifiToggleOff();
- }
- }, function(e) {
- showMsg('Error', 'Cannot get WiFi state: ' + e);
- });
- });
-
- $('#toggle_wifi').change(function() {
- if (wifiScanInProgress) return;
-
- var adapter = settings.wifi.getDefaultAdapter();
- if (adapter === null) {
- showMsg('Error', 'WiFi adapter not found');
- wifiToggleOff();
- return;
- }
-
- if ($('#toggle_wifi').val() === 'off') {
- adapter.setPowered(false, function() {
- /* success */
- console.log('Successfully disable wifi subsystem');
- wifiToggleOff();
- }, function(e) {
- /* error */
- wifiToggleOn();
- showMsg('Error', 'Cannot disable WiFi subsystem: ' + e);
- });
- } else {
- adapter.setPowered(true, function() {
- /* success */
- console.log('Successfully enable WiFi subsystem');
- wifiClearKnownList();
- wifiClearAvailableList();
- wifiToggleOn();
- setTimeout(function() {
- wifiScan(adapter);
- }, 1000);
- }, function(e) {
- /* error */
- wifiToggleOff();
- showMsg('Error', 'Cannot enable WiFi subsystem: ' + e);
- });
- }
- });
-
- $('#button_wifi_refresh').on('click', function() {
- var adapter = settings.wifi.getDefaultAdapter();
- if (adapter === null) {
- showErr('Error', 'WiFi adapter not found');
- }
-
- wifiScan(adapter);
- });
-
- $('#button_wifi_add').on('click', function() {
- if (wifiScanInProgress) return;
-
- /* Not fully implemented, disable for now */
- showMsg('Error', 'Not supported');
- return;
-
- var adapter = settings.wifi.getDefaultAdapter();
- if (adapter === null) {
- showMsg('Error', 'WiFi adapter not found');
- }
-
- $.mobile.changePage('#page_wifi_add');
- });
-
- /* WiFi network detail page */
- $('#page_wifi_detail').on('pageshow', function(event, data) {
- var network_id = localStorage.getItem('wifi_network_id');
- if (network_id == undefined) return;
- var network = $(jqId(network_id)).data('network-object');
- wifiConstructDetailPanel(network);
- });
-
- /* WiFi add new network page */
- $('#page_wifi_add').on('pagebeforeshow', function(event, data) {
- $('#input_wifi_ssid').val('');
- $('#input_wifi_password').val('');
- $('#select_wifi_security').val('None').change();
- $('#input_wifi_password').textinput('disable');
- });
-
- $('#page_wifi_button_add').on('click', function() {
- var adapter = settings.wifi.getDefaultAdapter();
- var ssid = $('#input_wifi_ssid').val();
- var security_option = $('#select_wifi_security').val();
- var passcode = $('#input_wifi_password').val();
-
- if (ssid === '') {
- showMsg('Error', 'Enter SSID');
- return;
- }
- if (security_option !== 'None') {
- showMsg('Error', 'Not supported');
- return;
- }
-
- showSpinner(false, 'Connecting...');
- adapter.connectNetwork(ssid, security_option, passcode, function() {
- /* success */
- hideSpinner();
- $.mobile.changePage('#page_wifi');
-
- }, function(e) {
- /* error */
- hideSpinner();
- showMsg('Error', 'WiFi connect failed: ' + e);
- });
- });
-
- $('#select_wifi_security').on('change', function(event, data) {
- var security = this.value;
-
- if (security === 'None') {
- $('#input_wifi_password').textinput('disable');
- $('#input_wifi_password').val('');
- } else {
- $('#input_wifi_password').textinput('enable');
- }
- });
-}
-
-function wifiEventReceived(event) {
- if (event.type !== WS_EVENT_TYPE.WIFI) return;
- if ($.mobile.activePage.attr('id') !== 'page_wifi' && $.mobile.activePage.attr('id') !== 'page_wifi_detail') {
- return;
- }
-
- if (event.name === 'ServicesChanged') {
- wifiHandleServicesChanged(event.id, event.value);
- } else if (event.name === 'PropertyChanged') {
- wifiHandlePropertyChanged(event.id, event.value);
- } else {
- console.log('Unsupported WiFi event received: ' + event.name);
- }
-}
-
-function wifiHandleServicesChanged(object_path, services) {
- var servicesChanged = services[0];
- var servicesRemoved = services[1];
-
- if ($('#toggle_wifi').val() === 'off') return;
-
- console.log(servicesChanged.length + ' networks changed');
- for (var i = 0; i < servicesChanged.length; i++) {
- if (servicesChanged[i][0] === undefined) {
- console.log('Invalid parameters, missing object path');
- continue;
- }
-
- if (servicesChanged[i][1].Type === 'wifi') {
- var network = $(jqId(servicesChanged[i][0])).data('network-object');
-
- if (network == null) {
- console.log('could not find network object ' + servicesChanged[i][0]);
- continue;
- }
-
- var network = new settings.wifi.WiFiNetwork(servicesChanged[i][0]);
- if (servicesChanged[i][1].Name !== undefined) {
- network.ssid = servicesChanged[i][1].Name;
- }
- if (servicesChanged[i][1].State === 'ready') {
- network.connected = true;
- } else if (servicesChanged[i][1].State === 'idle') {
- network.connected = false;
- }
- if (servicesChanged[i][1].EncryptionMode !== undefined) {
- network.encryption = servicesChanged[i][1].EncryptionMode;
- }
- if (servicesChanged[i][1].Strength !== undefined) {
- network.strength = servicesChanged[i][1].Strength;
- }
- if (servicesChanged[i][1].IPv4.Address !== undefined) {
- network.ipAddress = servicesChanged[i][1].IPv4.Address;
- }
- if (servicesChanged[i][1].IPv4.Gateway !== undefined) {
- network.gateway = servicesChanged[i][1].IPv4.Gateway;
- }
- if (servicesChanged[i][1].IPv4.Netmask !== undefined) {
- network.netmask = servicesChanged[i][1].IPv4.Netmask;
- }
-
- if ($.mobile.activePage.attr('id') === 'page_wifi') {
- console.log('Network updated');
- wifiUpdateNetwork(network);
- }
- }
- }
-
- console.log(servicesRemoved.length + ' networks removed');
- for (var i = 0; i < servicesRemoved.length; i++) {
- if (servicesRemoved[i] === undefined) {
- console.log('Invalid parameters, missing object path');
- continue;
- }
-
- wifiRemoveFromKnownList(servicesRemoved[i]);
- wifiRemoveFromAvailableList(servicesRemoved[i]);
- }
-}
-
-function wifiHandlePropertyChanged(id, property) {
- if (property[0] === 'Powered') {
- if (property[1] === true) {
- wifiClearKnownList();
- wifiClearAvailableList();
- wifiToggleOn();
- setTimeout(function() {
- var adapter = settings.wifi.getDefaultAdapter();
- wifiScan(adapter);
- }, 1000);
- } else {
- wifiToggleOff();
- }
- }
-
- /* if wifi is off, ignore all the propertyChanged events */
- if ($('#toggle_wifi').val() === 'off') return;
-
- if (property[0] === 'State') {
- /* specific network has changed */
- var network = $(jqId(parent)).data('network-object');
- if (network == null) {
- console.error('Wifi network not found');
- return;
- }
-
- if (property[1] === 'ready') {
- network.connected = true;
- } else if (property[1] === 'idle') {
- network.connected = false;
- }
-
- wifiUpdateNetwork(network);
- } else if (property[0] === 'Connected') {
- /* unknown network has changed, sync WiFi network */
- console.log('Unknown network connected property changed');
- var adapter = settings.wifi.getDefaultAdapter();
- wifiSync(adapter, null, null);
- }
-}
-
-function wifiClearKnownList() {
- $('#listview_network_known').html('');
-}
-
-function wifiClearAvailableList() {
- $('#listview_network_available').html('');
-}
-
-function wifiScan(adapter) {
- if (wifiScanInProgress) return;
-
- console.log('Start wifi scan');
- /* clear the network list with new scan */
- wifiClearKnownList();
- wifiClearAvailableList();
-
- showSpinner(false, 'Scanning...');
- wifiScanInProgress = true;
- $('#toggle_wifi').slider('disable');
- $('#toggle_wifi').slider('refresh');
- adapter.scan(function(networks) {
- hideSpinner();
- wifiScanInProgress = false;
- $('#toggle_wifi').slider('enable');
- $('#toggle_wifi').slider('refresh');
- console.log('found ' + networks.length + ' wifi networks');
- for (var i = 0; i < networks.length; i++) {
- var network = networks[i];
- if (network.ssid && network.ssid !== '') {
- wifiUpdateNetwork(network);
- } else {
- console.log('Skipping hidden network - ' + network.ipAddress);
- }
- }
- }, function(e) {
- hideSpinner();
- wifiScanInProgress = false;
- $('#toggle_wifi').slider('enable');
- $('#toggle_wifi').slider('refresh');
- showMsg('Error', 'Cannot scan: ' + e);
- });
-}
-
-function wifiSync(adapter, success_cb, error_cb) {
- if (wifiScanInProgress) return;
-
- console.log('Start wifi sync');
- /* clear the network list with new scan */
- wifiClearKnownList();
- wifiClearAvailableList();
-
- wifiScanInProgress = true;
- $('#toggle_wifi').slider('disable');
- $('#toggle_wifi').slider('refresh');
- adapter.scan(function(networks) {
- hideSpinner();
- wifiScanInProgress = false;
- $('#toggle_wifi').slider('enable');
- $('#toggle_wifi').slider('refresh');
- console.log('found ' + networks.length + ' wifi networks');
- for (var i = 0; i < networks.length; i++) {
- var network = networks[i];
- if (network.ssid && network.ssid !== '') {
- wifiUpdateNetwork(network);
- }
- }
- if (success_cb) {
- success_cb();
- }
- }, function(e) {
- wifiScanInProgress = false;
- $('#toggle_wifi').slider('enable');
- $('#toggle_wifi').slider('refresh');
- if (error_cb) {
- error_cb(e);
- }
- });
-}
-
-function wifiRefreshList() {
- $('#listview_network_known').listview('refresh');
- $('#listview_network_available').listview('refresh');
-}
-
-function wifiAppendToKnownList(network) {
- if ($('#listview_network_known').find(jqId(network.id)).length != 0) return;
-
- var parent = '#listview_network_known';
- wifiConstructNetworkElement(parent, network);
- wifiUpdateNetworkButton(network);
- wifiRefreshList();
-}
-
-function wifiRemoveFromKnownList(network_id) {
- var removeThis = $('#listview_network_known li').filter(function() {
- return $(this).find(jqId(network_id)).length === 1;
- });
-
- if (removeThis.length !== 0) {
- removeThis.remove();
- wifiRefreshList();
- }
-}
-
-function wifiAppendToAvailableList(network) {
- if ($('#listview_network_available').find(jqId(network.id)).length != 0) return;
-
- var parent = '#listview_network_available';
- wifiConstructNetworkElement(parent, network);
- wifiUpdateNetworkButton(network);
- wifiRefreshList();
-}
-
-function wifiRemoveFromAvailableList(network_id) {
- var removeThis = $('#listview_network_available li').filter(function() {
- return $(this).find(jqId(network_id)).length === 1;
- });
-
- if (removeThis.length !== 0) {
- removeThis.remove();
- wifiRefreshList();
- }
-}
-
-function getSignalStrengthStr(strength) {
- var signal_strength = 'unknown';
- if (strength > 0 && strength <= 20) {
- strength = 'very poor';
- } else if (strength > 20 && strength <= 40) {
- signal_strength = 'poor';
- } else if (strength > 40 && strength <= 70) {
- signal_strength = 'average';
- } else if (strength > 70 && strength <= 90) {
- signal_strength = 'good';
- } else if (strength > 90 && strength <= 100) {
- signal_strength = 'excellent';
- }
- return signal_strength;
-}
-
-function wifiConstructNetworkElement(parent, network) {
- var html = '<li data-icon="false"><a href="#" id="' + jqId(network.id).replace('#', '') + '">';
- html += '<div class="network-ssid">' + network.ssid + '</div>';
- html += '<div class="network-encryption">Encryption: ' + network.encryption + '</div>';
- html += '<div class="network-strength">Signal: ' + getSignalStrengthStr(network.strength) + '</div>';
- html += '<div class="network-status"></div>';
- html += '<div data-role="button" class="network-action-button ui-li-aside" data-inline="true"></div>';
- html += '</a></li>';
- $(parent).append(html).trigger('create');
-
- /* store network object in the element so we can reference it later */
- $(jqId(network.id)).data('network-object', network);
-
- $(jqId(network.id)).on('click', function() {
- localStorage.setItem('wifi_network_id', network.id);
- $.mobile.changePage('#page_wifi_detail');
- });
-
- $(jqId(network.id)).find('div.network-action-button').on('click', function(e) {
- var parent = $(this).parent().attr('id');
-
- /*
- * prevent the click event to propagate up
- */
- e.stopImmediatePropagation();
- e.preventDefault();
-
- var adapter = settings.wifi.getDefaultAdapter();
- if (adapter === null) return;
-
- /* retrieve the network object from element */
- var network = $(jqId(parent)).data('network-object');
- if (network == null) {
- console.error('Wifi network not found');
- return;
- }
-
- if (!network.connected && network.encryption !== 'none') {
- /* Encryption based connection not supported now */
- showMsg('Error', 'Only open networks are supported');
- return;
- }
-
- if (!network.connected) {
- createPopupDialog(false, false, 'Connect to network', network.ssid, 'Connect', 'Cancel', function() {
- console.log('WiFi connect to network: ' + network.ssid);
- showSpinner(false, 'Connecting...');
- adapter.connectNetwork(network.id, null, null, function() {
- /* success */
- wifiSync(adapter, function() {
- hideSpinner();
- }, function(e) {
- /* changing from disconnected to connected */
- hideSpinner();
- network.connected = true;
- wifiUpdateNetwork(network);
- })
- }, function(e) {
- /* error */
- hideSpinner();
- showMsg('Error', 'WiFi connect failed: ' + e);
- });
- });
- } else {
- console.log('Wifi disconnect from network: ' + network.ssid);
- showSpinner(false, 'Disconnecting...');
- adapter.disconnectNetwork(network.id, function() {
- /* success */
- wifiSync(adapter, function() {
- hideSpinner();
- }, function(e) {
- /* changing from connected to disconnected */
- hideSpinner();
- network.connected = false;
- wifiUpdateNetwork(network);
- })
- }, function(e) {
- /* error */
- hideSpinner();
- showMsg('Error', 'Network disconnect failed: ' + e);
- });
- }
- });
-}
-
-function wifiUpdateNetwork(network) {
- /* reposition device if it's connected or disconnected */
- if (network.connected) {
- wifiRemoveFromAvailableList(network.id);
- wifiAppendToKnownList(network);
- } else {
- wifiRemoveFromKnownList(network.id);
- wifiAppendToAvailableList(network);
- }
-
- /* update network button for allowed action */
- wifiUpdateNetworkButton(network);
-
- /* update network connection status */
- wifiUpdateConnectionStatus(network);
-
- /* update network detail panel */
- if ($.mobile.activePage.attr('id') === 'page_wifi_detail') {
- var network_id = localStorage.getItem('wifi_network_id');
- if (network_id == undefined) return;
- var network_object = $(jqId(network_id)).data('network-object');
- if (network.id === network_object.id) {
- wifiConstructDetailPanel(network);
- }
- }
-}
-
-function wifiUpdateNetworkButton(network) {
- if (network.connected) {
- $(jqId(network.id)).find('div.network-action-button').find('span').text('Disconnect');
- } else {
- $(jqId(network.id)).find('div.network-action-button').find('span').text('Connect');
- }
-}
-
-function wifiUpdateConnectionStatus(network) {
- var status = 'disconnected';
- if (network.connected) {
- $(jqId(network.id)).addClass('network-connected');
- status = 'connected';
- } else {
- status = 'disconnected';
- $(jqId(network.id)).removeClass('network-connected');
- }
-
- wifiUpdateConnectionStatusText(network, status);
-}
-
-function wifiUpdateConnectionStatusText(network, status) {
- $(jqId(network.id)).find('div.network-status').text(status);
-}
-
-function wifiConstructDetailPanel(network) {
- var status_connected = 'No';
-
- if (network == null) return;
- if (network.connected) status_connected = 'Yes';
-
- $('#page_wifi_detail_content').html('');
- var html = '<ul data-role="listview" id="listview_network_detail" data-inset="true" ' + 'class="network-list ui-listview">';
- html += '<li id="network_detail_ssid"><h2>SSID: ' + network.ssid + '</h2></li>';
- html += '<li id="network_detail_encryption"><h2>Encryption: ' + network.encryption + '</h2></li>';
- html += '<li id="network_detail_strength"><h2>Signal Strength: ' + network.strength + '</h2></li>';
- html += '<li id="network_detail_connected"><h2>Connected: ' + status_connected + '</h2></li>';
- if (network.connected) {
- html += '<li id="network_detail_ip_address"><h2>IP Address: ' + network.ipAddress + '</h2></li>';
- html += '<li id="network_detail_gateway"><h2>Gateway: ' + network.gateway + '</h2></li>';
- html += '<li id="network_detail_netmask"><h2>Netmask: ' + network.netmask + '</h2></li>';
- }
- html += '</ul>';
- $('#page_wifi_detail_content').append(html).trigger('create');
- $('#listview_wifi_detail').listview('refresh');
-}
-
-function wifiUpdateDetailPanel(network) {
- var status_connected = 'No';
-
- if (network == null) return;
- if (network.connected) status_connected = 'Yes';
- $('#wifi_detail_connected').text(status_connected);
- $('#listview_wifi_detail').listview('refresh');
-}
-
-function wifiToggleOn() {
- setTimeout(function() {
- $('#wifi_networks').show();
- $('#toggle_wifi').val('on').slider('refresh');
- }, 100);
-}
-
-function wifiToggleOff() {
- setTimeout(function() {
- $('#wifi_networks').hide();
- $('#toggle_wifi').val('off').slider('refresh');
- }, 100);
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-function jqId(id) {
- if (id == undefined) return null;
-
- /* replace colons and spaces with dash for jquery ids */
- return '#' + id.replace(/:| |\//g, '-');
-}
-
-function showMsg(title, message) {
- if (title == 'Error') {
- console.error(message);
- if (message.indexOf(ERROR_SETTINGSD_DISCONNECTED) >= 0) {
- createPopupDialog(false, false, ERROR_SETTINGSD_DISCONNECTED, 'Reconnect?', 'OK', 'Cancel', function() {
- console.log('Reconnecting to settings daemon...');
- wsAPI.reconnect();
- });
- return;
- }
- } else {
- console.log(message);
- }
- createPopupDialog(true, false, title, message);
-}
-
-function showInputDialog(title, input_message, ok_button_text, cancel_button_text, ok_callback) {
- createPopupDialog(false, true, title, input_message, ok_button_text, cancel_button_text, ok_callback);
-}
-
-function createPopupDialog(dismiss, is_input, title, message, ok_button_text, cancel_button_text, ok_callback) {
- // inject popup element
- var $dialog = $('<div/>').popup({
- dismissible: 'false',
- transition: 'none'
- }).bind('popupafterclose', function() {
- // remove element from page
- $(this).remove();
- });
-
- $('<h3/>', {
- text: title
- }).appendTo($dialog);
-
- if (is_input) {
-
- } else {
- $('<p/>', {
- text: message
- }).appendTo($dialog);
- }
-
- $('<a>', {
- text: ok_button_text ? ok_button_text : 'Ok'
- }).buttonMarkup({
- inline: true,
- }).on('click', function() {
- $dialog.popup('close');
- if (ok_callback) {
- if (is_input) {
- /* TODO implement getting input from field */
- ok_callback();
-
- } else {
- ok_callback();
- }
- }
- }).appendTo($dialog);
-
- if (cancel_button_text) {
- /* only create cancel button if requested */
- $('<a>', {
- text: cancel_button_text,
- }).buttonMarkup({
- inline: true,
- }).on('click', function() {
- $dialog.popup('close');
- }).appendTo($dialog);
- }
-
- $dialog.popup('open').trigger('create');
- $dialog.popup({
- dismissible: dismiss
- });
-}
-
-function showSpinner(dismiss, message) {
- $.mobile.loading('show', {
- text: message,
- theme: 'a',
- textVisible: true,
- textonly: false
- });
-}
-
-function hideSpinner() {
- $.mobile.loading('hide');
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013, Intel Corporation.
- *
- * This program is licensed under the terms and conditions of the
- * Apache License, version 2.0. The full text of the Apache License is at
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-
-/* Dummy backend for faking websocket daemon */
-var dummyBackend = true;
-
-var ERROR_SETTINGSD_DISCONNECTED = 'Settings daemon is not connected';
-
-var WS_REQUEST_TYPE = {
- WIFI: "wifi",
- BLUETOOTH: "bluetooth",
- DISPLAY: "display",
- SOUND: "sound",
- DATETIME: "clock",
- LOCALE: "locale"
-};
-
-var WS_EVENT_TYPE = {
- WIFI: "wifi",
- BLUETOOTH: "bluetooth",
- DISPLAY: "display",
- SOUND: "sound",
- DATETIME: "clock",
- LOCALE: "locale"
-};
-
-/* web socket module to connect to the settings daemon */
-var wsAPI = (function() {
- /* number of connection retries to attempt if the socket closes */
- var self = this;
- this.connected = false;
- this.event_callbacks = $.Callbacks();
-
- /* default values for WebSocket */
- this.socketUrl = 'ws://localhost:16000/';
- this.socketProtocol = 'http-only';
-
- this.timeouttime = 15000;
- this.methodIdx = 0;
- this.methodCalls = [];
- for (var i = 0; i < 100; i++) {
- this.methodCalls[i] = null;
- }
-
- this.MethodCall = function(id, name, success_cb, error_cb) {
- var me = this;
- this.successCB = success_cb;
- this.errorCB = error_cb;
- this.transactionid = id;
- this.name = name;
- this.done = false;
- this.start = function() {
- me.timeout = setTimeout(function() {
- if (me.errorCB !== undefined) {
- me.errorCB('\"' + me.name + '\" method timed out after ' + self.timeouttime + ' ms');
- }
- me.finish();
- }, self.timeouttime);
- }
- this.finish = function() {
- if (me.timeout !== undefined) {
- clearTimeout(me.timeout);
- }
- me.done = true;
- }
- }
-
- this.EventObject = function(type, id, name, value) {
- var me = this;
- this.type = type;
- this.id = id;
- this.name = name;
- this.value = value;
- }
-
- function connect(url, protocol, sucess_cb, error_cb) {
- self.socketUrl = typeof url !== 'undefined' ? url : self.socketUrl;
- self.socketProtocol = typeof protocol !== 'undefined' ? protocol : self.socketProtocol;
- self.successCB = sucess_cb;
- self.errorCB = error_cb;
-
- if ('WebSocket' in window) {
- if (self.socketProtocol.length > 0) {
- self.socket = new WebSocket(self.socketUrl, self.socketProtocol);
- } else {
- self.socket = new WebSocket(self);
- }
- console.log('Connecting to websocket: ' + self.socketUrl);
-
- self.socket.onopen = function() {
- self.connected = true;
- console.log('websocket opened');
- self.successCB();
- };
-
- self.socket.onclose = function(code, reason, remote) {
- self.connected = false;
- console.log('websocket closed - ' + reason);
-
- if (dummyBackend) {
- /* fake the connection for dummy backend */
- self.connected = true;
- self.successCB();
- return;
- }
-
- self.errorCB(reason);
- };
-
- self.socket.onerror = function(e) {
- if (dummyBackend) {
- /* ignore websocket error */
- return;
- }
-
- if (e.data) {
- self.errorCB('websocket error: ' + e.data);
- } else {
- self.errorCB('websocket error: unknown');
- }
- };
-
- self.socket.onmessage = function(e) {
- receive(e.data);
- };
- } else {
- console.log('Websockets not supported');
- }
- }
-
- function reconnect() {
- if (this.connected) return;
-
- setTimeout(function() {
- connect(self.socketUrl, self.socketProtocol, self.successCB, self.errorCB);
- }, 1000);
- }
-
- function send(msg, success_cb, error_cb) {
- if (!this.connected) {
- if (error_cb !== undefined) {
- error_cb(ERROR_SETTINGSD_DISCONNECTED);
- }
- return;
- }
- var i = this.methodIdx;
- this.methodIdx = (this.methodIdx + 1) % 100;
- this.methodCalls[i] = new this.MethodCall(msg.transactionid, msg.name, success_cb, error_cb);
- this.methodCalls[i].start();
-
- var jsonMsg = JSON.stringify(msg);
- if (dummyBackend) {
- /* fake with dummy data */
- dummyBackendSend(msg);
- } else {
- this.socket.send(jsonMsg);
- }
- }
-
- function fireEvent(type, id, name, value) {
- var event = new this.EventObject(type, id, name, value);
- event_callbacks.fire(event);
- }
-
- function receive(msg) {
- var self = this;
- var response;
- try {
- response = JSON.parse(msg);
- } catch (e) {
- console.error('Garbage message: ' + msg);
- return;
- }
-
- if ((response === undefined) || (response.type === undefined)) {
- console.error('Badly formed message: ' + msg);
- } else if (response.type === 'event' && response.value !== undefined) {
- if (response.value.interface_name === 'net.connman.Manager' || response.value.interface_name === 'net.connman.Service' || response.value.interface_name === 'net.connman.Technology') {
- if (response.value.signal_name === undefined || response.value.parameters === undefined) {
- console.error('Badly formed event: ' + msg);
- return;
- }
- if (response.value.signal_name === 'ServiceChanged' && response.value.parameters.length !== 2) {
- console.error('Badly formed event parameters: ' + msg);
- return;
- }
-
- if (response.value.object_path === '/' || response.value.object_path.indexOf('/net/connman/technology/wifi') >= 0) {
- fireEvent(WS_REQUEST_TYPE.WIFI, response.value.object_path, response.value.signal_name, response.value.parameters);
- } else if (response.value.object_path.indexOf('/net/connman/technology/bluetooth') >= 0) {
- fireEvent(WS_REQUEST_TYPE.BLUETOOTH, response.value.object_path, response.value.signal_name, response.value.parameters);
- } else {
- console.error('Unrecognized event object_path, skipping');
- }
- } else {
- console.error('Unrecognized event, skipping');
- }
- } else if (response.transactionid === undefined) {
- console.error('Badly formed response: ' + msg);
- } else {
- var calls = this.methodCalls;
- for (var i = 0; i < calls.length; i++) {
- var call = calls[i];
- if (call && (!call.done) && (call.transactionid === response.transactionid)) {
- call.finish();
- if (response.result !== 'succeeded' && response.reason !== undefined && call.errorCB !== undefined) {
- console.log('error - ' + response.reason);
- call.errorCB(response.reason);
- } else if (call.successCB !== undefined) {
- if (response.value !== undefined) {
- call.successCB(response.value);
- } else {
- call.successCB();
- }
- }
- return;
- }
- }
- }
- }
-
- function generateTransactionId() {
- var i, val = [];
- for (i = 0; i < 8; i++) {
- var num = Math.floor((Math.random() + 1) * 65536);
- val[i] = num.toString(16).substring(1);
- }
- var uuid = val[0] + val[1] + '-' + val[2] + '-' + val[3] + '-' + val[4] + '-' + val[5] + val[6] + val[7];
- return uuid;
- }
-
- function sendRequest(request_type, request_name, request_args, success_cb, error_cb) {
- var msg = {
- 'type': request_type,
- 'transactionid': generateTransactionId(),
- 'name': request_name,
- 'value': request_args
- };
-
- send(msg, success_cb, error_cb);
- }
-
- function subscribeEvents(callback) {
- event_callbacks.add(callback);
- }
-
- function unsubscribeEvents(callback) {
- event_callbacks.remove(callback);
- }
-
- /* this is dummy data for testing purposes */
- function dummyBackendSend(msg) {
- if (dummyBackend) {
- console.log('Sending to dummy server');
-
- var calls = this.methodCalls;
- var replyMsg = null;
-
- for (var i = 0; i < calls.length; i++) {
- var call = calls[i];
- if (call && (!call.done) && (call.transactionid === msg.transactionid)) {
- call.finish();
- if (msg.error !== undefined) {
- call.errorCB(msg.error);
- }
- if (msg.value !== undefined && call.successCB && call.errorCB !== undefined) {
- switch (msg.type) {
- case WS_REQUEST_TYPE.WIFI:
- if (msg.name === 'is_enabled') {
- /* default to enabled */
- var result = true;
- call.successCB(result);
- return;
- } else if (msg.name === 'enable' && msg.value === true) {
- call.successCB();
- return;
- } else if (msg.name === 'enable' && msg.value === false) {
- call.successCB();
- return;
- } else if (msg.name === 'scan') {
- var results = [
- [
- ["/net/connman/service/ethernet_0010f32f5a70_cable",
- {}],
- ["/net/connman/service/wifi_c8f733acdf96_3558364737_managed_psk",
- {
- "Type": "wifi",
- "Security": ["psk"],
- "State": "ready",
- "Strength": 50,
- "Favorite": false,
- "Immutable": false,
- "AutoConnect": false,
- "Name": "Access Point 1",
- "BSSID": "11:5d:49:88:3d:20",
- "MaxRate": 54000000,
- "Frequency": 2417,
- "EncryptionMode": "none",
- "Ethernet": {
- "Method": "auto",
- "Interface": "wlp1s0",
- "Address": "B2:D3:55:66:44:22",
- "MTU": 1500
- },
- "IPv4": {
- "Address": "192.168.1.20",
- "Gateway": "192.168.1.1",
- "Method": "dhcp",
- "Netmask": "255.255.255.0"
- },
- "IPv4.Configuration": {
- "Method": "dhcp"
- },
- "IPv6": {},
- "IPv6.Configuration": {
- "Method": "auto",
- "Privacy": "disabled"
- },
- "Nameservers": [],
- "Nameservers.Configuration": [],
- "Timeservers": [],
- "Timeservers.Configuration": [],
- "Domains": [],
- "Domains.Configuration": [],
- "Proxy": {},
- "Proxy.Configuration": {},
- "Provider": {}
- }],
- ["/net/connman/service/wifi_c8f733acdf96_446f75636865626167_managed_psk",
- {
- "Type": "wifi",
- "Security": ["psk"],
- "State": "idle",
- "Strength": 50,
- "Favorite": false,
- "Immutable": false,
- "AutoConnect": false,
- "Name": "Access Point 2",
- "BSSID": "21:ef:30:b9:ad:86",
- "MaxRate": 54000000,
- "Frequency": 2417,
- "EncryptionMode": "aes",
- "Ethernet": {
- "Method": "auto",
- "Interface": "wlp1s0",
- "Address": "E8:F2:33:AC:DF:96",
- "MTU": 1500
- },
- "IPv4": {},
- "IPv4.Configuration": {
- "Method": "dhcp"
- },
- "IPv6": {},
- "IPv6.Configuration": {
- "Method": "auto",
- "Privacy": "disabled"
- },
- "Nameservers": [],
- "Nameservers.Configuration": [],
- "Timeservers": [],
- "Timeservers.Configuration": [],
- "Domains": [],
- "Domains.Configuration": [],
- "Proxy": {},
- "Proxy.Configuration": {},
- "Provider": {}
- }],
- ["/net/connman/service/wifi_c8f733acdf96_536563757265446f75636865626167_managed_psk",
- {
- "Type": "wifi",
- "Security": ["psk"],
- "State": "idle",
- "Strength": 50,
- "Favorite": false,
- "Immutable": false,
- "AutoConnect": false,
- "Name": "Access Point 3",
- "BSSID": "25:ad:44:b7:e3:66",
- "MaxRate": 54000000,
- "Frequency": 2417,
- "EncryptionMode": "aes",
- "Ethernet": {
- "Method": "auto",
- "Interface": "wlp1s0",
- "Address": "A9:28:44:AD:FF:26",
- "MTU": 1500
- },
- "IPv4": {},
- "IPv4.Configuration": {
- "Method": "dhcp"
- },
- "IPv6": {},
- "IPv6.Configuration": {
- "Method": "auto",
- "Privacy": "disabled"
- },
- "Nameservers": [],
- "Nameservers.Configuration": [],
- "Timeservers": [],
- "Timeservers.Configuration": [],
- "Domains": [],
- "Domains.Configuration": [],
- "Proxy": {},
- "Proxy.Configuration": {},
- "Provider": {}
- }]
- ]
- ];
-
- replyMsg = JSON.stringify(results);
- /* simulate scan behavior */
- setTimeout(function() {
- call.successCB(results);
- }, 2000);
- return;
- } else if (msg.name === 'connect') {
- call.successCB();
- setTimeout(function() {
- fireEvent(WS_REQUEST_TYPE.WIFI, '/net/connman/service/wifi_c8f733acdf96_3558364737_managed_psk', 'PropertyChanged', ["Connected", true]);
- }, 2000);
- return;
- } else if (msg.name === 'disconnect') {
- call.successCB();
- setTimeout(function() {
- fireEvent(WS_REQUEST_TYPE.WIFI, '/net/connman/service/wifi_c8f733acdf96_3558364737_managed_psk', 'PropertyChanged', ["Connected", false]);
- }, 2000);
- return;
- } else {
- call.errorCB('Unsupported request: ' + msg.name + ', ' + msg.value);
- return;
- }
- break;
- case WS_REQUEST_TYPE.BLUETOOTH:
- if (msg.name === 'enable' && msg.value === true) {
- call.successCB();
- return;
- } else if (msg.name === 'enable' && msg.value === false) {
- call.successCB();
- return;
- } else {
- call.errorCB('Unsupported request: ' + msg.name + ', ' + msg.value);
- return;
- }
- break;
- case WS_REQUEST_TYPE.DATETIME:
- if (msg.name === 'is_time_updates_auto' && msg.value !== undefined) {
- /* default to manual */
- var result = false;
- call.successCB(result);
- return;
- } else if (msg.name === 'is_timezone_updates_auto' && msg.value !== undefined) {
- /* default to manual */
- var result = false;
- call.successCB(result);
- return;
- } else if (msg.name === 'time' && msg.value !== undefined) {
- call.successCB();
- return;
- } else if (msg.name === 'timezone' && msg.value !== undefined) {
- call.successCB();
- return;
- } else if (msg.name === 'time_updates' && msg.value !== undefined) {
- call.successCB();
- return;
- } else if (msg.name === 'timezone_updates' && msg.value !== undefined) {
- call.successCB();
- return;
- } else {
- call.errorCB('Unsupported request: ' + msg.name + ', ' + msg.value);
- return;
- }
- break;
- case WS_REQUEST_TYPE.DISPLAY:
- case WS_REQUEST_TYPE.SOUND:
- case WS_REQUEST_TYPE.LOCALE:
- call.errorCB('Request not implemented');
- return;
- default:
- call.errorCB('Invalid request type: ' + msg.type);
- return;
- }
- }
- return;
- }
- }
- }
- }
-
- return {
- connect: connect,
- reconnect: reconnect,
- sendRequest: sendRequest,
- subscribeEvents: subscribeEvents,
- unsubscribeEvents: unsubscribeEvents
- }
-})();
+++ /dev/null
-{
- "app": {
- "launch": {
- "container": "panel",
- "local_path": "index.html"
- }
- },
- "description": "__MSG_appDescription__",
- "icons": {
- "128": "Settings.png"
- },
- "name": "__MSG_appName__",
- "permissions": [],
- "version": "0.2013.7.4"
-}
+++ /dev/null
-* Tue Oct 15 2013 Jimmy Huang <jimmy.huang@intel.com> accepted/tizen/20131007.221312@71c3e9e
-- Monitor settings daemon events and update changes
-
-* Tue Oct 15 2013 Jimmy Huang <jimmy.huang@intel.com> accepted/tizen/20131007.221312@ff849bb
-- Remove duplicating disconnect button from WiFi details panel
-
-* Fri Oct 04 2013 Jimmy Huang <jimmy.huang@intel.com> submit/tizen/20131003.210102@6d2592a
-- Fixes TIVI-1943
-
-* Thu Oct 03 2013 Jimmy Huang <jimmy.huang@intel.com> accepted/tizen/20130918.214652@278671f
-- New release of SettingsApp
- - Bumped version to 0.0.2
- - Fixes TIVI-1788 - Setting error: Setting daemon is not connected
- - Added runtime dependency on settingsd
- - Fixed a bug where hidden network is still showing
- - Various fixes date and time settings
- - Added support for automatic time and timezone updates
- - Add support for is_time_update_enabled and is_timezone_update_enabled requests
- - Switch to text input instead of time and date input since the picker is broken
- - Added time and date string validator
- - Fixes clock not syncing right when moving out of focus
- - Updated dummy backend
- - Fixed a bug where GUI doesn't allow you to disconnect from encrypted networks
- - Display ip address and other connected information
- - Fixed a bug where toggle changes triggers recursive callbacks
- - Cleaning up debug logs and error messages
- - Fixed a bug where previous scan is not canceled when page is loaded
- - Display wifi network encryption and signal strength
- - Display error when trying to connect to encrypted network since it's not implemented
- - Updated wifi scan handling code and added some more dummy data
- - Ask user to reconnect to settings daemon if it is disconnected
- - Disable wifi toggle button when scanning
- - Show an error message for disconnecting from websocket
-
-
-* Thu Sep 19 2013 Jimmy Huang <jimmy.huang@intel.com>
-- Uninstall widget when doing rpm uninstall
-
-* Wed Sep 18 2013 Jimmy Huang <jimmy.huang@intel.com>
-- Added new icon to package, fixes TIVI-1709
-
-* Fri Sep 13 2013 Jimmy Huang <jimmy.huang@intel.com> submit/tizen/20130828.173751@0f314ff
-- Disable dummy backend and connect to settings daemon
-- Added date and time settings
-- Added wifi settings and dummy data
-- Code refactoring and cleanup
-- Added new app icon, fixes TIVI-1709
-
-* Thu Aug 22 2013 Jimmy Huang <jimmy.huang@intel.com>
-- Initial commit
+++ /dev/null
-Name: Settings
-Summary: A HTML5 based app for system settings
-Version: 0.0.2
-Release: 1
-Group: Applications/Web Applications
-License: Apache-2.0
-URL: http://www.tizen.org2
-Source0: %{name}-%{version}.tar.bz2
-BuildRequires: zip
-BuildRequires: desktop-file-utils
-Requires: bluetooth-frwk-core
-Requires: bluetooth-frwk-service
-Requires: settingsd
-Requires: wrt-installer
-
-%description
-A HTML5 based app for system settings like WiFi, Bluetooth
-
-%prep
-%setup -q -n %{name}-%{version}
-
-%build
-
-make wgtPkg
-
-#make %{?jobs:-j%jobs}
-
-%install
-rm -rf %{buildroot}
-%make_install
-
-%post
-if [ -f /opt/usr/apps/.preinstallWidgets/preinstallDone ]; then
- wrt-installer -i /opt/usr/apps/.preinstallWidgets/Settings.wgt;
-fi
-
-%postun
-wrt-installer -un ODBQpKvkS1.Settings
-
-%files
-%defattr(-,root,root,-)
-/opt/usr/apps/.preinstallWidgets/Settings.wgt
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<tizen-app-template xmlns="http://www.tizen.org/tizen-app-template" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" template-version="" sdk-version="" icon32="tizen_32.png" icon64="tizen_64.png" xsi:schemaLocation="http://www.tizen.org/tizen-app-template tizen-app-template.xsd ">
- <template-name>SettingsApp</template-name>
- <widget-type>TIZEN</widget-type>
- <description-file-name>description.xml</description-file-name>
-</tizen-app-template>