Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/hdcdstr8fwd/foundation-theme.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoward Colin <howard@straightfwd.co.uk>2016-12-14 01:52:24 +0300
committerHoward Colin <howard@straightfwd.co.uk>2016-12-14 01:52:24 +0300
commita4b5a3440a967bab7f5775419ff81c6052edf958 (patch)
treeba8a60ed1ff91b12295388363d94bd61a1871127
parent7210f33ebf69ea78b9681e5abc4df5305f717c27 (diff)
another update
-rw-r--r--examplesite/themes/hugof/LICENSE.md20
-rw-r--r--examplesite/themes/hugof/archetypes/default.md2
-rw-r--r--examplesite/themes/hugof/archetypes/single.md5
-rw-r--r--examplesite/themes/hugof/layouts/404.html63
-rw-r--r--examplesite/themes/hugof/layouts/_default/list.html0
-rw-r--r--examplesite/themes/hugof/layouts/_default/single-para.html72
-rw-r--r--examplesite/themes/hugof/layouts/_default/single.html64
-rw-r--r--examplesite/themes/hugof/layouts/index.html64
-rw-r--r--examplesite/themes/hugof/layouts/partials/footer.html33
-rw-r--r--examplesite/themes/hugof/layouts/partials/hero.html10
-rw-r--r--examplesite/themes/hugof/layouts/partials/main.html13
-rw-r--r--examplesite/themes/hugof/layouts/partials/nav.html17
-rw-r--r--examplesite/themes/hugof/static/css/foundation.css4226
-rw-r--r--examplesite/themes/hugof/static/css/styles.css153
-rw-r--r--examplesite/themes/hugof/static/img/swirl_pattern.pngbin9475 -> 0 bytes
-rw-r--r--examplesite/themes/hugof/static/js/app.js1
-rw-r--r--examplesite/themes/hugof/static/js/foundation.js9143
-rw-r--r--examplesite/themes/hugof/static/js/jquery.js9842
-rw-r--r--examplesite/themes/hugof/static/js/what-input.js295
-rw-r--r--examplesite/themes/hugof/theme.toml15
-rw-r--r--images/screenshot.pngbin199010 -> 0 bytes
-rw-r--r--images/tn.pngbin352414 -> 0 bytes
22 files changed, 0 insertions, 24038 deletions
diff --git a/examplesite/themes/hugof/LICENSE.md b/examplesite/themes/hugof/LICENSE.md
deleted file mode 100644
index e1265aa..0000000
--- a/examplesite/themes/hugof/LICENSE.md
+++ /dev/null
@@ -1,20 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 YOUR_NAME_HERE
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/examplesite/themes/hugof/archetypes/default.md b/examplesite/themes/hugof/archetypes/default.md
deleted file mode 100644
index ac36e06..0000000
--- a/examplesite/themes/hugof/archetypes/default.md
+++ /dev/null
@@ -1,2 +0,0 @@
-+++
-+++
diff --git a/examplesite/themes/hugof/archetypes/single.md b/examplesite/themes/hugof/archetypes/single.md
deleted file mode 100644
index b4bfb45..0000000
--- a/examplesite/themes/hugof/archetypes/single.md
+++ /dev/null
@@ -1,5 +0,0 @@
-+++
-title = ""
-layout = "single-para"
-+++
-
diff --git a/examplesite/themes/hugof/layouts/404.html b/examplesite/themes/hugof/layouts/404.html
deleted file mode 100644
index 3da8c4a..0000000
--- a/examplesite/themes/hugof/layouts/404.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!doctype html>
-<html class="no-js" lang="en" dir="ltr">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="x-ua-compatible" content="ie=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title> {{ .Site.Title }} </title>
- <link rel="stylesheet" href="{{ .Site.BaseURL }}css/foundation.css" type="text/css" media="screen">
- <link rel="stylesheet" href="{{ .Site.BaseURL }}css/styles.css" type="text/css" media="screen">
- </head>
-
- <body>
- <div class="off-canvas-wrapper"> {{ "<!-- Definition of global off canvas wrapper -->" | safeHTML }}
- <div class="off-canvas-wrapper-inner" data-off-canvas-wrapper> {{ "<!-- Definition of inner off canvas wrapper -->" | safeHTML }}
-
- {{ "<!-- Menu -->" | safeHTML }}
- <div class="off-canvas position-left" id="mobile-menu" data-off-canvas>
- <ul>
- <li><a href="#">One</a></li>
- <li><a href="#">Two</a></li>
- <li><a href="#">Three</a></li>
- </ul>
- </div>
-
- {{ "<!-- Page Content -->" | safeHTML }}
- <div class="off-canvas-content" data-off-canvas-content>
-
- {{ "<!-- Foundation Mobile Menu -->" | safeHTML }}
-
- <div class="titlebar show-for-small-only">
- <div class="title-bar left">
- <button class="menu-icon" type="button" data-open="mobile-menu"></button>
- <span class="title-bar-title">MENU</span>
- </div>
- </div>
-
- {{ "<!-- Partials that make up the site -->" | safeHTML }}
- {{ partial "nav.html" . }}
-
- {{ partial "hero.html" . }}
-
- <h1>404 - The page you are looking for was not found </h1>
-
- {{ partial "footer.html" . }}
- </div> {{ "<!-- End page content menu wrapper -->" | safeHTML }}
-
- </div> {{ "<!-- End of global off canvas inner wrapper -->" | safeHTML }}
- </div> {{ "<!-- End of global off canvas wrapper -->" | safeHTML }}
-
-
- {{ "<!-- JS includes -->" | safeHTML }}
-
- <script src="{{ .Site.BaseURL }}js/jquery.js"></script>
- <script src="{{ .Site.BaseURL }}js/what-input.js"></script>
- <script src="{{ .Site.BaseURL }}js/foundation.js"></script>
- <script src="{{ .Site.BaseURL }}js/app.js"></script>
-
- </body>
-</html>
-
-
-
- \ No newline at end of file
diff --git a/examplesite/themes/hugof/layouts/_default/list.html b/examplesite/themes/hugof/layouts/_default/list.html
deleted file mode 100644
index e69de29..0000000
--- a/examplesite/themes/hugof/layouts/_default/list.html
+++ /dev/null
diff --git a/examplesite/themes/hugof/layouts/_default/single-para.html b/examplesite/themes/hugof/layouts/_default/single-para.html
deleted file mode 100644
index 3fcdfc1..0000000
--- a/examplesite/themes/hugof/layouts/_default/single-para.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!doctype html>
-<html class="no-js" lang="en" dir="ltr">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="x-ua-compatible" content="ie=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title> {{ .Site.Title }} - {{.Title}} </title>
- <link rel="stylesheet" href="{{ .Site.BaseURL }}css/foundation.css" type="text/css" media="screen">
- <link rel="stylesheet" href="{{ .Site.BaseURL }}css/styles.css" type="text/css" media="screen">
- </head>
-
- <body>
- <div class="off-canvas-wrapper"> {{ "<!-- Definition of global off canvas wrapper -->" | safeHTML }}
- <div class="off-canvas-wrapper-inner" data-off-canvas-wrapper> {{ "<!-- Definition of inner off canvas wrapper -->" | safeHTML }}
-
- {{ "<!-- Menu -->" | safeHTML }}
- <div class="off-canvas position-left" id="mobile-menu" data-off-canvas>
- <ul>
- {{ $currentNode := . }}
- {{ range .Site.Menus.main }}
- <li><a class="nav-item{{if or ($currentNode.IsMenuCurrent "main" .) ($currentNode.HasMenuCurrent "main" .) }} active{{end}}" href="{{.URL}}">{{ .Name}}</a></li>
- {{end}}
- </ul>
- </div>
-
- {{ "<!-- Page Content -->" | safeHTML }}
- <div class="off-canvas-content" data-off-canvas-content>
-
- {{ "<!-- Foundation Mobile Menu -->" | safeHTML }}
-
- <div class="titlebar show-for-small-only">
- <div class="title-bar left">
- <button class="menu-icon" type="button" data-open="mobile-menu"></button>
- <span class="title-bar-title">MENU</span>
- </div>
- </div>
-
- {{ "<!-- Partials that make up the site -->" | safeHTML }}
- {{ partial "nav.html" . }}
-
- {{ partial "hero.html" . }}
-
- <!-- Add your own content here -->
- <section class="main-content">
- <div class="wrapper row">
- <div class="small-12 medium-12 column content-one">
- <h1>{{ .Title }}</h1>
- <p> {{ .Content }} </p>
- </div>
- </div>
- </section>
-
- {{ partial "footer.html" . }}
- </div> {{ "<!-- End page content menu wrapper -->" | safeHTML }}
-
- </div> {{ "<!-- End of global off canvas inner wrapper -->" | safeHTML }}
- </div> {{ "<!-- End of global off canvas wrapper -->" | safeHTML }}
-
-
- {{ "<!-- JS includes -->" | safeHTML }}
-
- <script src="{{ .Site.BaseURL }}js/jquery.js"></script>
- <script src="{{ .Site.BaseURL }}js/what-input.js"></script>
- <script src="{{ .Site.BaseURL }}js/foundation.js"></script>
- <script src="{{ .Site.BaseURL }}js/app.js"></script>
-
- </body>
-</html>
-
-
-
- \ No newline at end of file
diff --git a/examplesite/themes/hugof/layouts/_default/single.html b/examplesite/themes/hugof/layouts/_default/single.html
deleted file mode 100644
index fcb8203..0000000
--- a/examplesite/themes/hugof/layouts/_default/single.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!doctype html>
-<html class="no-js" lang="en" dir="ltr">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="x-ua-compatible" content="ie=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title> {{ .Site.Title }} </title>
- <link rel="stylesheet" href="{{ .Site.BaseURL }}css/foundation.css" type="text/css" media="screen">
- <link rel="stylesheet" href="{{ .Site.BaseURL }}css/styles.css" type="text/css" media="screen">
- </head>
-
- <body>
- <div class="off-canvas-wrapper"> {{ "<!-- Definition of global off canvas wrapper -->" | safeHTML }}
- <div class="off-canvas-wrapper-inner" data-off-canvas-wrapper> {{ "<!-- Definition of inner off canvas wrapper -->" | safeHTML }}
-
- {{ "<!-- Menu -->" | safeHTML }}
- <div class="off-canvas position-left" id="mobile-menu" data-off-canvas>
- <ul>
- {{ $currentNode := . }}
- {{ range .Site.Menus.main }}
- <li><a class="nav-item{{if or ($currentNode.IsMenuCurrent "main" .) ($currentNode.HasMenuCurrent "main" .) }} active{{end}}" href="{{.URL}}">{{ .Name}}</a></li>
- {{end}}
- </ul>
- </div>
-
- {{ "<!-- Page Content -->" | safeHTML }}
- <div class="off-canvas-content" data-off-canvas-content>
-
- {{ "<!-- Foundation Mobile Menu -->" | safeHTML }}
-
- <div class="titlebar show-for-small-only">
- <div class="title-bar left">
- <button class="menu-icon" type="button" data-open="mobile-menu"></button>
- <span class="title-bar-title">MENU</span>
- </div>
- </div>
-
- {{ "<!-- Partials that make up the site -->" | safeHTML }}
- {{ partial "nav.html" . }}
-
- {{ partial "hero.html" . }}
-
- <!-- Add your own content here -->
-
- {{ partial "footer.html" . }}
- </div> {{ "<!-- End page content menu wrapper -->" | safeHTML }}
-
- </div> {{ "<!-- End of global off canvas inner wrapper -->" | safeHTML }}
- </div> {{ "<!-- End of global off canvas wrapper -->" | safeHTML }}
-
-
- {{ "<!-- JS includes -->" | safeHTML }}
-
- <script src="{{ .Site.BaseURL }}js/jquery.js"></script>
- <script src="{{ .Site.BaseURL }}js/what-input.js"></script>
- <script src="{{ .Site.BaseURL }}js/foundation.js"></script>
- <script src="{{ .Site.BaseURL }}js/app.js"></script>
-
- </body>
-</html>
-
-
-
- \ No newline at end of file
diff --git a/examplesite/themes/hugof/layouts/index.html b/examplesite/themes/hugof/layouts/index.html
deleted file mode 100644
index 982e5e4..0000000
--- a/examplesite/themes/hugof/layouts/index.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!doctype html>
-<html class="no-js" lang="en" dir="ltr">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="x-ua-compatible" content="ie=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title> {{ .Site.Title }} </title>
- <link rel="stylesheet" href="{{ .Site.BaseURL }}css/foundation.css" type="text/css" media="screen">
- <link rel="stylesheet" href="{{ .Site.BaseURL }}css/styles.css" type="text/css" media="screen">
- </head>
-
- <body>
- <div class="off-canvas-wrapper"> {{ "<!-- Definition of global off canvas wrapper -->" | safeHTML }}
- <div class="off-canvas-wrapper-inner" data-off-canvas-wrapper> {{ "<!-- Definition of inner off canvas wrapper -->" | safeHTML }}
-
- {{ "<!-- Menu -->" | safeHTML }}
- <div class="off-canvas position-left" id="mobile-menu" data-off-canvas>
- <ul>
- {{ $currentNode := . }}
- {{ range .Site.Menus.main }}
- <li><a class="nav-item{{if or ($currentNode.IsMenuCurrent "main" .) ($currentNode.HasMenuCurrent "main" .) }} active{{end}}" href="{{.URL}}">{{ .Name}}</a></li>
- {{end}}
- </ul>
- </div>
-
- {{ "<!-- Page Content -->" | safeHTML }}
- <div class="off-canvas-content" data-off-canvas-content>
-
- {{ "<!-- Foundation Mobile Menu -->" | safeHTML }}
-
- <div class="titlebar show-for-small-only">
- <div class="title-bar left">
- <button class="menu-icon" type="button" data-open="mobile-menu"></button>
- <span class="title-bar-title">MENU</span>
- </div>
- </div>
-
- {{ "<!-- Partials that make up the site -->" | safeHTML }}
- {{ partial "nav.html" . }}
-
- {{ partial "hero.html" . }}
-
- {{ partial "main.html" . }}
-
- {{ partial "footer.html" . }}
- </div> {{ "<!-- End page content menu wrapper -->" | safeHTML }}
-
- </div> {{ "<!-- End of global off canvas inner wrapper -->" | safeHTML }}
- </div> {{ "<!-- End of global off canvas wrapper -->" | safeHTML }}
-
-
- {{ "<!-- JS includes -->" | safeHTML }}
-
- <script src="{{ .Site.BaseURL }}js/jquery.js"></script>
- <script src="{{ .Site.BaseURL }}js/what-input.js"></script>
- <script src="{{ .Site.BaseURL }}js/foundation.js"></script>
- <script src="{{ .Site.BaseURL }}js/app.js"></script>
-
- </body>
-</html>
-
-
-
- \ No newline at end of file
diff --git a/examplesite/themes/hugof/layouts/partials/footer.html b/examplesite/themes/hugof/layouts/partials/footer.html
deleted file mode 100644
index d6235c3..0000000
--- a/examplesite/themes/hugof/layouts/partials/footer.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{{ "<!-- BEGIN FOOTER -->" | safeHTML }}
-<footer>
-<div class="wrapper row small-up-1 medium-up-3">
-
- <div class="column">
- <h4>Contact Info</h4>
- <hr>
- <a><span>Phone </span>{{ .Site.Params.footer.phone }}</a>
- <a><span>Email </span>{{ .Site.Params.footer.email }}</a>
- <a><span>Address </span>{{ .Site.Params.footer.address }}</a>
- </div>
-
- <div class="column">
- <h4>Links</h4>
- <hr>
- {{ $currentNode := . }}
- {{ range .Site.Menus.main }}
- <a class="nav-item{{if or ($currentNode.IsMenuCurrent "main" .) ($currentNode.HasMenuCurrent "main" .) }} active{{end}}" href="{{.URL}}">{{ .Name}}</a>
- {{end}}
- </div>
-
- <div class="column">
- <h4>Social</h4>
- <hr>
- {{ $currentNode := . }}
- {{ range .Site.Menus.social }}
- <a class="nav-item{{if or ($currentNode.IsMenuCurrent "social" .) ($currentNode.HasMenuCurrent "social" .) }} active{{end}}" href="{{.URL}}">{{ .Name}}</a>
- {{end}}
- </div>
-
- </div>
-</footer> {{ "<!-- END FOOTER -->" | safeHTML }}
- \ No newline at end of file
diff --git a/examplesite/themes/hugof/layouts/partials/hero.html b/examplesite/themes/hugof/layouts/partials/hero.html
deleted file mode 100644
index c1a22bf..0000000
--- a/examplesite/themes/hugof/layouts/partials/hero.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{{ "<!-- BEGIN HERO PANEL -->" | safeHTML }}
-
-<section class="hero-panel">
- <div class="wrapper">
- <h1>{{ .Site.Params.hero.herotitle }}</h1>
- <p>{{ .Site.Params.hero.herodiscription }}</p>
- <a href="" class="button primary">{{ .Site.Params.hero.btnblue }}</a>
- <a href="" class="button success">{{ .Site.Params.hero.btngreen }}</a>
- </div>
-</section> {{ "<!-- END HERO PANEL -->" | safeHTML }}
diff --git a/examplesite/themes/hugof/layouts/partials/main.html b/examplesite/themes/hugof/layouts/partials/main.html
deleted file mode 100644
index 0a5aefa..0000000
--- a/examplesite/themes/hugof/layouts/partials/main.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{{ "<!-- BEGIN MAIN CONTENT -->" | safeHTML }}
-<section class="main-content">
- <div class="wrapper row">
- <div class="small-12 medium-6 column content-one">
- <h1>{{ .Site.Params.main.contentOneTitle }}</h1>
- <p>{{ .Site.Params.main.contentOneBody | markdownify }}</p>
- </div>
- <div class="small-12 medium-6 column content-two">
- <h1>{{ .Site.Params.main.contentTwoTitle }}</h1>
- <p>{{ .Site.Params.main.contentTwoBody | markdownify }}</p>
- </div>
- </div>
-</section> {{ "<!-- END MAIN CONTENT -->" | safeHTML }}
diff --git a/examplesite/themes/hugof/layouts/partials/nav.html b/examplesite/themes/hugof/layouts/partials/nav.html
deleted file mode 100644
index 329c7d5..0000000
--- a/examplesite/themes/hugof/layouts/partials/nav.html
+++ /dev/null
@@ -1,17 +0,0 @@
-{{ "<!-- BEGIN NAV BAR DESKTOP -->" | safeHTML }}
-
-<nav class="top-bar nav-desktop ">
- <div class="wrapper">
- <div class="top-bar-left">
- <a href="{{ .Site.BaseURL }}"><h3 class="site-logo">{{ .Site.Title }}</h3></a>
- </div>
- <div class="top-bar-right">
- <ul class="menu horizontal menu-desktop">
- {{ $currentNode := . }}
- {{ range .Site.Menus.main }}
- <li><a class="nav-item{{if or ($currentNode.IsMenuCurrent "main" .) ($currentNode.HasMenuCurrent "main" .) }} active{{end}}" href="{{.URL}}">{{ .Name}}</a></li>
- {{end}}
- </ul>
- </div>
- </div>
-</nav> {{ "<!-- END NAV BAR DESKTOP -->" | safeHTML }} \ No newline at end of file
diff --git a/examplesite/themes/hugof/static/css/foundation.css b/examplesite/themes/hugof/static/css/foundation.css
deleted file mode 100644
index c59eaf5..0000000
--- a/examplesite/themes/hugof/static/css/foundation.css
+++ /dev/null
@@ -1,4226 +0,0 @@
-@charset "UTF-8";
-/**
- * Foundation for Sites by ZURB
- * Version 6.2.4
- * foundation.zurb.com
- * Licensed under MIT Open Source
- */
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-/**
- * 1. Set default font family to sans-serif.
- * 2. Prevent iOS and IE text size adjust after device orientation change,
- * without disabling user zoom.
- */
-html {
- font-family: sans-serif;
- /* 1 */
- -ms-text-size-adjust: 100%;
- /* 2 */
- -webkit-text-size-adjust: 100%;
- /* 2 */ }
-
-/**
- * Remove default margin.
- */
-body {
- margin: 0; }
-
-/* HTML5 display definitions
- ========================================================================== */
-/**
- * Correct `block` display not defined for any HTML5 element in IE 8/9.
- * Correct `block` display not defined for `details` or `summary` in IE 10/11
- * and Firefox.
- * Correct `block` display not defined for `main` in IE 11.
- */
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
- display: block; }
-
-/**
- * 1. Correct `inline-block` display not defined in IE 8/9.
- * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
- */
-audio,
-canvas,
-progress,
-video {
- display: inline-block;
- /* 1 */
- vertical-align: baseline;
- /* 2 */ }
-
-/**
- * Prevent modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-audio:not([controls]) {
- display: none;
- height: 0; }
-
-/**
- * Address `[hidden]` styling not present in IE 8/9/10.
- * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
- */
-[hidden],
-template {
- display: none; }
-
-/* Links
- ========================================================================== */
-/**
- * Remove the gray background color from active links in IE 10.
- */
-a {
- background-color: transparent; }
-
-/**
- * Improve readability of focused elements when they are also in an
- * active/hover state.
- */
-a:active,
-a:hover {
- outline: 0; }
-
-/* Text-level semantics
- ========================================================================== */
-/**
- * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
- */
-abbr[title] {
- border-bottom: 1px dotted; }
-
-/**
- * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
- */
-b,
-strong {
- font-weight: bold; }
-
-/**
- * Address styling not present in Safari and Chrome.
- */
-dfn {
- font-style: italic; }
-
-/**
- * Address variable `h1` font-size and margin within `section` and `article`
- * contexts in Firefox 4+, Safari, and Chrome.
- */
-h1 {
- font-size: 2em;
- margin: 0.67em 0; }
-
-/**
- * Address styling not present in IE 8/9.
- */
-mark {
- background: #ff0;
- color: #000; }
-
-/**
- * Address inconsistent and variable font size in all browsers.
- */
-small {
- font-size: 80%; }
-
-/**
- * Prevent `sub` and `sup` affecting `line-height` in all browsers.
- */
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline; }
-
-sup {
- top: -0.5em; }
-
-sub {
- bottom: -0.25em; }
-
-/* Embedded content
- ========================================================================== */
-/**
- * Remove border when inside `a` element in IE 8/9/10.
- */
-img {
- border: 0; }
-
-/**
- * Correct overflow not hidden in IE 9/10/11.
- */
-svg:not(:root) {
- overflow: hidden; }
-
-/* Grouping content
- ========================================================================== */
-/**
- * Address margin not present in IE 8/9 and Safari.
- */
-figure {
- margin: 1em 40px; }
-
-/**
- * Address differences between Firefox and other browsers.
- */
-hr {
- box-sizing: content-box;
- height: 0; }
-
-/**
- * Contain overflow in all browsers.
- */
-pre {
- overflow: auto; }
-
-/**
- * Address odd `em`-unit font size rendering in all browsers.
- */
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, monospace;
- font-size: 1em; }
-
-/* Forms
- ========================================================================== */
-/**
- * Known limitation: by default, Chrome and Safari on OS X allow very limited
- * styling of `select`, unless a `border` property is set.
- */
-/**
- * 1. Correct color not being inherited.
- * Known issue: affects color of disabled elements.
- * 2. Correct font properties not being inherited.
- * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
- */
-button,
-input,
-optgroup,
-select,
-textarea {
- color: inherit;
- /* 1 */
- font: inherit;
- /* 2 */
- margin: 0;
- /* 3 */ }
-
-/**
- * Address `overflow` set to `hidden` in IE 8/9/10/11.
- */
-button {
- overflow: visible; }
-
-/**
- * Address inconsistent `text-transform` inheritance for `button` and `select`.
- * All other form control elements do not inherit `text-transform` values.
- * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
- * Correct `select` style inheritance in Firefox.
- */
-button,
-select {
- text-transform: none; }
-
-/**
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- * and `video` controls.
- * 2. Correct inability to style clickable `input` types in iOS.
- * 3. Improve usability and consistency of cursor style between image-type
- * `input` and others.
- */
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- -webkit-appearance: button;
- /* 2 */
- cursor: pointer;
- /* 3 */ }
-
-/**
- * Re-set default cursor for disabled elements.
- */
-button[disabled],
-html input[disabled] {
- cursor: not-allowed; }
-
-/**
- * Remove inner padding and border in Firefox 4+.
- */
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- border: 0;
- padding: 0; }
-
-/**
- * Address Firefox 4+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-input {
- line-height: normal; }
-
-/**
- * It's recommended that you don't attempt to style these elements.
- * Firefox's implementation doesn't respect box-sizing, padding, or width.
- *
- * 1. Address box sizing set to `content-box` in IE 8/9/10.
- * 2. Remove excess padding in IE 8/9/10.
- */
-input[type="checkbox"],
-input[type="radio"] {
- box-sizing: border-box;
- /* 1 */
- padding: 0;
- /* 2 */ }
-
-/**
- * Fix the cursor style for Chrome's increment/decrement buttons. For certain
- * `font-size` values of the `input`, it causes the cursor style of the
- * decrement button to change from `default` to `text`.
- */
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
- height: auto; }
-
-/**
- * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
- * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
- */
-input[type="search"] {
- -webkit-appearance: textfield;
- /* 1 */
- box-sizing: content-box;
- /* 2 */ }
-
-/**
- * Remove inner padding and search cancel button in Safari and Chrome on OS X.
- * Safari (but not Chrome) clips the cancel button when the search input has
- * padding (and `textfield` appearance).
- */
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none; }
-
-/**
- * Define consistent border, margin, and padding.
- * [NOTE] We don't enable this ruleset in Foundation, because we want the <fieldset> element to have plain styling.
- */
-/* fieldset {
- border: 1px solid #c0c0c0;
- margin: 0 2px;
- padding: 0.35em 0.625em 0.75em;
- } */
-/**
- * 1. Correct `color` not being inherited in IE 8/9/10/11.
- * 2. Remove padding so people aren't caught out if they zero out fieldsets.
- */
-legend {
- border: 0;
- /* 1 */
- padding: 0;
- /* 2 */ }
-
-/**
- * Remove default vertical scrollbar in IE 8/9/10/11.
- */
-textarea {
- overflow: auto; }
-
-/**
- * Don't inherit the `font-weight` (applied by a rule above).
- * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
- */
-optgroup {
- font-weight: bold; }
-
-/* Tables
- ========================================================================== */
-/**
- * Remove most spacing between table cells.
- */
-table {
- border-collapse: collapse;
- border-spacing: 0; }
-
-td,
-th {
- padding: 0; }
-
-.foundation-mq {
- font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; }
-
-html {
- font-size: 100%;
- box-sizing: border-box; }
-
-*,
-*::before,
-*::after {
- box-sizing: inherit; }
-
-body {
- padding: 0;
- margin: 0;
- font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
- font-weight: normal;
- line-height: 1.5;
- color: #0a0a0a;
- background: #fefefe;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale; }
-
-img {
- max-width: 100%;
- height: auto;
- -ms-interpolation-mode: bicubic;
- display: inline-block;
- vertical-align: middle; }
-
-textarea {
- height: auto;
- min-height: 50px;
- border-radius: 0; }
-
-select {
- width: 100%;
- border-radius: 0; }
-
-#map_canvas img,
-#map_canvas embed,
-#map_canvas object,
-.map_canvas img,
-.map_canvas embed,
-.map_canvas object,
-.mqa-display img,
-.mqa-display embed,
-.mqa-display object {
- max-width: none !important; }
-
-button {
- -webkit-appearance: none;
- -moz-appearance: none;
- background: transparent;
- padding: 0;
- border: 0;
- border-radius: 0;
- line-height: 1; }
- [data-whatinput='mouse'] button {
- outline: 0; }
-
-.is-visible {
- display: block !important; }
-
-.is-hidden {
- display: none !important; }
-
-.row {
- max-width: 75rem;
- margin-left: auto;
- margin-right: auto; }
- .row::before, .row::after {
- content: ' ';
- display: table; }
- .row::after {
- clear: both; }
- .row.collapse > .column, .row.collapse > .columns {
- padding-left: 0;
- padding-right: 0; }
- .row .row {
- margin-left: -0.625rem;
- margin-right: -0.625rem; }
- @media screen and (min-width: 40em) {
- .row .row {
- margin-left: -0.9375rem;
- margin-right: -0.9375rem; } }
- .row .row.collapse {
- margin-left: 0;
- margin-right: 0; }
- .row.expanded {
- max-width: none; }
- .row.expanded .row {
- margin-left: auto;
- margin-right: auto; }
-
-.column, .columns {
- width: 100%;
- float: left;
- padding-left: 0.625rem;
- padding-right: 0.625rem; }
- @media screen and (min-width: 40em) {
- .column, .columns {
- padding-left: 0.9375rem;
- padding-right: 0.9375rem; } }
- .column:last-child:not(:first-child), .columns:last-child:not(:first-child) {
- float: right; }
- .column.end:last-child:last-child, .end.columns:last-child:last-child {
- float: left; }
-
-.column.row.row, .row.row.columns {
- float: none; }
-
-.row .column.row.row, .row .row.row.columns {
- padding-left: 0;
- padding-right: 0;
- margin-left: 0;
- margin-right: 0; }
-
-.small-1 {
- width: 8.33333%; }
-
-.small-push-1 {
- position: relative;
- left: 8.33333%; }
-
-.small-pull-1 {
- position: relative;
- left: -8.33333%; }
-
-.small-offset-0 {
- margin-left: 0%; }
-
-.small-2 {
- width: 16.66667%; }
-
-.small-push-2 {
- position: relative;
- left: 16.66667%; }
-
-.small-pull-2 {
- position: relative;
- left: -16.66667%; }
-
-.small-offset-1 {
- margin-left: 8.33333%; }
-
-.small-3 {
- width: 25%; }
-
-.small-push-3 {
- position: relative;
- left: 25%; }
-
-.small-pull-3 {
- position: relative;
- left: -25%; }
-
-.small-offset-2 {
- margin-left: 16.66667%; }
-
-.small-4 {
- width: 33.33333%; }
-
-.small-push-4 {
- position: relative;
- left: 33.33333%; }
-
-.small-pull-4 {
- position: relative;
- left: -33.33333%; }
-
-.small-offset-3 {
- margin-left: 25%; }
-
-.small-5 {
- width: 41.66667%; }
-
-.small-push-5 {
- position: relative;
- left: 41.66667%; }
-
-.small-pull-5 {
- position: relative;
- left: -41.66667%; }
-
-.small-offset-4 {
- margin-left: 33.33333%; }
-
-.small-6 {
- width: 50%; }
-
-.small-push-6 {
- position: relative;
- left: 50%; }
-
-.small-pull-6 {
- position: relative;
- left: -50%; }
-
-.small-offset-5 {
- margin-left: 41.66667%; }
-
-.small-7 {
- width: 58.33333%; }
-
-.small-push-7 {
- position: relative;
- left: 58.33333%; }
-
-.small-pull-7 {
- position: relative;
- left: -58.33333%; }
-
-.small-offset-6 {
- margin-left: 50%; }
-
-.small-8 {
- width: 66.66667%; }
-
-.small-push-8 {
- position: relative;
- left: 66.66667%; }
-
-.small-pull-8 {
- position: relative;
- left: -66.66667%; }
-
-.small-offset-7 {
- margin-left: 58.33333%; }
-
-.small-9 {
- width: 75%; }
-
-.small-push-9 {
- position: relative;
- left: 75%; }
-
-.small-pull-9 {
- position: relative;
- left: -75%; }
-
-.small-offset-8 {
- margin-left: 66.66667%; }
-
-.small-10 {
- width: 83.33333%; }
-
-.small-push-10 {
- position: relative;
- left: 83.33333%; }
-
-.small-pull-10 {
- position: relative;
- left: -83.33333%; }
-
-.small-offset-9 {
- margin-left: 75%; }
-
-.small-11 {
- width: 91.66667%; }
-
-.small-push-11 {
- position: relative;
- left: 91.66667%; }
-
-.small-pull-11 {
- position: relative;
- left: -91.66667%; }
-
-.small-offset-10 {
- margin-left: 83.33333%; }
-
-.small-12 {
- width: 100%; }
-
-.small-offset-11 {
- margin-left: 91.66667%; }
-
-.small-up-1 > .column, .small-up-1 > .columns {
- width: 100%;
- float: left; }
- .small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) {
- clear: none; }
- .small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) {
- clear: both; }
- .small-up-1 > .column:last-child, .small-up-1 > .columns:last-child {
- float: left; }
-
-.small-up-2 > .column, .small-up-2 > .columns {
- width: 50%;
- float: left; }
- .small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) {
- clear: none; }
- .small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) {
- clear: both; }
- .small-up-2 > .column:last-child, .small-up-2 > .columns:last-child {
- float: left; }
-
-.small-up-3 > .column, .small-up-3 > .columns {
- width: 33.33333%;
- float: left; }
- .small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) {
- clear: none; }
- .small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) {
- clear: both; }
- .small-up-3 > .column:last-child, .small-up-3 > .columns:last-child {
- float: left; }
-
-.small-up-4 > .column, .small-up-4 > .columns {
- width: 25%;
- float: left; }
- .small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) {
- clear: none; }
- .small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) {
- clear: both; }
- .small-up-4 > .column:last-child, .small-up-4 > .columns:last-child {
- float: left; }
-
-.small-up-5 > .column, .small-up-5 > .columns {
- width: 20%;
- float: left; }
- .small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) {
- clear: none; }
- .small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) {
- clear: both; }
- .small-up-5 > .column:last-child, .small-up-5 > .columns:last-child {
- float: left; }
-
-.small-up-6 > .column, .small-up-6 > .columns {
- width: 16.66667%;
- float: left; }
- .small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) {
- clear: none; }
- .small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) {
- clear: both; }
- .small-up-6 > .column:last-child, .small-up-6 > .columns:last-child {
- float: left; }
-
-.small-up-7 > .column, .small-up-7 > .columns {
- width: 14.28571%;
- float: left; }
- .small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) {
- clear: none; }
- .small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) {
- clear: both; }
- .small-up-7 > .column:last-child, .small-up-7 > .columns:last-child {
- float: left; }
-
-.small-up-8 > .column, .small-up-8 > .columns {
- width: 12.5%;
- float: left; }
- .small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) {
- clear: none; }
- .small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) {
- clear: both; }
- .small-up-8 > .column:last-child, .small-up-8 > .columns:last-child {
- float: left; }
-
-.small-collapse > .column, .small-collapse > .columns {
- padding-left: 0;
- padding-right: 0; }
-
-.small-collapse .row {
- margin-left: 0;
- margin-right: 0; }
-
-.expanded.row .small-collapse.row {
- margin-left: 0;
- margin-right: 0; }
-
-.small-uncollapse > .column, .small-uncollapse > .columns {
- padding-left: 0.625rem;
- padding-right: 0.625rem; }
-
-.small-centered {
- margin-left: auto;
- margin-right: auto; }
- .small-centered, .small-centered:last-child:not(:first-child) {
- float: none;
- clear: both; }
-
-.small-uncentered,
-.small-push-0,
-.small-pull-0 {
- position: static;
- margin-left: 0;
- margin-right: 0;
- float: left; }
-
-@media screen and (min-width: 40em) {
- .medium-1 {
- width: 8.33333%; }
- .medium-push-1 {
- position: relative;
- left: 8.33333%; }
- .medium-pull-1 {
- position: relative;
- left: -8.33333%; }
- .medium-offset-0 {
- margin-left: 0%; }
- .medium-2 {
- width: 16.66667%; }
- .medium-push-2 {
- position: relative;
- left: 16.66667%; }
- .medium-pull-2 {
- position: relative;
- left: -16.66667%; }
- .medium-offset-1 {
- margin-left: 8.33333%; }
- .medium-3 {
- width: 25%; }
- .medium-push-3 {
- position: relative;
- left: 25%; }
- .medium-pull-3 {
- position: relative;
- left: -25%; }
- .medium-offset-2 {
- margin-left: 16.66667%; }
- .medium-4 {
- width: 33.33333%; }
- .medium-push-4 {
- position: relative;
- left: 33.33333%; }
- .medium-pull-4 {
- position: relative;
- left: -33.33333%; }
- .medium-offset-3 {
- margin-left: 25%; }
- .medium-5 {
- width: 41.66667%; }
- .medium-push-5 {
- position: relative;
- left: 41.66667%; }
- .medium-pull-5 {
- position: relative;
- left: -41.66667%; }
- .medium-offset-4 {
- margin-left: 33.33333%; }
- .medium-6 {
- width: 50%; }
- .medium-push-6 {
- position: relative;
- left: 50%; }
- .medium-pull-6 {
- position: relative;
- left: -50%; }
- .medium-offset-5 {
- margin-left: 41.66667%; }
- .medium-7 {
- width: 58.33333%; }
- .medium-push-7 {
- position: relative;
- left: 58.33333%; }
- .medium-pull-7 {
- position: relative;
- left: -58.33333%; }
- .medium-offset-6 {
- margin-left: 50%; }
- .medium-8 {
- width: 66.66667%; }
- .medium-push-8 {
- position: relative;
- left: 66.66667%; }
- .medium-pull-8 {
- position: relative;
- left: -66.66667%; }
- .medium-offset-7 {
- margin-left: 58.33333%; }
- .medium-9 {
- width: 75%; }
- .medium-push-9 {
- position: relative;
- left: 75%; }
- .medium-pull-9 {
- position: relative;
- left: -75%; }
- .medium-offset-8 {
- margin-left: 66.66667%; }
- .medium-10 {
- width: 83.33333%; }
- .medium-push-10 {
- position: relative;
- left: 83.33333%; }
- .medium-pull-10 {
- position: relative;
- left: -83.33333%; }
- .medium-offset-9 {
- margin-left: 75%; }
- .medium-11 {
- width: 91.66667%; }
- .medium-push-11 {
- position: relative;
- left: 91.66667%; }
- .medium-pull-11 {
- position: relative;
- left: -91.66667%; }
- .medium-offset-10 {
- margin-left: 83.33333%; }
- .medium-12 {
- width: 100%; }
- .medium-offset-11 {
- margin-left: 91.66667%; }
- .medium-up-1 > .column, .medium-up-1 > .columns {
- width: 100%;
- float: left; }
- .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) {
- clear: none; }
- .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) {
- clear: both; }
- .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child {
- float: left; }
- .medium-up-2 > .column, .medium-up-2 > .columns {
- width: 50%;
- float: left; }
- .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) {
- clear: none; }
- .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) {
- clear: both; }
- .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child {
- float: left; }
- .medium-up-3 > .column, .medium-up-3 > .columns {
- width: 33.33333%;
- float: left; }
- .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) {
- clear: none; }
- .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) {
- clear: both; }
- .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child {
- float: left; }
- .medium-up-4 > .column, .medium-up-4 > .columns {
- width: 25%;
- float: left; }
- .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) {
- clear: none; }
- .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) {
- clear: both; }
- .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child {
- float: left; }
- .medium-up-5 > .column, .medium-up-5 > .columns {
- width: 20%;
- float: left; }
- .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) {
- clear: none; }
- .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) {
- clear: both; }
- .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child {
- float: left; }
- .medium-up-6 > .column, .medium-up-6 > .columns {
- width: 16.66667%;
- float: left; }
- .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) {
- clear: none; }
- .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) {
- clear: both; }
- .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child {
- float: left; }
- .medium-up-7 > .column, .medium-up-7 > .columns {
- width: 14.28571%;
- float: left; }
- .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) {
- clear: none; }
- .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) {
- clear: both; }
- .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child {
- float: left; }
- .medium-up-8 > .column, .medium-up-8 > .columns {
- width: 12.5%;
- float: left; }
- .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) {
- clear: none; }
- .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) {
- clear: both; }
- .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child {
- float: left; }
- .medium-collapse > .column, .medium-collapse > .columns {
- padding-left: 0;
- padding-right: 0; }
- .medium-collapse .row {
- margin-left: 0;
- margin-right: 0; }
- .expanded.row .medium-collapse.row {
- margin-left: 0;
- margin-right: 0; }
- .medium-uncollapse > .column, .medium-uncollapse > .columns {
- padding-left: 0.9375rem;
- padding-right: 0.9375rem; }
- .medium-centered {
- margin-left: auto;
- margin-right: auto; }
- .medium-centered, .medium-centered:last-child:not(:first-child) {
- float: none;
- clear: both; }
- .medium-uncentered,
- .medium-push-0,
- .medium-pull-0 {
- position: static;
- margin-left: 0;
- margin-right: 0;
- float: left; } }
-
-@media screen and (min-width: 64em) {
- .large-1 {
- width: 8.33333%; }
- .large-push-1 {
- position: relative;
- left: 8.33333%; }
- .large-pull-1 {
- position: relative;
- left: -8.33333%; }
- .large-offset-0 {
- margin-left: 0%; }
- .large-2 {
- width: 16.66667%; }
- .large-push-2 {
- position: relative;
- left: 16.66667%; }
- .large-pull-2 {
- position: relative;
- left: -16.66667%; }
- .large-offset-1 {
- margin-left: 8.33333%; }
- .large-3 {
- width: 25%; }
- .large-push-3 {
- position: relative;
- left: 25%; }
- .large-pull-3 {
- position: relative;
- left: -25%; }
- .large-offset-2 {
- margin-left: 16.66667%; }
- .large-4 {
- width: 33.33333%; }
- .large-push-4 {
- position: relative;
- left: 33.33333%; }
- .large-pull-4 {
- position: relative;
- left: -33.33333%; }
- .large-offset-3 {
- margin-left: 25%; }
- .large-5 {
- width: 41.66667%; }
- .large-push-5 {
- position: relative;
- left: 41.66667%; }
- .large-pull-5 {
- position: relative;
- left: -41.66667%; }
- .large-offset-4 {
- margin-left: 33.33333%; }
- .large-6 {
- width: 50%; }
- .large-push-6 {
- position: relative;
- left: 50%; }
- .large-pull-6 {
- position: relative;
- left: -50%; }
- .large-offset-5 {
- margin-left: 41.66667%; }
- .large-7 {
- width: 58.33333%; }
- .large-push-7 {
- position: relative;
- left: 58.33333%; }
- .large-pull-7 {
- position: relative;
- left: -58.33333%; }
- .large-offset-6 {
- margin-left: 50%; }
- .large-8 {
- width: 66.66667%; }
- .large-push-8 {
- position: relative;
- left: 66.66667%; }
- .large-pull-8 {
- position: relative;
- left: -66.66667%; }
- .large-offset-7 {
- margin-left: 58.33333%; }
- .large-9 {
- width: 75%; }
- .large-push-9 {
- position: relative;
- left: 75%; }
- .large-pull-9 {
- position: relative;
- left: -75%; }
- .large-offset-8 {
- margin-left: 66.66667%; }
- .large-10 {
- width: 83.33333%; }
- .large-push-10 {
- position: relative;
- left: 83.33333%; }
- .large-pull-10 {
- position: relative;
- left: -83.33333%; }
- .large-offset-9 {
- margin-left: 75%; }
- .large-11 {
- width: 91.66667%; }
- .large-push-11 {
- position: relative;
- left: 91.66667%; }
- .large-pull-11 {
- position: relative;
- left: -91.66667%; }
- .large-offset-10 {
- margin-left: 83.33333%; }
- .large-12 {
- width: 100%; }
- .large-offset-11 {
- margin-left: 91.66667%; }
- .large-up-1 > .column, .large-up-1 > .columns {
- width: 100%;
- float: left; }
- .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) {
- clear: none; }
- .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) {
- clear: both; }
- .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child {
- float: left; }
- .large-up-2 > .column, .large-up-2 > .columns {
- width: 50%;
- float: left; }
- .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) {
- clear: none; }
- .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) {
- clear: both; }
- .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child {
- float: left; }
- .large-up-3 > .column, .large-up-3 > .columns {
- width: 33.33333%;
- float: left; }
- .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) {
- clear: none; }
- .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) {
- clear: both; }
- .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child {
- float: left; }
- .large-up-4 > .column, .large-up-4 > .columns {
- width: 25%;
- float: left; }
- .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) {
- clear: none; }
- .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) {
- clear: both; }
- .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child {
- float: left; }
- .large-up-5 > .column, .large-up-5 > .columns {
- width: 20%;
- float: left; }
- .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) {
- clear: none; }
- .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) {
- clear: both; }
- .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child {
- float: left; }
- .large-up-6 > .column, .large-up-6 > .columns {
- width: 16.66667%;
- float: left; }
- .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) {
- clear: none; }
- .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) {
- clear: both; }
- .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child {
- float: left; }
- .large-up-7 > .column, .large-up-7 > .columns {
- width: 14.28571%;
- float: left; }
- .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) {
- clear: none; }
- .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) {
- clear: both; }
- .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child {
- float: left; }
- .large-up-8 > .column, .large-up-8 > .columns {
- width: 12.5%;
- float: left; }
- .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) {
- clear: none; }
- .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) {
- clear: both; }
- .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child {
- float: left; }
- .large-collapse > .column, .large-collapse > .columns {
- padding-left: 0;
- padding-right: 0; }
- .large-collapse .row {
- margin-left: 0;
- margin-right: 0; }
- .expanded.row .large-collapse.row {
- margin-left: 0;
- margin-right: 0; }
- .large-uncollapse > .column, .large-uncollapse > .columns {
- padding-left: 0.9375rem;
- padding-right: 0.9375rem; }
- .large-centered {
- margin-left: auto;
- margin-right: auto; }
- .large-centered, .large-centered:last-child:not(:first-child) {
- float: none;
- clear: both; }
- .large-uncentered,
- .large-push-0,
- .large-pull-0 {
- position: static;
- margin-left: 0;
- margin-right: 0;
- float: left; } }
-
-div,
-dl,
-dt,
-dd,
-ul,
-ol,
-li,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-pre,
-form,
-p,
-blockquote,
-th,
-td {
- margin: 0;
- padding: 0; }
-
-p {
- font-size: inherit;
- line-height: 1.6;
- margin-bottom: 1rem;
- text-rendering: optimizeLegibility; }
-
-em,
-i {
- font-style: italic;
- line-height: inherit; }
-
-strong,
-b {
- font-weight: bold;
- line-height: inherit; }
-
-small {
- font-size: 80%;
- line-height: inherit; }
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
- font-weight: normal;
- font-style: normal;
- color: inherit;
- text-rendering: optimizeLegibility;
- margin-top: 0;
- margin-bottom: 0.5rem;
- line-height: 1.4; }
- h1 small,
- h2 small,
- h3 small,
- h4 small,
- h5 small,
- h6 small {
- color: #cacaca;
- line-height: 0; }
-
-h1 {
- font-size: 1.5rem; }
-
-h2 {
- font-size: 1.25rem; }
-
-h3 {
- font-size: 1.1875rem; }
-
-h4 {
- font-size: 1.125rem; }
-
-h5 {
- font-size: 1.0625rem; }
-
-h6 {
- font-size: 1rem; }
-
-@media screen and (min-width: 40em) {
- h1 {
- font-size: 3rem; }
- h2 {
- font-size: 2.5rem; }
- h3 {
- font-size: 1.9375rem; }
- h4 {
- font-size: 1.5625rem; }
- h5 {
- font-size: 1.25rem; }
- h6 {
- font-size: 1rem; } }
-
-a {
- color: #2199e8;
- text-decoration: none;
- line-height: inherit;
- cursor: pointer; }
- a:hover, a:focus {
- color: #1585cf; }
- a img {
- border: 0; }
-
-hr {
- max-width: 75rem;
- height: 0;
- border-right: 0;
- border-top: 0;
- border-bottom: 1px solid #cacaca;
- border-left: 0;
- margin: 1.25rem auto;
- clear: both; }
-
-ul,
-ol,
-dl {
- line-height: 1.6;
- margin-bottom: 1rem;
- list-style-position: outside; }
-
-li {
- font-size: inherit; }
-
-ul {
- list-style-type: disc;
- margin-left: 1.25rem; }
-
-ol {
- margin-left: 1.25rem; }
-
-ul ul, ol ul, ul ol, ol ol {
- margin-left: 1.25rem;
- margin-bottom: 0; }
-
-dl {
- margin-bottom: 1rem; }
- dl dt {
- margin-bottom: 0.3rem;
- font-weight: bold; }
-
-blockquote {
- margin: 0 0 1rem;
- padding: 0.5625rem 1.25rem 0 1.1875rem;
- border-left: 1px solid #cacaca; }
- blockquote, blockquote p {
- line-height: 1.6;
- color: #8a8a8a; }
-
-cite {
- display: block;
- font-size: 0.8125rem;
- color: #8a8a8a; }
- cite:before {
- content: '\2014 \0020'; }
-
-abbr {
- color: #0a0a0a;
- cursor: help;
- border-bottom: 1px dotted #0a0a0a; }
-
-code {
- font-family: Consolas, "Liberation Mono", Courier, monospace;
- font-weight: normal;
- color: #0a0a0a;
- background-color: #e6e6e6;
- border: 1px solid #cacaca;
- padding: 0.125rem 0.3125rem 0.0625rem; }
-
-kbd {
- padding: 0.125rem 0.25rem 0;
- margin: 0;
- background-color: #e6e6e6;
- color: #0a0a0a;
- font-family: Consolas, "Liberation Mono", Courier, monospace; }
-
-.subheader {
- margin-top: 0.2rem;
- margin-bottom: 0.5rem;
- font-weight: normal;
- line-height: 1.4;
- color: #8a8a8a; }
-
-.lead {
- font-size: 125%;
- line-height: 1.6; }
-
-.stat {
- font-size: 2.5rem;
- line-height: 1; }
- p + .stat {
- margin-top: -1rem; }
-
-.no-bullet {
- margin-left: 0;
- list-style: none; }
-
-.text-left {
- text-align: left; }
-
-.text-right {
- text-align: right; }
-
-.text-center {
- text-align: center; }
-
-.text-justify {
- text-align: justify; }
-
-@media screen and (min-width: 40em) {
- .medium-text-left {
- text-align: left; }
- .medium-text-right {
- text-align: right; }
- .medium-text-center {
- text-align: center; }
- .medium-text-justify {
- text-align: justify; } }
-
-@media screen and (min-width: 64em) {
- .large-text-left {
- text-align: left; }
- .large-text-right {
- text-align: right; }
- .large-text-center {
- text-align: center; }
- .large-text-justify {
- text-align: justify; } }
-
-.show-for-print {
- display: none !important; }
-
-@media print {
- * {
- background: transparent !important;
- color: black !important;
- box-shadow: none !important;
- text-shadow: none !important; }
- .show-for-print {
- display: block !important; }
- .hide-for-print {
- display: none !important; }
- table.show-for-print {
- display: table !important; }
- thead.show-for-print {
- display: table-header-group !important; }
- tbody.show-for-print {
- display: table-row-group !important; }
- tr.show-for-print {
- display: table-row !important; }
- td.show-for-print {
- display: table-cell !important; }
- th.show-for-print {
- display: table-cell !important; }
- a,
- a:visited {
- text-decoration: underline; }
- a[href]:after {
- content: " (" attr(href) ")"; }
- .ir a:after,
- a[href^='javascript:']:after,
- a[href^='#']:after {
- content: ''; }
- abbr[title]:after {
- content: " (" attr(title) ")"; }
- pre,
- blockquote {
- border: 1px solid #8a8a8a;
- page-break-inside: avoid; }
- thead {
- display: table-header-group; }
- tr,
- img {
- page-break-inside: avoid; }
- img {
- max-width: 100% !important; }
- @page {
- margin: 0.5cm; }
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3; }
- h2,
- h3 {
- page-break-after: avoid; } }
-
-.button {
- display: inline-block;
- text-align: center;
- line-height: 1;
- cursor: pointer;
- -webkit-appearance: none;
- transition: background-color 0.25s ease-out, color 0.25s ease-out;
- vertical-align: middle;
- border: 1px solid transparent;
- border-radius: 0;
- padding: 0.85em 1em;
- margin: 0 0 1rem 0;
- font-size: 0.9rem;
- background-color: #2199e8;
- color: #fefefe; }
- [data-whatinput='mouse'] .button {
- outline: 0; }
- .button:hover, .button:focus {
- background-color: #1583cc;
- color: #fefefe; }
- .button.tiny {
- font-size: 0.6rem; }
- .button.small {
- font-size: 0.75rem; }
- .button.large {
- font-size: 1.25rem; }
- .button.expanded {
- display: block;
- width: 100%;
- margin-left: 0;
- margin-right: 0; }
- .button.primary {
- background-color: #2199e8;
- color: #fefefe; }
- .button.primary:hover, .button.primary:focus {
- background-color: #147cc0;
- color: #fefefe; }
- .button.secondary {
- background-color: #777;
- color: #fefefe; }
- .button.secondary:hover, .button.secondary:focus {
- background-color: #5f5f5f;
- color: #fefefe; }
- .button.success {
- background-color: #3adb76;
- color: #fefefe; }
- .button.success:hover, .button.success:focus {
- background-color: #22bb5b;
- color: #fefefe; }
- .button.warning {
- background-color: #ffae00;
- color: #fefefe; }
- .button.warning:hover, .button.warning:focus {
- background-color: #cc8b00;
- color: #fefefe; }
- .button.alert {
- background-color: #ec5840;
- color: #fefefe; }
- .button.alert:hover, .button.alert:focus {
- background-color: #da3116;
- color: #fefefe; }
- .button.hollow {
- border: 1px solid #2199e8;
- color: #2199e8; }
- .button.hollow, .button.hollow:hover, .button.hollow:focus {
- background-color: transparent; }
- .button.hollow:hover, .button.hollow:focus {
- border-color: #0c4d78;
- color: #0c4d78; }
- .button.hollow.primary {
- border: 1px solid #2199e8;
- color: #2199e8; }
- .button.hollow.primary:hover, .button.hollow.primary:focus {
- border-color: #0c4d78;
- color: #0c4d78; }
- .button.hollow.secondary {
- border: 1px solid #777;
- color: #777; }
- .button.hollow.secondary:hover, .button.hollow.secondary:focus {
- border-color: #3c3c3c;
- color: #3c3c3c; }
- .button.hollow.success {
- border: 1px solid #3adb76;
- color: #3adb76; }
- .button.hollow.success:hover, .button.hollow.success:focus {
- border-color: #157539;
- color: #157539; }
- .button.hollow.warning {
- border: 1px solid #ffae00;
- color: #ffae00; }
- .button.hollow.warning:hover, .button.hollow.warning:focus {
- border-color: #805700;
- color: #805700; }
- .button.hollow.alert {
- border: 1px solid #ec5840;
- color: #ec5840; }
- .button.hollow.alert:hover, .button.hollow.alert:focus {
- border-color: #881f0e;
- color: #881f0e; }
- .button.disabled, .button[disabled] {
- opacity: 0.25;
- cursor: not-allowed; }
- .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus {
- background-color: #2199e8;
- color: #fefefe; }
- .button.disabled.primary, .button[disabled].primary {
- opacity: 0.25;
- cursor: not-allowed; }
- .button.disabled.primary:hover, .button.disabled.primary:focus, .button[disabled].primary:hover, .button[disabled].primary:focus {
- background-color: #2199e8;
- color: #fefefe; }
- .button.disabled.secondary, .button[disabled].secondary {
- opacity: 0.25;
- cursor: not-allowed; }
- .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus {
- background-color: #777;
- color: #fefefe; }
- .button.disabled.success, .button[disabled].success {
- opacity: 0.25;
- cursor: not-allowed; }
- .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus {
- background-color: #3adb76;
- color: #fefefe; }
- .button.disabled.warning, .button[disabled].warning {
- opacity: 0.25;
- cursor: not-allowed; }
- .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning:hover, .button[disabled].warning:focus {
- background-color: #ffae00;
- color: #fefefe; }
- .button.disabled.alert, .button[disabled].alert {
- opacity: 0.25;
- cursor: not-allowed; }
- .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus {
- background-color: #ec5840;
- color: #fefefe; }
- .button.dropdown::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 0.4em;
- border-color: #fefefe transparent transparent;
- border-top-style: solid;
- border-bottom-width: 0;
- position: relative;
- top: 0.4em;
- float: right;
- margin-left: 1em;
- display: inline-block; }
- .button.arrow-only::after {
- margin-left: 0;
- float: none;
- top: -0.1em; }
-
-[type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'],
-textarea {
- display: block;
- box-sizing: border-box;
- width: 100%;
- height: 2.4375rem;
- padding: 0.5rem;
- border: 1px solid #cacaca;
- margin: 0 0 1rem;
- font-family: inherit;
- font-size: 1rem;
- color: #0a0a0a;
- background-color: #fefefe;
- box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1);
- border-radius: 0;
- transition: box-shadow 0.5s, border-color 0.25s ease-in-out;
- -webkit-appearance: none;
- -moz-appearance: none; }
- [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus,
- textarea:focus {
- border: 1px solid #8a8a8a;
- background-color: #fefefe;
- outline: none;
- box-shadow: 0 0 5px #cacaca;
- transition: box-shadow 0.5s, border-color 0.25s ease-in-out; }
-
-textarea {
- max-width: 100%; }
- textarea[rows] {
- height: auto; }
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
- color: #cacaca; }
-
-input::-moz-placeholder,
-textarea::-moz-placeholder {
- color: #cacaca; }
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
- color: #cacaca; }
-
-input::placeholder,
-textarea::placeholder {
- color: #cacaca; }
-
-input:disabled, input[readonly],
-textarea:disabled,
-textarea[readonly] {
- background-color: #e6e6e6;
- cursor: not-allowed; }
-
-[type='submit'],
-[type='button'] {
- border-radius: 0;
- -webkit-appearance: none;
- -moz-appearance: none; }
-
-input[type='search'] {
- box-sizing: border-box; }
-
-[type='file'],
-[type='checkbox'],
-[type='radio'] {
- margin: 0 0 1rem; }
-
-[type='checkbox'] + label,
-[type='radio'] + label {
- display: inline-block;
- margin-left: 0.5rem;
- margin-right: 1rem;
- margin-bottom: 0;
- vertical-align: baseline; }
- [type='checkbox'] + label[for],
- [type='radio'] + label[for] {
- cursor: pointer; }
-
-label > [type='checkbox'],
-label > [type='radio'] {
- margin-right: 0.5rem; }
-
-[type='file'] {
- width: 100%; }
-
-label {
- display: block;
- margin: 0;
- font-size: 0.875rem;
- font-weight: normal;
- line-height: 1.8;
- color: #0a0a0a; }
- label.middle {
- margin: 0 0 1rem;
- padding: 0.5625rem 0; }
-
-.help-text {
- margin-top: -0.5rem;
- font-size: 0.8125rem;
- font-style: italic;
- color: #0a0a0a; }
-
-.input-group {
- display: table;
- width: 100%;
- margin-bottom: 1rem; }
- .input-group > :first-child {
- border-radius: 0 0 0 0; }
- .input-group > :last-child > * {
- border-radius: 0 0 0 0; }
-
-.input-group-label, .input-group-field, .input-group-button {
- margin: 0;
- white-space: nowrap;
- display: table-cell;
- vertical-align: middle; }
-
-.input-group-label {
- text-align: center;
- padding: 0 1rem;
- background: #e6e6e6;
- color: #0a0a0a;
- border: 1px solid #cacaca;
- white-space: nowrap;
- width: 1%;
- height: 100%; }
- .input-group-label:first-child {
- border-right: 0; }
- .input-group-label:last-child {
- border-left: 0; }
-
-.input-group-field {
- border-radius: 0;
- height: 2.5rem; }
-
-.input-group-button {
- padding-top: 0;
- padding-bottom: 0;
- text-align: center;
- height: 100%;
- width: 1%; }
- .input-group-button a,
- .input-group-button input,
- .input-group-button button {
- margin: 0; }
-
-.input-group .input-group-button {
- display: table-cell; }
-
-fieldset {
- border: 0;
- padding: 0;
- margin: 0; }
-
-legend {
- margin-bottom: 0.5rem;
- max-width: 100%; }
-
-.fieldset {
- border: 1px solid #cacaca;
- padding: 1.25rem;
- margin: 1.125rem 0; }
- .fieldset legend {
- background: #fefefe;
- padding: 0 0.1875rem;
- margin: 0;
- margin-left: -0.1875rem; }
-
-select {
- height: 2.4375rem;
- padding: 0.5rem;
- border: 1px solid #cacaca;
- margin: 0 0 1rem;
- font-size: 1rem;
- font-family: inherit;
- line-height: normal;
- color: #0a0a0a;
- background-color: #fefefe;
- border-radius: 0;
- -webkit-appearance: none;
- -moz-appearance: none;
- background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='32' height='24' viewBox='0 0 32 24'><polygon points='0,0 32,0 16,24' style='fill: rgb%28138, 138, 138%29'></polygon></svg>");
- background-size: 9px 6px;
- background-position: right -1rem center;
- background-origin: content-box;
- background-repeat: no-repeat;
- padding-right: 1.5rem; }
- @media screen and (min-width: 0\0) {
- select {
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } }
- select:disabled {
- background-color: #e6e6e6;
- cursor: not-allowed; }
- select::-ms-expand {
- display: none; }
- select[multiple] {
- height: auto;
- background-image: none; }
-
-.is-invalid-input:not(:focus) {
- background-color: rgba(236, 88, 64, 0.1);
- border-color: #ec5840; }
-
-.is-invalid-label {
- color: #ec5840; }
-
-.form-error {
- display: none;
- margin-top: -0.5rem;
- margin-bottom: 1rem;
- font-size: 0.75rem;
- font-weight: bold;
- color: #ec5840; }
- .form-error.is-visible {
- display: block; }
-
-.accordion {
- list-style-type: none;
- background: #fefefe;
- margin-left: 0; }
-
-.accordion-item:first-child > :first-child {
- border-radius: 0 0 0 0; }
-
-.accordion-item:last-child > :last-child {
- border-radius: 0 0 0 0; }
-
-.accordion-title {
- display: block;
- padding: 1.25rem 1rem;
- line-height: 1;
- font-size: 0.75rem;
- color: #2199e8;
- position: relative;
- border: 1px solid #e6e6e6;
- border-bottom: 0; }
- :last-child:not(.is-active) > .accordion-title {
- border-radius: 0 0 0 0;
- border-bottom: 1px solid #e6e6e6; }
- .accordion-title:hover, .accordion-title:focus {
- background-color: #e6e6e6; }
- .accordion-title::before {
- content: '+';
- position: absolute;
- right: 1rem;
- top: 50%;
- margin-top: -0.5rem; }
- .is-active > .accordion-title::before {
- content: '–'; }
-
-.accordion-content {
- padding: 1rem;
- display: none;
- border: 1px solid #e6e6e6;
- border-bottom: 0;
- background-color: #fefefe;
- color: #0a0a0a; }
- :last-child > .accordion-content:last-child {
- border-bottom: 1px solid #e6e6e6; }
-
-.is-accordion-submenu-parent > a {
- position: relative; }
- .is-accordion-submenu-parent > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 6px;
- border-color: #2199e8 transparent transparent;
- border-top-style: solid;
- border-bottom-width: 0;
- position: absolute;
- top: 50%;
- margin-top: -4px;
- right: 1rem; }
-
-.is-accordion-submenu-parent[aria-expanded='true'] > a::after {
- -webkit-transform-origin: 50% 50%;
- -ms-transform-origin: 50% 50%;
- transform-origin: 50% 50%;
- -webkit-transform: scaleY(-1);
- -ms-transform: scaleY(-1);
- transform: scaleY(-1); }
-
-.badge {
- display: inline-block;
- padding: 0.3em;
- min-width: 2.1em;
- font-size: 0.6rem;
- text-align: center;
- border-radius: 50%;
- background: #2199e8;
- color: #fefefe; }
- .badge.secondary {
- background: #777;
- color: #fefefe; }
- .badge.success {
- background: #3adb76;
- color: #fefefe; }
- .badge.warning {
- background: #ffae00;
- color: #fefefe; }
- .badge.alert {
- background: #ec5840;
- color: #fefefe; }
-
-.breadcrumbs {
- list-style: none;
- margin: 0 0 1rem 0; }
- .breadcrumbs::before, .breadcrumbs::after {
- content: ' ';
- display: table; }
- .breadcrumbs::after {
- clear: both; }
- .breadcrumbs li {
- float: left;
- color: #0a0a0a;
- font-size: 0.6875rem;
- cursor: default;
- text-transform: uppercase; }
- .breadcrumbs li:not(:last-child)::after {
- color: #cacaca;
- content: "/";
- margin: 0 0.75rem;
- position: relative;
- top: 1px;
- opacity: 1; }
- .breadcrumbs a {
- color: #2199e8; }
- .breadcrumbs a:hover {
- text-decoration: underline; }
- .breadcrumbs .disabled {
- color: #cacaca;
- cursor: not-allowed; }
-
-.button-group {
- margin-bottom: 1rem;
- font-size: 0; }
- .button-group::before, .button-group::after {
- content: ' ';
- display: table; }
- .button-group::after {
- clear: both; }
- .button-group .button {
- margin: 0;
- margin-right: 1px;
- margin-bottom: 1px;
- font-size: 0.9rem; }
- .button-group .button:last-child {
- margin-right: 0; }
- .button-group.tiny .button {
- font-size: 0.6rem; }
- .button-group.small .button {
- font-size: 0.75rem; }
- .button-group.large .button {
- font-size: 1.25rem; }
- .button-group.expanded {
- margin-right: -1px; }
- .button-group.expanded::before, .button-group.expanded::after {
- display: none; }
- .button-group.expanded .button:first-child:nth-last-child(2), .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button {
- display: inline-block;
- width: calc(50% - 1px);
- margin-right: 1px; }
- .button-group.expanded .button:first-child:nth-last-child(2):last-child, .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button:last-child {
- margin-right: -6px; }
- .button-group.expanded .button:first-child:nth-last-child(3), .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button {
- display: inline-block;
- width: calc(33.33333% - 1px);
- margin-right: 1px; }
- .button-group.expanded .button:first-child:nth-last-child(3):last-child, .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button:last-child {
- margin-right: -6px; }
- .button-group.expanded .button:first-child:nth-last-child(4), .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button {
- display: inline-block;
- width: calc(25% - 1px);
- margin-right: 1px; }
- .button-group.expanded .button:first-child:nth-last-child(4):last-child, .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button:last-child {
- margin-right: -6px; }
- .button-group.expanded .button:first-child:nth-last-child(5), .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button {
- display: inline-block;
- width: calc(20% - 1px);
- margin-right: 1px; }
- .button-group.expanded .button:first-child:nth-last-child(5):last-child, .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button:last-child {
- margin-right: -6px; }
- .button-group.expanded .button:first-child:nth-last-child(6), .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button {
- display: inline-block;
- width: calc(16.66667% - 1px);
- margin-right: 1px; }
- .button-group.expanded .button:first-child:nth-last-child(6):last-child, .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button:last-child {
- margin-right: -6px; }
- .button-group.primary .button {
- background-color: #2199e8;
- color: #fefefe; }
- .button-group.primary .button:hover, .button-group.primary .button:focus {
- background-color: #147cc0;
- color: #fefefe; }
- .button-group.secondary .button {
- background-color: #777;
- color: #fefefe; }
- .button-group.secondary .button:hover, .button-group.secondary .button:focus {
- background-color: #5f5f5f;
- color: #fefefe; }
- .button-group.success .button {
- background-color: #3adb76;
- color: #fefefe; }
- .button-group.success .button:hover, .button-group.success .button:focus {
- background-color: #22bb5b;
- color: #fefefe; }
- .button-group.warning .button {
- background-color: #ffae00;
- color: #fefefe; }
- .button-group.warning .button:hover, .button-group.warning .button:focus {
- background-color: #cc8b00;
- color: #fefefe; }
- .button-group.alert .button {
- background-color: #ec5840;
- color: #fefefe; }
- .button-group.alert .button:hover, .button-group.alert .button:focus {
- background-color: #da3116;
- color: #fefefe; }
- .button-group.stacked .button, .button-group.stacked-for-small .button, .button-group.stacked-for-medium .button {
- width: 100%; }
- .button-group.stacked .button:last-child, .button-group.stacked-for-small .button:last-child, .button-group.stacked-for-medium .button:last-child {
- margin-bottom: 0; }
- @media screen and (min-width: 40em) {
- .button-group.stacked-for-small .button {
- width: auto;
- margin-bottom: 0; } }
- @media screen and (min-width: 64em) {
- .button-group.stacked-for-medium .button {
- width: auto;
- margin-bottom: 0; } }
- @media screen and (max-width: 39.9375em) {
- .button-group.stacked-for-small.expanded {
- display: block; }
- .button-group.stacked-for-small.expanded .button {
- display: block;
- margin-right: 0; } }
-
-.callout {
- margin: 0 0 1rem 0;
- padding: 1rem;
- border: 1px solid rgba(10, 10, 10, 0.25);
- border-radius: 0;
- position: relative;
- color: #0a0a0a;
- background-color: white; }
- .callout > :first-child {
- margin-top: 0; }
- .callout > :last-child {
- margin-bottom: 0; }
- .callout.primary {
- background-color: #def0fc; }
- .callout.secondary {
- background-color: #ebebeb; }
- .callout.success {
- background-color: #e1faea; }
- .callout.warning {
- background-color: #fff3d9; }
- .callout.alert {
- background-color: #fce6e2; }
- .callout.small {
- padding-top: 0.5rem;
- padding-right: 0.5rem;
- padding-bottom: 0.5rem;
- padding-left: 0.5rem; }
- .callout.large {
- padding-top: 3rem;
- padding-right: 3rem;
- padding-bottom: 3rem;
- padding-left: 3rem; }
-
-.close-button {
- position: absolute;
- color: #8a8a8a;
- right: 1rem;
- top: 0.5rem;
- font-size: 2em;
- line-height: 1;
- cursor: pointer; }
- [data-whatinput='mouse'] .close-button {
- outline: 0; }
- .close-button:hover, .close-button:focus {
- color: #0a0a0a; }
-
-.menu {
- margin: 0;
- list-style-type: none; }
- .menu > li {
- display: table-cell;
- vertical-align: middle; }
- [data-whatinput='mouse'] .menu > li {
- outline: 0; }
- .menu > li > a {
- display: block;
- padding: 0.7rem 1rem;
- line-height: 1; }
- .menu input,
- .menu a,
- .menu button {
- margin-bottom: 0; }
- .menu > li > a img,
- .menu > li > a i,
- .menu > li > a svg {
- vertical-align: middle; }
- .menu > li > a img + span,
- .menu > li > a i + span,
- .menu > li > a svg + span {
- vertical-align: middle; }
- .menu > li > a img,
- .menu > li > a i,
- .menu > li > a svg {
- margin-right: 0.25rem;
- display: inline-block; }
- .menu > li {
- display: table-cell; }
- .menu.vertical > li {
- display: block; }
- @media screen and (min-width: 40em) {
- .menu.medium-horizontal > li {
- display: table-cell; }
- .menu.medium-vertical > li {
- display: block; } }
- @media screen and (min-width: 64em) {
- .menu.large-horizontal > li {
- display: table-cell; }
- .menu.large-vertical > li {
- display: block; } }
- .menu.simple li {
- line-height: 1;
- display: inline-block;
- margin-right: 1rem; }
- .menu.simple a {
- padding: 0; }
- .menu.align-right::before, .menu.align-right::after {
- content: ' ';
- display: table; }
- .menu.align-right::after {
- clear: both; }
- .menu.align-right > li {
- float: right; }
- .menu.expanded {
- width: 100%;
- display: table;
- table-layout: fixed; }
- .menu.expanded > li:first-child:last-child {
- width: 100%; }
- .menu.icon-top > li > a {
- text-align: center; }
- .menu.icon-top > li > a img,
- .menu.icon-top > li > a i,
- .menu.icon-top > li > a svg {
- display: block;
- margin: 0 auto 0.25rem; }
- .menu.nested {
- margin-left: 1rem; }
- .menu .active > a {
- color: #fefefe;
- background: #2199e8; }
-
-.menu-text {
- font-weight: bold;
- color: inherit;
- line-height: 1;
- padding-top: 0;
- padding-bottom: 0;
- padding: 0.7rem 1rem; }
-
-.menu-centered {
- text-align: center; }
- .menu-centered > .menu {
- display: inline-block; }
-
-.no-js [data-responsive-menu] ul {
- display: none; }
-
-.menu-icon {
- position: relative;
- display: inline-block;
- vertical-align: middle;
- cursor: pointer;
- width: 20px;
- height: 16px; }
- .menu-icon::after {
- content: '';
- position: absolute;
- display: block;
- width: 100%;
- height: 2px;
- background: #fefefe;
- top: 0;
- left: 0;
- box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; }
- .menu-icon:hover::after {
- background: #cacaca;
- box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; }
-
-.menu-icon.dark {
- position: relative;
- display: inline-block;
- vertical-align: middle;
- cursor: pointer;
- width: 20px;
- height: 16px; }
- .menu-icon.dark::after {
- content: '';
- position: absolute;
- display: block;
- width: 100%;
- height: 2px;
- background: #0a0a0a;
- top: 0;
- left: 0;
- box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; }
- .menu-icon.dark:hover::after {
- background: #8a8a8a;
- box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; }
-
-.is-drilldown {
- position: relative;
- overflow: hidden; }
- .is-drilldown li {
- display: block !important; }
-
-.is-drilldown-submenu {
- position: absolute;
- top: 0;
- left: 100%;
- z-index: -1;
- width: 100%;
- background: #fefefe;
- transition: -webkit-transform 0.15s linear;
- transition: transform 0.15s linear; }
- .is-drilldown-submenu.is-active {
- z-index: 1;
- display: block;
- -webkit-transform: translateX(-100%);
- -ms-transform: translateX(-100%);
- transform: translateX(-100%); }
- .is-drilldown-submenu.is-closing {
- -webkit-transform: translateX(100%);
- -ms-transform: translateX(100%);
- transform: translateX(100%); }
-
-.is-drilldown-submenu-parent > a {
- position: relative; }
- .is-drilldown-submenu-parent > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 6px;
- border-color: transparent transparent transparent #2199e8;
- border-left-style: solid;
- border-right-width: 0;
- position: absolute;
- top: 50%;
- margin-top: -6px;
- right: 1rem; }
-
-.js-drilldown-back > a::before {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 6px;
- border-color: transparent #2199e8 transparent transparent;
- border-right-style: solid;
- border-left-width: 0;
- border-left-width: 0;
- display: inline-block;
- vertical-align: middle;
- margin-right: 0.75rem; }
-
-.dropdown-pane {
- background-color: #fefefe;
- border: 1px solid #cacaca;
- border-radius: 0;
- display: block;
- font-size: 1rem;
- padding: 1rem;
- position: absolute;
- visibility: hidden;
- width: 300px;
- z-index: 10; }
- .dropdown-pane.is-open {
- visibility: visible; }
-
-.dropdown-pane.tiny {
- width: 100px; }
-
-.dropdown-pane.small {
- width: 200px; }
-
-.dropdown-pane.large {
- width: 400px; }
-
-.dropdown.menu > li.opens-left > .is-dropdown-submenu {
- left: auto;
- right: 0;
- top: 100%; }
-
-.dropdown.menu > li.opens-right > .is-dropdown-submenu {
- right: auto;
- left: 0;
- top: 100%; }
-
-.dropdown.menu > li.is-dropdown-submenu-parent > a {
- padding-right: 1.5rem;
- position: relative; }
-
-.dropdown.menu > li.is-dropdown-submenu-parent > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: #2199e8 transparent transparent;
- border-top-style: solid;
- border-bottom-width: 0;
- right: 5px;
- margin-top: -2px; }
-
-[data-whatinput='mouse'] .dropdown.menu a {
- outline: 0; }
-
-.no-js .dropdown.menu ul {
- display: none; }
-
-.dropdown.menu.vertical > li .is-dropdown-submenu {
- top: 0; }
-
-.dropdown.menu.vertical > li.opens-left > .is-dropdown-submenu {
- left: auto;
- right: 100%; }
-
-.dropdown.menu.vertical > li.opens-right > .is-dropdown-submenu {
- right: auto;
- left: 100%; }
-
-.dropdown.menu.vertical > li > a::after {
- right: 14px;
- margin-top: -3px; }
-
-.dropdown.menu.vertical > li.opens-left > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: transparent #2199e8 transparent transparent;
- border-right-style: solid;
- border-left-width: 0; }
-
-.dropdown.menu.vertical > li.opens-right > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: transparent transparent transparent #2199e8;
- border-left-style: solid;
- border-right-width: 0; }
-
-@media screen and (min-width: 40em) {
- .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu {
- left: auto;
- right: 0;
- top: 100%; }
- .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu {
- right: auto;
- left: 0;
- top: 100%; }
- .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a {
- padding-right: 1.5rem;
- position: relative; }
- .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: #2199e8 transparent transparent;
- border-top-style: solid;
- border-bottom-width: 0;
- right: 5px;
- margin-top: -2px; }
- .dropdown.menu.medium-vertical > li .is-dropdown-submenu {
- top: 0; }
- .dropdown.menu.medium-vertical > li.opens-left > .is-dropdown-submenu {
- left: auto;
- right: 100%; }
- .dropdown.menu.medium-vertical > li.opens-right > .is-dropdown-submenu {
- right: auto;
- left: 100%; }
- .dropdown.menu.medium-vertical > li > a::after {
- right: 14px;
- margin-top: -3px; }
- .dropdown.menu.medium-vertical > li.opens-left > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: transparent #2199e8 transparent transparent;
- border-right-style: solid;
- border-left-width: 0; }
- .dropdown.menu.medium-vertical > li.opens-right > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: transparent transparent transparent #2199e8;
- border-left-style: solid;
- border-right-width: 0; } }
-
-@media screen and (min-width: 64em) {
- .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu {
- left: auto;
- right: 0;
- top: 100%; }
- .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu {
- right: auto;
- left: 0;
- top: 100%; }
- .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a {
- padding-right: 1.5rem;
- position: relative; }
- .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: #2199e8 transparent transparent;
- border-top-style: solid;
- border-bottom-width: 0;
- right: 5px;
- margin-top: -2px; }
- .dropdown.menu.large-vertical > li .is-dropdown-submenu {
- top: 0; }
- .dropdown.menu.large-vertical > li.opens-left > .is-dropdown-submenu {
- left: auto;
- right: 100%; }
- .dropdown.menu.large-vertical > li.opens-right > .is-dropdown-submenu {
- right: auto;
- left: 100%; }
- .dropdown.menu.large-vertical > li > a::after {
- right: 14px;
- margin-top: -3px; }
- .dropdown.menu.large-vertical > li.opens-left > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: transparent #2199e8 transparent transparent;
- border-right-style: solid;
- border-left-width: 0; }
- .dropdown.menu.large-vertical > li.opens-right > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: transparent transparent transparent #2199e8;
- border-left-style: solid;
- border-right-width: 0; } }
-
-.dropdown.menu.align-right .is-dropdown-submenu.first-sub {
- top: 100%;
- left: auto;
- right: 0; }
-
-.is-dropdown-menu.vertical {
- width: 100px; }
- .is-dropdown-menu.vertical.align-right {
- float: right; }
-
-.is-dropdown-submenu-parent {
- position: relative; }
- .is-dropdown-submenu-parent a::after {
- position: absolute;
- top: 50%;
- right: 5px;
- margin-top: -2px; }
- .is-dropdown-submenu-parent.opens-inner > .is-dropdown-submenu {
- top: 100%;
- left: auto; }
- .is-dropdown-submenu-parent.opens-left > .is-dropdown-submenu {
- left: auto;
- right: 100%; }
- .is-dropdown-submenu-parent.opens-right > .is-dropdown-submenu {
- right: auto;
- left: 100%; }
-
-.is-dropdown-submenu {
- display: none;
- position: absolute;
- top: 0;
- left: 100%;
- min-width: 200px;
- z-index: 1;
- background: #fefefe;
- border: 1px solid #cacaca; }
- .is-dropdown-submenu .is-dropdown-submenu-parent > a::after {
- right: 14px;
- margin-top: -3px; }
- .is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: transparent #2199e8 transparent transparent;
- border-right-style: solid;
- border-left-width: 0; }
- .is-dropdown-submenu .is-dropdown-submenu-parent.opens-right > a::after {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 5px;
- border-color: transparent transparent transparent #2199e8;
- border-left-style: solid;
- border-right-width: 0; }
- .is-dropdown-submenu .is-dropdown-submenu {
- margin-top: -1px; }
- .is-dropdown-submenu > li {
- width: 100%; }
- .is-dropdown-submenu.js-dropdown-active {
- display: block; }
-
-.flex-video {
- position: relative;
- height: 0;
- padding-bottom: 75%;
- margin-bottom: 1rem;
- overflow: hidden; }
- .flex-video iframe,
- .flex-video object,
- .flex-video embed,
- .flex-video video {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%; }
- .flex-video.widescreen {
- padding-bottom: 56.25%; }
- .flex-video.vimeo {
- padding-top: 0; }
-
-.label {
- display: inline-block;
- padding: 0.33333rem 0.5rem;
- font-size: 0.8rem;
- line-height: 1;
- white-space: nowrap;
- cursor: default;
- border-radius: 0;
- background: #2199e8;
- color: #fefefe; }
- .label.secondary {
- background: #777;
- color: #fefefe; }
- .label.success {
- background: #3adb76;
- color: #fefefe; }
- .label.warning {
- background: #ffae00;
- color: #fefefe; }
- .label.alert {
- background: #ec5840;
- color: #fefefe; }
-
-.media-object {
- margin-bottom: 1rem;
- display: block; }
- .media-object img {
- max-width: none; }
- @media screen and (max-width: 39.9375em) {
- .media-object.stack-for-small .media-object-section {
- padding: 0;
- padding-bottom: 1rem;
- display: block; }
- .media-object.stack-for-small .media-object-section img {
- width: 100%; } }
-
-.media-object-section {
- display: table-cell;
- vertical-align: top; }
- .media-object-section:first-child {
- padding-right: 1rem; }
- .media-object-section:last-child:not(:nth-child(2)) {
- padding-left: 1rem; }
- .media-object-section > :last-child {
- margin-bottom: 0; }
- .media-object-section.middle {
- vertical-align: middle; }
- .media-object-section.bottom {
- vertical-align: bottom; }
-
-html,
-body {
- height: 100%; }
-
-.off-canvas-wrapper {
- width: 100%;
- overflow-x: hidden;
- position: relative;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden;
- -webkit-overflow-scrolling: auto; }
-
-.off-canvas-wrapper-inner {
- position: relative;
- width: 100%;
- min-height: 100%;
- transition: -webkit-transform 0.5s ease;
- transition: transform 0.5s ease; }
- .off-canvas-wrapper-inner::before, .off-canvas-wrapper-inner::after {
- content: ' ';
- display: table; }
- .off-canvas-wrapper-inner::after {
- clear: both; }
-
-.off-canvas-content,
-.off-canvas-content {
- min-height: 100%;
- background: #fefefe;
- transition: -webkit-transform 0.5s ease;
- transition: transform 0.5s ease;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden;
- z-index: 1;
- padding-bottom: 0.1px;
- box-shadow: 0 0 10px rgba(10, 10, 10, 0.5); }
-
-.js-off-canvas-exit {
- display: none;
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(254, 254, 254, 0.25);
- cursor: pointer;
- transition: background 0.5s ease; }
-
-.off-canvas {
- position: absolute;
- background: #e6e6e6;
- z-index: -1;
- max-height: 100%;
- overflow-y: auto;
- -webkit-transform: translateX(0);
- -ms-transform: translateX(0);
- transform: translateX(0); }
- [data-whatinput='mouse'] .off-canvas {
- outline: 0; }
- .off-canvas.position-left {
- left: -250px;
- top: 0;
- width: 250px; }
- .is-open-left {
- -webkit-transform: translateX(250px);
- -ms-transform: translateX(250px);
- transform: translateX(250px); }
- .off-canvas.position-right {
- right: -250px;
- top: 0;
- width: 250px; }
- .is-open-right {
- -webkit-transform: translateX(-250px);
- -ms-transform: translateX(-250px);
- transform: translateX(-250px); }
-
-@media screen and (min-width: 40em) {
- .position-left.reveal-for-medium {
- left: 0;
- z-index: auto;
- position: fixed; }
- .position-left.reveal-for-medium ~ .off-canvas-content {
- margin-left: 250px; }
- .position-right.reveal-for-medium {
- right: 0;
- z-index: auto;
- position: fixed; }
- .position-right.reveal-for-medium ~ .off-canvas-content {
- margin-right: 250px; } }
-
-@media screen and (min-width: 64em) {
- .position-left.reveal-for-large {
- left: 0;
- z-index: auto;
- position: fixed; }
- .position-left.reveal-for-large ~ .off-canvas-content {
- margin-left: 250px; }
- .position-right.reveal-for-large {
- right: 0;
- z-index: auto;
- position: fixed; }
- .position-right.reveal-for-large ~ .off-canvas-content {
- margin-right: 250px; } }
-
-.orbit {
- position: relative; }
-
-.orbit-container {
- position: relative;
- margin: 0;
- overflow: hidden;
- list-style: none; }
-
-.orbit-slide {
- width: 100%;
- max-height: 100%; }
- .orbit-slide.no-motionui.is-active {
- top: 0;
- left: 0; }
-
-.orbit-figure {
- margin: 0; }
-
-.orbit-image {
- margin: 0;
- width: 100%;
- max-width: 100%; }
-
-.orbit-caption {
- position: absolute;
- bottom: 0;
- width: 100%;
- padding: 1rem;
- margin-bottom: 0;
- color: #fefefe;
- background-color: rgba(10, 10, 10, 0.5); }
-
-.orbit-previous, .orbit-next {
- position: absolute;
- top: 50%;
- -webkit-transform: translateY(-50%);
- -ms-transform: translateY(-50%);
- transform: translateY(-50%);
- z-index: 10;
- padding: 1rem;
- color: #fefefe; }
- [data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next {
- outline: 0; }
- .orbit-previous:hover, .orbit-next:hover, .orbit-previous:active, .orbit-next:active, .orbit-previous:focus, .orbit-next:focus {
- background-color: rgba(10, 10, 10, 0.5); }
-
-.orbit-previous {
- left: 0; }
-
-.orbit-next {
- left: auto;
- right: 0; }
-
-.orbit-bullets {
- position: relative;
- margin-top: 0.8rem;
- margin-bottom: 0.8rem;
- text-align: center; }
- [data-whatinput='mouse'] .orbit-bullets {
- outline: 0; }
- .orbit-bullets button {
- width: 1.2rem;
- height: 1.2rem;
- margin: 0.1rem;
- background-color: #cacaca;
- border-radius: 50%; }
- .orbit-bullets button:hover {
- background-color: #8a8a8a; }
- .orbit-bullets button.is-active {
- background-color: #8a8a8a; }
-
-.pagination {
- margin-left: 0;
- margin-bottom: 1rem; }
- .pagination::before, .pagination::after {
- content: ' ';
- display: table; }
- .pagination::after {
- clear: both; }
- .pagination li {
- font-size: 0.875rem;
- margin-right: 0.0625rem;
- border-radius: 0;
- display: none; }
- .pagination li:last-child, .pagination li:first-child {
- display: inline-block; }
- @media screen and (min-width: 40em) {
- .pagination li {
- display: inline-block; } }
- .pagination a,
- .pagination button {
- color: #0a0a0a;
- display: block;
- padding: 0.1875rem 0.625rem;
- border-radius: 0; }
- .pagination a:hover,
- .pagination button:hover {
- background: #e6e6e6; }
- .pagination .current {
- padding: 0.1875rem 0.625rem;
- background: #2199e8;
- color: #fefefe;
- cursor: default; }
- .pagination .disabled {
- padding: 0.1875rem 0.625rem;
- color: #cacaca;
- cursor: not-allowed; }
- .pagination .disabled:hover {
- background: transparent; }
- .pagination .ellipsis::after {
- content: '\2026';
- padding: 0.1875rem 0.625rem;
- color: #0a0a0a; }
-
-.pagination-previous a::before,
-.pagination-previous.disabled::before {
- content: '\00ab';
- display: inline-block;
- margin-right: 0.5rem; }
-
-.pagination-next a::after,
-.pagination-next.disabled::after {
- content: '\00bb';
- display: inline-block;
- margin-left: 0.5rem; }
-
-.progress {
- background-color: #cacaca;
- height: 1rem;
- margin-bottom: 1rem;
- border-radius: 0; }
- .progress.primary .progress-meter {
- background-color: #2199e8; }
- .progress.secondary .progress-meter {
- background-color: #777; }
- .progress.success .progress-meter {
- background-color: #3adb76; }
- .progress.warning .progress-meter {
- background-color: #ffae00; }
- .progress.alert .progress-meter {
- background-color: #ec5840; }
-
-.progress-meter {
- position: relative;
- display: block;
- width: 0%;
- height: 100%;
- background-color: #2199e8; }
-
-.progress-meter-text {
- position: absolute;
- top: 50%;
- left: 50%;
- -webkit-transform: translate(-50%, -50%);
- -ms-transform: translate(-50%, -50%);
- transform: translate(-50%, -50%);
- position: absolute;
- margin: 0;
- font-size: 0.75rem;
- font-weight: bold;
- color: #fefefe;
- white-space: nowrap; }
-
-body.is-reveal-open {
- overflow: hidden; }
-
-html.is-reveal-open,
-html.is-reveal-open body {
- min-height: 100%;
- overflow: hidden;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none; }
-
-.reveal-overlay {
- display: none;
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: 1005;
- background-color: rgba(10, 10, 10, 0.45);
- overflow-y: scroll; }
-
-.reveal {
- display: none;
- z-index: 1006;
- padding: 1rem;
- border: 1px solid #cacaca;
- background-color: #fefefe;
- border-radius: 0;
- position: relative;
- top: 100px;
- margin-left: auto;
- margin-right: auto;
- overflow-y: auto; }
- [data-whatinput='mouse'] .reveal {
- outline: 0; }
- @media screen and (min-width: 40em) {
- .reveal {
- min-height: 0; } }
- .reveal .column, .reveal .columns,
- .reveal .columns {
- min-width: 0; }
- .reveal > :last-child {
- margin-bottom: 0; }
- @media screen and (min-width: 40em) {
- .reveal {
- width: 600px;
- max-width: 75rem; } }
- @media screen and (min-width: 40em) {
- .reveal .reveal {
- left: auto;
- right: auto;
- margin: 0 auto; } }
- .reveal.collapse {
- padding: 0; }
- @media screen and (min-width: 40em) {
- .reveal.tiny {
- width: 30%;
- max-width: 75rem; } }
- @media screen and (min-width: 40em) {
- .reveal.small {
- width: 50%;
- max-width: 75rem; } }
- @media screen and (min-width: 40em) {
- .reveal.large {
- width: 90%;
- max-width: 75rem; } }
- .reveal.full {
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- height: 100vh;
- min-height: 100vh;
- max-width: none;
- margin-left: 0;
- border: 0;
- border-radius: 0; }
- @media screen and (max-width: 39.9375em) {
- .reveal {
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- height: 100vh;
- min-height: 100vh;
- max-width: none;
- margin-left: 0;
- border: 0;
- border-radius: 0; } }
- .reveal.without-overlay {
- position: fixed; }
-
-.slider {
- position: relative;
- height: 0.5rem;
- margin-top: 1.25rem;
- margin-bottom: 2.25rem;
- background-color: #e6e6e6;
- cursor: pointer;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -ms-touch-action: none;
- touch-action: none; }
-
-.slider-fill {
- position: absolute;
- top: 0;
- left: 0;
- display: inline-block;
- max-width: 100%;
- height: 0.5rem;
- background-color: #cacaca;
- transition: all 0.2s ease-in-out; }
- .slider-fill.is-dragging {
- transition: all 0s linear; }
-
-.slider-handle {
- position: absolute;
- top: 50%;
- -webkit-transform: translateY(-50%);
- -ms-transform: translateY(-50%);
- transform: translateY(-50%);
- position: absolute;
- left: 0;
- z-index: 1;
- display: inline-block;
- width: 1.4rem;
- height: 1.4rem;
- background-color: #2199e8;
- transition: all 0.2s ease-in-out;
- -ms-touch-action: manipulation;
- touch-action: manipulation;
- border-radius: 0; }
- [data-whatinput='mouse'] .slider-handle {
- outline: 0; }
- .slider-handle:hover {
- background-color: #1583cc; }
- .slider-handle.is-dragging {
- transition: all 0s linear; }
-
-.slider.disabled,
-.slider[disabled] {
- opacity: 0.25;
- cursor: not-allowed; }
-
-.slider.vertical {
- display: inline-block;
- width: 0.5rem;
- height: 12.5rem;
- margin: 0 1.25rem;
- -webkit-transform: scale(1, -1);
- -ms-transform: scale(1, -1);
- transform: scale(1, -1); }
- .slider.vertical .slider-fill {
- top: 0;
- width: 0.5rem;
- max-height: 100%; }
- .slider.vertical .slider-handle {
- position: absolute;
- top: 0;
- left: 50%;
- width: 1.4rem;
- height: 1.4rem;
- -webkit-transform: translateX(-50%);
- -ms-transform: translateX(-50%);
- transform: translateX(-50%); }
-
-.sticky-container {
- position: relative; }
-
-.sticky {
- position: absolute;
- z-index: 0;
- -webkit-transform: translate3d(0, 0, 0);
- transform: translate3d(0, 0, 0); }
-
-.sticky.is-stuck {
- position: fixed;
- z-index: 5; }
- .sticky.is-stuck.is-at-top {
- top: 0; }
- .sticky.is-stuck.is-at-bottom {
- bottom: 0; }
-
-.sticky.is-anchored {
- position: absolute;
- left: auto;
- right: auto; }
- .sticky.is-anchored.is-at-bottom {
- bottom: 0; }
-
-.switch {
- height: 2rem;
- margin-bottom: 1rem;
- outline: 0;
- position: relative;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- color: #fefefe;
- font-weight: bold;
- font-size: 0.875rem; }
-
-.switch-input {
- opacity: 0;
- position: absolute;
- margin-bottom: 0; }
-
-.switch-paddle {
- background: #cacaca;
- cursor: pointer;
- display: block;
- position: relative;
- width: 4rem;
- height: 2rem;
- transition: all 0.25s ease-out;
- border-radius: 0;
- color: inherit;
- font-weight: inherit; }
- input + .switch-paddle {
- margin: 0; }
- .switch-paddle::after {
- background: #fefefe;
- content: '';
- display: block;
- position: absolute;
- height: 1.5rem;
- left: 0.25rem;
- top: 0.25rem;
- width: 1.5rem;
- transition: all 0.25s ease-out;
- -webkit-transform: translate3d(0, 0, 0);
- transform: translate3d(0, 0, 0);
- border-radius: 0; }
- input:checked ~ .switch-paddle {
- background: #2199e8; }
- input:checked ~ .switch-paddle::after {
- left: 2.25rem; }
- [data-whatinput='mouse'] input:focus ~ .switch-paddle {
- outline: 0; }
-
-.switch-active, .switch-inactive {
- position: absolute;
- top: 50%;
- -webkit-transform: translateY(-50%);
- -ms-transform: translateY(-50%);
- transform: translateY(-50%); }
-
-.switch-active {
- left: 8%;
- display: none; }
- input:checked + label > .switch-active {
- display: block; }
-
-.switch-inactive {
- right: 15%; }
- input:checked + label > .switch-inactive {
- display: none; }
-
-.switch.tiny {
- height: 1.5rem; }
- .switch.tiny .switch-paddle {
- width: 3rem;
- height: 1.5rem;
- font-size: 0.625rem; }
- .switch.tiny .switch-paddle::after {
- width: 1rem;
- height: 1rem; }
- .switch.tiny input:checked ~ .switch-paddle::after {
- left: 1.75rem; }
-
-.switch.small {
- height: 1.75rem; }
- .switch.small .switch-paddle {
- width: 3.5rem;
- height: 1.75rem;
- font-size: 0.75rem; }
- .switch.small .switch-paddle::after {
- width: 1.25rem;
- height: 1.25rem; }
- .switch.small input:checked ~ .switch-paddle::after {
- left: 2rem; }
-
-.switch.large {
- height: 2.5rem; }
- .switch.large .switch-paddle {
- width: 5rem;
- height: 2.5rem;
- font-size: 1rem; }
- .switch.large .switch-paddle::after {
- width: 2rem;
- height: 2rem; }
- .switch.large input:checked ~ .switch-paddle::after {
- left: 2.75rem; }
-
-table {
- width: 100%;
- margin-bottom: 1rem;
- border-radius: 0; }
- table thead,
- table tbody,
- table tfoot {
- border: 1px solid #f1f1f1;
- background-color: #fefefe; }
- table caption {
- font-weight: bold;
- padding: 0.5rem 0.625rem 0.625rem; }
- table thead {
- background: #f8f8f8;
- color: #0a0a0a; }
- table tfoot {
- background: #f1f1f1;
- color: #0a0a0a; }
- table thead tr,
- table tfoot tr {
- background: transparent; }
- table thead th,
- table thead td,
- table tfoot th,
- table tfoot td {
- padding: 0.5rem 0.625rem 0.625rem;
- font-weight: bold;
- text-align: left; }
- table tbody tr:nth-child(even) {
- background-color: #f1f1f1; }
- table tbody th,
- table tbody td {
- padding: 0.5rem 0.625rem 0.625rem; }
-
-@media screen and (max-width: 63.9375em) {
- table.stack thead {
- display: none; }
- table.stack tfoot {
- display: none; }
- table.stack tr,
- table.stack th,
- table.stack td {
- display: block; }
- table.stack td {
- border-top: 0; } }
-
-table.scroll {
- display: block;
- width: 100%;
- overflow-x: auto; }
-
-table.hover thead tr:hover {
- background-color: #f3f3f3; }
-
-table.hover tfoot tr:hover {
- background-color: #ececec; }
-
-table.hover tbody tr:hover {
- background-color: #f9f9f9; }
-
-table.hover tbody tr:nth-of-type(even):hover {
- background-color: #ececec; }
-
-.table-scroll {
- overflow-x: auto; }
- .table-scroll table {
- width: auto; }
-
-.tabs {
- margin: 0;
- list-style-type: none;
- background: #fefefe;
- border: 1px solid #e6e6e6; }
- .tabs::before, .tabs::after {
- content: ' ';
- display: table; }
- .tabs::after {
- clear: both; }
-
-.tabs.vertical > li {
- width: auto;
- float: none;
- display: block; }
-
-.tabs.simple > li > a {
- padding: 0; }
- .tabs.simple > li > a:hover {
- background: transparent; }
-
-.tabs.primary {
- background: #2199e8; }
- .tabs.primary > li > a {
- color: #fefefe; }
- .tabs.primary > li > a:hover, .tabs.primary > li > a:focus {
- background: #1893e4; }
-
-.tabs-title {
- float: left; }
- .tabs-title > a {
- display: block;
- padding: 1.25rem 1.5rem;
- line-height: 1;
- font-size: 0.75rem; }
- .tabs-title > a:hover {
- background: #fefefe; }
- .tabs-title > a:focus, .tabs-title > a[aria-selected='true'] {
- background: #e6e6e6; }
-
-.tabs-content {
- background: #fefefe;
- transition: all 0.5s ease;
- border: 1px solid #e6e6e6;
- border-top: 0; }
-
-.tabs-content.vertical {
- border: 1px solid #e6e6e6;
- border-left: 0; }
-
-.tabs-panel {
- display: none;
- padding: 1rem; }
- .tabs-panel.is-active {
- display: block; }
-
-.thumbnail {
- border: solid 4px #fefefe;
- box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2);
- display: inline-block;
- line-height: 0;
- max-width: 100%;
- transition: box-shadow 200ms ease-out;
- border-radius: 0;
- margin-bottom: 1rem; }
- .thumbnail:hover, .thumbnail:focus {
- box-shadow: 0 0 6px 1px rgba(33, 153, 232, 0.5); }
-
-.title-bar {
- background: #0a0a0a;
- color: #fefefe;
- padding: 0.5rem; }
- .title-bar::before, .title-bar::after {
- content: ' ';
- display: table; }
- .title-bar::after {
- clear: both; }
- .title-bar .menu-icon {
- margin-left: 0.25rem;
- margin-right: 0.25rem; }
-
-.title-bar-left {
- float: left; }
-
-.title-bar-right {
- float: right;
- text-align: right; }
-
-.title-bar-title {
- font-weight: bold;
- vertical-align: middle;
- display: inline-block; }
-
-.has-tip {
- border-bottom: dotted 1px #8a8a8a;
- font-weight: bold;
- position: relative;
- display: inline-block;
- cursor: help; }
-
-.tooltip {
- background-color: #0a0a0a;
- color: #fefefe;
- font-size: 80%;
- padding: 0.75rem;
- position: absolute;
- z-index: 10;
- top: calc(100% + 0.6495rem);
- max-width: 10rem !important;
- border-radius: 0; }
- .tooltip::before {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 0.75rem;
- border-color: transparent transparent #0a0a0a;
- border-bottom-style: solid;
- border-top-width: 0;
- bottom: 100%;
- position: absolute;
- left: 50%;
- -webkit-transform: translateX(-50%);
- -ms-transform: translateX(-50%);
- transform: translateX(-50%); }
- .tooltip.top::before {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 0.75rem;
- border-color: #0a0a0a transparent transparent;
- border-top-style: solid;
- border-bottom-width: 0;
- top: 100%;
- bottom: auto; }
- .tooltip.left::before {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 0.75rem;
- border-color: transparent transparent transparent #0a0a0a;
- border-left-style: solid;
- border-right-width: 0;
- bottom: auto;
- left: 100%;
- top: 50%;
- -webkit-transform: translateY(-50%);
- -ms-transform: translateY(-50%);
- transform: translateY(-50%); }
- .tooltip.right::before {
- content: '';
- display: block;
- width: 0;
- height: 0;
- border: inset 0.75rem;
- border-color: transparent #0a0a0a transparent transparent;
- border-right-style: solid;
- border-left-width: 0;
- bottom: auto;
- left: auto;
- right: 100%;
- top: 50%;
- -webkit-transform: translateY(-50%);
- -ms-transform: translateY(-50%);
- transform: translateY(-50%); }
-
-.top-bar {
- padding: 0.5rem; }
- .top-bar::before, .top-bar::after {
- content: ' ';
- display: table; }
- .top-bar::after {
- clear: both; }
- .top-bar,
- .top-bar ul {
- background-color: #e6e6e6; }
- .top-bar input {
- max-width: 200px;
- margin-right: 1rem; }
- .top-bar .input-group-field {
- width: 100%;
- margin-right: 0; }
- .top-bar input.button {
- width: auto; }
- .top-bar .top-bar-left,
- .top-bar .top-bar-right {
- width: 100%; }
- @media screen and (min-width: 40em) {
- .top-bar .top-bar-left,
- .top-bar .top-bar-right {
- width: auto; } }
- @media screen and (max-width: 63.9375em) {
- .top-bar.stacked-for-medium .top-bar-left,
- .top-bar.stacked-for-medium .top-bar-right {
- width: 100%; } }
- @media screen and (max-width: 74.9375em) {
- .top-bar.stacked-for-large .top-bar-left,
- .top-bar.stacked-for-large .top-bar-right {
- width: 100%; } }
-
-.top-bar-title {
- float: left;
- margin-right: 1rem; }
-
-.top-bar-left {
- float: left; }
-
-.top-bar-right {
- float: right; }
-
-.hide {
- display: none !important; }
-
-.invisible {
- visibility: hidden; }
-
-@media screen and (max-width: 39.9375em) {
- .hide-for-small-only {
- display: none !important; } }
-
-@media screen and (max-width: 0em), screen and (min-width: 40em) {
- .show-for-small-only {
- display: none !important; } }
-
-@media screen and (min-width: 40em) {
- .hide-for-medium {
- display: none !important; } }
-
-@media screen and (max-width: 39.9375em) {
- .show-for-medium {
- display: none !important; } }
-
-@media screen and (min-width: 40em) and (max-width: 63.9375em) {
- .hide-for-medium-only {
- display: none !important; } }
-
-@media screen and (max-width: 39.9375em), screen and (min-width: 64em) {
- .show-for-medium-only {
- display: none !important; } }
-
-@media screen and (min-width: 64em) {
- .hide-for-large {
- display: none !important; } }
-
-@media screen and (max-width: 63.9375em) {
- .show-for-large {
- display: none !important; } }
-
-@media screen and (min-width: 64em) and (max-width: 74.9375em) {
- .hide-for-large-only {
- display: none !important; } }
-
-@media screen and (max-width: 63.9375em), screen and (min-width: 75em) {
- .show-for-large-only {
- display: none !important; } }
-
-.show-for-sr,
-.show-on-focus {
- position: absolute !important;
- width: 1px;
- height: 1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0); }
-
-.show-on-focus:active, .show-on-focus:focus {
- position: static !important;
- height: auto;
- width: auto;
- overflow: visible;
- clip: auto; }
-
-.show-for-landscape,
-.hide-for-portrait {
- display: block !important; }
- @media screen and (orientation: landscape) {
- .show-for-landscape,
- .hide-for-portrait {
- display: block !important; } }
- @media screen and (orientation: portrait) {
- .show-for-landscape,
- .hide-for-portrait {
- display: none !important; } }
-
-.hide-for-landscape,
-.show-for-portrait {
- display: none !important; }
- @media screen and (orientation: landscape) {
- .hide-for-landscape,
- .show-for-portrait {
- display: none !important; } }
- @media screen and (orientation: portrait) {
- .hide-for-landscape,
- .show-for-portrait {
- display: block !important; } }
-
-.float-left {
- float: left !important; }
-
-.float-right {
- float: right !important; }
-
-.float-center {
- display: block;
- margin-left: auto;
- margin-right: auto; }
-
-.clearfix::before, .clearfix::after {
- content: ' ';
- display: table; }
-
-.clearfix::after {
- clear: both; }
-
-.slide-in-down.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: translateY(-100%);
- -ms-transform: translateY(-100%);
- transform: translateY(-100%);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden; }
-
-.slide-in-down.mui-enter.mui-enter-active {
- -webkit-transform: translateY(0);
- -ms-transform: translateY(0);
- transform: translateY(0); }
-
-.slide-in-left.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: translateX(-100%);
- -ms-transform: translateX(-100%);
- transform: translateX(-100%);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden; }
-
-.slide-in-left.mui-enter.mui-enter-active {
- -webkit-transform: translateX(0);
- -ms-transform: translateX(0);
- transform: translateX(0); }
-
-.slide-in-up.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: translateY(100%);
- -ms-transform: translateY(100%);
- transform: translateY(100%);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden; }
-
-.slide-in-up.mui-enter.mui-enter-active {
- -webkit-transform: translateY(0);
- -ms-transform: translateY(0);
- transform: translateY(0); }
-
-.slide-in-right.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: translateX(100%);
- -ms-transform: translateX(100%);
- transform: translateX(100%);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden; }
-
-.slide-in-right.mui-enter.mui-enter-active {
- -webkit-transform: translateX(0);
- -ms-transform: translateX(0);
- transform: translateX(0); }
-
-.slide-out-down.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: translateY(0);
- -ms-transform: translateY(0);
- transform: translateY(0);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden; }
-
-.slide-out-down.mui-leave.mui-leave-active {
- -webkit-transform: translateY(100%);
- -ms-transform: translateY(100%);
- transform: translateY(100%); }
-
-.slide-out-right.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: translateX(0);
- -ms-transform: translateX(0);
- transform: translateX(0);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden; }
-
-.slide-out-right.mui-leave.mui-leave-active {
- -webkit-transform: translateX(100%);
- -ms-transform: translateX(100%);
- transform: translateX(100%); }
-
-.slide-out-up.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: translateY(0);
- -ms-transform: translateY(0);
- transform: translateY(0);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden; }
-
-.slide-out-up.mui-leave.mui-leave-active {
- -webkit-transform: translateY(-100%);
- -ms-transform: translateY(-100%);
- transform: translateY(-100%); }
-
-.slide-out-left.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: translateX(0);
- -ms-transform: translateX(0);
- transform: translateX(0);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden; }
-
-.slide-out-left.mui-leave.mui-leave-active {
- -webkit-transform: translateX(-100%);
- -ms-transform: translateX(-100%);
- transform: translateX(-100%); }
-
-.fade-in.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- opacity: 0;
- transition-property: opacity; }
-
-.fade-in.mui-enter.mui-enter-active {
- opacity: 1; }
-
-.fade-out.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- opacity: 1;
- transition-property: opacity; }
-
-.fade-out.mui-leave.mui-leave-active {
- opacity: 0; }
-
-.hinge-in-from-top.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotateX(-90deg);
- transform: perspective(2000px) rotateX(-90deg);
- -webkit-transform-origin: top;
- -ms-transform-origin: top;
- transform-origin: top;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.hinge-in-from-top.mui-enter.mui-enter-active {
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- opacity: 1; }
-
-.hinge-in-from-right.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotateY(-90deg);
- transform: perspective(2000px) rotateY(-90deg);
- -webkit-transform-origin: right;
- -ms-transform-origin: right;
- transform-origin: right;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.hinge-in-from-right.mui-enter.mui-enter-active {
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- opacity: 1; }
-
-.hinge-in-from-bottom.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotateX(90deg);
- transform: perspective(2000px) rotateX(90deg);
- -webkit-transform-origin: bottom;
- -ms-transform-origin: bottom;
- transform-origin: bottom;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.hinge-in-from-bottom.mui-enter.mui-enter-active {
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- opacity: 1; }
-
-.hinge-in-from-left.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotateY(90deg);
- transform: perspective(2000px) rotateY(90deg);
- -webkit-transform-origin: left;
- -ms-transform-origin: left;
- transform-origin: left;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.hinge-in-from-left.mui-enter.mui-enter-active {
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- opacity: 1; }
-
-.hinge-in-from-middle-x.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotateX(-90deg);
- transform: perspective(2000px) rotateX(-90deg);
- -webkit-transform-origin: center;
- -ms-transform-origin: center;
- transform-origin: center;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.hinge-in-from-middle-x.mui-enter.mui-enter-active {
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- opacity: 1; }
-
-.hinge-in-from-middle-y.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotateY(-90deg);
- transform: perspective(2000px) rotateY(-90deg);
- -webkit-transform-origin: center;
- -ms-transform-origin: center;
- transform-origin: center;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.hinge-in-from-middle-y.mui-enter.mui-enter-active {
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- opacity: 1; }
-
-.hinge-out-from-top.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- -webkit-transform-origin: top;
- -ms-transform-origin: top;
- transform-origin: top;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.hinge-out-from-top.mui-leave.mui-leave-active {
- -webkit-transform: perspective(2000px) rotateX(-90deg);
- transform: perspective(2000px) rotateX(-90deg);
- opacity: 0; }
-
-.hinge-out-from-right.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- -webkit-transform-origin: right;
- -ms-transform-origin: right;
- transform-origin: right;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.hinge-out-from-right.mui-leave.mui-leave-active {
- -webkit-transform: perspective(2000px) rotateY(-90deg);
- transform: perspective(2000px) rotateY(-90deg);
- opacity: 0; }
-
-.hinge-out-from-bottom.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- -webkit-transform-origin: bottom;
- -ms-transform-origin: bottom;
- transform-origin: bottom;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.hinge-out-from-bottom.mui-leave.mui-leave-active {
- -webkit-transform: perspective(2000px) rotateX(90deg);
- transform: perspective(2000px) rotateX(90deg);
- opacity: 0; }
-
-.hinge-out-from-left.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- -webkit-transform-origin: left;
- -ms-transform-origin: left;
- transform-origin: left;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.hinge-out-from-left.mui-leave.mui-leave-active {
- -webkit-transform: perspective(2000px) rotateY(90deg);
- transform: perspective(2000px) rotateY(90deg);
- opacity: 0; }
-
-.hinge-out-from-middle-x.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- -webkit-transform-origin: center;
- -ms-transform-origin: center;
- transform-origin: center;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.hinge-out-from-middle-x.mui-leave.mui-leave-active {
- -webkit-transform: perspective(2000px) rotateX(-90deg);
- transform: perspective(2000px) rotateX(-90deg);
- opacity: 0; }
-
-.hinge-out-from-middle-y.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: perspective(2000px) rotate(0deg);
- transform: perspective(2000px) rotate(0deg);
- -webkit-transform-origin: center;
- -ms-transform-origin: center;
- transform-origin: center;
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.hinge-out-from-middle-y.mui-leave.mui-leave-active {
- -webkit-transform: perspective(2000px) rotateY(-90deg);
- transform: perspective(2000px) rotateY(-90deg);
- opacity: 0; }
-
-.scale-in-up.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: scale(0.5);
- -ms-transform: scale(0.5);
- transform: scale(0.5);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.scale-in-up.mui-enter.mui-enter-active {
- -webkit-transform: scale(1);
- -ms-transform: scale(1);
- transform: scale(1);
- opacity: 1; }
-
-.scale-in-down.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: scale(1.5);
- -ms-transform: scale(1.5);
- transform: scale(1.5);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.scale-in-down.mui-enter.mui-enter-active {
- -webkit-transform: scale(1);
- -ms-transform: scale(1);
- transform: scale(1);
- opacity: 1; }
-
-.scale-out-up.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: scale(1);
- -ms-transform: scale(1);
- transform: scale(1);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.scale-out-up.mui-leave.mui-leave-active {
- -webkit-transform: scale(1.5);
- -ms-transform: scale(1.5);
- transform: scale(1.5);
- opacity: 0; }
-
-.scale-out-down.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: scale(1);
- -ms-transform: scale(1);
- transform: scale(1);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.scale-out-down.mui-leave.mui-leave-active {
- -webkit-transform: scale(0.5);
- -ms-transform: scale(0.5);
- transform: scale(0.5);
- opacity: 0; }
-
-.spin-in.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: rotate(-0.75turn);
- -ms-transform: rotate(-0.75turn);
- transform: rotate(-0.75turn);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.spin-in.mui-enter.mui-enter-active {
- -webkit-transform: rotate(0);
- -ms-transform: rotate(0);
- transform: rotate(0);
- opacity: 1; }
-
-.spin-out.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: rotate(0);
- -ms-transform: rotate(0);
- transform: rotate(0);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.spin-out.mui-leave.mui-leave-active {
- -webkit-transform: rotate(0.75turn);
- -ms-transform: rotate(0.75turn);
- transform: rotate(0.75turn);
- opacity: 0; }
-
-.spin-in-ccw.mui-enter {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: rotate(0.75turn);
- -ms-transform: rotate(0.75turn);
- transform: rotate(0.75turn);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 0; }
-
-.spin-in-ccw.mui-enter.mui-enter-active {
- -webkit-transform: rotate(0);
- -ms-transform: rotate(0);
- transform: rotate(0);
- opacity: 1; }
-
-.spin-out-ccw.mui-leave {
- transition-duration: 500ms;
- transition-timing-function: linear;
- -webkit-transform: rotate(0);
- -ms-transform: rotate(0);
- transform: rotate(0);
- transition-property: -webkit-transform, opacity;
- transition-property: transform, opacity;
- opacity: 1; }
-
-.spin-out-ccw.mui-leave.mui-leave-active {
- -webkit-transform: rotate(-0.75turn);
- -ms-transform: rotate(-0.75turn);
- transform: rotate(-0.75turn);
- opacity: 0; }
-
-.slow {
- transition-duration: 750ms !important; }
-
-.fast {
- transition-duration: 250ms !important; }
-
-.linear {
- transition-timing-function: linear !important; }
-
-.ease {
- transition-timing-function: ease !important; }
-
-.ease-in {
- transition-timing-function: ease-in !important; }
-
-.ease-out {
- transition-timing-function: ease-out !important; }
-
-.ease-in-out {
- transition-timing-function: ease-in-out !important; }
-
-.bounce-in {
- transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; }
-
-.bounce-out {
- transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; }
-
-.bounce-in-out {
- transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; }
-
-.short-delay {
- transition-delay: 300ms !important; }
-
-.long-delay {
- transition-delay: 700ms !important; }
-
-.shake {
- -webkit-animation-name: shake-7;
- animation-name: shake-7; }
-
-@-webkit-keyframes shake-7 {
- 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% {
- -webkit-transform: translateX(7%);
- transform: translateX(7%); }
- 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% {
- -webkit-transform: translateX(-7%);
- transform: translateX(-7%); } }
-
-@keyframes shake-7 {
- 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% {
- -webkit-transform: translateX(7%);
- transform: translateX(7%); }
- 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% {
- -webkit-transform: translateX(-7%);
- transform: translateX(-7%); } }
-
-.spin-cw {
- -webkit-animation-name: spin-cw-1turn;
- animation-name: spin-cw-1turn; }
-
-@-webkit-keyframes spin-cw-1turn {
- 0% {
- -webkit-transform: rotate(-1turn);
- transform: rotate(-1turn); }
- 100% {
- -webkit-transform: rotate(0);
- transform: rotate(0); } }
-
-@keyframes spin-cw-1turn {
- 0% {
- -webkit-transform: rotate(-1turn);
- transform: rotate(-1turn); }
- 100% {
- -webkit-transform: rotate(0);
- transform: rotate(0); } }
-
-.spin-ccw {
- -webkit-animation-name: spin-cw-1turn;
- animation-name: spin-cw-1turn; }
-
-@keyframes spin-cw-1turn {
- 0% {
- -webkit-transform: rotate(0);
- transform: rotate(0); }
- 100% {
- -webkit-transform: rotate(1turn);
- transform: rotate(1turn); } }
-
-.wiggle {
- -webkit-animation-name: wiggle-7deg;
- animation-name: wiggle-7deg; }
-
-@-webkit-keyframes wiggle-7deg {
- 40%, 50%, 60% {
- -webkit-transform: rotate(7deg);
- transform: rotate(7deg); }
- 35%, 45%, 55%, 65% {
- -webkit-transform: rotate(-7deg);
- transform: rotate(-7deg); }
- 0%, 30%, 70%, 100% {
- -webkit-transform: rotate(0);
- transform: rotate(0); } }
-
-@keyframes wiggle-7deg {
- 40%, 50%, 60% {
- -webkit-transform: rotate(7deg);
- transform: rotate(7deg); }
- 35%, 45%, 55%, 65% {
- -webkit-transform: rotate(-7deg);
- transform: rotate(-7deg); }
- 0%, 30%, 70%, 100% {
- -webkit-transform: rotate(0);
- transform: rotate(0); } }
-
-.shake,
-.spin-cw,
-.spin-ccw,
-.wiggle {
- -webkit-animation-duration: 500ms;
- animation-duration: 500ms; }
-
-.infinite {
- -webkit-animation-iteration-count: infinite;
- animation-iteration-count: infinite; }
-
-.slow {
- -webkit-animation-duration: 750ms !important;
- animation-duration: 750ms !important; }
-
-.fast {
- -webkit-animation-duration: 250ms !important;
- animation-duration: 250ms !important; }
-
-.linear {
- -webkit-animation-timing-function: linear !important;
- animation-timing-function: linear !important; }
-
-.ease {
- -webkit-animation-timing-function: ease !important;
- animation-timing-function: ease !important; }
-
-.ease-in {
- -webkit-animation-timing-function: ease-in !important;
- animation-timing-function: ease-in !important; }
-
-.ease-out {
- -webkit-animation-timing-function: ease-out !important;
- animation-timing-function: ease-out !important; }
-
-.ease-in-out {
- -webkit-animation-timing-function: ease-in-out !important;
- animation-timing-function: ease-in-out !important; }
-
-.bounce-in {
- -webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important;
- animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; }
-
-.bounce-out {
- -webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important;
- animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; }
-
-.bounce-in-out {
- -webkit-animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important;
- animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; }
-
-.short-delay {
- -webkit-animation-delay: 300ms !important;
- animation-delay: 300ms !important; }
-
-.long-delay {
- -webkit-animation-delay: 700ms !important;
- animation-delay: 700ms !important; }
diff --git a/examplesite/themes/hugof/static/css/styles.css b/examplesite/themes/hugof/static/css/styles.css
deleted file mode 100644
index 7c2f5e9..0000000
--- a/examplesite/themes/hugof/static/css/styles.css
+++ /dev/null
@@ -1,153 +0,0 @@
-/*************
-Global Styles
-************** */
-
-
-
-.wrapper {
- width: 90%;
- max-width: 700px;
- margin: 0 auto;
-}
-
-.off-canvas-wrapper {
- background-color: #222;
-}
-
-
-/*************
-Nav mobile
-************** */
-
-.title-bar {
- background-color: #222;
- height: 60px;
- padding-top: 15px;
-}
-
-#mobile-menu {
- background-color: #222;
- padding: 10px;
-}
-
-#mobile-menu li {
- list-style: none;
-}
-
-#mobile-menu a {
- color: rgba(255,255,255, 0.6);
- font-weight: bold;
- line-height: 2;
-}
-
-#mobile-menu a:hover {
- color: rgba(255,255,255, 0.8);
-}
-
-/*************
-Nav desktop
-************** */
-
-.nav-desktop {
- background-color: #222;
- padding: 0;
-}
-
-.site-logo {
- color: white;
-}
-
-.nav-desktop .menu-desktop {
- background-color: transparent;
- line-height: 50px;
-}
-
-.menu > li > a {
- display: inline-block;
- color: white;
- line-height: 50px;
- padding-top: 0;
- padding-bottom: 0;
-}
-
-.menu > li > a:hover {
- background-color: rgba(255,255,255, 0.1);
-}
-
-/*************
-Hero
-************** */
-.hero-panel {
- background-color: #cccccc;
- padding: 50px 0px;
- /*top right bottom left*/
- height: 300px;
- background-image: url("../img/swirl_pattern.png");
-}
-
-
-/*************
-Main
-************** */
-.main-content {
- padding: 80px 0px;
-}
-
-.content-one {
-
-}
-
-.content-two {
-
-}
-
-/*************
-Footer
-************** */
-footer {
- background-color: #222;
- padding: 50px 0px;
-}
-
-footer h4 {
- color: rgba(255,255,255, 0.8);
- font-size: 1.3em;
-}
-
-footer hr {
- border-color: rgba(255,255,255, 0.1);
- margin: 10px 0;
-}
-
-footer a {
- display: block;
- color: rgba(255,255,255, 0.6);
- font-size: 0.8em;
-}
-
-footer a span {
- font-weight: bold;
- color: rgba(255,255,255, 0.3);
-
-}
-
-footer a:hover {
- color: rgba(255,255,255, 0.8);
-}
-
-/*************
-Media Query
-************** */
-
-@media (max-width: 640px) {
- .nav-desktop {
- display: none;
- }
-}
-
-@media (max-width: 800px) {
- .hero h1,
- .hero p {
- width: 100%;
- }
-}
diff --git a/examplesite/themes/hugof/static/img/swirl_pattern.png b/examplesite/themes/hugof/static/img/swirl_pattern.png
deleted file mode 100644
index 80f6bb4..0000000
--- a/examplesite/themes/hugof/static/img/swirl_pattern.png
+++ /dev/null
Binary files differ
diff --git a/examplesite/themes/hugof/static/js/app.js b/examplesite/themes/hugof/static/js/app.js
deleted file mode 100644
index 5b80fd1..0000000
--- a/examplesite/themes/hugof/static/js/app.js
+++ /dev/null
@@ -1 +0,0 @@
-$(document).foundation()
diff --git a/examplesite/themes/hugof/static/js/foundation.js b/examplesite/themes/hugof/static/js/foundation.js
deleted file mode 100644
index 1ea4dac..0000000
--- a/examplesite/themes/hugof/static/js/foundation.js
+++ /dev/null
@@ -1,9143 +0,0 @@
-!function ($) {
-
- "use strict";
-
- var FOUNDATION_VERSION = '6.2.4';
-
- // Global Foundation object
- // This is attached to the window, or used as a module for AMD/Browserify
- var Foundation = {
- version: FOUNDATION_VERSION,
-
- /**
- * Stores initialized plugins.
- */
- _plugins: {},
-
- /**
- * Stores generated unique ids for plugin instances
- */
- _uuids: [],
-
- /**
- * Returns a boolean for RTL support
- */
- rtl: function () {
- return $('html').attr('dir') === 'rtl';
- },
- /**
- * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing.
- * @param {Object} plugin - The constructor of the plugin.
- */
- plugin: function (plugin, name) {
- // Object key to use when adding to global Foundation object
- // Examples: Foundation.Reveal, Foundation.OffCanvas
- var className = name || functionName(plugin);
- // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin
- // Examples: data-reveal, data-off-canvas
- var attrName = hyphenate(className);
-
- // Add to the Foundation object and the plugins list (for reflowing)
- this._plugins[attrName] = this[className] = plugin;
- },
- /**
- * @function
- * Populates the _uuids array with pointers to each individual plugin instance.
- * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls.
- * Also fires the initialization event for each plugin, consolidating repetitive code.
- * @param {Object} plugin - an instance of a plugin, usually `this` in context.
- * @param {String} name - the name of the plugin, passed as a camelCased string.
- * @fires Plugin#init
- */
- registerPlugin: function (plugin, name) {
- var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase();
- plugin.uuid = this.GetYoDigits(6, pluginName);
-
- if (!plugin.$element.attr('data-' + pluginName)) {
- plugin.$element.attr('data-' + pluginName, plugin.uuid);
- }
- if (!plugin.$element.data('zfPlugin')) {
- plugin.$element.data('zfPlugin', plugin);
- }
- /**
- * Fires when the plugin has initialized.
- * @event Plugin#init
- */
- plugin.$element.trigger('init.zf.' + pluginName);
-
- this._uuids.push(plugin.uuid);
-
- return;
- },
- /**
- * @function
- * Removes the plugins uuid from the _uuids array.
- * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute.
- * Also fires the destroyed event for the plugin, consolidating repetitive code.
- * @param {Object} plugin - an instance of a plugin, usually `this` in context.
- * @fires Plugin#destroyed
- */
- unregisterPlugin: function (plugin) {
- var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor));
-
- this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1);
- plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin')
- /**
- * Fires when the plugin has been destroyed.
- * @event Plugin#destroyed
- */
- .trigger('destroyed.zf.' + pluginName);
- for (var prop in plugin) {
- plugin[prop] = null; //clean up script to prep for garbage collection.
- }
- return;
- },
-
- /**
- * @function
- * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc.
- * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'`
- * @default If no argument is passed, reflow all currently active plugins.
- */
- reInit: function (plugins) {
- var isJQ = plugins instanceof $;
- try {
- if (isJQ) {
- plugins.each(function () {
- $(this).data('zfPlugin')._init();
- });
- } else {
- var type = typeof plugins,
- _this = this,
- fns = {
- 'object': function (plgs) {
- plgs.forEach(function (p) {
- p = hyphenate(p);
- $('[data-' + p + ']').foundation('_init');
- });
- },
- 'string': function () {
- plugins = hyphenate(plugins);
- $('[data-' + plugins + ']').foundation('_init');
- },
- 'undefined': function () {
- this['object'](Object.keys(_this._plugins));
- }
- };
- fns[type](plugins);
- }
- } catch (err) {
- console.error(err);
- } finally {
- return plugins;
- }
- },
-
- /**
- * returns a random base-36 uid with namespacing
- * @function
- * @param {Number} length - number of random base-36 digits desired. Increase for more random strings.
- * @param {String} namespace - name of plugin to be incorporated in uid, optional.
- * @default {String} '' - if no plugin name is provided, nothing is appended to the uid.
- * @returns {String} - unique id
- */
- GetYoDigits: function (length, namespace) {
- length = length || 6;
- return Math.round(Math.pow(36, length + 1) - Math.random() * Math.pow(36, length)).toString(36).slice(1) + (namespace ? '-' + namespace : '');
- },
- /**
- * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized.
- * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object.
- * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything.
- */
- reflow: function (elem, plugins) {
-
- // If plugins is undefined, just grab everything
- if (typeof plugins === 'undefined') {
- plugins = Object.keys(this._plugins);
- }
- // If plugins is a string, convert it to an array with one item
- else if (typeof plugins === 'string') {
- plugins = [plugins];
- }
-
- var _this = this;
-
- // Iterate through each plugin
- $.each(plugins, function (i, name) {
- // Get the current plugin
- var plugin = _this._plugins[name];
-
- // Localize the search to all elements inside elem, as well as elem itself, unless elem === document
- var $elem = $(elem).find('[data-' + name + ']').addBack('[data-' + name + ']');
-
- // For each plugin found, initialize it
- $elem.each(function () {
- var $el = $(this),
- opts = {};
- // Don't double-dip on plugins
- if ($el.data('zfPlugin')) {
- console.warn("Tried to initialize " + name + " on an element that already has a Foundation plugin.");
- return;
- }
-
- if ($el.attr('data-options')) {
- var thing = $el.attr('data-options').split(';').forEach(function (e, i) {
- var opt = e.split(':').map(function (el) {
- return el.trim();
- });
- if (opt[0]) opts[opt[0]] = parseValue(opt[1]);
- });
- }
- try {
- $el.data('zfPlugin', new plugin($(this), opts));
- } catch (er) {
- console.error(er);
- } finally {
- return;
- }
- });
- });
- },
- getFnName: functionName,
- transitionend: function ($elem) {
- var transitions = {
- 'transition': 'transitionend',
- 'WebkitTransition': 'webkitTransitionEnd',
- 'MozTransition': 'transitionend',
- 'OTransition': 'otransitionend'
- };
- var elem = document.createElement('div'),
- end;
-
- for (var t in transitions) {
- if (typeof elem.style[t] !== 'undefined') {
- end = transitions[t];
- }
- }
- if (end) {
- return end;
- } else {
- end = setTimeout(function () {
- $elem.triggerHandler('transitionend', [$elem]);
- }, 1);
- return 'transitionend';
- }
- }
- };
-
- Foundation.util = {
- /**
- * Function for applying a debounce effect to a function call.
- * @function
- * @param {Function} func - Function to be called at end of timeout.
- * @param {Number} delay - Time in ms to delay the call of `func`.
- * @returns function
- */
- throttle: function (func, delay) {
- var timer = null;
-
- return function () {
- var context = this,
- args = arguments;
-
- if (timer === null) {
- timer = setTimeout(function () {
- func.apply(context, args);
- timer = null;
- }, delay);
- }
- };
- }
- };
-
- // TODO: consider not making this a jQuery function
- // TODO: need way to reflow vs. re-initialize
- /**
- * The Foundation jQuery method.
- * @param {String|Array} method - An action to perform on the current jQuery object.
- */
- var foundation = function (method) {
- var type = typeof method,
- $meta = $('meta.foundation-mq'),
- $noJS = $('.no-js');
-
- if (!$meta.length) {
- $('<meta class="foundation-mq">').appendTo(document.head);
- }
- if ($noJS.length) {
- $noJS.removeClass('no-js');
- }
-
- if (type === 'undefined') {
- //needs to initialize the Foundation object, or an individual plugin.
- Foundation.MediaQuery._init();
- Foundation.reflow(this);
- } else if (type === 'string') {
- //an individual method to invoke on a plugin or group of plugins
- var args = Array.prototype.slice.call(arguments, 1); //collect all the arguments, if necessary
- var plugClass = this.data('zfPlugin'); //determine the class of plugin
-
- if (plugClass !== undefined && plugClass[method] !== undefined) {
- //make sure both the class and method exist
- if (this.length === 1) {
- //if there's only one, call it directly.
- plugClass[method].apply(plugClass, args);
- } else {
- this.each(function (i, el) {
- //otherwise loop through the jQuery collection and invoke the method on each
- plugClass[method].apply($(el).data('zfPlugin'), args);
- });
- }
- } else {
- //error for no class or no method
- throw new ReferenceError("We're sorry, '" + method + "' is not an available method for " + (plugClass ? functionName(plugClass) : 'this element') + '.');
- }
- } else {
- //error for invalid argument type
- throw new TypeError('We\'re sorry, ' + type + ' is not a valid parameter. You must use a string representing the method you wish to invoke.');
- }
- return this;
- };
-
- window.Foundation = Foundation;
- $.fn.foundation = foundation;
-
- // Polyfill for requestAnimationFrame
- (function () {
- if (!Date.now || !window.Date.now) window.Date.now = Date.now = function () {
- return new Date().getTime();
- };
-
- var vendors = ['webkit', 'moz'];
- for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
- var vp = vendors[i];
- window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];
- window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];
- }
- if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
- var lastTime = 0;
- window.requestAnimationFrame = function (callback) {
- var now = Date.now();
- var nextTime = Math.max(lastTime + 16, now);
- return setTimeout(function () {
- callback(lastTime = nextTime);
- }, nextTime - now);
- };
- window.cancelAnimationFrame = clearTimeout;
- }
- /**
- * Polyfill for performance.now, required by rAF
- */
- if (!window.performance || !window.performance.now) {
- window.performance = {
- start: Date.now(),
- now: function () {
- return Date.now() - this.start;
- }
- };
- }
- })();
- if (!Function.prototype.bind) {
- Function.prototype.bind = function (oThis) {
- if (typeof this !== 'function') {
- // closest thing possible to the ECMAScript 5
- // internal IsCallable function
- throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
- }
-
- var aArgs = Array.prototype.slice.call(arguments, 1),
- fToBind = this,
- fNOP = function () {},
- fBound = function () {
- return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
- };
-
- if (this.prototype) {
- // native functions don't have a prototype
- fNOP.prototype = this.prototype;
- }
- fBound.prototype = new fNOP();
-
- return fBound;
- };
- }
- // Polyfill to get the name of a function in IE9
- function functionName(fn) {
- if (Function.prototype.name === undefined) {
- var funcNameRegex = /function\s([^(]{1,})\(/;
- var results = funcNameRegex.exec(fn.toString());
- return results && results.length > 1 ? results[1].trim() : "";
- } else if (fn.prototype === undefined) {
- return fn.constructor.name;
- } else {
- return fn.prototype.constructor.name;
- }
- }
- function parseValue(str) {
- if (/true/.test(str)) return true;else if (/false/.test(str)) return false;else if (!isNaN(str * 1)) return parseFloat(str);
- return str;
- }
- // Convert PascalCase to kebab-case
- // Thank you: http://stackoverflow.com/a/8955580
- function hyphenate(str) {
- return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
- }
-}(jQuery);
-'use strict';
-
-!function ($) {
-
- // Default set of media queries
- var defaultQueries = {
- 'default': 'only screen',
- landscape: 'only screen and (orientation: landscape)',
- portrait: 'only screen and (orientation: portrait)',
- retina: 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)'
- };
-
- var MediaQuery = {
- queries: [],
-
- current: '',
-
- /**
- * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher.
- * @function
- * @private
- */
- _init: function () {
- var self = this;
- var extractedStyles = $('.foundation-mq').css('font-family');
- var namedQueries;
-
- namedQueries = parseStyleToObject(extractedStyles);
-
- for (var key in namedQueries) {
- if (namedQueries.hasOwnProperty(key)) {
- self.queries.push({
- name: key,
- value: 'only screen and (min-width: ' + namedQueries[key] + ')'
- });
- }
- }
-
- this.current = this._getCurrentSize();
-
- this._watcher();
- },
-
-
- /**
- * Checks if the screen is at least as wide as a breakpoint.
- * @function
- * @param {String} size - Name of the breakpoint to check.
- * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller.
- */
- atLeast: function (size) {
- var query = this.get(size);
-
- if (query) {
- return window.matchMedia(query).matches;
- }
-
- return false;
- },
-
-
- /**
- * Gets the media query of a breakpoint.
- * @function
- * @param {String} size - Name of the breakpoint to get.
- * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist.
- */
- get: function (size) {
- for (var i in this.queries) {
- if (this.queries.hasOwnProperty(i)) {
- var query = this.queries[i];
- if (size === query.name) return query.value;
- }
- }
-
- return null;
- },
-
-
- /**
- * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one).
- * @function
- * @private
- * @returns {String} Name of the current breakpoint.
- */
- _getCurrentSize: function () {
- var matched;
-
- for (var i = 0; i < this.queries.length; i++) {
- var query = this.queries[i];
-
- if (window.matchMedia(query.value).matches) {
- matched = query;
- }
- }
-
- if (typeof matched === 'object') {
- return matched.name;
- } else {
- return matched;
- }
- },
-
-
- /**
- * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes.
- * @function
- * @private
- */
- _watcher: function () {
- var _this = this;
-
- $(window).on('resize.zf.mediaquery', function () {
- var newSize = _this._getCurrentSize(),
- currentSize = _this.current;
-
- if (newSize !== currentSize) {
- // Change the current media query
- _this.current = newSize;
-
- // Broadcast the media query change on the window
- $(window).trigger('changed.zf.mediaquery', [newSize, currentSize]);
- }
- });
- }
- };
-
- Foundation.MediaQuery = MediaQuery;
-
- // matchMedia() polyfill - Test a CSS media type/query in JS.
- // Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license
- window.matchMedia || (window.matchMedia = function () {
- 'use strict';
-
- // For browsers that support matchMedium api such as IE 9 and webkit
-
- var styleMedia = window.styleMedia || window.media;
-
- // For those that don't support matchMedium
- if (!styleMedia) {
- var style = document.createElement('style'),
- script = document.getElementsByTagName('script')[0],
- info = null;
-
- style.type = 'text/css';
- style.id = 'matchmediajs-test';
-
- script && script.parentNode && script.parentNode.insertBefore(style, script);
-
- // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
- info = 'getComputedStyle' in window && window.getComputedStyle(style, null) || style.currentStyle;
-
- styleMedia = {
- matchMedium: function (media) {
- var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';
-
- // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
- if (style.styleSheet) {
- style.styleSheet.cssText = text;
- } else {
- style.textContent = text;
- }
-
- // Test if media query is true or false
- return info.width === '1px';
- }
- };
- }
-
- return function (media) {
- return {
- matches: styleMedia.matchMedium(media || 'all'),
- media: media || 'all'
- };
- };
- }());
-
- // Thank you: https://github.com/sindresorhus/query-string
- function parseStyleToObject(str) {
- var styleObject = {};
-
- if (typeof str !== 'string') {
- return styleObject;
- }
-
- str = str.trim().slice(1, -1); // browsers re-quote string style values
-
- if (!str) {
- return styleObject;
- }
-
- styleObject = str.split('&').reduce(function (ret, param) {
- var parts = param.replace(/\+/g, ' ').split('=');
- var key = parts[0];
- var val = parts[1];
- key = decodeURIComponent(key);
-
- // missing `=` should be `null`:
- // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
- val = val === undefined ? null : decodeURIComponent(val);
-
- if (!ret.hasOwnProperty(key)) {
- ret[key] = val;
- } else if (Array.isArray(ret[key])) {
- ret[key].push(val);
- } else {
- ret[key] = [ret[key], val];
- }
- return ret;
- }, {});
-
- return styleObject;
- }
-
- Foundation.MediaQuery = MediaQuery;
-}(jQuery);
-/*******************************************
- * *
- * This util was created by Marius Olbertz *
- * Please thank Marius on GitHub /owlbertz *
- * or the web http://www.mariusolbertz.de/ *
- * *
- ******************************************/
-
-'use strict';
-
-!function ($) {
-
- var keyCodes = {
- 9: 'TAB',
- 13: 'ENTER',
- 27: 'ESCAPE',
- 32: 'SPACE',
- 37: 'ARROW_LEFT',
- 38: 'ARROW_UP',
- 39: 'ARROW_RIGHT',
- 40: 'ARROW_DOWN'
- };
-
- var commands = {};
-
- var Keyboard = {
- keys: getKeyCodes(keyCodes),
-
- /**
- * Parses the (keyboard) event and returns a String that represents its key
- * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE
- * @param {Event} event - the event generated by the event handler
- * @return String key - String that represents the key pressed
- */
- parseKey: function (event) {
- var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase();
- if (event.shiftKey) key = 'SHIFT_' + key;
- if (event.ctrlKey) key = 'CTRL_' + key;
- if (event.altKey) key = 'ALT_' + key;
- return key;
- },
-
-
- /**
- * Handles the given (keyboard) event
- * @param {Event} event - the event generated by the event handler
- * @param {String} component - Foundation component's name, e.g. Slider or Reveal
- * @param {Objects} functions - collection of functions that are to be executed
- */
- handleKey: function (event, component, functions) {
- var commandList = commands[component],
- keyCode = this.parseKey(event),
- cmds,
- command,
- fn;
-
- if (!commandList) return console.warn('Component not defined!');
-
- if (typeof commandList.ltr === 'undefined') {
- // this component does not differentiate between ltr and rtl
- cmds = commandList; // use plain list
- } else {
- // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa
- if (Foundation.rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl);else cmds = $.extend({}, commandList.rtl, commandList.ltr);
- }
- command = cmds[keyCode];
-
- fn = functions[command];
- if (fn && typeof fn === 'function') {
- // execute function if exists
- var returnValue = fn.apply();
- if (functions.handled || typeof functions.handled === 'function') {
- // execute function when event was handled
- functions.handled(returnValue);
- }
- } else {
- if (functions.unhandled || typeof functions.unhandled === 'function') {
- // execute function when event was not handled
- functions.unhandled();
- }
- }
- },
-
-
- /**
- * Finds all focusable elements within the given `$element`
- * @param {jQuery} $element - jQuery object to search within
- * @return {jQuery} $focusable - all focusable elements within `$element`
- */
- findFocusable: function ($element) {
- return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function () {
- if (!$(this).is(':visible') || $(this).attr('tabindex') < 0) {
- return false;
- } //only have visible elements and those that have a tabindex greater or equal 0
- return true;
- });
- },
-
-
- /**
- * Returns the component name name
- * @param {Object} component - Foundation component, e.g. Slider or Reveal
- * @return String componentName
- */
-
- register: function (componentName, cmds) {
- commands[componentName] = cmds;
- }
- };
-
- /*
- * Constants for easier comparing.
- * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE
- */
- function getKeyCodes(kcs) {
- var k = {};
- for (var kc in kcs) {
- k[kcs[kc]] = kcs[kc];
- }return k;
- }
-
- Foundation.Keyboard = Keyboard;
-}(jQuery);
-'use strict';
-
-!function ($) {
-
- /**
- * Motion module.
- * @module foundation.motion
- */
-
- var initClasses = ['mui-enter', 'mui-leave'];
- var activeClasses = ['mui-enter-active', 'mui-leave-active'];
-
- var Motion = {
- animateIn: function (element, animation, cb) {
- animate(true, element, animation, cb);
- },
-
- animateOut: function (element, animation, cb) {
- animate(false, element, animation, cb);
- }
- };
-
- function Move(duration, elem, fn) {
- var anim,
- prog,
- start = null;
- // console.log('called');
-
- function move(ts) {
- if (!start) start = window.performance.now();
- // console.log(start, ts);
- prog = ts - start;
- fn.apply(elem);
-
- if (prog < duration) {
- anim = window.requestAnimationFrame(move, elem);
- } else {
- window.cancelAnimationFrame(anim);
- elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);
- }
- }
- anim = window.requestAnimationFrame(move);
- }
-
- /**
- * Animates an element in or out using a CSS transition class.
- * @function
- * @private
- * @param {Boolean} isIn - Defines if the animation is in or out.
- * @param {Object} element - jQuery or HTML object to animate.
- * @param {String} animation - CSS class to use.
- * @param {Function} cb - Callback to run when animation is finished.
- */
- function animate(isIn, element, animation, cb) {
- element = $(element).eq(0);
-
- if (!element.length) return;
-
- var initClass = isIn ? initClasses[0] : initClasses[1];
- var activeClass = isIn ? activeClasses[0] : activeClasses[1];
-
- // Set up the animation
- reset();
-
- element.addClass(animation).css('transition', 'none');
-
- requestAnimationFrame(function () {
- element.addClass(initClass);
- if (isIn) element.show();
- });
-
- // Start the animation
- requestAnimationFrame(function () {
- element[0].offsetWidth;
- element.css('transition', '').addClass(activeClass);
- });
-
- // Clean up the animation when it finishes
- element.one(Foundation.transitionend(element), finish);
-
- // Hides the element (for out animations), resets the element, and runs a callback
- function finish() {
- if (!isIn) element.hide();
- reset();
- if (cb) cb.apply(element);
- }
-
- // Resets transitions and removes motion-specific classes
- function reset() {
- element[0].style.transitionDuration = 0;
- element.removeClass(initClass + ' ' + activeClass + ' ' + animation);
- }
- }
-
- Foundation.Move = Move;
- Foundation.Motion = Motion;
-}(jQuery);
-'use strict';
-
-!function ($) {
-
- var Nest = {
- Feather: function (menu) {
- var type = arguments.length <= 1 || arguments[1] === undefined ? 'zf' : arguments[1];
-
- menu.attr('role', 'menubar');
-
- var items = menu.find('li').attr({ 'role': 'menuitem' }),
- subMenuClass = 'is-' + type + '-submenu',
- subItemClass = subMenuClass + '-item',
- hasSubClass = 'is-' + type + '-submenu-parent';
-
- menu.find('a:first').attr('tabindex', 0);
-
- items.each(function () {
- var $item = $(this),
- $sub = $item.children('ul');
-
- if ($sub.length) {
- $item.addClass(hasSubClass).attr({
- 'aria-haspopup': true,
- 'aria-expanded': false,
- 'aria-label': $item.children('a:first').text()
- });
-
- $sub.addClass('submenu ' + subMenuClass).attr({
- 'data-submenu': '',
- 'aria-hidden': true,
- 'role': 'menu'
- });
- }
-
- if ($item.parent('[data-submenu]').length) {
- $item.addClass('is-submenu-item ' + subItemClass);
- }
- });
-
- return;
- },
- Burn: function (menu, type) {
- var items = menu.find('li').removeAttr('tabindex'),
- subMenuClass = 'is-' + type + '-submenu',
- subItemClass = subMenuClass + '-item',
- hasSubClass = 'is-' + type + '-submenu-parent';
-
- menu.find('>li, .menu, .menu > li').removeClass(subMenuClass + ' ' + subItemClass + ' ' + hasSubClass + ' is-submenu-item submenu is-active').removeAttr('data-submenu').css('display', '');
-
- // console.log( menu.find('.' + subMenuClass + ', .' + subItemClass + ', .has-submenu, .is-submenu-item, .submenu, [data-submenu]')
- // .removeClass(subMenuClass + ' ' + subItemClass + ' has-submenu is-submenu-item submenu')
- // .removeAttr('data-submenu'));
- // items.each(function(){
- // var $item = $(this),
- // $sub = $item.children('ul');
- // if($item.parent('[data-submenu]').length){
- // $item.removeClass('is-submenu-item ' + subItemClass);
- // }
- // if($sub.length){
- // $item.removeClass('has-submenu');
- // $sub.removeClass('submenu ' + subMenuClass).removeAttr('data-submenu');
- // }
- // });
- }
- };
-
- Foundation.Nest = Nest;
-}(jQuery);
-'use strict';
-
-!function ($) {
-
- Foundation.Box = {
- ImNotTouchingYou: ImNotTouchingYou,
- GetDimensions: GetDimensions,
- GetOffsets: GetOffsets
- };
-
- /**
- * Compares the dimensions of an element to a container and determines collision events with container.
- * @function
- * @param {jQuery} element - jQuery object to test for collisions.
- * @param {jQuery} parent - jQuery object to use as bounding container.
- * @param {Boolean} lrOnly - set to true to check left and right values only.
- * @param {Boolean} tbOnly - set to true to check top and bottom values only.
- * @default if no parent object passed, detects collisions with `window`.
- * @returns {Boolean} - true if collision free, false if a collision in any direction.
- */
- function ImNotTouchingYou(element, parent, lrOnly, tbOnly) {
- var eleDims = GetDimensions(element),
- top,
- bottom,
- left,
- right;
-
- if (parent) {
- var parDims = GetDimensions(parent);
-
- bottom = eleDims.offset.top + eleDims.height <= parDims.height + parDims.offset.top;
- top = eleDims.offset.top >= parDims.offset.top;
- left = eleDims.offset.left >= parDims.offset.left;
- right = eleDims.offset.left + eleDims.width <= parDims.width + parDims.offset.left;
- } else {
- bottom = eleDims.offset.top + eleDims.height <= eleDims.windowDims.height + eleDims.windowDims.offset.top;
- top = eleDims.offset.top >= eleDims.windowDims.offset.top;
- left = eleDims.offset.left >= eleDims.windowDims.offset.left;
- right = eleDims.offset.left + eleDims.width <= eleDims.windowDims.width;
- }
-
- var allDirs = [bottom, top, left, right];
-
- if (lrOnly) {
- return left === right === true;
- }
-
- if (tbOnly) {
- return top === bottom === true;
- }
-
- return allDirs.indexOf(false) === -1;
- };
-
- /**
- * Uses native methods to return an object of dimension values.
- * @function
- * @param {jQuery || HTML} element - jQuery object or DOM element for which to get the dimensions. Can be any element other that document or window.
- * @returns {Object} - nested object of integer pixel values
- * TODO - if element is window, return only those values.
- */
- function GetDimensions(elem, test) {
- elem = elem.length ? elem[0] : elem;
-
- if (elem === window || elem === document) {
- throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");
- }
-
- var rect = elem.getBoundingClientRect(),
- parRect = elem.parentNode.getBoundingClientRect(),
- winRect = document.body.getBoundingClientRect(),
- winY = window.pageYOffset,
- winX = window.pageXOffset;
-
- return {
- width: rect.width,
- height: rect.height,
- offset: {
- top: rect.top + winY,
- left: rect.left + winX
- },
- parentDims: {
- width: parRect.width,
- height: parRect.height,
- offset: {
- top: parRect.top + winY,
- left: parRect.left + winX
- }
- },
- windowDims: {
- width: winRect.width,
- height: winRect.height,
- offset: {
- top: winY,
- left: winX
- }
- }
- };
- }
-
- /**
- * Returns an object of top and left integer pixel values for dynamically rendered elements,
- * such as: Tooltip, Reveal, and Dropdown
- * @function
- * @param {jQuery} element - jQuery object for the element being positioned.
- * @param {jQuery} anchor - jQuery object for the element's anchor point.
- * @param {String} position - a string relating to the desired position of the element, relative to it's anchor
- * @param {Number} vOffset - integer pixel value of desired vertical separation between anchor and element.
- * @param {Number} hOffset - integer pixel value of desired horizontal separation between anchor and element.
- * @param {Boolean} isOverflow - if a collision event is detected, sets to true to default the element to full width - any desired offset.
- * TODO alter/rewrite to work with `em` values as well/instead of pixels
- */
- function GetOffsets(element, anchor, position, vOffset, hOffset, isOverflow) {
- var $eleDims = GetDimensions(element),
- $anchorDims = anchor ? GetDimensions(anchor) : null;
-
- switch (position) {
- case 'top':
- return {
- left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left,
- top: $anchorDims.offset.top - ($eleDims.height + vOffset)
- };
- break;
- case 'left':
- return {
- left: $anchorDims.offset.left - ($eleDims.width + hOffset),
- top: $anchorDims.offset.top
- };
- break;
- case 'right':
- return {
- left: $anchorDims.offset.left + $anchorDims.width + hOffset,
- top: $anchorDims.offset.top
- };
- break;
- case 'center top':
- return {
- left: $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2,
- top: $anchorDims.offset.top - ($eleDims.height + vOffset)
- };
- break;
- case 'center bottom':
- return {
- left: isOverflow ? hOffset : $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2,
- top: $anchorDims.offset.top + $anchorDims.height + vOffset
- };
- break;
- case 'center left':
- return {
- left: $anchorDims.offset.left - ($eleDims.width + hOffset),
- top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2
- };
- break;
- case 'center right':
- return {
- left: $anchorDims.offset.left + $anchorDims.width + hOffset + 1,
- top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2
- };
- break;
- case 'center':
- return {
- left: $eleDims.windowDims.offset.left + $eleDims.windowDims.width / 2 - $eleDims.width / 2,
- top: $eleDims.windowDims.offset.top + $eleDims.windowDims.height / 2 - $eleDims.height / 2
- };
- break;
- case 'reveal':
- return {
- left: ($eleDims.windowDims.width - $eleDims.width) / 2,
- top: $eleDims.windowDims.offset.top + vOffset
- };
- case 'reveal full':
- return {
- left: $eleDims.windowDims.offset.left,
- top: $eleDims.windowDims.offset.top
- };
- break;
- case 'left bottom':
- return {
- left: $anchorDims.offset.left,
- top: $anchorDims.offset.top + $anchorDims.height
- };
- break;
- case 'right bottom':
- return {
- left: $anchorDims.offset.left + $anchorDims.width + hOffset - $eleDims.width,
- top: $anchorDims.offset.top + $anchorDims.height
- };
- break;
- default:
- return {
- left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left + hOffset,
- top: $anchorDims.offset.top + $anchorDims.height + vOffset
- };
- }
- }
-}(jQuery);
-'use strict';
-
-!function ($) {
-
- var MutationObserver = function () {
- var prefixes = ['WebKit', 'Moz', 'O', 'Ms', ''];
- for (var i = 0; i < prefixes.length; i++) {
- if (prefixes[i] + 'MutationObserver' in window) {
- return window[prefixes[i] + 'MutationObserver'];
- }
- }
- return false;
- }();
-
- var triggers = function (el, type) {
- el.data(type).split(' ').forEach(function (id) {
- $('#' + id)[type === 'close' ? 'trigger' : 'triggerHandler'](type + '.zf.trigger', [el]);
- });
- };
- // Elements with [data-open] will reveal a plugin that supports it when clicked.
- $(document).on('click.zf.trigger', '[data-open]', function () {
- triggers($(this), 'open');
- });
-
- // Elements with [data-close] will close a plugin that supports it when clicked.
- // If used without a value on [data-close], the event will bubble, allowing it to close a parent component.
- $(document).on('click.zf.trigger', '[data-close]', function () {
- var id = $(this).data('close');
- if (id) {
- triggers($(this), 'close');
- } else {
- $(this).trigger('close.zf.trigger');
- }
- });
-
- // Elements with [data-toggle] will toggle a plugin that supports it when clicked.
- $(document).on('click.zf.trigger', '[data-toggle]', function () {
- triggers($(this), 'toggle');
- });
-
- // Elements with [data-closable] will respond to close.zf.trigger events.
- $(document).on('close.zf.trigger', '[data-closable]', function (e) {
- e.stopPropagation();
- var animation = $(this).data('closable');
-
- if (animation !== '') {
- Foundation.Motion.animateOut($(this), animation, function () {
- $(this).trigger('closed.zf');
- });
- } else {
- $(this).fadeOut().trigger('closed.zf');
- }
- });
-
- $(document).on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', function () {
- var id = $(this).data('toggle-focus');
- $('#' + id).triggerHandler('toggle.zf.trigger', [$(this)]);
- });
-
- /**
- * Fires once after all other scripts have loaded
- * @function
- * @private
- */
- $(window).on('load', function () {
- checkListeners();
- });
-
- function checkListeners() {
- eventsListener();
- resizeListener();
- scrollListener();
- closemeListener();
- }
-
- //******** only fires this function once on load, if there's something to watch ********
- function closemeListener(pluginName) {
- var yetiBoxes = $('[data-yeti-box]'),
- plugNames = ['dropdown', 'tooltip', 'reveal'];
-
- if (pluginName) {
- if (typeof pluginName === 'string') {
- plugNames.push(pluginName);
- } else if (typeof pluginName === 'object' && typeof pluginName[0] === 'string') {
- plugNames.concat(pluginName);
- } else {
- console.error('Plugin names must be strings');
- }
- }
- if (yetiBoxes.length) {
- var listeners = plugNames.map(function (name) {
- return 'closeme.zf.' + name;
- }).join(' ');
-
- $(window).off(listeners).on(listeners, function (e, pluginId) {
- var plugin = e.namespace.split('.')[0];
- var plugins = $('[data-' + plugin + ']').not('[data-yeti-box="' + pluginId + '"]');
-
- plugins.each(function () {
- var _this = $(this);
-
- _this.triggerHandler('close.zf.trigger', [_this]);
- });
- });
- }
- }
-
- function resizeListener(debounce) {
- var timer = void 0,
- $nodes = $('[data-resize]');
- if ($nodes.length) {
- $(window).off('resize.zf.trigger').on('resize.zf.trigger', function (e) {
- if (timer) {
- clearTimeout(timer);
- }
-
- timer = setTimeout(function () {
-
- if (!MutationObserver) {
- //fallback for IE 9
- $nodes.each(function () {
- $(this).triggerHandler('resizeme.zf.trigger');
- });
- }
- //trigger all listening elements and signal a resize event
- $nodes.attr('data-events', "resize");
- }, debounce || 10); //default time to emit resize event
- });
- }
- }
-
- function scrollListener(debounce) {
- var timer = void 0,
- $nodes = $('[data-scroll]');
- if ($nodes.length) {
- $(window).off('scroll.zf.trigger').on('scroll.zf.trigger', function (e) {
- if (timer) {
- clearTimeout(timer);
- }
-
- timer = setTimeout(function () {
-
- if (!MutationObserver) {
- //fallback for IE 9
- $nodes.each(function () {
- $(this).triggerHandler('scrollme.zf.trigger');
- });
- }
- //trigger all listening elements and signal a scroll event
- $nodes.attr('data-events', "scroll");
- }, debounce || 10); //default time to emit scroll event
- });
- }
- }
-
- function eventsListener() {
- if (!MutationObserver) {
- return false;
- }
- var nodes = document.querySelectorAll('[data-resize], [data-scroll], [data-mutate]');
-
- //element callback
- var listeningElementsMutation = function (mutationRecordsList) {
- var $target = $(mutationRecordsList[0].target);
- //trigger the event handler for the element depending on type
- switch ($target.attr("data-events")) {
-
- case "resize":
- $target.triggerHandler('resizeme.zf.trigger', [$target]);
- break;
-
- case "scroll":
- $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]);
- break;
-
- // case "mutate" :
- // console.log('mutate', $target);
- // $target.triggerHandler('mutate.zf.trigger');
- //
- // //make sure we don't get stuck in an infinite loop from sloppy codeing
- // if ($target.index('[data-mutate]') == $("[data-mutate]").length-1) {
- // domMutationObserver();
- // }
- // break;
-
- default:
- return false;
- //nothing
- }
- };
-
- if (nodes.length) {
- //for each element that needs to listen for resizing, scrolling, (or coming soon mutation) add a single observer
- for (var i = 0; i <= nodes.length - 1; i++) {
- var elementObserver = new MutationObserver(listeningElementsMutation);
- elementObserver.observe(nodes[i], { attributes: true, childList: false, characterData: false, subtree: false, attributeFilter: ["data-events"] });
- }
- }
- }
-
- // ------------------------------------
-
- // [PH]
- // Foundation.CheckWatchers = checkWatchers;
- Foundation.IHearYou = checkListeners;
- // Foundation.ISeeYou = scrollListener;
- // Foundation.IFeelYou = closemeListener;
-}(jQuery);
-
-// function domMutationObserver(debounce) {
-// // !!! This is coming soon and needs more work; not active !!! //
-// var timer,
-// nodes = document.querySelectorAll('[data-mutate]');
-// //
-// if (nodes.length) {
-// // var MutationObserver = (function () {
-// // var prefixes = ['WebKit', 'Moz', 'O', 'Ms', ''];
-// // for (var i=0; i < prefixes.length; i++) {
-// // if (prefixes[i] + 'MutationObserver' in window) {
-// // return window[prefixes[i] + 'MutationObserver'];
-// // }
-// // }
-// // return false;
-// // }());
-//
-//
-// //for the body, we need to listen for all changes effecting the style and class attributes
-// var bodyObserver = new MutationObserver(bodyMutation);
-// bodyObserver.observe(document.body, { attributes: true, childList: true, characterData: false, subtree:true, attributeFilter:["style", "class"]});
-//
-//
-// //body callback
-// function bodyMutation(mutate) {
-// //trigger all listening elements and signal a mutation event
-// if (timer) { clearTimeout(timer); }
-//
-// timer = setTimeout(function() {
-// bodyObserver.disconnect();
-// $('[data-mutate]').attr('data-events',"mutate");
-// }, debounce || 150);
-// }
-// }
-// }
-'use strict';
-
-!function ($) {
-
- function Timer(elem, options, cb) {
- var _this = this,
- duration = options.duration,
- //options is an object for easily adding features later.
- nameSpace = Object.keys(elem.data())[0] || 'timer',
- remain = -1,
- start,
- timer;
-
- this.isPaused = false;
-
- this.restart = function () {
- remain = -1;
- clearTimeout(timer);
- this.start();
- };
-
- this.start = function () {
- this.isPaused = false;
- // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things.
- clearTimeout(timer);
- remain = remain <= 0 ? duration : remain;
- elem.data('paused', false);
- start = Date.now();
- timer = setTimeout(function () {
- if (options.infinite) {
- _this.restart(); //rerun the timer.
- }
- if (cb && typeof cb === 'function') {
- cb();
- }
- }, remain);
- elem.trigger('timerstart.zf.' + nameSpace);
- };
-
- this.pause = function () {
- this.isPaused = true;
- //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things.
- clearTimeout(timer);
- elem.data('paused', true);
- var end = Date.now();
- remain = remain - (end - start);
- elem.trigger('timerpaused.zf.' + nameSpace);
- };
- }
-
- /**
- * Runs a callback function when images are fully loaded.
- * @param {Object} images - Image(s) to check if loaded.
- * @param {Func} callback - Function to execute when image is fully loaded.
- */
- function onImagesLoaded(images, callback) {
- var self = this,
- unloaded = images.length;
-
- if (unloaded === 0) {
- callback();
- }
-
- images.each(function () {
- if (this.complete) {
- singleImageLoaded();
- } else if (typeof this.naturalWidth !== 'undefined' && this.naturalWidth > 0) {
- singleImageLoaded();
- } else {
- $(this).one('load', function () {
- singleImageLoaded();
- });
- }
- });
-
- function singleImageLoaded() {
- unloaded--;
- if (unloaded === 0) {
- callback();
- }
- }
- }
-
- Foundation.Timer = Timer;
- Foundation.onImagesLoaded = onImagesLoaded;
-}(jQuery);
-//**************************************************
-//**Work inspired by multiple jquery swipe plugins**
-//**Done by Yohai Ararat ***************************
-//**************************************************
-(function ($) {
-
- $.spotSwipe = {
- version: '1.0.0',
- enabled: 'ontouchstart' in document.documentElement,
- preventDefault: false,
- moveThreshold: 75,
- timeThreshold: 200
- };
-
- var startPosX,
- startPosY,
- startTime,
- elapsedTime,
- isMoving = false;
-
- function onTouchEnd() {
- // alert(this);
- this.removeEventListener('touchmove', onTouchMove);
- this.removeEventListener('touchend', onTouchEnd);
- isMoving = false;
- }
-
- function onTouchMove(e) {
- if ($.spotSwipe.preventDefault) {
- e.preventDefault();
- }
- if (isMoving) {
- var x = e.touches[0].pageX;
- var y = e.touches[0].pageY;
- var dx = startPosX - x;
- var dy = startPosY - y;
- var dir;
- elapsedTime = new Date().getTime() - startTime;
- if (Math.abs(dx) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) {
- dir = dx > 0 ? 'left' : 'right';
- }
- // else if(Math.abs(dy) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) {
- // dir = dy > 0 ? 'down' : 'up';
- // }
- if (dir) {
- e.preventDefault();
- onTouchEnd.call(this);
- $(this).trigger('swipe', dir).trigger('swipe' + dir);
- }
- }
- }
-
- function onTouchStart(e) {
- if (e.touches.length == 1) {
- startPosX = e.touches[0].pageX;
- startPosY = e.touches[0].pageY;
- isMoving = true;
- startTime = new Date().getTime();
- this.addEventListener('touchmove', onTouchMove, false);
- this.addEventListener('touchend', onTouchEnd, false);
- }
- }
-
- function init() {
- this.addEventListener && this.addEventListener('touchstart', onTouchStart, false);
- }
-
- function teardown() {
- this.removeEventListener('touchstart', onTouchStart);
- }
-
- $.event.special.swipe = { setup: init };
-
- $.each(['left', 'up', 'down', 'right'], function () {
- $.event.special['swipe' + this] = { setup: function () {
- $(this).on('swipe', $.noop);
- } };
- });
-})(jQuery);
-/****************************************************
- * Method for adding psuedo drag events to elements *
- ***************************************************/
-!function ($) {
- $.fn.addTouch = function () {
- this.each(function (i, el) {
- $(el).bind('touchstart touchmove touchend touchcancel', function () {
- //we pass the original event object because the jQuery event
- //object is normalized to w3c specs and does not provide the TouchList
- handleTouch(event);
- });
- });
-
- var handleTouch = function (event) {
- var touches = event.changedTouches,
- first = touches[0],
- eventTypes = {
- touchstart: 'mousedown',
- touchmove: 'mousemove',
- touchend: 'mouseup'
- },
- type = eventTypes[event.type],
- simulatedEvent;
-
- if ('MouseEvent' in window && typeof window.MouseEvent === 'function') {
- simulatedEvent = new window.MouseEvent(type, {
- 'bubbles': true,
- 'cancelable': true,
- 'screenX': first.screenX,
- 'screenY': first.screenY,
- 'clientX': first.clientX,
- 'clientY': first.clientY
- });
- } else {
- simulatedEvent = document.createEvent('MouseEvent');
- simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0 /*left*/, null);
- }
- first.target.dispatchEvent(simulatedEvent);
- };
- };
-}(jQuery);
-
-//**********************************
-//**From the jQuery Mobile Library**
-//**need to recreate functionality**
-//**and try to improve if possible**
-//**********************************
-
-/* Removing the jQuery function ****
-************************************
-
-(function( $, window, undefined ) {
-
- var $document = $( document ),
- // supportTouch = $.mobile.support.touch,
- touchStartEvent = 'touchstart'//supportTouch ? "touchstart" : "mousedown",
- touchStopEvent = 'touchend'//supportTouch ? "touchend" : "mouseup",
- touchMoveEvent = 'touchmove'//supportTouch ? "touchmove" : "mousemove";
-
- // setup new event shortcuts
- $.each( ( "touchstart touchmove touchend " +
- "swipe swipeleft swiperight" ).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;
- }
- });
-
- function triggerCustomEvent( obj, eventType, event, bubble ) {
- var originalType = event.type;
- event.type = eventType;
- if ( bubble ) {
- $.event.trigger( event, undefined, obj );
- } else {
- $.event.dispatch.call( obj, event );
- }
- event.type = originalType;
- }
-
- // also handles taphold
-
- // Also handles swipeleft, swiperight
- $.event.special.swipe = {
-
- // More than this horizontal displacement, and we will suppress scrolling.
- scrollSupressionThreshold: 30,
-
- // More time than this, and it isn't a swipe.
- durationThreshold: 1000,
-
- // Swipe horizontal displacement must be more than this.
- horizontalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30,
-
- // Swipe vertical displacement must be less than this.
- verticalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30,
-
- getLocation: function ( event ) {
- var winPageX = window.pageXOffset,
- winPageY = window.pageYOffset,
- x = event.clientX,
- y = event.clientY;
-
- if ( event.pageY === 0 && Math.floor( y ) > Math.floor( event.pageY ) ||
- event.pageX === 0 && Math.floor( x ) > Math.floor( event.pageX ) ) {
-
- // iOS4 clientX/clientY have the value that should have been
- // in pageX/pageY. While pageX/page/ have the value 0
- x = x - winPageX;
- y = y - winPageY;
- } else if ( y < ( event.pageY - winPageY) || x < ( event.pageX - winPageX ) ) {
-
- // Some Android browsers have totally bogus values for clientX/Y
- // when scrolling/zooming a page. Detectable since clientX/clientY
- // should never be smaller than pageX/pageY minus page scroll
- x = event.pageX - winPageX;
- y = event.pageY - winPageY;
- }
-
- return {
- x: x,
- y: y
- };
- },
-
- start: function( event ) {
- var data = event.originalEvent.touches ?
- event.originalEvent.touches[ 0 ] : event,
- location = $.event.special.swipe.getLocation( data );
- return {
- time: ( new Date() ).getTime(),
- coords: [ location.x, location.y ],
- origin: $( event.target )
- };
- },
-
- stop: function( event ) {
- var data = event.originalEvent.touches ?
- event.originalEvent.touches[ 0 ] : event,
- location = $.event.special.swipe.getLocation( data );
- return {
- time: ( new Date() ).getTime(),
- coords: [ location.x, location.y ]
- };
- },
-
- handleSwipe: function( start, stop, thisObject, origTarget ) {
- 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 ) {
- var direction = start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight";
-
- triggerCustomEvent( thisObject, "swipe", $.Event( "swipe", { target: origTarget, swipestart: start, swipestop: stop }), true );
- triggerCustomEvent( thisObject, direction,$.Event( direction, { target: origTarget, swipestart: start, swipestop: stop } ), true );
- return true;
- }
- return false;
-
- },
-
- // This serves as a flag to ensure that at most one swipe event event is
- // in work at any given time
- eventInProgress: false,
-
- setup: function() {
- var events,
- thisObject = this,
- $this = $( thisObject ),
- context = {};
-
- // Retrieve the events data for this element and add the swipe context
- events = $.data( this, "mobile-events" );
- if ( !events ) {
- events = { length: 0 };
- $.data( this, "mobile-events", events );
- }
- events.length++;
- events.swipe = context;
-
- context.start = function( event ) {
-
- // Bail if we're already working on a swipe event
- if ( $.event.special.swipe.eventInProgress ) {
- return;
- }
- $.event.special.swipe.eventInProgress = true;
-
- var stop,
- start = $.event.special.swipe.start( event ),
- origTarget = event.target,
- emitted = false;
-
- context.move = function( event ) {
- if ( !start || event.isDefaultPrevented() ) {
- return;
- }
-
- stop = $.event.special.swipe.stop( event );
- if ( !emitted ) {
- emitted = $.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget );
- if ( emitted ) {
-
- // Reset the context to make way for the next swipe event
- $.event.special.swipe.eventInProgress = false;
- }
- }
- // prevent scrolling
- if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
- event.preventDefault();
- }
- };
-
- context.stop = function() {
- emitted = true;
-
- // Reset the context to make way for the next swipe event
- $.event.special.swipe.eventInProgress = false;
- $document.off( touchMoveEvent, context.move );
- context.move = null;
- };
-
- $document.on( touchMoveEvent, context.move )
- .one( touchStopEvent, context.stop );
- };
- $this.on( touchStartEvent, context.start );
- },
-
- teardown: function() {
- var events, context;
-
- events = $.data( this, "mobile-events" );
- if ( events ) {
- context = events.swipe;
- delete events.swipe;
- events.length--;
- if ( events.length === 0 ) {
- $.removeData( this, "mobile-events" );
- }
- }
-
- if ( context ) {
- if ( context.start ) {
- $( this ).off( touchStartEvent, context.start );
- }
- if ( context.move ) {
- $document.off( touchMoveEvent, context.move );
- }
- if ( context.stop ) {
- $document.off( touchStopEvent, context.stop );
- }
- }
- }
- };
- $.each({
- swipeleft: "swipe.left",
- swiperight: "swipe.right"
- }, function( event, sourceEvent ) {
-
- $.event.special[ event ] = {
- setup: function() {
- $( this ).bind( sourceEvent, $.noop );
- },
- teardown: function() {
- $( this ).unbind( sourceEvent );
- }
- };
- });
-})( jQuery, this );
-*/
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Abide module.
- * @module foundation.abide
- */
-
- var Abide = function () {
- /**
- * Creates a new instance of Abide.
- * @class
- * @fires Abide#init
- * @param {Object} element - jQuery object to add the trigger to.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Abide(element) {
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
-
- _classCallCheck(this, Abide);
-
- this.$element = element;
- this.options = $.extend({}, Abide.defaults, this.$element.data(), options);
-
- this._init();
-
- Foundation.registerPlugin(this, 'Abide');
- }
-
- /**
- * Initializes the Abide plugin and calls functions to get Abide functioning on load.
- * @private
- */
-
-
- _createClass(Abide, [{
- key: '_init',
- value: function _init() {
- this.$inputs = this.$element.find('input, textarea, select');
-
- this._events();
- }
-
- /**
- * Initializes events for Abide.
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this2 = this;
-
- this.$element.off('.abide').on('reset.zf.abide', function () {
- _this2.resetForm();
- }).on('submit.zf.abide', function () {
- return _this2.validateForm();
- });
-
- if (this.options.validateOn === 'fieldChange') {
- this.$inputs.off('change.zf.abide').on('change.zf.abide', function (e) {
- _this2.validateInput($(e.target));
- });
- }
-
- if (this.options.liveValidate) {
- this.$inputs.off('input.zf.abide').on('input.zf.abide', function (e) {
- _this2.validateInput($(e.target));
- });
- }
- }
-
- /**
- * Calls necessary functions to update Abide upon DOM change
- * @private
- */
-
- }, {
- key: '_reflow',
- value: function _reflow() {
- this._init();
- }
-
- /**
- * Checks whether or not a form element has the required attribute and if it's checked or not
- * @param {Object} element - jQuery object to check for required attribute
- * @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty
- */
-
- }, {
- key: 'requiredCheck',
- value: function requiredCheck($el) {
- if (!$el.attr('required')) return true;
-
- var isGood = true;
-
- switch ($el[0].type) {
- case 'checkbox':
- isGood = $el[0].checked;
- break;
-
- case 'select':
- case 'select-one':
- case 'select-multiple':
- var opt = $el.find('option:selected');
- if (!opt.length || !opt.val()) isGood = false;
- break;
-
- default:
- if (!$el.val() || !$el.val().length) isGood = false;
- }
-
- return isGood;
- }
-
- /**
- * Based on $el, get the first element with selector in this order:
- * 1. The element's direct sibling('s).
- * 3. The element's parent's children.
- *
- * This allows for multiple form errors per input, though if none are found, no form errors will be shown.
- *
- * @param {Object} $el - jQuery object to use as reference to find the form error selector.
- * @returns {Object} jQuery object with the selector.
- */
-
- }, {
- key: 'findFormError',
- value: function findFormError($el) {
- var $error = $el.siblings(this.options.formErrorSelector);
-
- if (!$error.length) {
- $error = $el.parent().find(this.options.formErrorSelector);
- }
-
- return $error;
- }
-
- /**
- * Get the first element in this order:
- * 2. The <label> with the attribute `[for="someInputId"]`
- * 3. The `.closest()` <label>
- *
- * @param {Object} $el - jQuery object to check for required attribute
- * @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty
- */
-
- }, {
- key: 'findLabel',
- value: function findLabel($el) {
- var id = $el[0].id;
- var $label = this.$element.find('label[for="' + id + '"]');
-
- if (!$label.length) {
- return $el.closest('label');
- }
-
- return $label;
- }
-
- /**
- * Get the set of labels associated with a set of radio els in this order
- * 2. The <label> with the attribute `[for="someInputId"]`
- * 3. The `.closest()` <label>
- *
- * @param {Object} $el - jQuery object to check for required attribute
- * @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty
- */
-
- }, {
- key: 'findRadioLabels',
- value: function findRadioLabels($els) {
- var _this3 = this;
-
- var labels = $els.map(function (i, el) {
- var id = el.id;
- var $label = _this3.$element.find('label[for="' + id + '"]');
-
- if (!$label.length) {
- $label = $(el).closest('label');
- }
- return $label[0];
- });
-
- return $(labels);
- }
-
- /**
- * Adds the CSS error class as specified by the Abide settings to the label, input, and the form
- * @param {Object} $el - jQuery object to add the class to
- */
-
- }, {
- key: 'addErrorClasses',
- value: function addErrorClasses($el) {
- var $label = this.findLabel($el);
- var $formError = this.findFormError($el);
-
- if ($label.length) {
- $label.addClass(this.options.labelErrorClass);
- }
-
- if ($formError.length) {
- $formError.addClass(this.options.formErrorClass);
- }
-
- $el.addClass(this.options.inputErrorClass).attr('data-invalid', '');
- }
-
- /**
- * Remove CSS error classes etc from an entire radio button group
- * @param {String} groupName - A string that specifies the name of a radio button group
- *
- */
-
- }, {
- key: 'removeRadioErrorClasses',
- value: function removeRadioErrorClasses(groupName) {
- var $els = this.$element.find(':radio[name="' + groupName + '"]');
- var $labels = this.findRadioLabels($els);
- var $formErrors = this.findFormError($els);
-
- if ($labels.length) {
- $labels.removeClass(this.options.labelErrorClass);
- }
-
- if ($formErrors.length) {
- $formErrors.removeClass(this.options.formErrorClass);
- }
-
- $els.removeClass(this.options.inputErrorClass).removeAttr('data-invalid');
- }
-
- /**
- * Removes CSS error class as specified by the Abide settings from the label, input, and the form
- * @param {Object} $el - jQuery object to remove the class from
- */
-
- }, {
- key: 'removeErrorClasses',
- value: function removeErrorClasses($el) {
- // radios need to clear all of the els
- if ($el[0].type == 'radio') {
- return this.removeRadioErrorClasses($el.attr('name'));
- }
-
- var $label = this.findLabel($el);
- var $formError = this.findFormError($el);
-
- if ($label.length) {
- $label.removeClass(this.options.labelErrorClass);
- }
-
- if ($formError.length) {
- $formError.removeClass(this.options.formErrorClass);
- }
-
- $el.removeClass(this.options.inputErrorClass).removeAttr('data-invalid');
- }
-
- /**
- * Goes through a form to find inputs and proceeds to validate them in ways specific to their type
- * @fires Abide#invalid
- * @fires Abide#valid
- * @param {Object} element - jQuery object to validate, should be an HTML input
- * @returns {Boolean} goodToGo - If the input is valid or not.
- */
-
- }, {
- key: 'validateInput',
- value: function validateInput($el) {
- var clearRequire = this.requiredCheck($el),
- validated = false,
- customValidator = true,
- validator = $el.attr('data-validator'),
- equalTo = true;
-
- // don't validate ignored inputs or hidden inputs
- if ($el.is('[data-abide-ignore]') || $el.is('[type="hidden"]')) {
- return true;
- }
-
- switch ($el[0].type) {
- case 'radio':
- validated = this.validateRadio($el.attr('name'));
- break;
-
- case 'checkbox':
- validated = clearRequire;
- break;
-
- case 'select':
- case 'select-one':
- case 'select-multiple':
- validated = clearRequire;
- break;
-
- default:
- validated = this.validateText($el);
- }
-
- if (validator) {
- customValidator = this.matchValidation($el, validator, $el.attr('required'));
- }
-
- if ($el.attr('data-equalto')) {
- equalTo = this.options.validators.equalTo($el);
- }
-
- var goodToGo = [clearRequire, validated, customValidator, equalTo].indexOf(false) === -1;
- var message = (goodToGo ? 'valid' : 'invalid') + '.zf.abide';
-
- this[goodToGo ? 'removeErrorClasses' : 'addErrorClasses']($el);
-
- /**
- * Fires when the input is done checking for validation. Event trigger is either `valid.zf.abide` or `invalid.zf.abide`
- * Trigger includes the DOM element of the input.
- * @event Abide#valid
- * @event Abide#invalid
- */
- $el.trigger(message, [$el]);
-
- return goodToGo;
- }
-
- /**
- * Goes through a form and if there are any invalid inputs, it will display the form error element
- * @returns {Boolean} noError - true if no errors were detected...
- * @fires Abide#formvalid
- * @fires Abide#forminvalid
- */
-
- }, {
- key: 'validateForm',
- value: function validateForm() {
- var acc = [];
- var _this = this;
-
- this.$inputs.each(function () {
- acc.push(_this.validateInput($(this)));
- });
-
- var noError = acc.indexOf(false) === -1;
-
- this.$element.find('[data-abide-error]').css('display', noError ? 'none' : 'block');
-
- /**
- * Fires when the form is finished validating. Event trigger is either `formvalid.zf.abide` or `forminvalid.zf.abide`.
- * Trigger includes the element of the form.
- * @event Abide#formvalid
- * @event Abide#forminvalid
- */
- this.$element.trigger((noError ? 'formvalid' : 'forminvalid') + '.zf.abide', [this.$element]);
-
- return noError;
- }
-
- /**
- * Determines whether or a not a text input is valid based on the pattern specified in the attribute. If no matching pattern is found, returns true.
- * @param {Object} $el - jQuery object to validate, should be a text input HTML element
- * @param {String} pattern - string value of one of the RegEx patterns in Abide.options.patterns
- * @returns {Boolean} Boolean value depends on whether or not the input value matches the pattern specified
- */
-
- }, {
- key: 'validateText',
- value: function validateText($el, pattern) {
- // A pattern can be passed to this function, or it will be infered from the input's "pattern" attribute, or it's "type" attribute
- pattern = pattern || $el.attr('pattern') || $el.attr('type');
- var inputText = $el.val();
- var valid = false;
-
- if (inputText.length) {
- // If the pattern attribute on the element is in Abide's list of patterns, then test that regexp
- if (this.options.patterns.hasOwnProperty(pattern)) {
- valid = this.options.patterns[pattern].test(inputText);
- }
- // If the pattern name isn't also the type attribute of the field, then test it as a regexp
- else if (pattern !== $el.attr('type')) {
- valid = new RegExp(pattern).test(inputText);
- } else {
- valid = true;
- }
- }
- // An empty field is valid if it's not required
- else if (!$el.prop('required')) {
- valid = true;
- }
-
- return valid;
- }
-
- /**
- * Determines whether or a not a radio input is valid based on whether or not it is required and selected. Although the function targets a single `<input>`, it validates by checking the `required` and `checked` properties of all radio buttons in its group.
- * @param {String} groupName - A string that specifies the name of a radio button group
- * @returns {Boolean} Boolean value depends on whether or not at least one radio input has been selected (if it's required)
- */
-
- }, {
- key: 'validateRadio',
- value: function validateRadio(groupName) {
- // If at least one radio in the group has the `required` attribute, the group is considered required
- // Per W3C spec, all radio buttons in a group should have `required`, but we're being nice
- var $group = this.$element.find(':radio[name="' + groupName + '"]');
- var valid = false,
- required = false;
-
- // For the group to be required, at least one radio needs to be required
- $group.each(function (i, e) {
- if ($(e).attr('required')) {
- required = true;
- }
- });
- if (!required) valid = true;
-
- if (!valid) {
- // For the group to be valid, at least one radio needs to be checked
- $group.each(function (i, e) {
- if ($(e).prop('checked')) {
- valid = true;
- }
- });
- };
-
- return valid;
- }
-
- /**
- * Determines if a selected input passes a custom validation function. Multiple validations can be used, if passed to the element with `data-validator="foo bar baz"` in a space separated listed.
- * @param {Object} $el - jQuery input element.
- * @param {String} validators - a string of function names matching functions in the Abide.options.validators object.
- * @param {Boolean} required - self explanatory?
- * @returns {Boolean} - true if validations passed.
- */
-
- }, {
- key: 'matchValidation',
- value: function matchValidation($el, validators, required) {
- var _this4 = this;
-
- required = required ? true : false;
-
- var clear = validators.split(' ').map(function (v) {
- return _this4.options.validators[v]($el, required, $el.parent());
- });
- return clear.indexOf(false) === -1;
- }
-
- /**
- * Resets form inputs and styles
- * @fires Abide#formreset
- */
-
- }, {
- key: 'resetForm',
- value: function resetForm() {
- var $form = this.$element,
- opts = this.options;
-
- $('.' + opts.labelErrorClass, $form).not('small').removeClass(opts.labelErrorClass);
- $('.' + opts.inputErrorClass, $form).not('small').removeClass(opts.inputErrorClass);
- $(opts.formErrorSelector + '.' + opts.formErrorClass).removeClass(opts.formErrorClass);
- $form.find('[data-abide-error]').css('display', 'none');
- $(':input', $form).not(':button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]').val('').removeAttr('data-invalid');
- $(':input:radio', $form).not('[data-abide-ignore]').prop('checked', false).removeAttr('data-invalid');
- $(':input:checkbox', $form).not('[data-abide-ignore]').prop('checked', false).removeAttr('data-invalid');
- /**
- * Fires when the form has been reset.
- * @event Abide#formreset
- */
- $form.trigger('formreset.zf.abide', [$form]);
- }
-
- /**
- * Destroys an instance of Abide.
- * Removes error styles and classes from elements, without resetting their values.
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- var _this = this;
- this.$element.off('.abide').find('[data-abide-error]').css('display', 'none');
-
- this.$inputs.off('.abide').each(function () {
- _this.removeErrorClasses($(this));
- });
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Abide;
- }();
-
- /**
- * Default settings for plugin
- */
-
-
- Abide.defaults = {
- /**
- * The default event to validate inputs. Checkboxes and radios validate immediately.
- * Remove or change this value for manual validation.
- * @option
- * @example 'fieldChange'
- */
- validateOn: 'fieldChange',
-
- /**
- * Class to be applied to input labels on failed validation.
- * @option
- * @example 'is-invalid-label'
- */
- labelErrorClass: 'is-invalid-label',
-
- /**
- * Class to be applied to inputs on failed validation.
- * @option
- * @example 'is-invalid-input'
- */
- inputErrorClass: 'is-invalid-input',
-
- /**
- * Class selector to use to target Form Errors for show/hide.
- * @option
- * @example '.form-error'
- */
- formErrorSelector: '.form-error',
-
- /**
- * Class added to Form Errors on failed validation.
- * @option
- * @example 'is-visible'
- */
- formErrorClass: 'is-visible',
-
- /**
- * Set to true to validate text inputs on any value change.
- * @option
- * @example false
- */
- liveValidate: false,
-
- patterns: {
- alpha: /^[a-zA-Z]+$/,
- alpha_numeric: /^[a-zA-Z0-9]+$/,
- integer: /^[-+]?\d+$/,
- number: /^[-+]?\d*(?:[\.\,]\d+)?$/,
-
- // amex, visa, diners
- card: /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,
- cvv: /^([0-9]){3,4}$/,
-
- // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
- email: /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,
-
- url: /^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/,
- // abc.de
- domain: /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,
-
- datetime: /^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,
- // YYYY-MM-DD
- date: /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,
- // HH:MM:SS
- time: /^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,
- dateISO: /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,
- // MM/DD/YYYY
- month_day_year: /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,
- // DD/MM/YYYY
- day_month_year: /^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,
-
- // #FFF or #FFFFFF
- color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
- },
-
- /**
- * Optional validation functions to be used. `equalTo` being the only default included function.
- * Functions should return only a boolean if the input is valid or not. Functions are given the following arguments:
- * el : The jQuery element to validate.
- * required : Boolean value of the required attribute be present or not.
- * parent : The direct parent of the input.
- * @option
- */
- validators: {
- equalTo: function (el, required, parent) {
- return $('#' + el.attr('data-equalto')).val() === el.val();
- }
- }
- };
-
- // Window exports
- Foundation.plugin(Abide, 'Abide');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Accordion module.
- * @module foundation.accordion
- * @requires foundation.util.keyboard
- * @requires foundation.util.motion
- */
-
- var Accordion = function () {
- /**
- * Creates a new instance of an accordion.
- * @class
- * @fires Accordion#init
- * @param {jQuery} element - jQuery object to make into an accordion.
- * @param {Object} options - a plain object with settings to override the default options.
- */
-
- function Accordion(element, options) {
- _classCallCheck(this, Accordion);
-
- this.$element = element;
- this.options = $.extend({}, Accordion.defaults, this.$element.data(), options);
-
- this._init();
-
- Foundation.registerPlugin(this, 'Accordion');
- Foundation.Keyboard.register('Accordion', {
- 'ENTER': 'toggle',
- 'SPACE': 'toggle',
- 'ARROW_DOWN': 'next',
- 'ARROW_UP': 'previous'
- });
- }
-
- /**
- * Initializes the accordion by animating the preset active pane(s).
- * @private
- */
-
-
- _createClass(Accordion, [{
- key: '_init',
- value: function _init() {
- this.$element.attr('role', 'tablist');
- this.$tabs = this.$element.children('li, [data-accordion-item]');
-
- this.$tabs.each(function (idx, el) {
- var $el = $(el),
- $content = $el.children('[data-tab-content]'),
- id = $content[0].id || Foundation.GetYoDigits(6, 'accordion'),
- linkId = el.id || id + '-label';
-
- $el.find('a:first').attr({
- 'aria-controls': id,
- 'role': 'tab',
- 'id': linkId,
- 'aria-expanded': false,
- 'aria-selected': false
- });
-
- $content.attr({ 'role': 'tabpanel', 'aria-labelledby': linkId, 'aria-hidden': true, 'id': id });
- });
- var $initActive = this.$element.find('.is-active').children('[data-tab-content]');
- if ($initActive.length) {
- this.down($initActive, true);
- }
- this._events();
- }
-
- /**
- * Adds event handlers for items within the accordion.
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this;
-
- this.$tabs.each(function () {
- var $elem = $(this);
- var $tabContent = $elem.children('[data-tab-content]');
- if ($tabContent.length) {
- $elem.children('a').off('click.zf.accordion keydown.zf.accordion').on('click.zf.accordion', function (e) {
- e.preventDefault();
- _this.toggle($tabContent);
- }).on('keydown.zf.accordion', function (e) {
- Foundation.Keyboard.handleKey(e, 'Accordion', {
- toggle: function () {
- _this.toggle($tabContent);
- },
- next: function () {
- var $a = $elem.next().find('a').focus();
- if (!_this.options.multiExpand) {
- $a.trigger('click.zf.accordion');
- }
- },
- previous: function () {
- var $a = $elem.prev().find('a').focus();
- if (!_this.options.multiExpand) {
- $a.trigger('click.zf.accordion');
- }
- },
- handled: function () {
- e.preventDefault();
- e.stopPropagation();
- }
- });
- });
- }
- });
- }
-
- /**
- * Toggles the selected content pane's open/close state.
- * @param {jQuery} $target - jQuery object of the pane to toggle (`.accordion-content`).
- * @function
- */
-
- }, {
- key: 'toggle',
- value: function toggle($target) {
- if ($target.parent().hasClass('is-active')) {
- this.up($target);
- } else {
- this.down($target);
- }
- }
-
- /**
- * Opens the accordion tab defined by `$target`.
- * @param {jQuery} $target - Accordion pane to open (`.accordion-content`).
- * @param {Boolean} firstTime - flag to determine if reflow should happen.
- * @fires Accordion#down
- * @function
- */
-
- }, {
- key: 'down',
- value: function down($target, firstTime) {
- var _this2 = this;
-
- $target.attr('aria-hidden', false).parent('[data-tab-content]').addBack().parent().addClass('is-active');
-
- if (!this.options.multiExpand && !firstTime) {
- var $currentActive = this.$element.children('.is-active').children('[data-tab-content]');
- if ($currentActive.length) {
- this.up($currentActive.not($target));
- }
- }
-
- $target.slideDown(this.options.slideSpeed, function () {
- /**
- * Fires when the tab is done opening.
- * @event Accordion#down
- */
- _this2.$element.trigger('down.zf.accordion', [$target]);
- });
-
- $('#' + $target.attr('aria-labelledby')).attr({
- 'aria-expanded': true,
- 'aria-selected': true
- });
- }
-
- /**
- * Closes the tab defined by `$target`.
- * @param {jQuery} $target - Accordion tab to close (`.accordion-content`).
- * @fires Accordion#up
- * @function
- */
-
- }, {
- key: 'up',
- value: function up($target) {
- var $aunts = $target.parent().siblings(),
- _this = this;
-
- if (!this.options.allowAllClosed && !$aunts.hasClass('is-active') || !$target.parent().hasClass('is-active')) {
- return;
- }
-
- // Foundation.Move(this.options.slideSpeed, $target, function(){
- $target.slideUp(_this.options.slideSpeed, function () {
- /**
- * Fires when the tab is done collapsing up.
- * @event Accordion#up
- */
- _this.$element.trigger('up.zf.accordion', [$target]);
- });
- // });
-
- $target.attr('aria-hidden', true).parent().removeClass('is-active');
-
- $('#' + $target.attr('aria-labelledby')).attr({
- 'aria-expanded': false,
- 'aria-selected': false
- });
- }
-
- /**
- * Destroys an instance of an accordion.
- * @fires Accordion#destroyed
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.find('[data-tab-content]').stop(true).slideUp(0).css('display', '');
- this.$element.find('a').off('.zf.accordion');
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Accordion;
- }();
-
- Accordion.defaults = {
- /**
- * Amount of time to animate the opening of an accordion pane.
- * @option
- * @example 250
- */
- slideSpeed: 250,
- /**
- * Allow the accordion to have multiple open panes.
- * @option
- * @example false
- */
- multiExpand: false,
- /**
- * Allow the accordion to close all panes.
- * @option
- * @example false
- */
- allowAllClosed: false
- };
-
- // Window exports
- Foundation.plugin(Accordion, 'Accordion');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * AccordionMenu module.
- * @module foundation.accordionMenu
- * @requires foundation.util.keyboard
- * @requires foundation.util.motion
- * @requires foundation.util.nest
- */
-
- var AccordionMenu = function () {
- /**
- * Creates a new instance of an accordion menu.
- * @class
- * @fires AccordionMenu#init
- * @param {jQuery} element - jQuery object to make into an accordion menu.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function AccordionMenu(element, options) {
- _classCallCheck(this, AccordionMenu);
-
- this.$element = element;
- this.options = $.extend({}, AccordionMenu.defaults, this.$element.data(), options);
-
- Foundation.Nest.Feather(this.$element, 'accordion');
-
- this._init();
-
- Foundation.registerPlugin(this, 'AccordionMenu');
- Foundation.Keyboard.register('AccordionMenu', {
- 'ENTER': 'toggle',
- 'SPACE': 'toggle',
- 'ARROW_RIGHT': 'open',
- 'ARROW_UP': 'up',
- 'ARROW_DOWN': 'down',
- 'ARROW_LEFT': 'close',
- 'ESCAPE': 'closeAll'
- });
- }
-
- /**
- * Initializes the accordion menu by hiding all nested menus.
- * @private
- */
-
-
- _createClass(AccordionMenu, [{
- key: '_init',
- value: function _init() {
- this.$element.find('[data-submenu]').not('.is-active').slideUp(0); //.find('a').css('padding-left', '1rem');
- this.$element.attr({
- 'role': 'menu',
- 'aria-multiselectable': this.options.multiOpen
- });
-
- this.$menuLinks = this.$element.find('.is-accordion-submenu-parent');
- this.$menuLinks.each(function () {
- var linkId = this.id || Foundation.GetYoDigits(6, 'acc-menu-link'),
- $elem = $(this),
- $sub = $elem.children('[data-submenu]'),
- subId = $sub[0].id || Foundation.GetYoDigits(6, 'acc-menu'),
- isActive = $sub.hasClass('is-active');
- $elem.attr({
- 'aria-controls': subId,
- 'aria-expanded': isActive,
- 'role': 'menuitem',
- 'id': linkId
- });
- $sub.attr({
- 'aria-labelledby': linkId,
- 'aria-hidden': !isActive,
- 'role': 'menu',
- 'id': subId
- });
- });
- var initPanes = this.$element.find('.is-active');
- if (initPanes.length) {
- var _this = this;
- initPanes.each(function () {
- _this.down($(this));
- });
- }
- this._events();
- }
-
- /**
- * Adds event handlers for items within the menu.
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this;
-
- this.$element.find('li').each(function () {
- var $submenu = $(this).children('[data-submenu]');
-
- if ($submenu.length) {
- $(this).children('a').off('click.zf.accordionMenu').on('click.zf.accordionMenu', function (e) {
- e.preventDefault();
-
- _this.toggle($submenu);
- });
- }
- }).on('keydown.zf.accordionmenu', function (e) {
- var $element = $(this),
- $elements = $element.parent('ul').children('li'),
- $prevElement,
- $nextElement,
- $target = $element.children('[data-submenu]');
-
- $elements.each(function (i) {
- if ($(this).is($element)) {
- $prevElement = $elements.eq(Math.max(0, i - 1)).find('a').first();
- $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1)).find('a').first();
-
- if ($(this).children('[data-submenu]:visible').length) {
- // has open sub menu
- $nextElement = $element.find('li:first-child').find('a').first();
- }
- if ($(this).is(':first-child')) {
- // is first element of sub menu
- $prevElement = $element.parents('li').first().find('a').first();
- } else if ($prevElement.parents('li').first().children('[data-submenu]:visible').length) {
- // if previous element has open sub menu
- $prevElement = $prevElement.parents('li').find('li:last-child').find('a').first();
- }
- if ($(this).is(':last-child')) {
- // is last element of sub menu
- $nextElement = $element.parents('li').first().next('li').find('a').first();
- }
-
- return;
- }
- });
-
- Foundation.Keyboard.handleKey(e, 'AccordionMenu', {
- open: function () {
- if ($target.is(':hidden')) {
- _this.down($target);
- $target.find('li').first().find('a').first().focus();
- }
- },
- close: function () {
- if ($target.length && !$target.is(':hidden')) {
- // close active sub of this item
- _this.up($target);
- } else if ($element.parent('[data-submenu]').length) {
- // close currently open sub
- _this.up($element.parent('[data-submenu]'));
- $element.parents('li').first().find('a').first().focus();
- }
- },
- up: function () {
- $prevElement.focus();
- return true;
- },
- down: function () {
- $nextElement.focus();
- return true;
- },
- toggle: function () {
- if ($element.children('[data-submenu]').length) {
- _this.toggle($element.children('[data-submenu]'));
- }
- },
- closeAll: function () {
- _this.hideAll();
- },
- handled: function (preventDefault) {
- if (preventDefault) {
- e.preventDefault();
- }
- e.stopImmediatePropagation();
- }
- });
- }); //.attr('tabindex', 0);
- }
-
- /**
- * Closes all panes of the menu.
- * @function
- */
-
- }, {
- key: 'hideAll',
- value: function hideAll() {
- this.$element.find('[data-submenu]').slideUp(this.options.slideSpeed);
- }
-
- /**
- * Toggles the open/close state of a submenu.
- * @function
- * @param {jQuery} $target - the submenu to toggle
- */
-
- }, {
- key: 'toggle',
- value: function toggle($target) {
- if (!$target.is(':animated')) {
- if (!$target.is(':hidden')) {
- this.up($target);
- } else {
- this.down($target);
- }
- }
- }
-
- /**
- * Opens the sub-menu defined by `$target`.
- * @param {jQuery} $target - Sub-menu to open.
- * @fires AccordionMenu#down
- */
-
- }, {
- key: 'down',
- value: function down($target) {
- var _this = this;
-
- if (!this.options.multiOpen) {
- this.up(this.$element.find('.is-active').not($target.parentsUntil(this.$element).add($target)));
- }
-
- $target.addClass('is-active').attr({ 'aria-hidden': false }).parent('.is-accordion-submenu-parent').attr({ 'aria-expanded': true });
-
- //Foundation.Move(this.options.slideSpeed, $target, function() {
- $target.slideDown(_this.options.slideSpeed, function () {
- /**
- * Fires when the menu is done opening.
- * @event AccordionMenu#down
- */
- _this.$element.trigger('down.zf.accordionMenu', [$target]);
- });
- //});
- }
-
- /**
- * Closes the sub-menu defined by `$target`. All sub-menus inside the target will be closed as well.
- * @param {jQuery} $target - Sub-menu to close.
- * @fires AccordionMenu#up
- */
-
- }, {
- key: 'up',
- value: function up($target) {
- var _this = this;
- //Foundation.Move(this.options.slideSpeed, $target, function(){
- $target.slideUp(_this.options.slideSpeed, function () {
- /**
- * Fires when the menu is done collapsing up.
- * @event AccordionMenu#up
- */
- _this.$element.trigger('up.zf.accordionMenu', [$target]);
- });
- //});
-
- var $menus = $target.find('[data-submenu]').slideUp(0).addBack().attr('aria-hidden', true);
-
- $menus.parent('.is-accordion-submenu-parent').attr('aria-expanded', false);
- }
-
- /**
- * Destroys an instance of accordion menu.
- * @fires AccordionMenu#destroyed
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.find('[data-submenu]').slideDown(0).css('display', '');
- this.$element.find('a').off('click.zf.accordionMenu');
-
- Foundation.Nest.Burn(this.$element, 'accordion');
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return AccordionMenu;
- }();
-
- AccordionMenu.defaults = {
- /**
- * Amount of time to animate the opening of a submenu in ms.
- * @option
- * @example 250
- */
- slideSpeed: 250,
- /**
- * Allow the menu to have multiple open panes.
- * @option
- * @example true
- */
- multiOpen: true
- };
-
- // Window exports
- Foundation.plugin(AccordionMenu, 'AccordionMenu');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Drilldown module.
- * @module foundation.drilldown
- * @requires foundation.util.keyboard
- * @requires foundation.util.motion
- * @requires foundation.util.nest
- */
-
- var Drilldown = function () {
- /**
- * Creates a new instance of a drilldown menu.
- * @class
- * @param {jQuery} element - jQuery object to make into an accordion menu.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Drilldown(element, options) {
- _classCallCheck(this, Drilldown);
-
- this.$element = element;
- this.options = $.extend({}, Drilldown.defaults, this.$element.data(), options);
-
- Foundation.Nest.Feather(this.$element, 'drilldown');
-
- this._init();
-
- Foundation.registerPlugin(this, 'Drilldown');
- Foundation.Keyboard.register('Drilldown', {
- 'ENTER': 'open',
- 'SPACE': 'open',
- 'ARROW_RIGHT': 'next',
- 'ARROW_UP': 'up',
- 'ARROW_DOWN': 'down',
- 'ARROW_LEFT': 'previous',
- 'ESCAPE': 'close',
- 'TAB': 'down',
- 'SHIFT_TAB': 'up'
- });
- }
-
- /**
- * Initializes the drilldown by creating jQuery collections of elements
- * @private
- */
-
-
- _createClass(Drilldown, [{
- key: '_init',
- value: function _init() {
- this.$submenuAnchors = this.$element.find('li.is-drilldown-submenu-parent').children('a');
- this.$submenus = this.$submenuAnchors.parent('li').children('[data-submenu]');
- this.$menuItems = this.$element.find('li').not('.js-drilldown-back').attr('role', 'menuitem').find('a');
-
- this._prepareMenu();
-
- this._keyboardEvents();
- }
-
- /**
- * prepares drilldown menu by setting attributes to links and elements
- * sets a min height to prevent content jumping
- * wraps the element if not already wrapped
- * @private
- * @function
- */
-
- }, {
- key: '_prepareMenu',
- value: function _prepareMenu() {
- var _this = this;
- // if(!this.options.holdOpen){
- // this._menuLinkEvents();
- // }
- this.$submenuAnchors.each(function () {
- var $link = $(this);
- var $sub = $link.parent();
- if (_this.options.parentLink) {
- $link.clone().prependTo($sub.children('[data-submenu]')).wrap('<li class="is-submenu-parent-item is-submenu-item is-drilldown-submenu-item" role="menu-item"></li>');
- }
- $link.data('savedHref', $link.attr('href')).removeAttr('href').attr('tabindex', 0);
- $link.children('[data-submenu]').attr({
- 'aria-hidden': true,
- 'tabindex': 0,
- 'role': 'menu'
- });
- _this._events($link);
- });
- this.$submenus.each(function () {
- var $menu = $(this),
- $back = $menu.find('.js-drilldown-back');
- if (!$back.length) {
- $menu.prepend(_this.options.backButton);
- }
- _this._back($menu);
- });
- if (!this.$element.parent().hasClass('is-drilldown')) {
- this.$wrapper = $(this.options.wrapper).addClass('is-drilldown');
- this.$wrapper = this.$element.wrap(this.$wrapper).parent().css(this._getMaxDims());
- }
- }
-
- /**
- * Adds event handlers to elements in the menu.
- * @function
- * @private
- * @param {jQuery} $elem - the current menu item to add handlers to.
- */
-
- }, {
- key: '_events',
- value: function _events($elem) {
- var _this = this;
-
- $elem.off('click.zf.drilldown').on('click.zf.drilldown', function (e) {
- if ($(e.target).parentsUntil('ul', 'li').hasClass('is-drilldown-submenu-parent')) {
- e.stopImmediatePropagation();
- e.preventDefault();
- }
-
- // if(e.target !== e.currentTarget.firstElementChild){
- // return false;
- // }
- _this._show($elem.parent('li'));
-
- if (_this.options.closeOnClick) {
- var $body = $('body');
- $body.off('.zf.drilldown').on('click.zf.drilldown', function (e) {
- if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target)) {
- return;
- }
- e.preventDefault();
- _this._hideAll();
- $body.off('.zf.drilldown');
- });
- }
- });
- }
-
- /**
- * Adds keydown event listener to `li`'s in the menu.
- * @private
- */
-
- }, {
- key: '_keyboardEvents',
- value: function _keyboardEvents() {
- var _this = this;
-
- this.$menuItems.add(this.$element.find('.js-drilldown-back > a')).on('keydown.zf.drilldown', function (e) {
-
- var $element = $(this),
- $elements = $element.parent('li').parent('ul').children('li').children('a'),
- $prevElement,
- $nextElement;
-
- $elements.each(function (i) {
- if ($(this).is($element)) {
- $prevElement = $elements.eq(Math.max(0, i - 1));
- $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1));
- return;
- }
- });
-
- Foundation.Keyboard.handleKey(e, 'Drilldown', {
- next: function () {
- if ($element.is(_this.$submenuAnchors)) {
- _this._show($element.parent('li'));
- $element.parent('li').one(Foundation.transitionend($element), function () {
- $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus();
- });
- return true;
- }
- },
- previous: function () {
- _this._hide($element.parent('li').parent('ul'));
- $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () {
- setTimeout(function () {
- $element.parent('li').parent('ul').parent('li').children('a').first().focus();
- }, 1);
- });
- return true;
- },
- up: function () {
- $prevElement.focus();
- return true;
- },
- down: function () {
- $nextElement.focus();
- return true;
- },
- close: function () {
- _this._back();
- //_this.$menuItems.first().focus(); // focus to first element
- },
- open: function () {
- if (!$element.is(_this.$menuItems)) {
- // not menu item means back button
- _this._hide($element.parent('li').parent('ul'));
- $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () {
- setTimeout(function () {
- $element.parent('li').parent('ul').parent('li').children('a').first().focus();
- }, 1);
- });
- return true;
- } else if ($element.is(_this.$submenuAnchors)) {
- _this._show($element.parent('li'));
- $element.parent('li').one(Foundation.transitionend($element), function () {
- $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus();
- });
- return true;
- }
- },
- handled: function (preventDefault) {
- if (preventDefault) {
- e.preventDefault();
- }
- e.stopImmediatePropagation();
- }
- });
- }); // end keyboardAccess
- }
-
- /**
- * Closes all open elements, and returns to root menu.
- * @function
- * @fires Drilldown#closed
- */
-
- }, {
- key: '_hideAll',
- value: function _hideAll() {
- var $elem = this.$element.find('.is-drilldown-submenu.is-active').addClass('is-closing');
- $elem.one(Foundation.transitionend($elem), function (e) {
- $elem.removeClass('is-active is-closing');
- });
- /**
- * Fires when the menu is fully closed.
- * @event Drilldown#closed
- */
- this.$element.trigger('closed.zf.drilldown');
- }
-
- /**
- * Adds event listener for each `back` button, and closes open menus.
- * @function
- * @fires Drilldown#back
- * @param {jQuery} $elem - the current sub-menu to add `back` event.
- */
-
- }, {
- key: '_back',
- value: function _back($elem) {
- var _this = this;
- $elem.off('click.zf.drilldown');
- $elem.children('.js-drilldown-back').on('click.zf.drilldown', function (e) {
- e.stopImmediatePropagation();
- // console.log('mouseup on back');
- _this._hide($elem);
-
- // If there is a parent submenu, call show
- var parentSubMenu = $elem.parent('li').parent('ul').parent('li');
- if (parentSubMenu.length) {
- _this._show(parentSubMenu);
- }
- });
- }
-
- /**
- * Adds event listener to menu items w/o submenus to close open menus on click.
- * @function
- * @private
- */
-
- }, {
- key: '_menuLinkEvents',
- value: function _menuLinkEvents() {
- var _this = this;
- this.$menuItems.not('.is-drilldown-submenu-parent').off('click.zf.drilldown').on('click.zf.drilldown', function (e) {
- // e.stopImmediatePropagation();
- setTimeout(function () {
- _this._hideAll();
- }, 0);
- });
- }
-
- /**
- * Opens a submenu.
- * @function
- * @fires Drilldown#open
- * @param {jQuery} $elem - the current element with a submenu to open, i.e. the `li` tag.
- */
-
- }, {
- key: '_show',
- value: function _show($elem) {
- $elem.attr('aria-expanded', true);
- $elem.children('[data-submenu]').addClass('is-active').attr('aria-hidden', false);
- /**
- * Fires when the submenu has opened.
- * @event Drilldown#open
- */
- this.$element.trigger('open.zf.drilldown', [$elem]);
- }
- }, {
- key: '_hide',
-
-
- /**
- * Hides a submenu
- * @function
- * @fires Drilldown#hide
- * @param {jQuery} $elem - the current sub-menu to hide, i.e. the `ul` tag.
- */
- value: function _hide($elem) {
- var _this = this;
- $elem.parent('li').attr('aria-expanded', false);
- $elem.attr('aria-hidden', true).addClass('is-closing').one(Foundation.transitionend($elem), function () {
- $elem.removeClass('is-active is-closing');
- $elem.blur();
- });
- /**
- * Fires when the submenu has closed.
- * @event Drilldown#hide
- */
- $elem.trigger('hide.zf.drilldown', [$elem]);
- }
-
- /**
- * Iterates through the nested menus to calculate the min-height, and max-width for the menu.
- * Prevents content jumping.
- * @function
- * @private
- */
-
- }, {
- key: '_getMaxDims',
- value: function _getMaxDims() {
- var biggest = 0;
- var result = {};
-
- this.$submenus.add(this.$element).each(function (i, elem) {
- var height = elem.getBoundingClientRect().height;
- if (height > biggest) biggest = height;
- });
-
- result['min-height'] = biggest + 'px';
- result['max-width'] = this.$element[0].getBoundingClientRect().width + 'px';
-
- return result;
- }
-
- /**
- * Destroys the Drilldown Menu
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this._hideAll();
- Foundation.Nest.Burn(this.$element, 'drilldown');
- this.$element.unwrap().find('.js-drilldown-back, .is-submenu-parent-item').remove().end().find('.is-active, .is-closing, .is-drilldown-submenu').removeClass('is-active is-closing is-drilldown-submenu').end().find('[data-submenu]').removeAttr('aria-hidden tabindex role');
- this.$submenuAnchors.each(function () {
- $(this).off('.zf.drilldown');
- });
- this.$element.find('a').each(function () {
- var $link = $(this);
- $link.removeAttr('tabindex');
- if ($link.data('savedHref')) {
- $link.attr('href', $link.data('savedHref')).removeData('savedHref');
- } else {
- return;
- }
- });
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Drilldown;
- }();
-
- Drilldown.defaults = {
- /**
- * Markup used for JS generated back button. Prepended to submenu lists and deleted on `destroy` method, 'js-drilldown-back' class required. Remove the backslash (`\`) if copy and pasting.
- * @option
- * @example '<\li><\a>Back<\/a><\/li>'
- */
- backButton: '<li class="js-drilldown-back"><a tabindex="0">Back</a></li>',
- /**
- * Markup used to wrap drilldown menu. Use a class name for independent styling; the JS applied class: `is-drilldown` is required. Remove the backslash (`\`) if copy and pasting.
- * @option
- * @example '<\div class="is-drilldown"><\/div>'
- */
- wrapper: '<div></div>',
- /**
- * Adds the parent link to the submenu.
- * @option
- * @example false
- */
- parentLink: false,
- /**
- * Allow the menu to return to root list on body click.
- * @option
- * @example false
- */
- closeOnClick: false
- // holdOpen: false
- };
-
- // Window exports
- Foundation.plugin(Drilldown, 'Drilldown');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Dropdown module.
- * @module foundation.dropdown
- * @requires foundation.util.keyboard
- * @requires foundation.util.box
- * @requires foundation.util.triggers
- */
-
- var Dropdown = function () {
- /**
- * Creates a new instance of a dropdown.
- * @class
- * @param {jQuery} element - jQuery object to make into a dropdown.
- * Object should be of the dropdown panel, rather than its anchor.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Dropdown(element, options) {
- _classCallCheck(this, Dropdown);
-
- this.$element = element;
- this.options = $.extend({}, Dropdown.defaults, this.$element.data(), options);
- this._init();
-
- Foundation.registerPlugin(this, 'Dropdown');
- Foundation.Keyboard.register('Dropdown', {
- 'ENTER': 'open',
- 'SPACE': 'open',
- 'ESCAPE': 'close',
- 'TAB': 'tab_forward',
- 'SHIFT_TAB': 'tab_backward'
- });
- }
-
- /**
- * Initializes the plugin by setting/checking options and attributes, adding helper variables, and saving the anchor.
- * @function
- * @private
- */
-
-
- _createClass(Dropdown, [{
- key: '_init',
- value: function _init() {
- var $id = this.$element.attr('id');
-
- this.$anchor = $('[data-toggle="' + $id + '"]').length ? $('[data-toggle="' + $id + '"]') : $('[data-open="' + $id + '"]');
- this.$anchor.attr({
- 'aria-controls': $id,
- 'data-is-focus': false,
- 'data-yeti-box': $id,
- 'aria-haspopup': true,
- 'aria-expanded': false
-
- });
-
- this.options.positionClass = this.getPositionClass();
- this.counter = 4;
- this.usedPositions = [];
- this.$element.attr({
- 'aria-hidden': 'true',
- 'data-yeti-box': $id,
- 'data-resize': $id,
- 'aria-labelledby': this.$anchor[0].id || Foundation.GetYoDigits(6, 'dd-anchor')
- });
- this._events();
- }
-
- /**
- * Helper function to determine current orientation of dropdown pane.
- * @function
- * @returns {String} position - string value of a position class.
- */
-
- }, {
- key: 'getPositionClass',
- value: function getPositionClass() {
- var verticalPosition = this.$element[0].className.match(/(top|left|right|bottom)/g);
- verticalPosition = verticalPosition ? verticalPosition[0] : '';
- var horizontalPosition = /float-(\S+)/.exec(this.$anchor[0].className);
- horizontalPosition = horizontalPosition ? horizontalPosition[1] : '';
- var position = horizontalPosition ? horizontalPosition + ' ' + verticalPosition : verticalPosition;
-
- return position;
- }
-
- /**
- * Adjusts the dropdown panes orientation by adding/removing positioning classes.
- * @function
- * @private
- * @param {String} position - position class to remove.
- */
-
- }, {
- key: '_reposition',
- value: function _reposition(position) {
- this.usedPositions.push(position ? position : 'bottom');
- //default, try switching to opposite side
- if (!position && this.usedPositions.indexOf('top') < 0) {
- this.$element.addClass('top');
- } else if (position === 'top' && this.usedPositions.indexOf('bottom') < 0) {
- this.$element.removeClass(position);
- } else if (position === 'left' && this.usedPositions.indexOf('right') < 0) {
- this.$element.removeClass(position).addClass('right');
- } else if (position === 'right' && this.usedPositions.indexOf('left') < 0) {
- this.$element.removeClass(position).addClass('left');
- }
-
- //if default change didn't work, try bottom or left first
- else if (!position && this.usedPositions.indexOf('top') > -1 && this.usedPositions.indexOf('left') < 0) {
- this.$element.addClass('left');
- } else if (position === 'top' && this.usedPositions.indexOf('bottom') > -1 && this.usedPositions.indexOf('left') < 0) {
- this.$element.removeClass(position).addClass('left');
- } else if (position === 'left' && this.usedPositions.indexOf('right') > -1 && this.usedPositions.indexOf('bottom') < 0) {
- this.$element.removeClass(position);
- } else if (position === 'right' && this.usedPositions.indexOf('left') > -1 && this.usedPositions.indexOf('bottom') < 0) {
- this.$element.removeClass(position);
- }
- //if nothing cleared, set to bottom
- else {
- this.$element.removeClass(position);
- }
- this.classChanged = true;
- this.counter--;
- }
-
- /**
- * Sets the position and orientation of the dropdown pane, checks for collisions.
- * Recursively calls itself if a collision is detected, with a new position class.
- * @function
- * @private
- */
-
- }, {
- key: '_setPosition',
- value: function _setPosition() {
- if (this.$anchor.attr('aria-expanded') === 'false') {
- return false;
- }
- var position = this.getPositionClass(),
- $eleDims = Foundation.Box.GetDimensions(this.$element),
- $anchorDims = Foundation.Box.GetDimensions(this.$anchor),
- _this = this,
- direction = position === 'left' ? 'left' : position === 'right' ? 'left' : 'top',
- param = direction === 'top' ? 'height' : 'width',
- offset = param === 'height' ? this.options.vOffset : this.options.hOffset;
-
- if ($eleDims.width >= $eleDims.windowDims.width || !this.counter && !Foundation.Box.ImNotTouchingYou(this.$element)) {
- this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, 'center bottom', this.options.vOffset, this.options.hOffset, true)).css({
- 'width': $eleDims.windowDims.width - this.options.hOffset * 2,
- 'height': 'auto'
- });
- this.classChanged = true;
- return false;
- }
-
- this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, position, this.options.vOffset, this.options.hOffset));
-
- while (!Foundation.Box.ImNotTouchingYou(this.$element, false, true) && this.counter) {
- this._reposition(position);
- this._setPosition();
- }
- }
-
- /**
- * Adds event listeners to the element utilizing the triggers utility library.
- * @function
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this;
- this.$element.on({
- 'open.zf.trigger': this.open.bind(this),
- 'close.zf.trigger': this.close.bind(this),
- 'toggle.zf.trigger': this.toggle.bind(this),
- 'resizeme.zf.trigger': this._setPosition.bind(this)
- });
-
- if (this.options.hover) {
- this.$anchor.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () {
- if ($('body[data-whatinput="mouse"]').is('*')) {
- clearTimeout(_this.timeout);
- _this.timeout = setTimeout(function () {
- _this.open();
- _this.$anchor.data('hover', true);
- }, _this.options.hoverDelay);
- }
- }).on('mouseleave.zf.dropdown', function () {
- clearTimeout(_this.timeout);
- _this.timeout = setTimeout(function () {
- _this.close();
- _this.$anchor.data('hover', false);
- }, _this.options.hoverDelay);
- });
- if (this.options.hoverPane) {
- this.$element.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () {
- clearTimeout(_this.timeout);
- }).on('mouseleave.zf.dropdown', function () {
- clearTimeout(_this.timeout);
- _this.timeout = setTimeout(function () {
- _this.close();
- _this.$anchor.data('hover', false);
- }, _this.options.hoverDelay);
- });
- }
- }
- this.$anchor.add(this.$element).on('keydown.zf.dropdown', function (e) {
-
- var $target = $(this),
- visibleFocusableElements = Foundation.Keyboard.findFocusable(_this.$element);
-
- Foundation.Keyboard.handleKey(e, 'Dropdown', {
- tab_forward: function () {
- if (_this.$element.find(':focus').is(visibleFocusableElements.eq(-1))) {
- // left modal downwards, setting focus to first element
- if (_this.options.trapFocus) {
- // if focus shall be trapped
- visibleFocusableElements.eq(0).focus();
- e.preventDefault();
- } else {
- // if focus is not trapped, close dropdown on focus out
- _this.close();
- }
- }
- },
- tab_backward: function () {
- if (_this.$element.find(':focus').is(visibleFocusableElements.eq(0)) || _this.$element.is(':focus')) {
- // left modal upwards, setting focus to last element
- if (_this.options.trapFocus) {
- // if focus shall be trapped
- visibleFocusableElements.eq(-1).focus();
- e.preventDefault();
- } else {
- // if focus is not trapped, close dropdown on focus out
- _this.close();
- }
- }
- },
- open: function () {
- if ($target.is(_this.$anchor)) {
- _this.open();
- _this.$element.attr('tabindex', -1).focus();
- e.preventDefault();
- }
- },
- close: function () {
- _this.close();
- _this.$anchor.focus();
- }
- });
- });
- }
-
- /**
- * Adds an event handler to the body to close any dropdowns on a click.
- * @function
- * @private
- */
-
- }, {
- key: '_addBodyHandler',
- value: function _addBodyHandler() {
- var $body = $(document.body).not(this.$element),
- _this = this;
- $body.off('click.zf.dropdown').on('click.zf.dropdown', function (e) {
- if (_this.$anchor.is(e.target) || _this.$anchor.find(e.target).length) {
- return;
- }
- if (_this.$element.find(e.target).length) {
- return;
- }
- _this.close();
- $body.off('click.zf.dropdown');
- });
- }
-
- /**
- * Opens the dropdown pane, and fires a bubbling event to close other dropdowns.
- * @function
- * @fires Dropdown#closeme
- * @fires Dropdown#show
- */
-
- }, {
- key: 'open',
- value: function open() {
- // var _this = this;
- /**
- * Fires to close other open dropdowns
- * @event Dropdown#closeme
- */
- this.$element.trigger('closeme.zf.dropdown', this.$element.attr('id'));
- this.$anchor.addClass('hover').attr({ 'aria-expanded': true });
- // this.$element/*.show()*/;
- this._setPosition();
- this.$element.addClass('is-open').attr({ 'aria-hidden': false });
-
- if (this.options.autoFocus) {
- var $focusable = Foundation.Keyboard.findFocusable(this.$element);
- if ($focusable.length) {
- $focusable.eq(0).focus();
- }
- }
-
- if (this.options.closeOnClick) {
- this._addBodyHandler();
- }
-
- /**
- * Fires once the dropdown is visible.
- * @event Dropdown#show
- */
- this.$element.trigger('show.zf.dropdown', [this.$element]);
- }
-
- /**
- * Closes the open dropdown pane.
- * @function
- * @fires Dropdown#hide
- */
-
- }, {
- key: 'close',
- value: function close() {
- if (!this.$element.hasClass('is-open')) {
- return false;
- }
- this.$element.removeClass('is-open').attr({ 'aria-hidden': true });
-
- this.$anchor.removeClass('hover').attr('aria-expanded', false);
-
- if (this.classChanged) {
- var curPositionClass = this.getPositionClass();
- if (curPositionClass) {
- this.$element.removeClass(curPositionClass);
- }
- this.$element.addClass(this.options.positionClass)
- /*.hide()*/.css({ height: '', width: '' });
- this.classChanged = false;
- this.counter = 4;
- this.usedPositions.length = 0;
- }
- this.$element.trigger('hide.zf.dropdown', [this.$element]);
- }
-
- /**
- * Toggles the dropdown pane's visibility.
- * @function
- */
-
- }, {
- key: 'toggle',
- value: function toggle() {
- if (this.$element.hasClass('is-open')) {
- if (this.$anchor.data('hover')) return;
- this.close();
- } else {
- this.open();
- }
- }
-
- /**
- * Destroys the dropdown.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.off('.zf.trigger').hide();
- this.$anchor.off('.zf.dropdown');
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Dropdown;
- }();
-
- Dropdown.defaults = {
- /**
- * Amount of time to delay opening a submenu on hover event.
- * @option
- * @example 250
- */
- hoverDelay: 250,
- /**
- * Allow submenus to open on hover events
- * @option
- * @example false
- */
- hover: false,
- /**
- * Don't close dropdown when hovering over dropdown pane
- * @option
- * @example true
- */
- hoverPane: false,
- /**
- * Number of pixels between the dropdown pane and the triggering element on open.
- * @option
- * @example 1
- */
- vOffset: 1,
- /**
- * Number of pixels between the dropdown pane and the triggering element on open.
- * @option
- * @example 1
- */
- hOffset: 1,
- /**
- * Class applied to adjust open position. JS will test and fill this in.
- * @option
- * @example 'top'
- */
- positionClass: '',
- /**
- * Allow the plugin to trap focus to the dropdown pane if opened with keyboard commands.
- * @option
- * @example false
- */
- trapFocus: false,
- /**
- * Allow the plugin to set focus to the first focusable element within the pane, regardless of method of opening.
- * @option
- * @example true
- */
- autoFocus: false,
- /**
- * Allows a click on the body to close the dropdown.
- * @option
- * @example false
- */
- closeOnClick: false
- };
-
- // Window exports
- Foundation.plugin(Dropdown, 'Dropdown');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * DropdownMenu module.
- * @module foundation.dropdown-menu
- * @requires foundation.util.keyboard
- * @requires foundation.util.box
- * @requires foundation.util.nest
- */
-
- var DropdownMenu = function () {
- /**
- * Creates a new instance of DropdownMenu.
- * @class
- * @fires DropdownMenu#init
- * @param {jQuery} element - jQuery object to make into a dropdown menu.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function DropdownMenu(element, options) {
- _classCallCheck(this, DropdownMenu);
-
- this.$element = element;
- this.options = $.extend({}, DropdownMenu.defaults, this.$element.data(), options);
-
- Foundation.Nest.Feather(this.$element, 'dropdown');
- this._init();
-
- Foundation.registerPlugin(this, 'DropdownMenu');
- Foundation.Keyboard.register('DropdownMenu', {
- 'ENTER': 'open',
- 'SPACE': 'open',
- 'ARROW_RIGHT': 'next',
- 'ARROW_UP': 'up',
- 'ARROW_DOWN': 'down',
- 'ARROW_LEFT': 'previous',
- 'ESCAPE': 'close'
- });
- }
-
- /**
- * Initializes the plugin, and calls _prepareMenu
- * @private
- * @function
- */
-
-
- _createClass(DropdownMenu, [{
- key: '_init',
- value: function _init() {
- var subs = this.$element.find('li.is-dropdown-submenu-parent');
- this.$element.children('.is-dropdown-submenu-parent').children('.is-dropdown-submenu').addClass('first-sub');
-
- this.$menuItems = this.$element.find('[role="menuitem"]');
- this.$tabs = this.$element.children('[role="menuitem"]');
- this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass);
-
- if (this.$element.hasClass(this.options.rightClass) || this.options.alignment === 'right' || Foundation.rtl() || this.$element.parents('.top-bar-right').is('*')) {
- this.options.alignment = 'right';
- subs.addClass('opens-left');
- } else {
- subs.addClass('opens-right');
- }
- this.changed = false;
- this._events();
- }
- }, {
- key: '_isVertical',
- value: function _isVertical() {
- return this.$tabs.css('display') === 'block';
- }
-
- /**
- * Adds event listeners to elements within the menu
- * @private
- * @function
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this,
- hasTouch = 'ontouchstart' in window || typeof window.ontouchstart !== 'undefined',
- parClass = 'is-dropdown-submenu-parent';
-
- // used for onClick and in the keyboard handlers
- var handleClickFn = function (e) {
- var $elem = $(e.target).parentsUntil('ul', '.' + parClass),
- hasSub = $elem.hasClass(parClass),
- hasClicked = $elem.attr('data-is-click') === 'true',
- $sub = $elem.children('.is-dropdown-submenu');
-
- if (hasSub) {
- if (hasClicked) {
- if (!_this.options.closeOnClick || !_this.options.clickOpen && !hasTouch || _this.options.forceFollow && hasTouch) {
- return;
- } else {
- e.stopImmediatePropagation();
- e.preventDefault();
- _this._hide($elem);
- }
- } else {
- e.preventDefault();
- e.stopImmediatePropagation();
- _this._show($sub);
- $elem.add($elem.parentsUntil(_this.$element, '.' + parClass)).attr('data-is-click', true);
- }
- } else {
- if (_this.options.closeOnClickInside) {
- _this._hide($elem);
- }
- return;
- }
- };
-
- if (this.options.clickOpen || hasTouch) {
- this.$menuItems.on('click.zf.dropdownmenu touchstart.zf.dropdownmenu', handleClickFn);
- }
-
- if (!this.options.disableHover) {
- this.$menuItems.on('mouseenter.zf.dropdownmenu', function (e) {
- var $elem = $(this),
- hasSub = $elem.hasClass(parClass);
-
- if (hasSub) {
- clearTimeout(_this.delay);
- _this.delay = setTimeout(function () {
- _this._show($elem.children('.is-dropdown-submenu'));
- }, _this.options.hoverDelay);
- }
- }).on('mouseleave.zf.dropdownmenu', function (e) {
- var $elem = $(this),
- hasSub = $elem.hasClass(parClass);
- if (hasSub && _this.options.autoclose) {
- if ($elem.attr('data-is-click') === 'true' && _this.options.clickOpen) {
- return false;
- }
-
- clearTimeout(_this.delay);
- _this.delay = setTimeout(function () {
- _this._hide($elem);
- }, _this.options.closingTime);
- }
- });
- }
- this.$menuItems.on('keydown.zf.dropdownmenu', function (e) {
- var $element = $(e.target).parentsUntil('ul', '[role="menuitem"]'),
- isTab = _this.$tabs.index($element) > -1,
- $elements = isTab ? _this.$tabs : $element.siblings('li').add($element),
- $prevElement,
- $nextElement;
-
- $elements.each(function (i) {
- if ($(this).is($element)) {
- $prevElement = $elements.eq(i - 1);
- $nextElement = $elements.eq(i + 1);
- return;
- }
- });
-
- var nextSibling = function () {
- if (!$element.is(':last-child')) {
- $nextElement.children('a:first').focus();
- e.preventDefault();
- }
- },
- prevSibling = function () {
- $prevElement.children('a:first').focus();
- e.preventDefault();
- },
- openSub = function () {
- var $sub = $element.children('ul.is-dropdown-submenu');
- if ($sub.length) {
- _this._show($sub);
- $element.find('li > a:first').focus();
- e.preventDefault();
- } else {
- return;
- }
- },
- closeSub = function () {
- //if ($element.is(':first-child')) {
- var close = $element.parent('ul').parent('li');
- close.children('a:first').focus();
- _this._hide(close);
- e.preventDefault();
- //}
- };
- var functions = {
- open: openSub,
- close: function () {
- _this._hide(_this.$element);
- _this.$menuItems.find('a:first').focus(); // focus to first element
- e.preventDefault();
- },
- handled: function () {
- e.stopImmediatePropagation();
- }
- };
-
- if (isTab) {
- if (_this._isVertical()) {
- // vertical menu
- if (Foundation.rtl()) {
- // right aligned
- $.extend(functions, {
- down: nextSibling,
- up: prevSibling,
- next: closeSub,
- previous: openSub
- });
- } else {
- // left aligned
- $.extend(functions, {
- down: nextSibling,
- up: prevSibling,
- next: openSub,
- previous: closeSub
- });
- }
- } else {
- // horizontal menu
- if (Foundation.rtl()) {
- // right aligned
- $.extend(functions, {
- next: prevSibling,
- previous: nextSibling,
- down: openSub,
- up: closeSub
- });
- } else {
- // left aligned
- $.extend(functions, {
- next: nextSibling,
- previous: prevSibling,
- down: openSub,
- up: closeSub
- });
- }
- }
- } else {
- // not tabs -> one sub
- if (Foundation.rtl()) {
- // right aligned
- $.extend(functions, {
- next: closeSub,
- previous: openSub,
- down: nextSibling,
- up: prevSibling
- });
- } else {
- // left aligned
- $.extend(functions, {
- next: openSub,
- previous: closeSub,
- down: nextSibling,
- up: prevSibling
- });
- }
- }
- Foundation.Keyboard.handleKey(e, 'DropdownMenu', functions);
- });
- }
-
- /**
- * Adds an event handler to the body to close any dropdowns on a click.
- * @function
- * @private
- */
-
- }, {
- key: '_addBodyHandler',
- value: function _addBodyHandler() {
- var $body = $(document.body),
- _this = this;
- $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu').on('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu', function (e) {
- var $link = _this.$element.find(e.target);
- if ($link.length) {
- return;
- }
-
- _this._hide();
- $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu');
- });
- }
-
- /**
- * Opens a dropdown pane, and checks for collisions first.
- * @param {jQuery} $sub - ul element that is a submenu to show
- * @function
- * @private
- * @fires DropdownMenu#show
- */
-
- }, {
- key: '_show',
- value: function _show($sub) {
- var idx = this.$tabs.index(this.$tabs.filter(function (i, el) {
- return $(el).find($sub).length > 0;
- }));
- var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent');
- this._hide($sibs, idx);
- $sub.css('visibility', 'hidden').addClass('js-dropdown-active').attr({ 'aria-hidden': false }).parent('li.is-dropdown-submenu-parent').addClass('is-active').attr({ 'aria-expanded': true });
- var clear = Foundation.Box.ImNotTouchingYou($sub, null, true);
- if (!clear) {
- var oldClass = this.options.alignment === 'left' ? '-right' : '-left',
- $parentLi = $sub.parent('.is-dropdown-submenu-parent');
- $parentLi.removeClass('opens' + oldClass).addClass('opens-' + this.options.alignment);
- clear = Foundation.Box.ImNotTouchingYou($sub, null, true);
- if (!clear) {
- $parentLi.removeClass('opens-' + this.options.alignment).addClass('opens-inner');
- }
- this.changed = true;
- }
- $sub.css('visibility', '');
- if (this.options.closeOnClick) {
- this._addBodyHandler();
- }
- /**
- * Fires when the new dropdown pane is visible.
- * @event DropdownMenu#show
- */
- this.$element.trigger('show.zf.dropdownmenu', [$sub]);
- }
-
- /**
- * Hides a single, currently open dropdown pane, if passed a parameter, otherwise, hides everything.
- * @function
- * @param {jQuery} $elem - element with a submenu to hide
- * @param {Number} idx - index of the $tabs collection to hide
- * @private
- */
-
- }, {
- key: '_hide',
- value: function _hide($elem, idx) {
- var $toClose;
- if ($elem && $elem.length) {
- $toClose = $elem;
- } else if (idx !== undefined) {
- $toClose = this.$tabs.not(function (i, el) {
- return i === idx;
- });
- } else {
- $toClose = this.$element;
- }
- var somethingToClose = $toClose.hasClass('is-active') || $toClose.find('.is-active').length > 0;
-
- if (somethingToClose) {
- $toClose.find('li.is-active').add($toClose).attr({
- 'aria-expanded': false,
- 'data-is-click': false
- }).removeClass('is-active');
-
- $toClose.find('ul.js-dropdown-active').attr({
- 'aria-hidden': true
- }).removeClass('js-dropdown-active');
-
- if (this.changed || $toClose.find('opens-inner').length) {
- var oldClass = this.options.alignment === 'left' ? 'right' : 'left';
- $toClose.find('li.is-dropdown-submenu-parent').add($toClose).removeClass('opens-inner opens-' + this.options.alignment).addClass('opens-' + oldClass);
- this.changed = false;
- }
- /**
- * Fires when the open menus are closed.
- * @event DropdownMenu#hide
- */
- this.$element.trigger('hide.zf.dropdownmenu', [$toClose]);
- }
- }
-
- /**
- * Destroys the plugin.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click').removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner');
- $(document.body).off('.zf.dropdownmenu');
- Foundation.Nest.Burn(this.$element, 'dropdown');
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return DropdownMenu;
- }();
-
- /**
- * Default settings for plugin
- */
-
-
- DropdownMenu.defaults = {
- /**
- * Disallows hover events from opening submenus
- * @option
- * @example false
- */
- disableHover: false,
- /**
- * Allow a submenu to automatically close on a mouseleave event, if not clicked open.
- * @option
- * @example true
- */
- autoclose: true,
- /**
- * Amount of time to delay opening a submenu on hover event.
- * @option
- * @example 50
- */
- hoverDelay: 50,
- /**
- * Allow a submenu to open/remain open on parent click event. Allows cursor to move away from menu.
- * @option
- * @example true
- */
- clickOpen: false,
- /**
- * Amount of time to delay closing a submenu on a mouseleave event.
- * @option
- * @example 500
- */
-
- closingTime: 500,
- /**
- * Position of the menu relative to what direction the submenus should open. Handled by JS.
- * @option
- * @example 'left'
- */
- alignment: 'left',
- /**
- * Allow clicks on the body to close any open submenus.
- * @option
- * @example true
- */
- closeOnClick: true,
- /**
- * Allow clicks on leaf anchor links to close any open submenus.
- * @option
- * @example true
- */
- closeOnClickInside: true,
- /**
- * Class applied to vertical oriented menus, Foundation default is `vertical`. Update this if using your own class.
- * @option
- * @example 'vertical'
- */
- verticalClass: 'vertical',
- /**
- * Class applied to right-side oriented menus, Foundation default is `align-right`. Update this if using your own class.
- * @option
- * @example 'align-right'
- */
- rightClass: 'align-right',
- /**
- * Boolean to force overide the clicking of links to perform default action, on second touch event for mobile.
- * @option
- * @example false
- */
- forceFollow: true
- };
-
- // Window exports
- Foundation.plugin(DropdownMenu, 'DropdownMenu');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Equalizer module.
- * @module foundation.equalizer
- * @requires foundation.util.mediaQuery
- * @requires foundation.util.timerAndImageLoader if equalizer contains images
- */
-
- var Equalizer = function () {
- /**
- * Creates a new instance of Equalizer.
- * @class
- * @fires Equalizer#init
- * @param {Object} element - jQuery object to add the trigger to.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Equalizer(element, options) {
- _classCallCheck(this, Equalizer);
-
- this.$element = element;
- this.options = $.extend({}, Equalizer.defaults, this.$element.data(), options);
-
- this._init();
-
- Foundation.registerPlugin(this, 'Equalizer');
- }
-
- /**
- * Initializes the Equalizer plugin and calls functions to get equalizer functioning on load.
- * @private
- */
-
-
- _createClass(Equalizer, [{
- key: '_init',
- value: function _init() {
- var eqId = this.$element.attr('data-equalizer') || '';
- var $watched = this.$element.find('[data-equalizer-watch="' + eqId + '"]');
-
- this.$watched = $watched.length ? $watched : this.$element.find('[data-equalizer-watch]');
- this.$element.attr('data-resize', eqId || Foundation.GetYoDigits(6, 'eq'));
-
- this.hasNested = this.$element.find('[data-equalizer]').length > 0;
- this.isNested = this.$element.parentsUntil(document.body, '[data-equalizer]').length > 0;
- this.isOn = false;
- this._bindHandler = {
- onResizeMeBound: this._onResizeMe.bind(this),
- onPostEqualizedBound: this._onPostEqualized.bind(this)
- };
-
- var imgs = this.$element.find('img');
- var tooSmall;
- if (this.options.equalizeOn) {
- tooSmall = this._checkMQ();
- $(window).on('changed.zf.mediaquery', this._checkMQ.bind(this));
- } else {
- this._events();
- }
- if (tooSmall !== undefined && tooSmall === false || tooSmall === undefined) {
- if (imgs.length) {
- Foundation.onImagesLoaded(imgs, this._reflow.bind(this));
- } else {
- this._reflow();
- }
- }
- }
-
- /**
- * Removes event listeners if the breakpoint is too small.
- * @private
- */
-
- }, {
- key: '_pauseEvents',
- value: function _pauseEvents() {
- this.isOn = false;
- this.$element.off({
- '.zf.equalizer': this._bindHandler.onPostEqualizedBound,
- 'resizeme.zf.trigger': this._bindHandler.onResizeMeBound
- });
- }
-
- /**
- * function to handle $elements resizeme.zf.trigger, with bound this on _bindHandler.onResizeMeBound
- * @private
- */
-
- }, {
- key: '_onResizeMe',
- value: function _onResizeMe(e) {
- this._reflow();
- }
-
- /**
- * function to handle $elements postequalized.zf.equalizer, with bound this on _bindHandler.onPostEqualizedBound
- * @private
- */
-
- }, {
- key: '_onPostEqualized',
- value: function _onPostEqualized(e) {
- if (e.target !== this.$element[0]) {
- this._reflow();
- }
- }
-
- /**
- * Initializes events for Equalizer.
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this;
- this._pauseEvents();
- if (this.hasNested) {
- this.$element.on('postequalized.zf.equalizer', this._bindHandler.onPostEqualizedBound);
- } else {
- this.$element.on('resizeme.zf.trigger', this._bindHandler.onResizeMeBound);
- }
- this.isOn = true;
- }
-
- /**
- * Checks the current breakpoint to the minimum required size.
- * @private
- */
-
- }, {
- key: '_checkMQ',
- value: function _checkMQ() {
- var tooSmall = !Foundation.MediaQuery.atLeast(this.options.equalizeOn);
- if (tooSmall) {
- if (this.isOn) {
- this._pauseEvents();
- this.$watched.css('height', 'auto');
- }
- } else {
- if (!this.isOn) {
- this._events();
- }
- }
- return tooSmall;
- }
-
- /**
- * A noop version for the plugin
- * @private
- */
-
- }, {
- key: '_killswitch',
- value: function _killswitch() {
- return;
- }
-
- /**
- * Calls necessary functions to update Equalizer upon DOM change
- * @private
- */
-
- }, {
- key: '_reflow',
- value: function _reflow() {
- if (!this.options.equalizeOnStack) {
- if (this._isStacked()) {
- this.$watched.css('height', 'auto');
- return false;
- }
- }
- if (this.options.equalizeByRow) {
- this.getHeightsByRow(this.applyHeightByRow.bind(this));
- } else {
- this.getHeights(this.applyHeight.bind(this));
- }
- }
-
- /**
- * Manually determines if the first 2 elements are *NOT* stacked.
- * @private
- */
-
- }, {
- key: '_isStacked',
- value: function _isStacked() {
- return this.$watched[0].getBoundingClientRect().top !== this.$watched[1].getBoundingClientRect().top;
- }
-
- /**
- * Finds the outer heights of children contained within an Equalizer parent and returns them in an array
- * @param {Function} cb - A non-optional callback to return the heights array to.
- * @returns {Array} heights - An array of heights of children within Equalizer container
- */
-
- }, {
- key: 'getHeights',
- value: function getHeights(cb) {
- var heights = [];
- for (var i = 0, len = this.$watched.length; i < len; i++) {
- this.$watched[i].style.height = 'auto';
- heights.push(this.$watched[i].offsetHeight);
- }
- cb(heights);
- }
-
- /**
- * Finds the outer heights of children contained within an Equalizer parent and returns them in an array
- * @param {Function} cb - A non-optional callback to return the heights array to.
- * @returns {Array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child
- */
-
- }, {
- key: 'getHeightsByRow',
- value: function getHeightsByRow(cb) {
- var lastElTopOffset = this.$watched.length ? this.$watched.first().offset().top : 0,
- groups = [],
- group = 0;
- //group by Row
- groups[group] = [];
- for (var i = 0, len = this.$watched.length; i < len; i++) {
- this.$watched[i].style.height = 'auto';
- //maybe could use this.$watched[i].offsetTop
- var elOffsetTop = $(this.$watched[i]).offset().top;
- if (elOffsetTop != lastElTopOffset) {
- group++;
- groups[group] = [];
- lastElTopOffset = elOffsetTop;
- }
- groups[group].push([this.$watched[i], this.$watched[i].offsetHeight]);
- }
-
- for (var j = 0, ln = groups.length; j < ln; j++) {
- var heights = $(groups[j]).map(function () {
- return this[1];
- }).get();
- var max = Math.max.apply(null, heights);
- groups[j].push(max);
- }
- cb(groups);
- }
-
- /**
- * Changes the CSS height property of each child in an Equalizer parent to match the tallest
- * @param {array} heights - An array of heights of children within Equalizer container
- * @fires Equalizer#preequalized
- * @fires Equalizer#postequalized
- */
-
- }, {
- key: 'applyHeight',
- value: function applyHeight(heights) {
- var max = Math.max.apply(null, heights);
- /**
- * Fires before the heights are applied
- * @event Equalizer#preequalized
- */
- this.$element.trigger('preequalized.zf.equalizer');
-
- this.$watched.css('height', max);
-
- /**
- * Fires when the heights have been applied
- * @event Equalizer#postequalized
- */
- this.$element.trigger('postequalized.zf.equalizer');
- }
-
- /**
- * Changes the CSS height property of each child in an Equalizer parent to match the tallest by row
- * @param {array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child
- * @fires Equalizer#preequalized
- * @fires Equalizer#preequalizedRow
- * @fires Equalizer#postequalizedRow
- * @fires Equalizer#postequalized
- */
-
- }, {
- key: 'applyHeightByRow',
- value: function applyHeightByRow(groups) {
- /**
- * Fires before the heights are applied
- */
- this.$element.trigger('preequalized.zf.equalizer');
- for (var i = 0, len = groups.length; i < len; i++) {
- var groupsILength = groups[i].length,
- max = groups[i][groupsILength - 1];
- if (groupsILength <= 2) {
- $(groups[i][0][0]).css({ 'height': 'auto' });
- continue;
- }
- /**
- * Fires before the heights per row are applied
- * @event Equalizer#preequalizedRow
- */
- this.$element.trigger('preequalizedrow.zf.equalizer');
- for (var j = 0, lenJ = groupsILength - 1; j < lenJ; j++) {
- $(groups[i][j][0]).css({ 'height': max });
- }
- /**
- * Fires when the heights per row have been applied
- * @event Equalizer#postequalizedRow
- */
- this.$element.trigger('postequalizedrow.zf.equalizer');
- }
- /**
- * Fires when the heights have been applied
- */
- this.$element.trigger('postequalized.zf.equalizer');
- }
-
- /**
- * Destroys an instance of Equalizer.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this._pauseEvents();
- this.$watched.css('height', 'auto');
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Equalizer;
- }();
-
- /**
- * Default settings for plugin
- */
-
-
- Equalizer.defaults = {
- /**
- * Enable height equalization when stacked on smaller screens.
- * @option
- * @example true
- */
- equalizeOnStack: false,
- /**
- * Enable height equalization row by row.
- * @option
- * @example false
- */
- equalizeByRow: false,
- /**
- * String representing the minimum breakpoint size the plugin should equalize heights on.
- * @option
- * @example 'medium'
- */
- equalizeOn: ''
- };
-
- // Window exports
- Foundation.plugin(Equalizer, 'Equalizer');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Interchange module.
- * @module foundation.interchange
- * @requires foundation.util.mediaQuery
- * @requires foundation.util.timerAndImageLoader
- */
-
- var Interchange = function () {
- /**
- * Creates a new instance of Interchange.
- * @class
- * @fires Interchange#init
- * @param {Object} element - jQuery object to add the trigger to.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Interchange(element, options) {
- _classCallCheck(this, Interchange);
-
- this.$element = element;
- this.options = $.extend({}, Interchange.defaults, options);
- this.rules = [];
- this.currentPath = '';
-
- this._init();
- this._events();
-
- Foundation.registerPlugin(this, 'Interchange');
- }
-
- /**
- * Initializes the Interchange plugin and calls functions to get interchange functioning on load.
- * @function
- * @private
- */
-
-
- _createClass(Interchange, [{
- key: '_init',
- value: function _init() {
- this._addBreakpoints();
- this._generateRules();
- this._reflow();
- }
-
- /**
- * Initializes events for Interchange.
- * @function
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- $(window).on('resize.zf.interchange', Foundation.util.throttle(this._reflow.bind(this), 50));
- }
-
- /**
- * Calls necessary functions to update Interchange upon DOM change
- * @function
- * @private
- */
-
- }, {
- key: '_reflow',
- value: function _reflow() {
- var match;
-
- // Iterate through each rule, but only save the last match
- for (var i in this.rules) {
- if (this.rules.hasOwnProperty(i)) {
- var rule = this.rules[i];
-
- if (window.matchMedia(rule.query).matches) {
- match = rule;
- }
- }
- }
-
- if (match) {
- this.replace(match.path);
- }
- }
-
- /**
- * Gets the Foundation breakpoints and adds them to the Interchange.SPECIAL_QUERIES object.
- * @function
- * @private
- */
-
- }, {
- key: '_addBreakpoints',
- value: function _addBreakpoints() {
- for (var i in Foundation.MediaQuery.queries) {
- if (Foundation.MediaQuery.queries.hasOwnProperty(i)) {
- var query = Foundation.MediaQuery.queries[i];
- Interchange.SPECIAL_QUERIES[query.name] = query.value;
- }
- }
- }
-
- /**
- * Checks the Interchange element for the provided media query + content pairings
- * @function
- * @private
- * @param {Object} element - jQuery object that is an Interchange instance
- * @returns {Array} scenarios - Array of objects that have 'mq' and 'path' keys with corresponding keys
- */
-
- }, {
- key: '_generateRules',
- value: function _generateRules(element) {
- var rulesList = [];
- var rules;
-
- if (this.options.rules) {
- rules = this.options.rules;
- } else {
- rules = this.$element.data('interchange').match(/\[.*?\]/g);
- }
-
- for (var i in rules) {
- if (rules.hasOwnProperty(i)) {
- var rule = rules[i].slice(1, -1).split(', ');
- var path = rule.slice(0, -1).join('');
- var query = rule[rule.length - 1];
-
- if (Interchange.SPECIAL_QUERIES[query]) {
- query = Interchange.SPECIAL_QUERIES[query];
- }
-
- rulesList.push({
- path: path,
- query: query
- });
- }
- }
-
- this.rules = rulesList;
- }
-
- /**
- * Update the `src` property of an image, or change the HTML of a container, to the specified path.
- * @function
- * @param {String} path - Path to the image or HTML partial.
- * @fires Interchange#replaced
- */
-
- }, {
- key: 'replace',
- value: function replace(path) {
- if (this.currentPath === path) return;
-
- var _this = this,
- trigger = 'replaced.zf.interchange';
-
- // Replacing images
- if (this.$element[0].nodeName === 'IMG') {
- this.$element.attr('src', path).on('load', function () {
- _this.currentPath = path;
- }).trigger(trigger);
- }
- // Replacing background images
- else if (path.match(/\.(gif|jpg|jpeg|png|svg|tiff)([?#].*)?/i)) {
- this.$element.css({ 'background-image': 'url(' + path + ')' }).trigger(trigger);
- }
- // Replacing HTML
- else {
- $.get(path, function (response) {
- _this.$element.html(response).trigger(trigger);
- $(response).foundation();
- _this.currentPath = path;
- });
- }
-
- /**
- * Fires when content in an Interchange element is done being loaded.
- * @event Interchange#replaced
- */
- // this.$element.trigger('replaced.zf.interchange');
- }
-
- /**
- * Destroys an instance of interchange.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- //TODO this.
- }
- }]);
-
- return Interchange;
- }();
-
- /**
- * Default settings for plugin
- */
-
-
- Interchange.defaults = {
- /**
- * Rules to be applied to Interchange elements. Set with the `data-interchange` array notation.
- * @option
- */
- rules: null
- };
-
- Interchange.SPECIAL_QUERIES = {
- 'landscape': 'screen and (orientation: landscape)',
- 'portrait': 'screen and (orientation: portrait)',
- 'retina': 'only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)'
- };
-
- // Window exports
- Foundation.plugin(Interchange, 'Interchange');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Magellan module.
- * @module foundation.magellan
- */
-
- var Magellan = function () {
- /**
- * Creates a new instance of Magellan.
- * @class
- * @fires Magellan#init
- * @param {Object} element - jQuery object to add the trigger to.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Magellan(element, options) {
- _classCallCheck(this, Magellan);
-
- this.$element = element;
- this.options = $.extend({}, Magellan.defaults, this.$element.data(), options);
-
- this._init();
-
- Foundation.registerPlugin(this, 'Magellan');
- }
-
- /**
- * Initializes the Magellan plugin and calls functions to get equalizer functioning on load.
- * @private
- */
-
-
- _createClass(Magellan, [{
- key: '_init',
- value: function _init() {
- var id = this.$element[0].id || Foundation.GetYoDigits(6, 'magellan');
- var _this = this;
- this.$targets = $('[data-magellan-target]');
- this.$links = this.$element.find('a');
- this.$element.attr({
- 'data-resize': id,
- 'data-scroll': id,
- 'id': id
- });
- this.$active = $();
- this.scrollPos = parseInt(window.pageYOffset, 10);
-
- this._events();
- }
-
- /**
- * Calculates an array of pixel values that are the demarcation lines between locations on the page.
- * Can be invoked if new elements are added or the size of a location changes.
- * @function
- */
-
- }, {
- key: 'calcPoints',
- value: function calcPoints() {
- var _this = this,
- body = document.body,
- html = document.documentElement;
-
- this.points = [];
- this.winHeight = Math.round(Math.max(window.innerHeight, html.clientHeight));
- this.docHeight = Math.round(Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight));
-
- this.$targets.each(function () {
- var $tar = $(this),
- pt = Math.round($tar.offset().top - _this.options.threshold);
- $tar.targetPoint = pt;
- _this.points.push(pt);
- });
- }
-
- /**
- * Initializes events for Magellan.
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this,
- $body = $('html, body'),
- opts = {
- duration: _this.options.animationDuration,
- easing: _this.options.animationEasing
- };
- $(window).one('load', function () {
- if (_this.options.deepLinking) {
- if (location.hash) {
- _this.scrollToLoc(location.hash);
- }
- }
- _this.calcPoints();
- _this._updateActive();
- });
-
- this.$element.on({
- 'resizeme.zf.trigger': this.reflow.bind(this),
- 'scrollme.zf.trigger': this._updateActive.bind(this)
- }).on('click.zf.magellan', 'a[href^="#"]', function (e) {
- e.preventDefault();
- var arrival = this.getAttribute('href');
- _this.scrollToLoc(arrival);
- });
- }
-
- /**
- * Function to scroll to a given location on the page.
- * @param {String} loc - a properly formatted jQuery id selector. Example: '#foo'
- * @function
- */
-
- }, {
- key: 'scrollToLoc',
- value: function scrollToLoc(loc) {
- // Do nothing if target does not exist to prevent errors
- if (!$(loc).length) {
- return false;
- }
- var scrollPos = Math.round($(loc).offset().top - this.options.threshold / 2 - this.options.barOffset);
-
- $('html, body').stop(true).animate({ scrollTop: scrollPos }, this.options.animationDuration, this.options.animationEasing);
- }
-
- /**
- * Calls necessary functions to update Magellan upon DOM change
- * @function
- */
-
- }, {
- key: 'reflow',
- value: function reflow() {
- this.calcPoints();
- this._updateActive();
- }
-
- /**
- * Updates the visibility of an active location link, and updates the url hash for the page, if deepLinking enabled.
- * @private
- * @function
- * @fires Magellan#update
- */
-
- }, {
- key: '_updateActive',
- value: function _updateActive() /*evt, elem, scrollPos*/{
- var winPos = /*scrollPos ||*/parseInt(window.pageYOffset, 10),
- curIdx;
-
- if (winPos + this.winHeight === this.docHeight) {
- curIdx = this.points.length - 1;
- } else if (winPos < this.points[0]) {
- curIdx = 0;
- } else {
- var isDown = this.scrollPos < winPos,
- _this = this,
- curVisible = this.points.filter(function (p, i) {
- return isDown ? p - _this.options.barOffset <= winPos : p - _this.options.barOffset - _this.options.threshold <= winPos;
- });
- curIdx = curVisible.length ? curVisible.length - 1 : 0;
- }
-
- this.$active.removeClass(this.options.activeClass);
- this.$active = this.$links.filter('[href="#' + this.$targets.eq(curIdx).data('magellan-target') + '"]').addClass(this.options.activeClass);
-
- if (this.options.deepLinking) {
- var hash = this.$active[0].getAttribute('href');
- if (window.history.pushState) {
- window.history.pushState(null, null, hash);
- } else {
- window.location.hash = hash;
- }
- }
-
- this.scrollPos = winPos;
- /**
- * Fires when magellan is finished updating to the new active element.
- * @event Magellan#update
- */
- this.$element.trigger('update.zf.magellan', [this.$active]);
- }
-
- /**
- * Destroys an instance of Magellan and resets the url of the window.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.off('.zf.trigger .zf.magellan').find('.' + this.options.activeClass).removeClass(this.options.activeClass);
-
- if (this.options.deepLinking) {
- var hash = this.$active[0].getAttribute('href');
- window.location.hash.replace(hash, '');
- }
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Magellan;
- }();
-
- /**
- * Default settings for plugin
- */
-
-
- Magellan.defaults = {
- /**
- * Amount of time, in ms, the animated scrolling should take between locations.
- * @option
- * @example 500
- */
- animationDuration: 500,
- /**
- * Animation style to use when scrolling between locations.
- * @option
- * @example 'ease-in-out'
- */
- animationEasing: 'linear',
- /**
- * Number of pixels to use as a marker for location changes.
- * @option
- * @example 50
- */
- threshold: 50,
- /**
- * Class applied to the active locations link on the magellan container.
- * @option
- * @example 'active'
- */
- activeClass: 'active',
- /**
- * Allows the script to manipulate the url of the current page, and if supported, alter the history.
- * @option
- * @example true
- */
- deepLinking: false,
- /**
- * Number of pixels to offset the scroll of the page on item click if using a sticky nav bar.
- * @option
- * @example 25
- */
- barOffset: 0
- };
-
- // Window exports
- Foundation.plugin(Magellan, 'Magellan');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * OffCanvas module.
- * @module foundation.offcanvas
- * @requires foundation.util.mediaQuery
- * @requires foundation.util.triggers
- * @requires foundation.util.motion
- */
-
- var OffCanvas = function () {
- /**
- * Creates a new instance of an off-canvas wrapper.
- * @class
- * @fires OffCanvas#init
- * @param {Object} element - jQuery object to initialize.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function OffCanvas(element, options) {
- _classCallCheck(this, OffCanvas);
-
- this.$element = element;
- this.options = $.extend({}, OffCanvas.defaults, this.$element.data(), options);
- this.$lastTrigger = $();
- this.$triggers = $();
-
- this._init();
- this._events();
-
- Foundation.registerPlugin(this, 'OffCanvas');
- Foundation.Keyboard.register('OffCanvas', {
- 'ESCAPE': 'close'
- });
- }
-
- /**
- * Initializes the off-canvas wrapper by adding the exit overlay (if needed).
- * @function
- * @private
- */
-
-
- _createClass(OffCanvas, [{
- key: '_init',
- value: function _init() {
- var id = this.$element.attr('id');
-
- this.$element.attr('aria-hidden', 'true');
-
- // Find triggers that affect this element and add aria-expanded to them
- this.$triggers = $(document).find('[data-open="' + id + '"], [data-close="' + id + '"], [data-toggle="' + id + '"]').attr('aria-expanded', 'false').attr('aria-controls', id);
-
- // Add a close trigger over the body if necessary
- if (this.options.closeOnClick) {
- if ($('.js-off-canvas-exit').length) {
- this.$exiter = $('.js-off-canvas-exit');
- } else {
- var exiter = document.createElement('div');
- exiter.setAttribute('class', 'js-off-canvas-exit');
- $('[data-off-canvas-content]').append(exiter);
-
- this.$exiter = $(exiter);
- }
- }
-
- this.options.isRevealed = this.options.isRevealed || new RegExp(this.options.revealClass, 'g').test(this.$element[0].className);
-
- if (this.options.isRevealed) {
- this.options.revealOn = this.options.revealOn || this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split('-')[2];
- this._setMQChecker();
- }
- if (!this.options.transitionTime) {
- this.options.transitionTime = parseFloat(window.getComputedStyle($('[data-off-canvas-wrapper]')[0]).transitionDuration) * 1000;
- }
- }
-
- /**
- * Adds event handlers to the off-canvas wrapper and the exit overlay.
- * @function
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- this.$element.off('.zf.trigger .zf.offcanvas').on({
- 'open.zf.trigger': this.open.bind(this),
- 'close.zf.trigger': this.close.bind(this),
- 'toggle.zf.trigger': this.toggle.bind(this),
- 'keydown.zf.offcanvas': this._handleKeyboard.bind(this)
- });
-
- if (this.options.closeOnClick && this.$exiter.length) {
- this.$exiter.on({ 'click.zf.offcanvas': this.close.bind(this) });
- }
- }
-
- /**
- * Applies event listener for elements that will reveal at certain breakpoints.
- * @private
- */
-
- }, {
- key: '_setMQChecker',
- value: function _setMQChecker() {
- var _this = this;
-
- $(window).on('changed.zf.mediaquery', function () {
- if (Foundation.MediaQuery.atLeast(_this.options.revealOn)) {
- _this.reveal(true);
- } else {
- _this.reveal(false);
- }
- }).one('load.zf.offcanvas', function () {
- if (Foundation.MediaQuery.atLeast(_this.options.revealOn)) {
- _this.reveal(true);
- }
- });
- }
-
- /**
- * Handles the revealing/hiding the off-canvas at breakpoints, not the same as open.
- * @param {Boolean} isRevealed - true if element should be revealed.
- * @function
- */
-
- }, {
- key: 'reveal',
- value: function reveal(isRevealed) {
- var $closer = this.$element.find('[data-close]');
- if (isRevealed) {
- this.close();
- this.isRevealed = true;
- // if (!this.options.forceTop) {
- // var scrollPos = parseInt(window.pageYOffset);
- // this.$element[0].style.transform = 'translate(0,' + scrollPos + 'px)';
- // }
- // if (this.options.isSticky) { this._stick(); }
- this.$element.off('open.zf.trigger toggle.zf.trigger');
- if ($closer.length) {
- $closer.hide();
- }
- } else {
- this.isRevealed = false;
- // if (this.options.isSticky || !this.options.forceTop) {
- // this.$element[0].style.transform = '';
- // $(window).off('scroll.zf.offcanvas');
- // }
- this.$element.on({
- 'open.zf.trigger': this.open.bind(this),
- 'toggle.zf.trigger': this.toggle.bind(this)
- });
- if ($closer.length) {
- $closer.show();
- }
- }
- }
-
- /**
- * Opens the off-canvas menu.
- * @function
- * @param {Object} event - Event object passed from listener.
- * @param {jQuery} trigger - element that triggered the off-canvas to open.
- * @fires OffCanvas#opened
- */
-
- }, {
- key: 'open',
- value: function open(event, trigger) {
- if (this.$element.hasClass('is-open') || this.isRevealed) {
- return;
- }
- var _this = this,
- $body = $(document.body);
-
- if (this.options.forceTop) {
- $('body').scrollTop(0);
- }
- // window.pageYOffset = 0;
-
- // if (!this.options.forceTop) {
- // var scrollPos = parseInt(window.pageYOffset);
- // this.$element[0].style.transform = 'translate(0,' + scrollPos + 'px)';
- // if (this.$exiter.length) {
- // this.$exiter[0].style.transform = 'translate(0,' + scrollPos + 'px)';
- // }
- // }
- /**
- * Fires when the off-canvas menu opens.
- * @event OffCanvas#opened
- */
-
- var $wrapper = $('[data-off-canvas-wrapper]');
- $wrapper.addClass('is-off-canvas-open is-open-' + _this.options.position);
-
- _this.$element.addClass('is-open');
-
- // if (_this.options.isSticky) {
- // _this._stick();
- // }
-
- this.$triggers.attr('aria-expanded', 'true');
- this.$element.attr('aria-hidden', 'false').trigger('opened.zf.offcanvas');
-
- if (this.options.closeOnClick) {
- this.$exiter.addClass('is-visible');
- }
-
- if (trigger) {
- this.$lastTrigger = trigger;
- }
-
- if (this.options.autoFocus) {
- $wrapper.one(Foundation.transitionend($wrapper), function () {
- if (_this.$element.hasClass('is-open')) {
- // handle double clicks
- _this.$element.attr('tabindex', '-1');
- _this.$element.focus();
- }
- });
- }
-
- if (this.options.trapFocus) {
- $wrapper.one(Foundation.transitionend($wrapper), function () {
- if (_this.$element.hasClass('is-open')) {
- // handle double clicks
- _this.$element.attr('tabindex', '-1');
- _this.trapFocus();
- }
- });
- }
- }
-
- /**
- * Traps focus within the offcanvas on open.
- * @private
- */
-
- }, {
- key: '_trapFocus',
- value: function _trapFocus() {
- var focusable = Foundation.Keyboard.findFocusable(this.$element),
- first = focusable.eq(0),
- last = focusable.eq(-1);
-
- focusable.off('.zf.offcanvas').on('keydown.zf.offcanvas', function (e) {
- var key = Foundation.Keyboard.parseKey(e);
- if (key === 'TAB' && e.target === last[0]) {
- e.preventDefault();
- first.focus();
- }
- if (key === 'SHIFT_TAB' && e.target === first[0]) {
- e.preventDefault();
- last.focus();
- }
- });
- }
-
- /**
- * Allows the offcanvas to appear sticky utilizing translate properties.
- * @private
- */
- // OffCanvas.prototype._stick = function() {
- // var elStyle = this.$element[0].style;
- //
- // if (this.options.closeOnClick) {
- // var exitStyle = this.$exiter[0].style;
- // }
- //
- // $(window).on('scroll.zf.offcanvas', function(e) {
- // console.log(e);
- // var pageY = window.pageYOffset;
- // elStyle.transform = 'translate(0,' + pageY + 'px)';
- // if (exitStyle !== undefined) { exitStyle.transform = 'translate(0,' + pageY + 'px)'; }
- // });
- // // this.$element.trigger('stuck.zf.offcanvas');
- // };
- /**
- * Closes the off-canvas menu.
- * @function
- * @param {Function} cb - optional cb to fire after closure.
- * @fires OffCanvas#closed
- */
-
- }, {
- key: 'close',
- value: function close(cb) {
- if (!this.$element.hasClass('is-open') || this.isRevealed) {
- return;
- }
-
- var _this = this;
-
- // Foundation.Move(this.options.transitionTime, this.$element, function() {
- $('[data-off-canvas-wrapper]').removeClass('is-off-canvas-open is-open-' + _this.options.position);
- _this.$element.removeClass('is-open');
- // Foundation._reflow();
- // });
- this.$element.attr('aria-hidden', 'true')
- /**
- * Fires when the off-canvas menu opens.
- * @event OffCanvas#closed
- */
- .trigger('closed.zf.offcanvas');
- // if (_this.options.isSticky || !_this.options.forceTop) {
- // setTimeout(function() {
- // _this.$element[0].style.transform = '';
- // $(window).off('scroll.zf.offcanvas');
- // }, this.options.transitionTime);
- // }
- if (this.options.closeOnClick) {
- this.$exiter.removeClass('is-visible');
- }
-
- this.$triggers.attr('aria-expanded', 'false');
- if (this.options.trapFocus) {
- $('[data-off-canvas-content]').removeAttr('tabindex');
- }
- }
-
- /**
- * Toggles the off-canvas menu open or closed.
- * @function
- * @param {Object} event - Event object passed from listener.
- * @param {jQuery} trigger - element that triggered the off-canvas to open.
- */
-
- }, {
- key: 'toggle',
- value: function toggle(event, trigger) {
- if (this.$element.hasClass('is-open')) {
- this.close(event, trigger);
- } else {
- this.open(event, trigger);
- }
- }
-
- /**
- * Handles keyboard input when detected. When the escape key is pressed, the off-canvas menu closes, and focus is restored to the element that opened the menu.
- * @function
- * @private
- */
-
- }, {
- key: '_handleKeyboard',
- value: function _handleKeyboard(e) {
- var _this2 = this;
-
- Foundation.Keyboard.handleKey(e, 'OffCanvas', {
- close: function () {
- _this2.close();
- _this2.$lastTrigger.focus();
- return true;
- },
- handled: function () {
- e.stopPropagation();
- e.preventDefault();
- }
- });
- }
-
- /**
- * Destroys the offcanvas plugin.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.close();
- this.$element.off('.zf.trigger .zf.offcanvas');
- this.$exiter.off('.zf.offcanvas');
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return OffCanvas;
- }();
-
- OffCanvas.defaults = {
- /**
- * Allow the user to click outside of the menu to close it.
- * @option
- * @example true
- */
- closeOnClick: true,
-
- /**
- * Amount of time in ms the open and close transition requires. If none selected, pulls from body style.
- * @option
- * @example 500
- */
- transitionTime: 0,
-
- /**
- * Direction the offcanvas opens from. Determines class applied to body.
- * @option
- * @example left
- */
- position: 'left',
-
- /**
- * Force the page to scroll to top on open.
- * @option
- * @example true
- */
- forceTop: true,
-
- /**
- * Allow the offcanvas to remain open for certain breakpoints.
- * @option
- * @example false
- */
- isRevealed: false,
-
- /**
- * Breakpoint at which to reveal. JS will use a RegExp to target standard classes, if changing classnames, pass your class with the `revealClass` option.
- * @option
- * @example reveal-for-large
- */
- revealOn: null,
-
- /**
- * Force focus to the offcanvas on open. If true, will focus the opening trigger on close. Sets tabindex of [data-off-canvas-content] to -1 for accessibility purposes.
- * @option
- * @example true
- */
- autoFocus: true,
-
- /**
- * Class used to force an offcanvas to remain open. Foundation defaults for this are `reveal-for-large` & `reveal-for-medium`.
- * @option
- * TODO improve the regex testing for this.
- * @example reveal-for-large
- */
- revealClass: 'reveal-for-',
-
- /**
- * Triggers optional focus trapping when opening an offcanvas. Sets tabindex of [data-off-canvas-content] to -1 for accessibility purposes.
- * @option
- * @example true
- */
- trapFocus: false
- };
-
- // Window exports
- Foundation.plugin(OffCanvas, 'OffCanvas');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Orbit module.
- * @module foundation.orbit
- * @requires foundation.util.keyboard
- * @requires foundation.util.motion
- * @requires foundation.util.timerAndImageLoader
- * @requires foundation.util.touch
- */
-
- var Orbit = function () {
- /**
- * Creates a new instance of an orbit carousel.
- * @class
- * @param {jQuery} element - jQuery object to make into an Orbit Carousel.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Orbit(element, options) {
- _classCallCheck(this, Orbit);
-
- this.$element = element;
- this.options = $.extend({}, Orbit.defaults, this.$element.data(), options);
-
- this._init();
-
- Foundation.registerPlugin(this, 'Orbit');
- Foundation.Keyboard.register('Orbit', {
- 'ltr': {
- 'ARROW_RIGHT': 'next',
- 'ARROW_LEFT': 'previous'
- },
- 'rtl': {
- 'ARROW_LEFT': 'next',
- 'ARROW_RIGHT': 'previous'
- }
- });
- }
-
- /**
- * Initializes the plugin by creating jQuery collections, setting attributes, and starting the animation.
- * @function
- * @private
- */
-
-
- _createClass(Orbit, [{
- key: '_init',
- value: function _init() {
- this.$wrapper = this.$element.find('.' + this.options.containerClass);
- this.$slides = this.$element.find('.' + this.options.slideClass);
- var $images = this.$element.find('img'),
- initActive = this.$slides.filter('.is-active');
-
- if (!initActive.length) {
- this.$slides.eq(0).addClass('is-active');
- }
-
- if (!this.options.useMUI) {
- this.$slides.addClass('no-motionui');
- }
-
- if ($images.length) {
- Foundation.onImagesLoaded($images, this._prepareForOrbit.bind(this));
- } else {
- this._prepareForOrbit(); //hehe
- }
-
- if (this.options.bullets) {
- this._loadBullets();
- }
-
- this._events();
-
- if (this.options.autoPlay && this.$slides.length > 1) {
- this.geoSync();
- }
-
- if (this.options.accessible) {
- // allow wrapper to be focusable to enable arrow navigation
- this.$wrapper.attr('tabindex', 0);
- }
- }
-
- /**
- * Creates a jQuery collection of bullets, if they are being used.
- * @function
- * @private
- */
-
- }, {
- key: '_loadBullets',
- value: function _loadBullets() {
- this.$bullets = this.$element.find('.' + this.options.boxOfBullets).find('button');
- }
-
- /**
- * Sets a `timer` object on the orbit, and starts the counter for the next slide.
- * @function
- */
-
- }, {
- key: 'geoSync',
- value: function geoSync() {
- var _this = this;
- this.timer = new Foundation.Timer(this.$element, {
- duration: this.options.timerDelay,
- infinite: false
- }, function () {
- _this.changeSlide(true);
- });
- this.timer.start();
- }
-
- /**
- * Sets wrapper and slide heights for the orbit.
- * @function
- * @private
- */
-
- }, {
- key: '_prepareForOrbit',
- value: function _prepareForOrbit() {
- var _this = this;
- this._setWrapperHeight(function (max) {
- _this._setSlideHeight(max);
- });
- }
-
- /**
- * Calulates the height of each slide in the collection, and uses the tallest one for the wrapper height.
- * @function
- * @private
- * @param {Function} cb - a callback function to fire when complete.
- */
-
- }, {
- key: '_setWrapperHeight',
- value: function _setWrapperHeight(cb) {
- //rewrite this to `for` loop
- var max = 0,
- temp,
- counter = 0;
-
- this.$slides.each(function () {
- temp = this.getBoundingClientRect().height;
- $(this).attr('data-slide', counter);
-
- if (counter) {
- //if not the first slide, set css position and display property
- $(this).css({ 'position': 'relative', 'display': 'none' });
- }
- max = temp > max ? temp : max;
- counter++;
- });
-
- if (counter === this.$slides.length) {
- this.$wrapper.css({ 'height': max }); //only change the wrapper height property once.
- cb(max); //fire callback with max height dimension.
- }
- }
-
- /**
- * Sets the max-height of each slide.
- * @function
- * @private
- */
-
- }, {
- key: '_setSlideHeight',
- value: function _setSlideHeight(height) {
- this.$slides.each(function () {
- $(this).css('max-height', height);
- });
- }
-
- /**
- * Adds event listeners to basically everything within the element.
- * @function
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this;
-
- //***************************************
- //**Now using custom event - thanks to:**
- //** Yohai Ararat of Toronto **
- //***************************************
- if (this.$slides.length > 1) {
-
- if (this.options.swipe) {
- this.$slides.off('swipeleft.zf.orbit swiperight.zf.orbit').on('swipeleft.zf.orbit', function (e) {
- e.preventDefault();
- _this.changeSlide(true);
- }).on('swiperight.zf.orbit', function (e) {
- e.preventDefault();
- _this.changeSlide(false);
- });
- }
- //***************************************
-
- if (this.options.autoPlay) {
- this.$slides.on('click.zf.orbit', function () {
- _this.$element.data('clickedOn', _this.$element.data('clickedOn') ? false : true);
- _this.timer[_this.$element.data('clickedOn') ? 'pause' : 'start']();
- });
-
- if (this.options.pauseOnHover) {
- this.$element.on('mouseenter.zf.orbit', function () {
- _this.timer.pause();
- }).on('mouseleave.zf.orbit', function () {
- if (!_this.$element.data('clickedOn')) {
- _this.timer.start();
- }
- });
- }
- }
-
- if (this.options.navButtons) {
- var $controls = this.$element.find('.' + this.options.nextClass + ', .' + this.options.prevClass);
- $controls.attr('tabindex', 0)
- //also need to handle enter/return and spacebar key presses
- .on('click.zf.orbit touchend.zf.orbit', function (e) {
- e.preventDefault();
- _this.changeSlide($(this).hasClass(_this.options.nextClass));
- });
- }
-
- if (this.options.bullets) {
- this.$bullets.on('click.zf.orbit touchend.zf.orbit', function () {
- if (/is-active/g.test(this.className)) {
- return false;
- } //if this is active, kick out of function.
- var idx = $(this).data('slide'),
- ltr = idx > _this.$slides.filter('.is-active').data('slide'),
- $slide = _this.$slides.eq(idx);
-
- _this.changeSlide(ltr, $slide, idx);
- });
- }
-
- if (this.options.accessible) {
- this.$wrapper.add(this.$bullets).on('keydown.zf.orbit', function (e) {
- // handle keyboard event with keyboard util
- Foundation.Keyboard.handleKey(e, 'Orbit', {
- next: function () {
- _this.changeSlide(true);
- },
- previous: function () {
- _this.changeSlide(false);
- },
- handled: function () {
- // if bullet is focused, make sure focus moves
- if ($(e.target).is(_this.$bullets)) {
- _this.$bullets.filter('.is-active').focus();
- }
- }
- });
- });
- }
- }
- }
-
- /**
- * Changes the current slide to a new one.
- * @function
- * @param {Boolean} isLTR - flag if the slide should move left to right.
- * @param {jQuery} chosenSlide - the jQuery element of the slide to show next, if one is selected.
- * @param {Number} idx - the index of the new slide in its collection, if one chosen.
- * @fires Orbit#slidechange
- */
-
- }, {
- key: 'changeSlide',
- value: function changeSlide(isLTR, chosenSlide, idx) {
- var $curSlide = this.$slides.filter('.is-active').eq(0);
-
- if (/mui/g.test($curSlide[0].className)) {
- return false;
- } //if the slide is currently animating, kick out of the function
-
- var $firstSlide = this.$slides.first(),
- $lastSlide = this.$slides.last(),
- dirIn = isLTR ? 'Right' : 'Left',
- dirOut = isLTR ? 'Left' : 'Right',
- _this = this,
- $newSlide;
-
- if (!chosenSlide) {
- //most of the time, this will be auto played or clicked from the navButtons.
- $newSlide = isLTR ? //if wrapping enabled, check to see if there is a `next` or `prev` sibling, if not, select the first or last slide to fill in. if wrapping not enabled, attempt to select `next` or `prev`, if there's nothing there, the function will kick out on next step. CRAZY NESTED TERNARIES!!!!!
- this.options.infiniteWrap ? $curSlide.next('.' + this.options.slideClass).length ? $curSlide.next('.' + this.options.slideClass) : $firstSlide : $curSlide.next('.' + this.options.slideClass) : //pick next slide if moving left to right
- this.options.infiniteWrap ? $curSlide.prev('.' + this.options.slideClass).length ? $curSlide.prev('.' + this.options.slideClass) : $lastSlide : $curSlide.prev('.' + this.options.slideClass); //pick prev slide if moving right to left
- } else {
- $newSlide = chosenSlide;
- }
-
- if ($newSlide.length) {
- /**
- * Triggers before the next slide starts animating in and only if a next slide has been found.
- * @event Orbit#beforeslidechange
- */
- this.$element.trigger('beforeslidechange.zf.orbit', [$curSlide, $newSlide]);
-
- if (this.options.bullets) {
- idx = idx || this.$slides.index($newSlide); //grab index to update bullets
- this._updateBullets(idx);
- }
-
- if (this.options.useMUI) {
- Foundation.Motion.animateIn($newSlide.addClass('is-active').css({ 'position': 'absolute', 'top': 0 }), this.options['animInFrom' + dirIn], function () {
- $newSlide.css({ 'position': 'relative', 'display': 'block' }).attr('aria-live', 'polite');
- });
-
- Foundation.Motion.animateOut($curSlide.removeClass('is-active'), this.options['animOutTo' + dirOut], function () {
- $curSlide.removeAttr('aria-live');
- if (_this.options.autoPlay && !_this.timer.isPaused) {
- _this.timer.restart();
- }
- //do stuff?
- });
- } else {
- $curSlide.removeClass('is-active is-in').removeAttr('aria-live').hide();
- $newSlide.addClass('is-active is-in').attr('aria-live', 'polite').show();
- if (this.options.autoPlay && !this.timer.isPaused) {
- this.timer.restart();
- }
- }
- /**
- * Triggers when the slide has finished animating in.
- * @event Orbit#slidechange
- */
- this.$element.trigger('slidechange.zf.orbit', [$newSlide]);
- }
- }
-
- /**
- * Updates the active state of the bullets, if displayed.
- * @function
- * @private
- * @param {Number} idx - the index of the current slide.
- */
-
- }, {
- key: '_updateBullets',
- value: function _updateBullets(idx) {
- var $oldBullet = this.$element.find('.' + this.options.boxOfBullets).find('.is-active').removeClass('is-active').blur(),
- span = $oldBullet.find('span:last').detach(),
- $newBullet = this.$bullets.eq(idx).addClass('is-active').append(span);
- }
-
- /**
- * Destroys the carousel and hides the element.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.off('.zf.orbit').find('*').off('.zf.orbit').end().hide();
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Orbit;
- }();
-
- Orbit.defaults = {
- /**
- * Tells the JS to look for and loadBullets.
- * @option
- * @example true
- */
- bullets: true,
- /**
- * Tells the JS to apply event listeners to nav buttons
- * @option
- * @example true
- */
- navButtons: true,
- /**
- * motion-ui animation class to apply
- * @option
- * @example 'slide-in-right'
- */
- animInFromRight: 'slide-in-right',
- /**
- * motion-ui animation class to apply
- * @option
- * @example 'slide-out-right'
- */
- animOutToRight: 'slide-out-right',
- /**
- * motion-ui animation class to apply
- * @option
- * @example 'slide-in-left'
- *
- */
- animInFromLeft: 'slide-in-left',
- /**
- * motion-ui animation class to apply
- * @option
- * @example 'slide-out-left'
- */
- animOutToLeft: 'slide-out-left',
- /**
- * Allows Orbit to automatically animate on page load.
- * @option
- * @example true
- */
- autoPlay: true,
- /**
- * Amount of time, in ms, between slide transitions
- * @option
- * @example 5000
- */
- timerDelay: 5000,
- /**
- * Allows Orbit to infinitely loop through the slides
- * @option
- * @example true
- */
- infiniteWrap: true,
- /**
- * Allows the Orbit slides to bind to swipe events for mobile, requires an additional util library
- * @option
- * @example true
- */
- swipe: true,
- /**
- * Allows the timing function to pause animation on hover.
- * @option
- * @example true
- */
- pauseOnHover: true,
- /**
- * Allows Orbit to bind keyboard events to the slider, to animate frames with arrow keys
- * @option
- * @example true
- */
- accessible: true,
- /**
- * Class applied to the container of Orbit
- * @option
- * @example 'orbit-container'
- */
- containerClass: 'orbit-container',
- /**
- * Class applied to individual slides.
- * @option
- * @example 'orbit-slide'
- */
- slideClass: 'orbit-slide',
- /**
- * Class applied to the bullet container. You're welcome.
- * @option
- * @example 'orbit-bullets'
- */
- boxOfBullets: 'orbit-bullets',
- /**
- * Class applied to the `next` navigation button.
- * @option
- * @example 'orbit-next'
- */
- nextClass: 'orbit-next',
- /**
- * Class applied to the `previous` navigation button.
- * @option
- * @example 'orbit-previous'
- */
- prevClass: 'orbit-previous',
- /**
- * Boolean to flag the js to use motion ui classes or not. Default to true for backwards compatability.
- * @option
- * @example true
- */
- useMUI: true
- };
-
- // Window exports
- Foundation.plugin(Orbit, 'Orbit');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * ResponsiveMenu module.
- * @module foundation.responsiveMenu
- * @requires foundation.util.triggers
- * @requires foundation.util.mediaQuery
- * @requires foundation.util.accordionMenu
- * @requires foundation.util.drilldown
- * @requires foundation.util.dropdown-menu
- */
-
- var ResponsiveMenu = function () {
- /**
- * Creates a new instance of a responsive menu.
- * @class
- * @fires ResponsiveMenu#init
- * @param {jQuery} element - jQuery object to make into a dropdown menu.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function ResponsiveMenu(element, options) {
- _classCallCheck(this, ResponsiveMenu);
-
- this.$element = $(element);
- this.rules = this.$element.data('responsive-menu');
- this.currentMq = null;
- this.currentPlugin = null;
-
- this._init();
- this._events();
-
- Foundation.registerPlugin(this, 'ResponsiveMenu');
- }
-
- /**
- * Initializes the Menu by parsing the classes from the 'data-ResponsiveMenu' attribute on the element.
- * @function
- * @private
- */
-
-
- _createClass(ResponsiveMenu, [{
- key: '_init',
- value: function _init() {
- // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules
- if (typeof this.rules === 'string') {
- var rulesTree = {};
-
- // Parse rules from "classes" pulled from data attribute
- var rules = this.rules.split(' ');
-
- // Iterate through every rule found
- for (var i = 0; i < rules.length; i++) {
- var rule = rules[i].split('-');
- var ruleSize = rule.length > 1 ? rule[0] : 'small';
- var rulePlugin = rule.length > 1 ? rule[1] : rule[0];
-
- if (MenuPlugins[rulePlugin] !== null) {
- rulesTree[ruleSize] = MenuPlugins[rulePlugin];
- }
- }
-
- this.rules = rulesTree;
- }
-
- if (!$.isEmptyObject(this.rules)) {
- this._checkMediaQueries();
- }
- }
-
- /**
- * Initializes events for the Menu.
- * @function
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this;
-
- $(window).on('changed.zf.mediaquery', function () {
- _this._checkMediaQueries();
- });
- // $(window).on('resize.zf.ResponsiveMenu', function() {
- // _this._checkMediaQueries();
- // });
- }
-
- /**
- * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out.
- * @function
- * @private
- */
-
- }, {
- key: '_checkMediaQueries',
- value: function _checkMediaQueries() {
- var matchedMq,
- _this = this;
- // Iterate through each rule and find the last matching rule
- $.each(this.rules, function (key) {
- if (Foundation.MediaQuery.atLeast(key)) {
- matchedMq = key;
- }
- });
-
- // No match? No dice
- if (!matchedMq) return;
-
- // Plugin already initialized? We good
- if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return;
-
- // Remove existing plugin-specific CSS classes
- $.each(MenuPlugins, function (key, value) {
- _this.$element.removeClass(value.cssClass);
- });
-
- // Add the CSS class for the new plugin
- this.$element.addClass(this.rules[matchedMq].cssClass);
-
- // Create an instance of the new plugin
- if (this.currentPlugin) this.currentPlugin.destroy();
- this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {});
- }
-
- /**
- * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.currentPlugin.destroy();
- $(window).off('.zf.ResponsiveMenu');
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return ResponsiveMenu;
- }();
-
- ResponsiveMenu.defaults = {};
-
- // The plugin matches the plugin classes with these plugin instances.
- var MenuPlugins = {
- dropdown: {
- cssClass: 'dropdown',
- plugin: Foundation._plugins['dropdown-menu'] || null
- },
- drilldown: {
- cssClass: 'drilldown',
- plugin: Foundation._plugins['drilldown'] || null
- },
- accordion: {
- cssClass: 'accordion-menu',
- plugin: Foundation._plugins['accordion-menu'] || null
- }
- };
-
- // Window exports
- Foundation.plugin(ResponsiveMenu, 'ResponsiveMenu');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * ResponsiveToggle module.
- * @module foundation.responsiveToggle
- * @requires foundation.util.mediaQuery
- */
-
- var ResponsiveToggle = function () {
- /**
- * Creates a new instance of Tab Bar.
- * @class
- * @fires ResponsiveToggle#init
- * @param {jQuery} element - jQuery object to attach tab bar functionality to.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function ResponsiveToggle(element, options) {
- _classCallCheck(this, ResponsiveToggle);
-
- this.$element = $(element);
- this.options = $.extend({}, ResponsiveToggle.defaults, this.$element.data(), options);
-
- this._init();
- this._events();
-
- Foundation.registerPlugin(this, 'ResponsiveToggle');
- }
-
- /**
- * Initializes the tab bar by finding the target element, toggling element, and running update().
- * @function
- * @private
- */
-
-
- _createClass(ResponsiveToggle, [{
- key: '_init',
- value: function _init() {
- var targetID = this.$element.data('responsive-toggle');
- if (!targetID) {
- console.error('Your tab bar needs an ID of a Menu as the value of data-tab-bar.');
- }
-
- this.$targetMenu = $('#' + targetID);
- this.$toggler = this.$element.find('[data-toggle]');
-
- this._update();
- }
-
- /**
- * Adds necessary event handlers for the tab bar to work.
- * @function
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this;
-
- this._updateMqHandler = this._update.bind(this);
-
- $(window).on('changed.zf.mediaquery', this._updateMqHandler);
-
- this.$toggler.on('click.zf.responsiveToggle', this.toggleMenu.bind(this));
- }
-
- /**
- * Checks the current media query to determine if the tab bar should be visible or hidden.
- * @function
- * @private
- */
-
- }, {
- key: '_update',
- value: function _update() {
- // Mobile
- if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) {
- this.$element.show();
- this.$targetMenu.hide();
- }
-
- // Desktop
- else {
- this.$element.hide();
- this.$targetMenu.show();
- }
- }
-
- /**
- * Toggles the element attached to the tab bar. The toggle only happens if the screen is small enough to allow it.
- * @function
- * @fires ResponsiveToggle#toggled
- */
-
- }, {
- key: 'toggleMenu',
- value: function toggleMenu() {
- if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) {
- this.$targetMenu.toggle(0);
-
- /**
- * Fires when the element attached to the tab bar toggles.
- * @event ResponsiveToggle#toggled
- */
- this.$element.trigger('toggled.zf.responsiveToggle');
- }
- }
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.off('.zf.responsiveToggle');
- this.$toggler.off('.zf.responsiveToggle');
-
- $(window).off('changed.zf.mediaquery', this._updateMqHandler);
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return ResponsiveToggle;
- }();
-
- ResponsiveToggle.defaults = {
- /**
- * The breakpoint after which the menu is always shown, and the tab bar is hidden.
- * @option
- * @example 'medium'
- */
- hideFor: 'medium'
- };
-
- // Window exports
- Foundation.plugin(ResponsiveToggle, 'ResponsiveToggle');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Reveal module.
- * @module foundation.reveal
- * @requires foundation.util.keyboard
- * @requires foundation.util.box
- * @requires foundation.util.triggers
- * @requires foundation.util.mediaQuery
- * @requires foundation.util.motion if using animations
- */
-
- var Reveal = function () {
- /**
- * Creates a new instance of Reveal.
- * @class
- * @param {jQuery} element - jQuery object to use for the modal.
- * @param {Object} options - optional parameters.
- */
-
- function Reveal(element, options) {
- _classCallCheck(this, Reveal);
-
- this.$element = element;
- this.options = $.extend({}, Reveal.defaults, this.$element.data(), options);
- this._init();
-
- Foundation.registerPlugin(this, 'Reveal');
- Foundation.Keyboard.register('Reveal', {
- 'ENTER': 'open',
- 'SPACE': 'open',
- 'ESCAPE': 'close',
- 'TAB': 'tab_forward',
- 'SHIFT_TAB': 'tab_backward'
- });
- }
-
- /**
- * Initializes the modal by adding the overlay and close buttons, (if selected).
- * @private
- */
-
-
- _createClass(Reveal, [{
- key: '_init',
- value: function _init() {
- this.id = this.$element.attr('id');
- this.isActive = false;
- this.cached = { mq: Foundation.MediaQuery.current };
- this.isMobile = mobileSniff();
-
- this.$anchor = $('[data-open="' + this.id + '"]').length ? $('[data-open="' + this.id + '"]') : $('[data-toggle="' + this.id + '"]');
- this.$anchor.attr({
- 'aria-controls': this.id,
- 'aria-haspopup': true,
- 'tabindex': 0
- });
-
- if (this.options.fullScreen || this.$element.hasClass('full')) {
- this.options.fullScreen = true;
- this.options.overlay = false;
- }
- if (this.options.overlay && !this.$overlay) {
- this.$overlay = this._makeOverlay(this.id);
- }
-
- this.$element.attr({
- 'role': 'dialog',
- 'aria-hidden': true,
- 'data-yeti-box': this.id,
- 'data-resize': this.id
- });
-
- if (this.$overlay) {
- this.$element.detach().appendTo(this.$overlay);
- } else {
- this.$element.detach().appendTo($('body'));
- this.$element.addClass('without-overlay');
- }
- this._events();
- if (this.options.deepLink && window.location.hash === '#' + this.id) {
- $(window).one('load.zf.reveal', this.open.bind(this));
- }
- }
-
- /**
- * Creates an overlay div to display behind the modal.
- * @private
- */
-
- }, {
- key: '_makeOverlay',
- value: function _makeOverlay(id) {
- var $overlay = $('<div></div>').addClass('reveal-overlay').appendTo('body');
- return $overlay;
- }
-
- /**
- * Updates position of modal
- * TODO: Figure out if we actually need to cache these values or if it doesn't matter
- * @private
- */
-
- }, {
- key: '_updatePosition',
- value: function _updatePosition() {
- var width = this.$element.outerWidth();
- var outerWidth = $(window).width();
- var height = this.$element.outerHeight();
- var outerHeight = $(window).height();
- var left, top;
- if (this.options.hOffset === 'auto') {
- left = parseInt((outerWidth - width) / 2, 10);
- } else {
- left = parseInt(this.options.hOffset, 10);
- }
- if (this.options.vOffset === 'auto') {
- if (height > outerHeight) {
- top = parseInt(Math.min(100, outerHeight / 10), 10);
- } else {
- top = parseInt((outerHeight - height) / 4, 10);
- }
- } else {
- top = parseInt(this.options.vOffset, 10);
- }
- this.$element.css({ top: top + 'px' });
- // only worry about left if we don't have an overlay or we havea horizontal offset,
- // otherwise we're perfectly in the middle
- if (!this.$overlay || this.options.hOffset !== 'auto') {
- this.$element.css({ left: left + 'px' });
- this.$element.css({ margin: '0px' });
- }
- }
-
- /**
- * Adds event handlers for the modal.
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this2 = this;
-
- var _this = this;
-
- this.$element.on({
- 'open.zf.trigger': this.open.bind(this),
- 'close.zf.trigger': function (event, $element) {
- if (event.target === _this.$element[0] || $(event.target).parents('[data-closable]')[0] === $element) {
- // only close reveal when it's explicitly called
- return _this2.close.apply(_this2);
- }
- },
- 'toggle.zf.trigger': this.toggle.bind(this),
- 'resizeme.zf.trigger': function () {
- _this._updatePosition();
- }
- });
-
- if (this.$anchor.length) {
- this.$anchor.on('keydown.zf.reveal', function (e) {
- if (e.which === 13 || e.which === 32) {
- e.stopPropagation();
- e.preventDefault();
- _this.open();
- }
- });
- }
-
- if (this.options.closeOnClick && this.options.overlay) {
- this.$overlay.off('.zf.reveal').on('click.zf.reveal', function (e) {
- if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target) || !$.contains(document, e.target)) {
- return;
- }
- _this.close();
- });
- }
- if (this.options.deepLink) {
- $(window).on('popstate.zf.reveal:' + this.id, this._handleState.bind(this));
- }
- }
-
- /**
- * Handles modal methods on back/forward button clicks or any other event that triggers popstate.
- * @private
- */
-
- }, {
- key: '_handleState',
- value: function _handleState(e) {
- if (window.location.hash === '#' + this.id && !this.isActive) {
- this.open();
- } else {
- this.close();
- }
- }
-
- /**
- * Opens the modal controlled by `this.$anchor`, and closes all others by default.
- * @function
- * @fires Reveal#closeme
- * @fires Reveal#open
- */
-
- }, {
- key: 'open',
- value: function open() {
- var _this3 = this;
-
- if (this.options.deepLink) {
- var hash = '#' + this.id;
-
- if (window.history.pushState) {
- window.history.pushState(null, null, hash);
- } else {
- window.location.hash = hash;
- }
- }
-
- this.isActive = true;
-
- // Make elements invisible, but remove display: none so we can get size and positioning
- this.$element.css({ 'visibility': 'hidden' }).show().scrollTop(0);
- if (this.options.overlay) {
- this.$overlay.css({ 'visibility': 'hidden' }).show();
- }
-
- this._updatePosition();
-
- this.$element.hide().css({ 'visibility': '' });
-
- if (this.$overlay) {
- this.$overlay.css({ 'visibility': '' }).hide();
- if (this.$element.hasClass('fast')) {
- this.$overlay.addClass('fast');
- } else if (this.$element.hasClass('slow')) {
- this.$overlay.addClass('slow');
- }
- }
-
- if (!this.options.multipleOpened) {
- /**
- * Fires immediately before the modal opens.
- * Closes any other modals that are currently open
- * @event Reveal#closeme
- */
- this.$element.trigger('closeme.zf.reveal', this.id);
- }
- // Motion UI method of reveal
- if (this.options.animationIn) {
- var _this;
-
- (function () {
- var afterAnimationFocus = function () {
- _this.$element.attr({
- 'aria-hidden': false,
- 'tabindex': -1
- }).focus();
- };
-
- _this = _this3;
-
- if (_this3.options.overlay) {
- Foundation.Motion.animateIn(_this3.$overlay, 'fade-in');
- }
- Foundation.Motion.animateIn(_this3.$element, _this3.options.animationIn, function () {
- _this3.focusableElements = Foundation.Keyboard.findFocusable(_this3.$element);
- afterAnimationFocus();
- });
- })();
- }
- // jQuery method of reveal
- else {
- if (this.options.overlay) {
- this.$overlay.show(0);
- }
- this.$element.show(this.options.showDelay);
- }
-
- // handle accessibility
- this.$element.attr({
- 'aria-hidden': false,
- 'tabindex': -1
- }).focus();
-
- /**
- * Fires when the modal has successfully opened.
- * @event Reveal#open
- */
- this.$element.trigger('open.zf.reveal');
-
- if (this.isMobile) {
- this.originalScrollPos = window.pageYOffset;
- $('html, body').addClass('is-reveal-open');
- } else {
- $('body').addClass('is-reveal-open');
- }
-
- setTimeout(function () {
- _this3._extraHandlers();
- }, 0);
- }
-
- /**
- * Adds extra event handlers for the body and window if necessary.
- * @private
- */
-
- }, {
- key: '_extraHandlers',
- value: function _extraHandlers() {
- var _this = this;
- this.focusableElements = Foundation.Keyboard.findFocusable(this.$element);
-
- if (!this.options.overlay && this.options.closeOnClick && !this.options.fullScreen) {
- $('body').on('click.zf.reveal', function (e) {
- if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target) || !$.contains(document, e.target)) {
- return;
- }
- _this.close();
- });
- }
-
- if (this.options.closeOnEsc) {
- $(window).on('keydown.zf.reveal', function (e) {
- Foundation.Keyboard.handleKey(e, 'Reveal', {
- close: function () {
- if (_this.options.closeOnEsc) {
- _this.close();
- _this.$anchor.focus();
- }
- }
- });
- });
- }
-
- // lock focus within modal while tabbing
- this.$element.on('keydown.zf.reveal', function (e) {
- var $target = $(this);
- // handle keyboard event with keyboard util
- Foundation.Keyboard.handleKey(e, 'Reveal', {
- tab_forward: function () {
- _this.focusableElements = Foundation.Keyboard.findFocusable(_this.$element);
- if (_this.$element.find(':focus').is(_this.focusableElements.eq(-1))) {
- // left modal downwards, setting focus to first element
- _this.focusableElements.eq(0).focus();
- return true;
- }
- if (_this.focusableElements.length === 0) {
- // no focusable elements inside the modal at all, prevent tabbing in general
- return true;
- }
- },
- tab_backward: function () {
- _this.focusableElements = Foundation.Keyboard.findFocusable(_this.$element);
- if (_this.$element.find(':focus').is(_this.focusableElements.eq(0)) || _this.$element.is(':focus')) {
- // left modal upwards, setting focus to last element
- _this.focusableElements.eq(-1).focus();
- return true;
- }
- if (_this.focusableElements.length === 0) {
- // no focusable elements inside the modal at all, prevent tabbing in general
- return true;
- }
- },
- open: function () {
- if (_this.$element.find(':focus').is(_this.$element.find('[data-close]'))) {
- setTimeout(function () {
- // set focus back to anchor if close button has been activated
- _this.$anchor.focus();
- }, 1);
- } else if ($target.is(_this.focusableElements)) {
- // dont't trigger if acual element has focus (i.e. inputs, links, ...)
- _this.open();
- }
- },
- close: function () {
- if (_this.options.closeOnEsc) {
- _this.close();
- _this.$anchor.focus();
- }
- },
- handled: function (preventDefault) {
- if (preventDefault) {
- e.preventDefault();
- }
- }
- });
- });
- }
-
- /**
- * Closes the modal.
- * @function
- * @fires Reveal#closed
- */
-
- }, {
- key: 'close',
- value: function close() {
- if (!this.isActive || !this.$element.is(':visible')) {
- return false;
- }
- var _this = this;
-
- // Motion UI method of hiding
- if (this.options.animationOut) {
- if (this.options.overlay) {
- Foundation.Motion.animateOut(this.$overlay, 'fade-out', finishUp);
- } else {
- finishUp();
- }
-
- Foundation.Motion.animateOut(this.$element, this.options.animationOut);
- }
- // jQuery method of hiding
- else {
- if (this.options.overlay) {
- this.$overlay.hide(0, finishUp);
- } else {
- finishUp();
- }
-
- this.$element.hide(this.options.hideDelay);
- }
-
- // Conditionals to remove extra event listeners added on open
- if (this.options.closeOnEsc) {
- $(window).off('keydown.zf.reveal');
- }
-
- if (!this.options.overlay && this.options.closeOnClick) {
- $('body').off('click.zf.reveal');
- }
-
- this.$element.off('keydown.zf.reveal');
-
- function finishUp() {
- if (_this.isMobile) {
- $('html, body').removeClass('is-reveal-open');
- if (_this.originalScrollPos) {
- $('body').scrollTop(_this.originalScrollPos);
- _this.originalScrollPos = null;
- }
- } else {
- $('body').removeClass('is-reveal-open');
- }
-
- _this.$element.attr('aria-hidden', true);
-
- /**
- * Fires when the modal is done closing.
- * @event Reveal#closed
- */
- _this.$element.trigger('closed.zf.reveal');
- }
-
- /**
- * Resets the modal content
- * This prevents a running video to keep going in the background
- */
- if (this.options.resetOnClose) {
- this.$element.html(this.$element.html());
- }
-
- this.isActive = false;
- if (_this.options.deepLink) {
- if (window.history.replaceState) {
- window.history.replaceState("", document.title, window.location.pathname);
- } else {
- window.location.hash = '';
- }
- }
- }
-
- /**
- * Toggles the open/closed state of a modal.
- * @function
- */
-
- }, {
- key: 'toggle',
- value: function toggle() {
- if (this.isActive) {
- this.close();
- } else {
- this.open();
- }
- }
- }, {
- key: 'destroy',
-
-
- /**
- * Destroys an instance of a modal.
- * @function
- */
- value: function destroy() {
- if (this.options.overlay) {
- this.$element.appendTo($('body')); // move $element outside of $overlay to prevent error unregisterPlugin()
- this.$overlay.hide().off().remove();
- }
- this.$element.hide().off();
- this.$anchor.off('.zf');
- $(window).off('.zf.reveal:' + this.id);
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Reveal;
- }();
-
- Reveal.defaults = {
- /**
- * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide.
- * @option
- * @example 'slide-in-left'
- */
- animationIn: '',
- /**
- * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide.
- * @option
- * @example 'slide-out-right'
- */
- animationOut: '',
- /**
- * Time, in ms, to delay the opening of a modal after a click if no animation used.
- * @option
- * @example 10
- */
- showDelay: 0,
- /**
- * Time, in ms, to delay the closing of a modal after a click if no animation used.
- * @option
- * @example 10
- */
- hideDelay: 0,
- /**
- * Allows a click on the body/overlay to close the modal.
- * @option
- * @example true
- */
- closeOnClick: true,
- /**
- * Allows the modal to close if the user presses the `ESCAPE` key.
- * @option
- * @example true
- */
- closeOnEsc: true,
- /**
- * If true, allows multiple modals to be displayed at once.
- * @option
- * @example false
- */
- multipleOpened: false,
- /**
- * Distance, in pixels, the modal should push down from the top of the screen.
- * @option
- * @example auto
- */
- vOffset: 'auto',
- /**
- * Distance, in pixels, the modal should push in from the side of the screen.
- * @option
- * @example auto
- */
- hOffset: 'auto',
- /**
- * Allows the modal to be fullscreen, completely blocking out the rest of the view. JS checks for this as well.
- * @option
- * @example false
- */
- fullScreen: false,
- /**
- * Percentage of screen height the modal should push up from the bottom of the view.
- * @option
- * @example 10
- */
- btmOffsetPct: 10,
- /**
- * Allows the modal to generate an overlay div, which will cover the view when modal opens.
- * @option
- * @example true
- */
- overlay: true,
- /**
- * Allows the modal to remove and reinject markup on close. Should be true if using video elements w/o using provider's api, otherwise, videos will continue to play in the background.
- * @option
- * @example false
- */
- resetOnClose: false,
- /**
- * Allows the modal to alter the url on open/close, and allows the use of the `back` button to close modals. ALSO, allows a modal to auto-maniacally open on page load IF the hash === the modal's user-set id.
- * @option
- * @example false
- */
- deepLink: false
- };
-
- // Window exports
- Foundation.plugin(Reveal, 'Reveal');
-
- function iPhoneSniff() {
- return (/iP(ad|hone|od).*OS/.test(window.navigator.userAgent)
- );
- }
-
- function androidSniff() {
- return (/Android/.test(window.navigator.userAgent)
- );
- }
-
- function mobileSniff() {
- return iPhoneSniff() || androidSniff();
- }
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Slider module.
- * @module foundation.slider
- * @requires foundation.util.motion
- * @requires foundation.util.triggers
- * @requires foundation.util.keyboard
- * @requires foundation.util.touch
- */
-
- var Slider = function () {
- /**
- * Creates a new instance of a drilldown menu.
- * @class
- * @param {jQuery} element - jQuery object to make into an accordion menu.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Slider(element, options) {
- _classCallCheck(this, Slider);
-
- this.$element = element;
- this.options = $.extend({}, Slider.defaults, this.$element.data(), options);
-
- this._init();
-
- Foundation.registerPlugin(this, 'Slider');
- Foundation.Keyboard.register('Slider', {
- 'ltr': {
- 'ARROW_RIGHT': 'increase',
- 'ARROW_UP': 'increase',
- 'ARROW_DOWN': 'decrease',
- 'ARROW_LEFT': 'decrease',
- 'SHIFT_ARROW_RIGHT': 'increase_fast',
- 'SHIFT_ARROW_UP': 'increase_fast',
- 'SHIFT_ARROW_DOWN': 'decrease_fast',
- 'SHIFT_ARROW_LEFT': 'decrease_fast'
- },
- 'rtl': {
- 'ARROW_LEFT': 'increase',
- 'ARROW_RIGHT': 'decrease',
- 'SHIFT_ARROW_LEFT': 'increase_fast',
- 'SHIFT_ARROW_RIGHT': 'decrease_fast'
- }
- });
- }
-
- /**
- * Initilizes the plugin by reading/setting attributes, creating collections and setting the initial position of the handle(s).
- * @function
- * @private
- */
-
-
- _createClass(Slider, [{
- key: '_init',
- value: function _init() {
- this.inputs = this.$element.find('input');
- this.handles = this.$element.find('[data-slider-handle]');
-
- this.$handle = this.handles.eq(0);
- this.$input = this.inputs.length ? this.inputs.eq(0) : $('#' + this.$handle.attr('aria-controls'));
- this.$fill = this.$element.find('[data-slider-fill]').css(this.options.vertical ? 'height' : 'width', 0);
-
- var isDbl = false,
- _this = this;
- if (this.options.disabled || this.$element.hasClass(this.options.disabledClass)) {
- this.options.disabled = true;
- this.$element.addClass(this.options.disabledClass);
- }
- if (!this.inputs.length) {
- this.inputs = $().add(this.$input);
- this.options.binding = true;
- }
- this._setInitAttr(0);
- this._events(this.$handle);
-
- if (this.handles[1]) {
- this.options.doubleSided = true;
- this.$handle2 = this.handles.eq(1);
- this.$input2 = this.inputs.length > 1 ? this.inputs.eq(1) : $('#' + this.$handle2.attr('aria-controls'));
-
- if (!this.inputs[1]) {
- this.inputs = this.inputs.add(this.$input2);
- }
- isDbl = true;
-
- this._setHandlePos(this.$handle, this.options.initialStart, true, function () {
-
- _this._setHandlePos(_this.$handle2, _this.options.initialEnd, true);
- });
- // this.$handle.triggerHandler('click.zf.slider');
- this._setInitAttr(1);
- this._events(this.$handle2);
- }
-
- if (!isDbl) {
- this._setHandlePos(this.$handle, this.options.initialStart, true);
- }
- }
-
- /**
- * Sets the position of the selected handle and fill bar.
- * @function
- * @private
- * @param {jQuery} $hndl - the selected handle to move.
- * @param {Number} location - floating point between the start and end values of the slider bar.
- * @param {Function} cb - callback function to fire on completion.
- * @fires Slider#moved
- * @fires Slider#changed
- */
-
- }, {
- key: '_setHandlePos',
- value: function _setHandlePos($hndl, location, noInvert, cb) {
- // don't move if the slider has been disabled since its initialization
- if (this.$element.hasClass(this.options.disabledClass)) {
- return;
- }
- //might need to alter that slightly for bars that will have odd number selections.
- location = parseFloat(location); //on input change events, convert string to number...grumble.
-
- // prevent slider from running out of bounds, if value exceeds the limits set through options, override the value to min/max
- if (location < this.options.start) {
- location = this.options.start;
- } else if (location > this.options.end) {
- location = this.options.end;
- }
-
- var isDbl = this.options.doubleSided;
-
- if (isDbl) {
- //this block is to prevent 2 handles from crossing eachother. Could/should be improved.
- if (this.handles.index($hndl) === 0) {
- var h2Val = parseFloat(this.$handle2.attr('aria-valuenow'));
- location = location >= h2Val ? h2Val - this.options.step : location;
- } else {
- var h1Val = parseFloat(this.$handle.attr('aria-valuenow'));
- location = location <= h1Val ? h1Val + this.options.step : location;
- }
- }
-
- //this is for single-handled vertical sliders, it adjusts the value to account for the slider being "upside-down"
- //for click and drag events, it's weird due to the scale(-1, 1) css property
- if (this.options.vertical && !noInvert) {
- location = this.options.end - location;
- }
-
- var _this = this,
- vert = this.options.vertical,
- hOrW = vert ? 'height' : 'width',
- lOrT = vert ? 'top' : 'left',
- handleDim = $hndl[0].getBoundingClientRect()[hOrW],
- elemDim = this.$element[0].getBoundingClientRect()[hOrW],
-
- //percentage of bar min/max value based on click or drag point
- pctOfBar = percent(location - this.options.start, this.options.end - this.options.start).toFixed(2),
-
- //number of actual pixels to shift the handle, based on the percentage obtained above
- pxToMove = (elemDim - handleDim) * pctOfBar,
-
- //percentage of bar to shift the handle
- movement = (percent(pxToMove, elemDim) * 100).toFixed(this.options.decimal);
- //fixing the decimal value for the location number, is passed to other methods as a fixed floating-point value
- location = parseFloat(location.toFixed(this.options.decimal));
- // declare empty object for css adjustments, only used with 2 handled-sliders
- var css = {};
-
- this._setValues($hndl, location);
-
- // TODO update to calculate based on values set to respective inputs??
- if (isDbl) {
- var isLeftHndl = this.handles.index($hndl) === 0,
-
- //empty variable, will be used for min-height/width for fill bar
- dim,
-
- //percentage w/h of the handle compared to the slider bar
- handlePct = ~ ~(percent(handleDim, elemDim) * 100);
- //if left handle, the math is slightly different than if it's the right handle, and the left/top property needs to be changed for the fill bar
- if (isLeftHndl) {
- //left or top percentage value to apply to the fill bar.
- css[lOrT] = movement + '%';
- //calculate the new min-height/width for the fill bar.
- dim = parseFloat(this.$handle2[0].style[lOrT]) - movement + handlePct;
- //this callback is necessary to prevent errors and allow the proper placement and initialization of a 2-handled slider
- //plus, it means we don't care if 'dim' isNaN on init, it won't be in the future.
- if (cb && typeof cb === 'function') {
- cb();
- } //this is only needed for the initialization of 2 handled sliders
- } else {
- //just caching the value of the left/bottom handle's left/top property
- var handlePos = parseFloat(this.$handle[0].style[lOrT]);
- //calculate the new min-height/width for the fill bar. Use isNaN to prevent false positives for numbers <= 0
- //based on the percentage of movement of the handle being manipulated, less the opposing handle's left/top position, plus the percentage w/h of the handle itself
- dim = movement - (isNaN(handlePos) ? this.options.initialStart / ((this.options.end - this.options.start) / 100) : handlePos) + handlePct;
- }
- // assign the min-height/width to our css object
- css['min-' + hOrW] = dim + '%';
- }
-
- this.$element.one('finished.zf.animate', function () {
- /**
- * Fires when the handle is done moving.
- * @event Slider#moved
- */
- _this.$element.trigger('moved.zf.slider', [$hndl]);
- });
-
- //because we don't know exactly how the handle will be moved, check the amount of time it should take to move.
- var moveTime = this.$element.data('dragging') ? 1000 / 60 : this.options.moveTime;
-
- Foundation.Move(moveTime, $hndl, function () {
- //adjusting the left/top property of the handle, based on the percentage calculated above
- $hndl.css(lOrT, movement + '%');
-
- if (!_this.options.doubleSided) {
- //if single-handled, a simple method to expand the fill bar
- _this.$fill.css(hOrW, pctOfBar * 100 + '%');
- } else {
- //otherwise, use the css object we created above
- _this.$fill.css(css);
- }
- });
-
- /**
- * Fires when the value has not been change for a given time.
- * @event Slider#changed
- */
- clearTimeout(_this.timeout);
- _this.timeout = setTimeout(function () {
- _this.$element.trigger('changed.zf.slider', [$hndl]);
- }, _this.options.changedDelay);
- }
-
- /**
- * Sets the initial attribute for the slider element.
- * @function
- * @private
- * @param {Number} idx - index of the current handle/input to use.
- */
-
- }, {
- key: '_setInitAttr',
- value: function _setInitAttr(idx) {
- var id = this.inputs.eq(idx).attr('id') || Foundation.GetYoDigits(6, 'slider');
- this.inputs.eq(idx).attr({
- 'id': id,
- 'max': this.options.end,
- 'min': this.options.start,
- 'step': this.options.step
- });
- this.handles.eq(idx).attr({
- 'role': 'slider',
- 'aria-controls': id,
- 'aria-valuemax': this.options.end,
- 'aria-valuemin': this.options.start,
- 'aria-valuenow': idx === 0 ? this.options.initialStart : this.options.initialEnd,
- 'aria-orientation': this.options.vertical ? 'vertical' : 'horizontal',
- 'tabindex': 0
- });
- }
-
- /**
- * Sets the input and `aria-valuenow` values for the slider element.
- * @function
- * @private
- * @param {jQuery} $handle - the currently selected handle.
- * @param {Number} val - floating point of the new value.
- */
-
- }, {
- key: '_setValues',
- value: function _setValues($handle, val) {
- var idx = this.options.doubleSided ? this.handles.index($handle) : 0;
- this.inputs.eq(idx).val(val);
- $handle.attr('aria-valuenow', val);
- }
-
- /**
- * Handles events on the slider element.
- * Calculates the new location of the current handle.
- * If there are two handles and the bar was clicked, it determines which handle to move.
- * @function
- * @private
- * @param {Object} e - the `event` object passed from the listener.
- * @param {jQuery} $handle - the current handle to calculate for, if selected.
- * @param {Number} val - floating point number for the new value of the slider.
- * TODO clean this up, there's a lot of repeated code between this and the _setHandlePos fn.
- */
-
- }, {
- key: '_handleEvent',
- value: function _handleEvent(e, $handle, val) {
- var value, hasVal;
- if (!val) {
- //click or drag events
- e.preventDefault();
- var _this = this,
- vertical = this.options.vertical,
- param = vertical ? 'height' : 'width',
- direction = vertical ? 'top' : 'left',
- eventOffset = vertical ? e.pageY : e.pageX,
- halfOfHandle = this.$handle[0].getBoundingClientRect()[param] / 2,
- barDim = this.$element[0].getBoundingClientRect()[param],
- windowScroll = vertical ? $(window).scrollTop() : $(window).scrollLeft();
-
- var elemOffset = this.$element.offset()[direction];
-
- // touch events emulated by the touch util give position relative to screen, add window.scroll to event coordinates...
- // best way to guess this is simulated is if clientY == pageY
- if (e.clientY === e.pageY) {
- eventOffset = eventOffset + windowScroll;
- }
- var eventFromBar = eventOffset - elemOffset;
- var barXY;
- if (eventFromBar < 0) {
- barXY = 0;
- } else if (eventFromBar > barDim) {
- barXY = barDim;
- } else {
- barXY = eventFromBar;
- }
- var offsetPct = percent(barXY, barDim);
-
- value = (this.options.end - this.options.start) * offsetPct + this.options.start;
-
- // turn everything around for RTL, yay math!
- if (Foundation.rtl() && !this.options.vertical) {
- value = this.options.end - value;
- }
-
- value = _this._adjustValue(null, value);
- //boolean flag for the setHandlePos fn, specifically for vertical sliders
- hasVal = false;
-
- if (!$handle) {
- //figure out which handle it is, pass it to the next function.
- var firstHndlPos = absPosition(this.$handle, direction, barXY, param),
- secndHndlPos = absPosition(this.$handle2, direction, barXY, param);
- $handle = firstHndlPos <= secndHndlPos ? this.$handle : this.$handle2;
- }
- } else {
- //change event on input
- value = this._adjustValue(null, val);
- hasVal = true;
- }
-
- this._setHandlePos($handle, value, hasVal);
- }
-
- /**
- * Adjustes value for handle in regard to step value. returns adjusted value
- * @function
- * @private
- * @param {jQuery} $handle - the selected handle.
- * @param {Number} value - value to adjust. used if $handle is falsy
- */
-
- }, {
- key: '_adjustValue',
- value: function _adjustValue($handle, value) {
- var val,
- step = this.options.step,
- div = parseFloat(step / 2),
- left,
- prev_val,
- next_val;
- if (!!$handle) {
- val = parseFloat($handle.attr('aria-valuenow'));
- } else {
- val = value;
- }
- left = val % step;
- prev_val = val - left;
- next_val = prev_val + step;
- if (left === 0) {
- return val;
- }
- val = val >= prev_val + div ? next_val : prev_val;
- return val;
- }
-
- /**
- * Adds event listeners to the slider elements.
- * @function
- * @private
- * @param {jQuery} $handle - the current handle to apply listeners to.
- */
-
- }, {
- key: '_events',
- value: function _events($handle) {
- var _this = this,
- curHandle,
- timer;
-
- this.inputs.off('change.zf.slider').on('change.zf.slider', function (e) {
- var idx = _this.inputs.index($(this));
- _this._handleEvent(e, _this.handles.eq(idx), $(this).val());
- });
-
- if (this.options.clickSelect) {
- this.$element.off('click.zf.slider').on('click.zf.slider', function (e) {
- if (_this.$element.data('dragging')) {
- return false;
- }
-
- if (!$(e.target).is('[data-slider-handle]')) {
- if (_this.options.doubleSided) {
- _this._handleEvent(e);
- } else {
- _this._handleEvent(e, _this.$handle);
- }
- }
- });
- }
-
- if (this.options.draggable) {
- this.handles.addTouch();
-
- var $body = $('body');
- $handle.off('mousedown.zf.slider').on('mousedown.zf.slider', function (e) {
- $handle.addClass('is-dragging');
- _this.$fill.addClass('is-dragging'); //
- _this.$element.data('dragging', true);
-
- curHandle = $(e.currentTarget);
-
- $body.on('mousemove.zf.slider', function (e) {
- e.preventDefault();
- _this._handleEvent(e, curHandle);
- }).on('mouseup.zf.slider', function (e) {
- _this._handleEvent(e, curHandle);
-
- $handle.removeClass('is-dragging');
- _this.$fill.removeClass('is-dragging');
- _this.$element.data('dragging', false);
-
- $body.off('mousemove.zf.slider mouseup.zf.slider');
- });
- })
- // prevent events triggered by touch
- .on('selectstart.zf.slider touchmove.zf.slider', function (e) {
- e.preventDefault();
- });
- }
-
- $handle.off('keydown.zf.slider').on('keydown.zf.slider', function (e) {
- var _$handle = $(this),
- idx = _this.options.doubleSided ? _this.handles.index(_$handle) : 0,
- oldValue = parseFloat(_this.inputs.eq(idx).val()),
- newValue;
-
- // handle keyboard event with keyboard util
- Foundation.Keyboard.handleKey(e, 'Slider', {
- decrease: function () {
- newValue = oldValue - _this.options.step;
- },
- increase: function () {
- newValue = oldValue + _this.options.step;
- },
- decrease_fast: function () {
- newValue = oldValue - _this.options.step * 10;
- },
- increase_fast: function () {
- newValue = oldValue + _this.options.step * 10;
- },
- handled: function () {
- // only set handle pos when event was handled specially
- e.preventDefault();
- _this._setHandlePos(_$handle, newValue, true);
- }
- });
- /*if (newValue) { // if pressed key has special function, update value
- e.preventDefault();
- _this._setHandlePos(_$handle, newValue);
- }*/
- });
- }
-
- /**
- * Destroys the slider plugin.
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.handles.off('.zf.slider');
- this.inputs.off('.zf.slider');
- this.$element.off('.zf.slider');
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Slider;
- }();
-
- Slider.defaults = {
- /**
- * Minimum value for the slider scale.
- * @option
- * @example 0
- */
- start: 0,
- /**
- * Maximum value for the slider scale.
- * @option
- * @example 100
- */
- end: 100,
- /**
- * Minimum value change per change event.
- * @option
- * @example 1
- */
- step: 1,
- /**
- * Value at which the handle/input *(left handle/first input)* should be set to on initialization.
- * @option
- * @example 0
- */
- initialStart: 0,
- /**
- * Value at which the right handle/second input should be set to on initialization.
- * @option
- * @example 100
- */
- initialEnd: 100,
- /**
- * Allows the input to be located outside the container and visible. Set to by the JS
- * @option
- * @example false
- */
- binding: false,
- /**
- * Allows the user to click/tap on the slider bar to select a value.
- * @option
- * @example true
- */
- clickSelect: true,
- /**
- * Set to true and use the `vertical` class to change alignment to vertical.
- * @option
- * @example false
- */
- vertical: false,
- /**
- * Allows the user to drag the slider handle(s) to select a value.
- * @option
- * @example true
- */
- draggable: true,
- /**
- * Disables the slider and prevents event listeners from being applied. Double checked by JS with `disabledClass`.
- * @option
- * @example false
- */
- disabled: false,
- /**
- * Allows the use of two handles. Double checked by the JS. Changes some logic handling.
- * @option
- * @example false
- */
- doubleSided: false,
- /**
- * Potential future feature.
- */
- // steps: 100,
- /**
- * Number of decimal places the plugin should go to for floating point precision.
- * @option
- * @example 2
- */
- decimal: 2,
- /**
- * Time delay for dragged elements.
- */
- // dragDelay: 0,
- /**
- * Time, in ms, to animate the movement of a slider handle if user clicks/taps on the bar. Needs to be manually set if updating the transition time in the Sass settings.
- * @option
- * @example 200
- */
- moveTime: 200, //update this if changing the transition time in the sass
- /**
- * Class applied to disabled sliders.
- * @option
- * @example 'disabled'
- */
- disabledClass: 'disabled',
- /**
- * Will invert the default layout for a vertical<span data-tooltip title="who would do this???"> </span>slider.
- * @option
- * @example false
- */
- invertVertical: false,
- /**
- * Milliseconds before the `changed.zf-slider` event is triggered after value change.
- * @option
- * @example 500
- */
- changedDelay: 500
- };
-
- function percent(frac, num) {
- return frac / num;
- }
- function absPosition($handle, dir, clickPos, param) {
- return Math.abs($handle.position()[dir] + $handle[param]() / 2 - clickPos);
- }
-
- // Window exports
- Foundation.plugin(Slider, 'Slider');
-}(jQuery);
-
-//*********this is in case we go to static, absolute positions instead of dynamic positioning********
-// this.setSteps(function() {
-// _this._events();
-// var initStart = _this.options.positions[_this.options.initialStart - 1] || null;
-// var initEnd = _this.options.initialEnd ? _this.options.position[_this.options.initialEnd - 1] : null;
-// if (initStart || initEnd) {
-// _this._handleEvent(initStart, initEnd);
-// }
-// });
-
-//***********the other part of absolute positions*************
-// Slider.prototype.setSteps = function(cb) {
-// var posChange = this.$element.outerWidth() / this.options.steps;
-// var counter = 0
-// while(counter < this.options.steps) {
-// if (counter) {
-// this.options.positions.push(this.options.positions[counter - 1] + posChange);
-// } else {
-// this.options.positions.push(posChange);
-// }
-// counter++;
-// }
-// cb();
-// };
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Sticky module.
- * @module foundation.sticky
- * @requires foundation.util.triggers
- * @requires foundation.util.mediaQuery
- */
-
- var Sticky = function () {
- /**
- * Creates a new instance of a sticky thing.
- * @class
- * @param {jQuery} element - jQuery object to make sticky.
- * @param {Object} options - options object passed when creating the element programmatically.
- */
-
- function Sticky(element, options) {
- _classCallCheck(this, Sticky);
-
- this.$element = element;
- this.options = $.extend({}, Sticky.defaults, this.$element.data(), options);
-
- this._init();
-
- Foundation.registerPlugin(this, 'Sticky');
- }
-
- /**
- * Initializes the sticky element by adding classes, getting/setting dimensions, breakpoints and attributes
- * @function
- * @private
- */
-
-
- _createClass(Sticky, [{
- key: '_init',
- value: function _init() {
- var $parent = this.$element.parent('[data-sticky-container]'),
- id = this.$element[0].id || Foundation.GetYoDigits(6, 'sticky'),
- _this = this;
-
- if (!$parent.length) {
- this.wasWrapped = true;
- }
- this.$container = $parent.length ? $parent : $(this.options.container).wrapInner(this.$element);
- this.$container.addClass(this.options.containerClass);
-
- this.$element.addClass(this.options.stickyClass).attr({ 'data-resize': id });
-
- this.scrollCount = this.options.checkEvery;
- this.isStuck = false;
- $(window).one('load.zf.sticky', function () {
- //We calculate the container height to have correct values for anchor points offset calculation.
- _this.containerHeight = _this.$element.css("display") == "none" ? 0 : _this.$element[0].getBoundingClientRect().height;
- _this.$container.css('height', _this.containerHeight);
- _this.elemHeight = _this.containerHeight;
- if (_this.options.anchor !== '') {
- _this.$anchor = $('#' + _this.options.anchor);
- } else {
- _this._parsePoints();
- }
-
- _this._setSizes(function () {
- _this._calc(false);
- });
- _this._events(id.split('-').reverse().join('-'));
- });
- }
-
- /**
- * If using multiple elements as anchors, calculates the top and bottom pixel values the sticky thing should stick and unstick on.
- * @function
- * @private
- */
-
- }, {
- key: '_parsePoints',
- value: function _parsePoints() {
- var top = this.options.topAnchor == "" ? 1 : this.options.topAnchor,
- btm = this.options.btmAnchor == "" ? document.documentElement.scrollHeight : this.options.btmAnchor,
- pts = [top, btm],
- breaks = {};
- for (var i = 0, len = pts.length; i < len && pts[i]; i++) {
- var pt;
- if (typeof pts[i] === 'number') {
- pt = pts[i];
- } else {
- var place = pts[i].split(':'),
- anchor = $('#' + place[0]);
-
- pt = anchor.offset().top;
- if (place[1] && place[1].toLowerCase() === 'bottom') {
- pt += anchor[0].getBoundingClientRect().height;
- }
- }
- breaks[i] = pt;
- }
-
- this.points = breaks;
- return;
- }
-
- /**
- * Adds event handlers for the scrolling element.
- * @private
- * @param {String} id - psuedo-random id for unique scroll event listener.
- */
-
- }, {
- key: '_events',
- value: function _events(id) {
- var _this = this,
- scrollListener = this.scrollListener = 'scroll.zf.' + id;
- if (this.isOn) {
- return;
- }
- if (this.canStick) {
- this.isOn = true;
- $(window).off(scrollListener).on(scrollListener, function (e) {
- if (_this.scrollCount === 0) {
- _this.scrollCount = _this.options.checkEvery;
- _this._setSizes(function () {
- _this._calc(false, window.pageYOffset);
- });
- } else {
- _this.scrollCount--;
- _this._calc(false, window.pageYOffset);
- }
- });
- }
-
- this.$element.off('resizeme.zf.trigger').on('resizeme.zf.trigger', function (e, el) {
- _this._setSizes(function () {
- _this._calc(false);
- if (_this.canStick) {
- if (!_this.isOn) {
- _this._events(id);
- }
- } else if (_this.isOn) {
- _this._pauseListeners(scrollListener);
- }
- });
- });
- }
-
- /**
- * Removes event handlers for scroll and change events on anchor.
- * @fires Sticky#pause
- * @param {String} scrollListener - unique, namespaced scroll listener attached to `window`
- */
-
- }, {
- key: '_pauseListeners',
- value: function _pauseListeners(scrollListener) {
- this.isOn = false;
- $(window).off(scrollListener);
-
- /**
- * Fires when the plugin is paused due to resize event shrinking the view.
- * @event Sticky#pause
- * @private
- */
- this.$element.trigger('pause.zf.sticky');
- }
-
- /**
- * Called on every `scroll` event and on `_init`
- * fires functions based on booleans and cached values
- * @param {Boolean} checkSizes - true if plugin should recalculate sizes and breakpoints.
- * @param {Number} scroll - current scroll position passed from scroll event cb function. If not passed, defaults to `window.pageYOffset`.
- */
-
- }, {
- key: '_calc',
- value: function _calc(checkSizes, scroll) {
- if (checkSizes) {
- this._setSizes();
- }
-
- if (!this.canStick) {
- if (this.isStuck) {
- this._removeSticky(true);
- }
- return false;
- }
-
- if (!scroll) {
- scroll = window.pageYOffset;
- }
-
- if (scroll >= this.topPoint) {
- if (scroll <= this.bottomPoint) {
- if (!this.isStuck) {
- this._setSticky();
- }
- } else {
- if (this.isStuck) {
- this._removeSticky(false);
- }
- }
- } else {
- if (this.isStuck) {
- this._removeSticky(true);
- }
- }
- }
-
- /**
- * Causes the $element to become stuck.
- * Adds `position: fixed;`, and helper classes.
- * @fires Sticky#stuckto
- * @function
- * @private
- */
-
- }, {
- key: '_setSticky',
- value: function _setSticky() {
- var _this = this,
- stickTo = this.options.stickTo,
- mrgn = stickTo === 'top' ? 'marginTop' : 'marginBottom',
- notStuckTo = stickTo === 'top' ? 'bottom' : 'top',
- css = {};
-
- css[mrgn] = this.options[mrgn] + 'em';
- css[stickTo] = 0;
- css[notStuckTo] = 'auto';
- css['left'] = this.$container.offset().left + parseInt(window.getComputedStyle(this.$container[0])["padding-left"], 10);
- this.isStuck = true;
- this.$element.removeClass('is-anchored is-at-' + notStuckTo).addClass('is-stuck is-at-' + stickTo).css(css)
- /**
- * Fires when the $element has become `position: fixed;`
- * Namespaced to `top` or `bottom`, e.g. `sticky.zf.stuckto:top`
- * @event Sticky#stuckto
- */
- .trigger('sticky.zf.stuckto:' + stickTo);
- this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd", function () {
- _this._setSizes();
- });
- }
-
- /**
- * Causes the $element to become unstuck.
- * Removes `position: fixed;`, and helper classes.
- * Adds other helper classes.
- * @param {Boolean} isTop - tells the function if the $element should anchor to the top or bottom of its $anchor element.
- * @fires Sticky#unstuckfrom
- * @private
- */
-
- }, {
- key: '_removeSticky',
- value: function _removeSticky(isTop) {
- var stickTo = this.options.stickTo,
- stickToTop = stickTo === 'top',
- css = {},
- anchorPt = (this.points ? this.points[1] - this.points[0] : this.anchorHeight) - this.elemHeight,
- mrgn = stickToTop ? 'marginTop' : 'marginBottom',
- notStuckTo = stickToTop ? 'bottom' : 'top',
- topOrBottom = isTop ? 'top' : 'bottom';
-
- css[mrgn] = 0;
-
- css['bottom'] = 'auto';
- if (isTop) {
- css['top'] = 0;
- } else {
- css['top'] = anchorPt;
- }
-
- css['left'] = '';
- this.isStuck = false;
- this.$element.removeClass('is-stuck is-at-' + stickTo).addClass('is-anchored is-at-' + topOrBottom).css(css)
- /**
- * Fires when the $element has become anchored.
- * Namespaced to `top` or `bottom`, e.g. `sticky.zf.unstuckfrom:bottom`
- * @event Sticky#unstuckfrom
- */
- .trigger('sticky.zf.unstuckfrom:' + topOrBottom);
- }
-
- /**
- * Sets the $element and $container sizes for plugin.
- * Calls `_setBreakPoints`.
- * @param {Function} cb - optional callback function to fire on completion of `_setBreakPoints`.
- * @private
- */
-
- }, {
- key: '_setSizes',
- value: function _setSizes(cb) {
- this.canStick = Foundation.MediaQuery.atLeast(this.options.stickyOn);
- if (!this.canStick) {
- if (cb && typeof cb === 'function') {
- cb();
- }
- }
- var _this = this,
- newElemWidth = this.$container[0].getBoundingClientRect().width,
- comp = window.getComputedStyle(this.$container[0]),
- pdng = parseInt(comp['padding-right'], 10);
-
- if (this.$anchor && this.$anchor.length) {
- this.anchorHeight = this.$anchor[0].getBoundingClientRect().height;
- } else {
- this._parsePoints();
- }
-
- this.$element.css({
- 'max-width': newElemWidth - pdng + 'px'
- });
-
- var newContainerHeight = this.$element[0].getBoundingClientRect().height || this.containerHeight;
- if (this.$element.css("display") == "none") {
- newContainerHeight = 0;
- }
- this.containerHeight = newContainerHeight;
- this.$container.css({
- height: newContainerHeight
- });
- this.elemHeight = newContainerHeight;
-
- if (this.isStuck) {
- this.$element.css({ "left": this.$container.offset().left + parseInt(comp['padding-left'], 10) });
- } else {
- if (this.$element.hasClass('is-at-bottom')) {
- var anchorPt = (this.points ? this.points[1] - this.$container.offset().top : this.anchorHeight) - this.elemHeight;
- this.$element.css('top', anchorPt);
- }
- }
-
- this._setBreakPoints(newContainerHeight, function () {
- if (cb && typeof cb === 'function') {
- cb();
- }
- });
- }
-
- /**
- * Sets the upper and lower breakpoints for the element to become sticky/unsticky.
- * @param {Number} elemHeight - px value for sticky.$element height, calculated by `_setSizes`.
- * @param {Function} cb - optional callback function to be called on completion.
- * @private
- */
-
- }, {
- key: '_setBreakPoints',
- value: function _setBreakPoints(elemHeight, cb) {
- if (!this.canStick) {
- if (cb && typeof cb === 'function') {
- cb();
- } else {
- return false;
- }
- }
- var mTop = emCalc(this.options.marginTop),
- mBtm = emCalc(this.options.marginBottom),
- topPoint = this.points ? this.points[0] : this.$anchor.offset().top,
- bottomPoint = this.points ? this.points[1] : topPoint + this.anchorHeight,
-
- // topPoint = this.$anchor.offset().top || this.points[0],
- // bottomPoint = topPoint + this.anchorHeight || this.points[1],
- winHeight = window.innerHeight;
-
- if (this.options.stickTo === 'top') {
- topPoint -= mTop;
- bottomPoint -= elemHeight + mTop;
- } else if (this.options.stickTo === 'bottom') {
- topPoint -= winHeight - (elemHeight + mBtm);
- bottomPoint -= winHeight - mBtm;
- } else {
- //this would be the stickTo: both option... tricky
- }
-
- this.topPoint = topPoint;
- this.bottomPoint = bottomPoint;
-
- if (cb && typeof cb === 'function') {
- cb();
- }
- }
-
- /**
- * Destroys the current sticky element.
- * Resets the element to the top position first.
- * Removes event listeners, JS-added css properties and classes, and unwraps the $element if the JS added the $container.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this._removeSticky(true);
-
- this.$element.removeClass(this.options.stickyClass + ' is-anchored is-at-top').css({
- height: '',
- top: '',
- bottom: '',
- 'max-width': ''
- }).off('resizeme.zf.trigger');
- if (this.$anchor && this.$anchor.length) {
- this.$anchor.off('change.zf.sticky');
- }
- $(window).off(this.scrollListener);
-
- if (this.wasWrapped) {
- this.$element.unwrap();
- } else {
- this.$container.removeClass(this.options.containerClass).css({
- height: ''
- });
- }
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Sticky;
- }();
-
- Sticky.defaults = {
- /**
- * Customizable container template. Add your own classes for styling and sizing.
- * @option
- * @example '&lt;div data-sticky-container class="small-6 columns"&gt;&lt;/div&gt;'
- */
- container: '<div data-sticky-container></div>',
- /**
- * Location in the view the element sticks to.
- * @option
- * @example 'top'
- */
- stickTo: 'top',
- /**
- * If anchored to a single element, the id of that element.
- * @option
- * @example 'exampleId'
- */
- anchor: '',
- /**
- * If using more than one element as anchor points, the id of the top anchor.
- * @option
- * @example 'exampleId:top'
- */
- topAnchor: '',
- /**
- * If using more than one element as anchor points, the id of the bottom anchor.
- * @option
- * @example 'exampleId:bottom'
- */
- btmAnchor: '',
- /**
- * Margin, in `em`'s to apply to the top of the element when it becomes sticky.
- * @option
- * @example 1
- */
- marginTop: 1,
- /**
- * Margin, in `em`'s to apply to the bottom of the element when it becomes sticky.
- * @option
- * @example 1
- */
- marginBottom: 1,
- /**
- * Breakpoint string that is the minimum screen size an element should become sticky.
- * @option
- * @example 'medium'
- */
- stickyOn: 'medium',
- /**
- * Class applied to sticky element, and removed on destruction. Foundation defaults to `sticky`.
- * @option
- * @example 'sticky'
- */
- stickyClass: 'sticky',
- /**
- * Class applied to sticky container. Foundation defaults to `sticky-container`.
- * @option
- * @example 'sticky-container'
- */
- containerClass: 'sticky-container',
- /**
- * Number of scroll events between the plugin's recalculating sticky points. Setting it to `0` will cause it to recalc every scroll event, setting it to `-1` will prevent recalc on scroll.
- * @option
- * @example 50
- */
- checkEvery: -1
- };
-
- /**
- * Helper function to calculate em values
- * @param Number {em} - number of em's to calculate into pixels
- */
- function emCalc(em) {
- return parseInt(window.getComputedStyle(document.body, null).fontSize, 10) * em;
- }
-
- // Window exports
- Foundation.plugin(Sticky, 'Sticky');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Tabs module.
- * @module foundation.tabs
- * @requires foundation.util.keyboard
- * @requires foundation.util.timerAndImageLoader if tabs contain images
- */
-
- var Tabs = function () {
- /**
- * Creates a new instance of tabs.
- * @class
- * @fires Tabs#init
- * @param {jQuery} element - jQuery object to make into tabs.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Tabs(element, options) {
- _classCallCheck(this, Tabs);
-
- this.$element = element;
- this.options = $.extend({}, Tabs.defaults, this.$element.data(), options);
-
- this._init();
- Foundation.registerPlugin(this, 'Tabs');
- Foundation.Keyboard.register('Tabs', {
- 'ENTER': 'open',
- 'SPACE': 'open',
- 'ARROW_RIGHT': 'next',
- 'ARROW_UP': 'previous',
- 'ARROW_DOWN': 'next',
- 'ARROW_LEFT': 'previous'
- // 'TAB': 'next',
- // 'SHIFT_TAB': 'previous'
- });
- }
-
- /**
- * Initializes the tabs by showing and focusing (if autoFocus=true) the preset active tab.
- * @private
- */
-
-
- _createClass(Tabs, [{
- key: '_init',
- value: function _init() {
- var _this = this;
-
- this.$tabTitles = this.$element.find('.' + this.options.linkClass);
- this.$tabContent = $('[data-tabs-content="' + this.$element[0].id + '"]');
-
- this.$tabTitles.each(function () {
- var $elem = $(this),
- $link = $elem.find('a'),
- isActive = $elem.hasClass('is-active'),
- hash = $link[0].hash.slice(1),
- linkId = $link[0].id ? $link[0].id : hash + '-label',
- $tabContent = $('#' + hash);
-
- $elem.attr({ 'role': 'presentation' });
-
- $link.attr({
- 'role': 'tab',
- 'aria-controls': hash,
- 'aria-selected': isActive,
- 'id': linkId
- });
-
- $tabContent.attr({
- 'role': 'tabpanel',
- 'aria-hidden': !isActive,
- 'aria-labelledby': linkId
- });
-
- if (isActive && _this.options.autoFocus) {
- $link.focus();
- }
- });
-
- if (this.options.matchHeight) {
- var $images = this.$tabContent.find('img');
-
- if ($images.length) {
- Foundation.onImagesLoaded($images, this._setHeight.bind(this));
- } else {
- this._setHeight();
- }
- }
-
- this._events();
- }
-
- /**
- * Adds event handlers for items within the tabs.
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- this._addKeyHandler();
- this._addClickHandler();
- this._setHeightMqHandler = null;
-
- if (this.options.matchHeight) {
- this._setHeightMqHandler = this._setHeight.bind(this);
-
- $(window).on('changed.zf.mediaquery', this._setHeightMqHandler);
- }
- }
-
- /**
- * Adds click handlers for items within the tabs.
- * @private
- */
-
- }, {
- key: '_addClickHandler',
- value: function _addClickHandler() {
- var _this = this;
-
- this.$element.off('click.zf.tabs').on('click.zf.tabs', '.' + this.options.linkClass, function (e) {
- e.preventDefault();
- e.stopPropagation();
- if ($(this).hasClass('is-active')) {
- return;
- }
- _this._handleTabChange($(this));
- });
- }
-
- /**
- * Adds keyboard event handlers for items within the tabs.
- * @private
- */
-
- }, {
- key: '_addKeyHandler',
- value: function _addKeyHandler() {
- var _this = this;
- var $firstTab = _this.$element.find('li:first-of-type');
- var $lastTab = _this.$element.find('li:last-of-type');
-
- this.$tabTitles.off('keydown.zf.tabs').on('keydown.zf.tabs', function (e) {
- if (e.which === 9) return;
-
- var $element = $(this),
- $elements = $element.parent('ul').children('li'),
- $prevElement,
- $nextElement;
-
- $elements.each(function (i) {
- if ($(this).is($element)) {
- if (_this.options.wrapOnKeys) {
- $prevElement = i === 0 ? $elements.last() : $elements.eq(i - 1);
- $nextElement = i === $elements.length - 1 ? $elements.first() : $elements.eq(i + 1);
- } else {
- $prevElement = $elements.eq(Math.max(0, i - 1));
- $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1));
- }
- return;
- }
- });
-
- // handle keyboard event with keyboard util
- Foundation.Keyboard.handleKey(e, 'Tabs', {
- open: function () {
- $element.find('[role="tab"]').focus();
- _this._handleTabChange($element);
- },
- previous: function () {
- $prevElement.find('[role="tab"]').focus();
- _this._handleTabChange($prevElement);
- },
- next: function () {
- $nextElement.find('[role="tab"]').focus();
- _this._handleTabChange($nextElement);
- },
- handled: function () {
- e.stopPropagation();
- e.preventDefault();
- }
- });
- });
- }
-
- /**
- * Opens the tab `$targetContent` defined by `$target`.
- * @param {jQuery} $target - Tab to open.
- * @fires Tabs#change
- * @function
- */
-
- }, {
- key: '_handleTabChange',
- value: function _handleTabChange($target) {
- var $tabLink = $target.find('[role="tab"]'),
- hash = $tabLink[0].hash,
- $targetContent = this.$tabContent.find(hash),
- $oldTab = this.$element.find('.' + this.options.linkClass + '.is-active').removeClass('is-active').find('[role="tab"]').attr({ 'aria-selected': 'false' });
-
- $('#' + $oldTab.attr('aria-controls')).removeClass('is-active').attr({ 'aria-hidden': 'true' });
-
- $target.addClass('is-active');
-
- $tabLink.attr({ 'aria-selected': 'true' });
-
- $targetContent.addClass('is-active').attr({ 'aria-hidden': 'false' });
-
- /**
- * Fires when the plugin has successfully changed tabs.
- * @event Tabs#change
- */
- this.$element.trigger('change.zf.tabs', [$target]);
- }
-
- /**
- * Public method for selecting a content pane to display.
- * @param {jQuery | String} elem - jQuery object or string of the id of the pane to display.
- * @function
- */
-
- }, {
- key: 'selectTab',
- value: function selectTab(elem) {
- var idStr;
-
- if (typeof elem === 'object') {
- idStr = elem[0].id;
- } else {
- idStr = elem;
- }
-
- if (idStr.indexOf('#') < 0) {
- idStr = '#' + idStr;
- }
-
- var $target = this.$tabTitles.find('[href="' + idStr + '"]').parent('.' + this.options.linkClass);
-
- this._handleTabChange($target);
- }
- }, {
- key: '_setHeight',
-
- /**
- * Sets the height of each panel to the height of the tallest panel.
- * If enabled in options, gets called on media query change.
- * If loading content via external source, can be called directly or with _reflow.
- * @function
- * @private
- */
- value: function _setHeight() {
- var max = 0;
- this.$tabContent.find('.' + this.options.panelClass).css('height', '').each(function () {
- var panel = $(this),
- isActive = panel.hasClass('is-active');
-
- if (!isActive) {
- panel.css({ 'visibility': 'hidden', 'display': 'block' });
- }
-
- var temp = this.getBoundingClientRect().height;
-
- if (!isActive) {
- panel.css({
- 'visibility': '',
- 'display': ''
- });
- }
-
- max = temp > max ? temp : max;
- }).css('height', max + 'px');
- }
-
- /**
- * Destroys an instance of an tabs.
- * @fires Tabs#destroyed
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.find('.' + this.options.linkClass).off('.zf.tabs').hide().end().find('.' + this.options.panelClass).hide();
-
- if (this.options.matchHeight) {
- if (this._setHeightMqHandler != null) {
- $(window).off('changed.zf.mediaquery', this._setHeightMqHandler);
- }
- }
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Tabs;
- }();
-
- Tabs.defaults = {
- /**
- * Allows the window to scroll to content of active pane on load if set to true.
- * @option
- * @example false
- */
- autoFocus: false,
-
- /**
- * Allows keyboard input to 'wrap' around the tab links.
- * @option
- * @example true
- */
- wrapOnKeys: true,
-
- /**
- * Allows the tab content panes to match heights if set to true.
- * @option
- * @example false
- */
- matchHeight: false,
-
- /**
- * Class applied to `li`'s in tab link list.
- * @option
- * @example 'tabs-title'
- */
- linkClass: 'tabs-title',
-
- /**
- * Class applied to the content containers.
- * @option
- * @example 'tabs-panel'
- */
- panelClass: 'tabs-panel'
- };
-
- function checkClass($elem) {
- return $elem.hasClass('is-active');
- }
-
- // Window exports
- Foundation.plugin(Tabs, 'Tabs');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Toggler module.
- * @module foundation.toggler
- * @requires foundation.util.motion
- * @requires foundation.util.triggers
- */
-
- var Toggler = function () {
- /**
- * Creates a new instance of Toggler.
- * @class
- * @fires Toggler#init
- * @param {Object} element - jQuery object to add the trigger to.
- * @param {Object} options - Overrides to the default plugin settings.
- */
-
- function Toggler(element, options) {
- _classCallCheck(this, Toggler);
-
- this.$element = element;
- this.options = $.extend({}, Toggler.defaults, element.data(), options);
- this.className = '';
-
- this._init();
- this._events();
-
- Foundation.registerPlugin(this, 'Toggler');
- }
-
- /**
- * Initializes the Toggler plugin by parsing the toggle class from data-toggler, or animation classes from data-animate.
- * @function
- * @private
- */
-
-
- _createClass(Toggler, [{
- key: '_init',
- value: function _init() {
- var input;
- // Parse animation classes if they were set
- if (this.options.animate) {
- input = this.options.animate.split(' ');
-
- this.animationIn = input[0];
- this.animationOut = input[1] || null;
- }
- // Otherwise, parse toggle class
- else {
- input = this.$element.data('toggler');
- // Allow for a . at the beginning of the string
- this.className = input[0] === '.' ? input.slice(1) : input;
- }
-
- // Add ARIA attributes to triggers
- var id = this.$element[0].id;
- $('[data-open="' + id + '"], [data-close="' + id + '"], [data-toggle="' + id + '"]').attr('aria-controls', id);
- // If the target is hidden, add aria-hidden
- this.$element.attr('aria-expanded', this.$element.is(':hidden') ? false : true);
- }
-
- /**
- * Initializes events for the toggle trigger.
- * @function
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- this.$element.off('toggle.zf.trigger').on('toggle.zf.trigger', this.toggle.bind(this));
- }
-
- /**
- * Toggles the target class on the target element. An event is fired from the original trigger depending on if the resultant state was "on" or "off".
- * @function
- * @fires Toggler#on
- * @fires Toggler#off
- */
-
- }, {
- key: 'toggle',
- value: function toggle() {
- this[this.options.animate ? '_toggleAnimate' : '_toggleClass']();
- }
- }, {
- key: '_toggleClass',
- value: function _toggleClass() {
- this.$element.toggleClass(this.className);
-
- var isOn = this.$element.hasClass(this.className);
- if (isOn) {
- /**
- * Fires if the target element has the class after a toggle.
- * @event Toggler#on
- */
- this.$element.trigger('on.zf.toggler');
- } else {
- /**
- * Fires if the target element does not have the class after a toggle.
- * @event Toggler#off
- */
- this.$element.trigger('off.zf.toggler');
- }
-
- this._updateARIA(isOn);
- }
- }, {
- key: '_toggleAnimate',
- value: function _toggleAnimate() {
- var _this = this;
-
- if (this.$element.is(':hidden')) {
- Foundation.Motion.animateIn(this.$element, this.animationIn, function () {
- _this._updateARIA(true);
- this.trigger('on.zf.toggler');
- });
- } else {
- Foundation.Motion.animateOut(this.$element, this.animationOut, function () {
- _this._updateARIA(false);
- this.trigger('off.zf.toggler');
- });
- }
- }
- }, {
- key: '_updateARIA',
- value: function _updateARIA(isOn) {
- this.$element.attr('aria-expanded', isOn ? true : false);
- }
-
- /**
- * Destroys the instance of Toggler on the element.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.off('.zf.toggler');
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Toggler;
- }();
-
- Toggler.defaults = {
- /**
- * Tells the plugin if the element should animated when toggled.
- * @option
- * @example false
- */
- animate: false
- };
-
- // Window exports
- Foundation.plugin(Toggler, 'Toggler');
-}(jQuery);
-'use strict';
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-!function ($) {
-
- /**
- * Tooltip module.
- * @module foundation.tooltip
- * @requires foundation.util.box
- * @requires foundation.util.mediaQuery
- * @requires foundation.util.triggers
- */
-
- var Tooltip = function () {
- /**
- * Creates a new instance of a Tooltip.
- * @class
- * @fires Tooltip#init
- * @param {jQuery} element - jQuery object to attach a tooltip to.
- * @param {Object} options - object to extend the default configuration.
- */
-
- function Tooltip(element, options) {
- _classCallCheck(this, Tooltip);
-
- this.$element = element;
- this.options = $.extend({}, Tooltip.defaults, this.$element.data(), options);
-
- this.isActive = false;
- this.isClick = false;
- this._init();
-
- Foundation.registerPlugin(this, 'Tooltip');
- }
-
- /**
- * Initializes the tooltip by setting the creating the tip element, adding it's text, setting private variables and setting attributes on the anchor.
- * @private
- */
-
-
- _createClass(Tooltip, [{
- key: '_init',
- value: function _init() {
- var elemId = this.$element.attr('aria-describedby') || Foundation.GetYoDigits(6, 'tooltip');
-
- this.options.positionClass = this.options.positionClass || this._getPositionClass(this.$element);
- this.options.tipText = this.options.tipText || this.$element.attr('title');
- this.template = this.options.template ? $(this.options.template) : this._buildTemplate(elemId);
-
- this.template.appendTo(document.body).text(this.options.tipText).hide();
-
- this.$element.attr({
- 'title': '',
- 'aria-describedby': elemId,
- 'data-yeti-box': elemId,
- 'data-toggle': elemId,
- 'data-resize': elemId
- }).addClass(this.options.triggerClass);
-
- //helper variables to track movement on collisions
- this.usedPositions = [];
- this.counter = 4;
- this.classChanged = false;
-
- this._events();
- }
-
- /**
- * Grabs the current positioning class, if present, and returns the value or an empty string.
- * @private
- */
-
- }, {
- key: '_getPositionClass',
- value: function _getPositionClass(element) {
- if (!element) {
- return '';
- }
- // var position = element.attr('class').match(/top|left|right/g);
- var position = element[0].className.match(/\b(top|left|right)\b/g);
- position = position ? position[0] : '';
- return position;
- }
- }, {
- key: '_buildTemplate',
-
- /**
- * builds the tooltip element, adds attributes, and returns the template.
- * @private
- */
- value: function _buildTemplate(id) {
- var templateClasses = (this.options.tooltipClass + ' ' + this.options.positionClass + ' ' + this.options.templateClasses).trim();
- var $template = $('<div></div>').addClass(templateClasses).attr({
- 'role': 'tooltip',
- 'aria-hidden': true,
- 'data-is-active': false,
- 'data-is-focus': false,
- 'id': id
- });
- return $template;
- }
-
- /**
- * Function that gets called if a collision event is detected.
- * @param {String} position - positioning class to try
- * @private
- */
-
- }, {
- key: '_reposition',
- value: function _reposition(position) {
- this.usedPositions.push(position ? position : 'bottom');
-
- //default, try switching to opposite side
- if (!position && this.usedPositions.indexOf('top') < 0) {
- this.template.addClass('top');
- } else if (position === 'top' && this.usedPositions.indexOf('bottom') < 0) {
- this.template.removeClass(position);
- } else if (position === 'left' && this.usedPositions.indexOf('right') < 0) {
- this.template.removeClass(position).addClass('right');
- } else if (position === 'right' && this.usedPositions.indexOf('left') < 0) {
- this.template.removeClass(position).addClass('left');
- }
-
- //if default change didn't work, try bottom or left first
- else if (!position && this.usedPositions.indexOf('top') > -1 && this.usedPositions.indexOf('left') < 0) {
- this.template.addClass('left');
- } else if (position === 'top' && this.usedPositions.indexOf('bottom') > -1 && this.usedPositions.indexOf('left') < 0) {
- this.template.removeClass(position).addClass('left');
- } else if (position === 'left' && this.usedPositions.indexOf('right') > -1 && this.usedPositions.indexOf('bottom') < 0) {
- this.template.removeClass(position);
- } else if (position === 'right' && this.usedPositions.indexOf('left') > -1 && this.usedPositions.indexOf('bottom') < 0) {
- this.template.removeClass(position);
- }
- //if nothing cleared, set to bottom
- else {
- this.template.removeClass(position);
- }
- this.classChanged = true;
- this.counter--;
- }
-
- /**
- * sets the position class of an element and recursively calls itself until there are no more possible positions to attempt, or the tooltip element is no longer colliding.
- * if the tooltip is larger than the screen width, default to full width - any user selected margin
- * @private
- */
-
- }, {
- key: '_setPosition',
- value: function _setPosition() {
- var position = this._getPositionClass(this.template),
- $tipDims = Foundation.Box.GetDimensions(this.template),
- $anchorDims = Foundation.Box.GetDimensions(this.$element),
- direction = position === 'left' ? 'left' : position === 'right' ? 'left' : 'top',
- param = direction === 'top' ? 'height' : 'width',
- offset = param === 'height' ? this.options.vOffset : this.options.hOffset,
- _this = this;
-
- if ($tipDims.width >= $tipDims.windowDims.width || !this.counter && !Foundation.Box.ImNotTouchingYou(this.template)) {
- this.template.offset(Foundation.Box.GetOffsets(this.template, this.$element, 'center bottom', this.options.vOffset, this.options.hOffset, true)).css({
- // this.$element.offset(Foundation.GetOffsets(this.template, this.$element, 'center bottom', this.options.vOffset, this.options.hOffset, true)).css({
- 'width': $anchorDims.windowDims.width - this.options.hOffset * 2,
- 'height': 'auto'
- });
- return false;
- }
-
- this.template.offset(Foundation.Box.GetOffsets(this.template, this.$element, 'center ' + (position || 'bottom'), this.options.vOffset, this.options.hOffset));
-
- while (!Foundation.Box.ImNotTouchingYou(this.template) && this.counter) {
- this._reposition(position);
- this._setPosition();
- }
- }
-
- /**
- * reveals the tooltip, and fires an event to close any other open tooltips on the page
- * @fires Tooltip#closeme
- * @fires Tooltip#show
- * @function
- */
-
- }, {
- key: 'show',
- value: function show() {
- if (this.options.showOn !== 'all' && !Foundation.MediaQuery.atLeast(this.options.showOn)) {
- // console.error('The screen is too small to display this tooltip');
- return false;
- }
-
- var _this = this;
- this.template.css('visibility', 'hidden').show();
- this._setPosition();
-
- /**
- * Fires to close all other open tooltips on the page
- * @event Closeme#tooltip
- */
- this.$element.trigger('closeme.zf.tooltip', this.template.attr('id'));
-
- this.template.attr({
- 'data-is-active': true,
- 'aria-hidden': false
- });
- _this.isActive = true;
- // console.log(this.template);
- this.template.stop().hide().css('visibility', '').fadeIn(this.options.fadeInDuration, function () {
- //maybe do stuff?
- });
- /**
- * Fires when the tooltip is shown
- * @event Tooltip#show
- */
- this.$element.trigger('show.zf.tooltip');
- }
-
- /**
- * Hides the current tooltip, and resets the positioning class if it was changed due to collision
- * @fires Tooltip#hide
- * @function
- */
-
- }, {
- key: 'hide',
- value: function hide() {
- // console.log('hiding', this.$element.data('yeti-box'));
- var _this = this;
- this.template.stop().attr({
- 'aria-hidden': true,
- 'data-is-active': false
- }).fadeOut(this.options.fadeOutDuration, function () {
- _this.isActive = false;
- _this.isClick = false;
- if (_this.classChanged) {
- _this.template.removeClass(_this._getPositionClass(_this.template)).addClass(_this.options.positionClass);
-
- _this.usedPositions = [];
- _this.counter = 4;
- _this.classChanged = false;
- }
- });
- /**
- * fires when the tooltip is hidden
- * @event Tooltip#hide
- */
- this.$element.trigger('hide.zf.tooltip');
- }
-
- /**
- * adds event listeners for the tooltip and its anchor
- * TODO combine some of the listeners like focus and mouseenter, etc.
- * @private
- */
-
- }, {
- key: '_events',
- value: function _events() {
- var _this = this;
- var $template = this.template;
- var isFocus = false;
-
- if (!this.options.disableHover) {
-
- this.$element.on('mouseenter.zf.tooltip', function (e) {
- if (!_this.isActive) {
- _this.timeout = setTimeout(function () {
- _this.show();
- }, _this.options.hoverDelay);
- }
- }).on('mouseleave.zf.tooltip', function (e) {
- clearTimeout(_this.timeout);
- if (!isFocus || _this.isClick && !_this.options.clickOpen) {
- _this.hide();
- }
- });
- }
-
- if (this.options.clickOpen) {
- this.$element.on('mousedown.zf.tooltip', function (e) {
- e.stopImmediatePropagation();
- if (_this.isClick) {
- //_this.hide();
- // _this.isClick = false;
- } else {
- _this.isClick = true;
- if ((_this.options.disableHover || !_this.$element.attr('tabindex')) && !_this.isActive) {
- _this.show();
- }
- }
- });
- } else {
- this.$element.on('mousedown.zf.tooltip', function (e) {
- e.stopImmediatePropagation();
- _this.isClick = true;
- });
- }
-
- if (!this.options.disableForTouch) {
- this.$element.on('tap.zf.tooltip touchend.zf.tooltip', function (e) {
- _this.isActive ? _this.hide() : _this.show();
- });
- }
-
- this.$element.on({
- // 'toggle.zf.trigger': this.toggle.bind(this),
- // 'close.zf.trigger': this.hide.bind(this)
- 'close.zf.trigger': this.hide.bind(this)
- });
-
- this.$element.on('focus.zf.tooltip', function (e) {
- isFocus = true;
- if (_this.isClick) {
- // If we're not showing open on clicks, we need to pretend a click-launched focus isn't
- // a real focus, otherwise on hover and come back we get bad behavior
- if (!_this.options.clickOpen) {
- isFocus = false;
- }
- return false;
- } else {
- _this.show();
- }
- }).on('focusout.zf.tooltip', function (e) {
- isFocus = false;
- _this.isClick = false;
- _this.hide();
- }).on('resizeme.zf.trigger', function () {
- if (_this.isActive) {
- _this._setPosition();
- }
- });
- }
-
- /**
- * adds a toggle method, in addition to the static show() & hide() functions
- * @function
- */
-
- }, {
- key: 'toggle',
- value: function toggle() {
- if (this.isActive) {
- this.hide();
- } else {
- this.show();
- }
- }
-
- /**
- * Destroys an instance of tooltip, removes template element from the view.
- * @function
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.$element.attr('title', this.template.text()).off('.zf.trigger .zf.tootip')
- // .removeClass('has-tip')
- .removeAttr('aria-describedby').removeAttr('data-yeti-box').removeAttr('data-toggle').removeAttr('data-resize');
-
- this.template.remove();
-
- Foundation.unregisterPlugin(this);
- }
- }]);
-
- return Tooltip;
- }();
-
- Tooltip.defaults = {
- disableForTouch: false,
- /**
- * Time, in ms, before a tooltip should open on hover.
- * @option
- * @example 200
- */
- hoverDelay: 200,
- /**
- * Time, in ms, a tooltip should take to fade into view.
- * @option
- * @example 150
- */
- fadeInDuration: 150,
- /**
- * Time, in ms, a tooltip should take to fade out of view.
- * @option
- * @example 150
- */
- fadeOutDuration: 150,
- /**
- * Disables hover events from opening the tooltip if set to true
- * @option
- * @example false
- */
- disableHover: false,
- /**
- * Optional addtional classes to apply to the tooltip template on init.
- * @option
- * @example 'my-cool-tip-class'
- */
- templateClasses: '',
- /**
- * Non-optional class added to tooltip templates. Foundation default is 'tooltip'.
- * @option
- * @example 'tooltip'
- */
- tooltipClass: 'tooltip',
- /**
- * Class applied to the tooltip anchor element.
- * @option
- * @example 'has-tip'
- */
- triggerClass: 'has-tip',
- /**
- * Minimum breakpoint size at which to open the tooltip.
- * @option
- * @example 'small'
- */
- showOn: 'small',
- /**
- * Custom template to be used to generate markup for tooltip.
- * @option
- * @example '&lt;div class="tooltip"&gt;&lt;/div&gt;'
- */
- template: '',
- /**
- * Text displayed in the tooltip template on open.
- * @option
- * @example 'Some cool space fact here.'
- */
- tipText: '',
- touchCloseText: 'Tap to close.',
- /**
- * Allows the tooltip to remain open if triggered with a click or touch event.
- * @option
- * @example true
- */
- clickOpen: true,
- /**
- * Additional positioning classes, set by the JS
- * @option
- * @example 'top'
- */
- positionClass: '',
- /**
- * Distance, in pixels, the template should push away from the anchor on the Y axis.
- * @option
- * @example 10
- */
- vOffset: 10,
- /**
- * Distance, in pixels, the template should push away from the anchor on the X axis, if aligned to a side.
- * @option
- * @example 12
- */
- hOffset: 12
- };
-
- /**
- * TODO utilize resize event trigger
- */
-
- // Window exports
- Foundation.plugin(Tooltip, 'Tooltip');
-}(jQuery); \ No newline at end of file
diff --git a/examplesite/themes/hugof/static/js/jquery.js b/examplesite/themes/hugof/static/js/jquery.js
deleted file mode 100644
index f942984..0000000
--- a/examplesite/themes/hugof/static/js/jquery.js
+++ /dev/null
@@ -1,9842 +0,0 @@
-/*!
- * jQuery JavaScript Library v2.2.2
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-03-17T17:51Z
- */
-
-(function( global, factory ) {
-
- if ( typeof module === "object" && typeof module.exports === "object" ) {
- // For CommonJS and CommonJS-like environments where a proper `window`
- // is present, execute the factory and get jQuery.
- // For environments that do not have a `window` with a `document`
- // (such as Node.js), expose a factory as module.exports.
- // This accentuates the need for the creation of a real `window`.
- // e.g. var jQuery = require("jquery")(window);
- // See ticket #14549 for more info.
- module.exports = global.document ?
- factory( global, true ) :
- function( w ) {
- if ( !w.document ) {
- throw new Error( "jQuery requires a window with a document" );
- }
- return factory( w );
- };
- } else {
- factory( global );
- }
-
-// Pass this if window is not defined yet
-}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Support: Firefox 18+
-// Can't be in strict mode, several libs including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-//"use strict";
-var arr = [];
-
-var document = window.document;
-
-var slice = arr.slice;
-
-var concat = arr.concat;
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var support = {};
-
-
-
-var
- version = "2.2.2",
-
- // Define a local copy of jQuery
- jQuery = function( selector, context ) {
-
- // The jQuery object is actually just the init constructor 'enhanced'
- // Need init if jQuery is called (just allow error to be thrown if not included)
- return new jQuery.fn.init( selector, context );
- },
-
- // Support: Android<4.1
- // Make sure we trim BOM and NBSP
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/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();
- };
-
-jQuery.fn = jQuery.prototype = {
-
- // The current version of jQuery being used
- jquery: version,
-
- constructor: jQuery,
-
- // Start with an empty selector
- selector: "",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- toArray: function() {
- return 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 just the one element from the set
- ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
-
- // Return all the elements in a clean array
- slice.call( this );
- },
-
- // 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.
- each: function( callback ) {
- return jQuery.each( this, callback );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map( this, function( elem, i ) {
- return callback.call( elem, i, elem );
- } ) );
- },
-
- slice: function() {
- return this.pushStack( 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 ] ] : [] );
- },
-
- end: function() {
- return this.prevObject || this.constructor();
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: arr.sort,
- splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[ 0 ] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
-
- // Skip the boolean and the target
- target = arguments[ i ] || {};
- i++;
- }
-
- // 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 ( i === length ) {
- 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
- expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
- // Assume jQuery is ready without the ready module
- isReady: true,
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- noop: function() {},
-
- isFunction: function( obj ) {
- return jQuery.type( obj ) === "function";
- },
-
- isArray: Array.isArray,
-
- isWindow: function( obj ) {
- return obj != null && obj === obj.window;
- },
-
- isNumeric: function( obj ) {
-
- // parseFloat NaNs numeric-cast false positives (null|true|false|"")
- // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
- // subtraction forces infinities to NaN
- // adding 1 corrects loss of precision from parseFloat (#15100)
- var realStringObj = obj && obj.toString();
- return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
- },
-
- isPlainObject: function( obj ) {
- var key;
-
- // Not plain objects:
- // - Any object or value whose internal [[Class]] property is not "[object Object]"
- // - DOM nodes
- // - window
- if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call( obj, "constructor" ) &&
- !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
- return false;
- }
-
- // 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 || hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- var name;
- for ( name in obj ) {
- return false;
- }
- return true;
- },
-
- type: function( obj ) {
- if ( obj == null ) {
- return obj + "";
- }
-
- // Support: Android<4.0, iOS<6 (functionish RegExp)
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ toString.call( obj ) ] || "object" :
- typeof obj;
- },
-
- // Evaluates a script in a global context
- globalEval: function( code ) {
- var script,
- indirect = eval;
-
- code = jQuery.trim( code );
-
- if ( code ) {
-
- // If the code includes a valid, prologue position
- // strict mode pragma, execute code by injecting a
- // script tag into the document.
- if ( code.indexOf( "use strict" ) === 1 ) {
- script = document.createElement( "script" );
- script.text = code;
- document.head.appendChild( script ).parentNode.removeChild( script );
- } else {
-
- // Otherwise, avoid the DOM node creation, insertion
- // and removal by using an indirect global eval
-
- indirect( code );
- }
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Support: IE9-11+
- // 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();
- },
-
- each: function( obj, callback ) {
- var length, i = 0;
-
- if ( isArrayLike( obj ) ) {
- length = obj.length;
- for ( ; i < length; i++ ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- } else {
- for ( i in obj ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- }
-
- return obj;
- },
-
- // Support: Android<4.1
- trim: 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 {
- push.call( ret, arr );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, arr, i ) {
- return arr == null ? -1 : indexOf.call( arr, elem, i );
- },
-
- merge: function( first, second ) {
- var len = +second.length,
- j = 0,
- i = first.length;
-
- for ( ; j < len; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, invert ) {
- var callbackInverse,
- matches = [],
- i = 0,
- length = elems.length,
- callbackExpect = !invert;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( ; i < length; i++ ) {
- callbackInverse = !callback( elems[ i ], i );
- if ( callbackInverse !== callbackExpect ) {
- matches.push( elems[ i ] );
- }
- }
-
- return matches;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var length, value,
- i = 0,
- ret = [];
-
- // Go through the array, translating each of the items to their new values
- if ( isArrayLike( elems ) ) {
- length = elems.length;
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( i in elems ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
- }
-
- // Flatten any nested arrays
- return 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 tmp, args, proxy;
-
- 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 = slice.call( arguments, 2 );
- proxy = function() {
- return fn.apply( context || this, args.concat( 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;
- },
-
- now: Date.now,
-
- // jQuery.support is not used in Core but other projects attach their
- // properties to it so it needs to exist.
- support: support
-} );
-
-// JSHint would error on this code due to the Symbol not being defined in ES5.
-// Defining this global in .jshintrc would create a danger of using the global
-// unguarded in another place, it seems safer to just disable JSHint for these
-// three lines.
-/* jshint ignore: start */
-if ( typeof Symbol === "function" ) {
- jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-/* jshint ignore: end */
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
- // Support: iOS 8.2 (not reproducible in simulator)
- // `in` check used to prevent JIT error (gh-2145)
- // hasOwn isn't used here due to false negatives
- // regarding Nodelist length in IE
- var length = !!obj && "length" in obj && obj.length,
- type = jQuery.type( obj );
-
- if ( type === "function" || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- return type === "array" || length === 0 ||
- typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.2.1
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2015-10-17
- */
-(function( window ) {
-
-var i,
- support,
- Expr,
- getText,
- isXML,
- tokenize,
- compile,
- select,
- outermostContext,
- sortInput,
- hasDuplicate,
-
- // Local document vars
- setDocument,
- document,
- docElem,
- documentIsHTML,
- rbuggyQSA,
- rbuggyMatches,
- matches,
- contains,
-
- // Instance-specific data
- expando = "sizzle" + 1 * new Date(),
- preferredDoc = window.document,
- dirruns = 0,
- done = 0,
- classCache = createCache(),
- tokenCache = createCache(),
- compilerCache = createCache(),
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- }
- return 0;
- },
-
- // General-purpose constants
- 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 as it's faster than native
- // http://jsperf.com/thor-indexof-vs-for/5
- indexOf = function( list, elem ) {
- var i = 0,
- len = list.length;
- for ( ; i < len; i++ ) {
- if ( list[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
-
- // http://www.w3.org/TR/css3-selectors/#whitespace
- whitespace = "[\\x20\\t\\r\\n\\f]",
-
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
- identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
- attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
- // Operator (capture 2)
- "*([*^$|!~]?=)" + whitespace +
- // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
- "*\\]",
-
- pseudos = ":(" + identifier + ")(?:\\((" +
- // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
- // 1. quoted (capture 3; capture 4 or capture 5)
- "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
- // 2. simple (capture 6)
- "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
- // 3. anything else (capture 2)
- ".*" +
- ")\\)|)",
-
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
- rwhitespace = new RegExp( whitespace + "+", "g" ),
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
- rpseudo = new RegExp( pseudos ),
- ridentifier = new RegExp( "^" + identifier + "$" ),
-
- matchExpr = {
- "ID": new RegExp( "^#(" + identifier + ")" ),
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
- "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" )
- },
-
- rinputs = /^(?:input|select|textarea|button)$/i,
- rheader = /^h\d$/i,
-
- rnative = /^[^{]+\{\s*\[native \w/,
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
- rsibling = /[+~]/,
- 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<24
- // Workaround erroneous numeric interpretation of +"0x"
- return high !== high || escapedWhitespace ?
- escaped :
- high < 0 ?
- // BMP codepoint
- String.fromCharCode( high + 0x10000 ) :
- // Supplemental Plane codepoint (surrogate pair)
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
- },
-
- // Used for iframes
- // See setDocument()
- // Removing the function wrapper causes a "Permission Denied"
- // error in IE
- unloadHandler = function() {
- setDocument();
- };
-
-// 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 m, i, elem, nid, nidselect, match, groups, newSelector,
- newContext = context && context.ownerDocument,
-
- // nodeType defaults to 9, since context defaults to document
- nodeType = context ? context.nodeType : 9;
-
- results = results || [];
-
- // Return early from calls with invalid selector or context
- if ( typeof selector !== "string" || !selector ||
- nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
- return results;
- }
-
- // Try to shortcut find operations (as opposed to filters) in HTML documents
- if ( !seed ) {
-
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
- setDocument( context );
- }
- context = context || document;
-
- if ( documentIsHTML ) {
-
- // If the selector is sufficiently simple, try using a "get*By*" DOM method
- // (excepting DocumentFragment context, where the methods don't exist)
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
- // ID selector
- if ( (m = match[1]) ) {
-
- // Document context
- if ( nodeType === 9 ) {
- if ( (elem = context.getElementById( m )) ) {
-
- // Support: IE, Opera, Webkit
- // TODO: identify versions
- // getElementById can match elements by name instead of ID
- if ( elem.id === m ) {
- results.push( elem );
- return results;
- }
- } else {
- return results;
- }
-
- // Element context
- } else {
-
- // Support: IE, Opera, Webkit
- // TODO: identify versions
- // getElementById can match elements by name instead of ID
- if ( newContext && (elem = newContext.getElementById( m )) &&
- contains( context, elem ) &&
- elem.id === m ) {
-
- results.push( elem );
- return results;
- }
- }
-
- // Type selector
- } else if ( match[2] ) {
- push.apply( results, context.getElementsByTagName( selector ) );
- return results;
-
- // Class selector
- } else if ( (m = match[3]) && support.getElementsByClassName &&
- context.getElementsByClassName ) {
-
- push.apply( results, context.getElementsByClassName( m ) );
- return results;
- }
- }
-
- // Take advantage of querySelectorAll
- if ( support.qsa &&
- !compilerCache[ selector + " " ] &&
- (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
- if ( nodeType !== 1 ) {
- newContext = context;
- newSelector = selector;
-
- // qSA looks outside Element context, which is not what we want
- // Thanks to Andrew Dupont for this workaround technique
- // Support: IE <=8
- // Exclude object elements
- } else if ( context.nodeName.toLowerCase() !== "object" ) {
-
- // Capture the context ID, setting it first if necessary
- if ( (nid = context.getAttribute( "id" )) ) {
- nid = nid.replace( rescape, "\\$&" );
- } else {
- context.setAttribute( "id", (nid = expando) );
- }
-
- // Prefix every selector in the list
- groups = tokenize( selector );
- i = groups.length;
- nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
- while ( i-- ) {
- groups[i] = nidselect + " " + toSelector( groups[i] );
- }
- newSelector = groups.join( "," );
-
- // Expand context for sibling selectors
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
- context;
- }
-
- if ( newSelector ) {
- try {
- push.apply( results,
- newContext.querySelectorAll( newSelector )
- );
- return results;
- } catch ( qsaError ) {
- } finally {
- if ( nid === expando ) {
- context.removeAttribute( "id" );
- }
- }
- }
- }
- }
- }
-
- // All others
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * 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
- */
-function addHandle( attrs, handler ) {
- var arr = attrs.split("|"),
- i = arr.length;
-
- while ( i-- ) {
- Expr.attrHandle[ arr[i] ] = handler;
- }
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 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]);
- }
- }
- });
- });
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
- return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-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;
-};
-
-/**
- * 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 hasCompare, parent,
- doc = node ? node.ownerDocument || node : preferredDoc;
-
- // Return early if doc is invalid or already selected
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
- return document;
- }
-
- // Update global variables
- document = doc;
- docElem = document.documentElement;
- documentIsHTML = !isXML( document );
-
- // Support: IE 9-11, Edge
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
- if ( (parent = document.defaultView) && parent.top !== parent ) {
- // Support: IE 11
- if ( parent.addEventListener ) {
- parent.addEventListener( "unload", unloadHandler, false );
-
- // Support: IE 9 - 10 only
- } else if ( parent.attachEvent ) {
- parent.attachEvent( "onunload", unloadHandler );
- }
- }
-
- /* Attributes
- ---------------------------------------------------------------------- */
-
- // Support: IE<8
- // Verify that getAttribute really returns attributes and not properties
- // (excepting IE8 booleans)
- support.attributes = assert(function( div ) {
- div.className = "i";
- return !div.getAttribute("className");
- });
-
- /* getElement(s)By*
- ---------------------------------------------------------------------- */
-
- // Check if getElementsByTagName("*") returns only elements
- support.getElementsByTagName = assert(function( div ) {
- div.appendChild( document.createComment("") );
- return !div.getElementsByTagName("*").length;
- });
-
- // Support: IE<9
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
- // 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 !document.getElementsByName || !document.getElementsByName( expando ).length;
- });
-
- // ID find and filter
- if ( support.getById ) {
- Expr.find["ID"] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var m = context.getElementById( id );
- return m ? [ 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 !== "undefined" &&
- elem.getAttributeNode("id");
- return node && node.value === attrId;
- };
- };
- }
-
- // Tag
- Expr.find["TAG"] = support.getElementsByTagName ?
- function( tag, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( tag );
-
- // DocumentFragment nodes don't have gEBTN
- } else if ( support.qsa ) {
- return context.querySelectorAll( tag );
- }
- } :
-
- function( tag, context ) {
- var elem,
- tmp = [],
- i = 0,
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
- 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 !== "undefined" && 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 = rnative.test( document.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
- docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
- "<option selected=''></option></select>";
-
- // Support: IE8, Opera 11-12.16
- // Nothing should be selected when empty strings follow ^= or $= or *=
- // The test attribute must be unknown in Opera but "safe" for WinRT
- // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
- if ( div.querySelectorAll("[msallowcapture^='']").length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
- }
-
- // Support: IE8
- // Boolean attributes and "value" are not treated correctly
- if ( !div.querySelectorAll("[selected]").length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
- }
-
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
- if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
- rbuggyQSA.push("~=");
- }
-
- // 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");
- }
-
- // Support: Safari 8+, iOS 8+
- // https://bugs.webkit.org/show_bug.cgi?id=136851
- // In-page `selector#id sibing-combinator selector` fails
- if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
- rbuggyQSA.push(".#.+[+~]");
- }
- });
-
- assert(function( div ) {
- // Support: Windows 8 Native Apps
- // The type and name attributes are restricted during .innerHTML assignment
- var input = document.createElement("input");
- input.setAttribute( "type", "hidden" );
- div.appendChild( input ).setAttribute( "name", "D" );
-
- // Support: IE8
- // Enforce case-sensitivity of name attribute
- if ( div.querySelectorAll("[name=d]").length ) {
- rbuggyQSA.push( "name" + 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 = rnative.test( (matches = docElem.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
- ---------------------------------------------------------------------- */
- hasCompare = rnative.test( docElem.compareDocumentPosition );
-
- // Element contains another
- // Purposefully self-exclusive
- // As in, an element does not contain itself
- contains = hasCompare || rnative.test( docElem.contains ) ?
- 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
- ---------------------------------------------------------------------- */
-
- // Document order sorting
- sortOrder = hasCompare ?
- function( a, b ) {
-
- // Flag for duplicate removal
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- // Sort on method existence if only one input has compareDocumentPosition
- var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
- if ( compare ) {
- return compare;
- }
-
- // Calculate position if both inputs belong to the same document
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
- a.compareDocumentPosition( b ) :
-
- // Otherwise we know they are disconnected
- 1;
-
- // Disconnected nodes
- if ( compare & 1 ||
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
- // Choose the first element that is related to our preferred document
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
- return -1;
- }
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
- return 1;
- }
-
- // Maintain original order
- return sortInput ?
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
- 0;
- }
-
- return compare & 4 ? -1 : 1;
- } :
- function( a, b ) {
- // Exit early if the nodes are identical
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- var cur,
- i = 0,
- aup = a.parentNode,
- bup = b.parentNode,
- ap = [ a ],
- bp = [ b ];
-
- // Parentless nodes are either documents or disconnected
- if ( !aup || !bup ) {
- return a === document ? -1 :
- b === document ? 1 :
- aup ? -1 :
- bup ? 1 :
- sortInput ?
- ( indexOf( sortInput, a ) - indexOf( 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 document;
-};
-
-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 &&
- !compilerCache[ expr + " " ] &&
- ( !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 ?
- val :
- support.attributes || !documentIsHTML ?
- elem.getAttribute( name ) :
- (val = elem.getAttributeNode(name)) && val.specified ?
- val.value :
- null;
-};
-
-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 );
- }
- }
-
- // Clear input after sorting to release objects
- // See https://github.com/jquery/sizzle/pull/225
- sortInput = null;
-
- 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
- while ( (node = elem[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 (jQuery #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[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[6] && match[2];
-
- if ( matchExpr["CHILD"].test( match[0] ) ) {
- return null;
- }
-
- // Accept quoted arguments as-is
- if ( match[3] ) {
- match[2] = match[4] || match[5] || "";
-
- // 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 !== "undefined" && 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.replace( rwhitespace, " " ) + " " ).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, uniqueCache, outerCache, node, nodeIndex, start,
- dir = simple !== forward ? "nextSibling" : "previousSibling",
- parent = elem.parentNode,
- name = ofType && elem.nodeName.toLowerCase(),
- useCache = !xml && !ofType,
- diff = false;
-
- 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
-
- // ...in a gzip-friendly way
- node = parent;
- outerCache = node[ expando ] || (node[ expando ] = {});
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
-
- cache = uniqueCache[ type ] || [];
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
- diff = nodeIndex && 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 ) {
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
- break;
- }
- }
-
- } else {
- // Use previously-cached element index if available
- if ( useCache ) {
- // ...in a gzip-friendly way
- node = elem;
- outerCache = node[ expando ] || (node[ expando ] = {});
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
-
- cache = uniqueCache[ type ] || [];
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
- diff = nodeIndex;
- }
-
- // xml :nth-child(...)
- // or :nth-last-child(...) or :nth(-last)?-of-type(...)
- if ( diff === false ) {
- // 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 ) {
- outerCache = node[ expando ] || (node[ expando ] = {});
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
-
- uniqueCache[ 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( 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 );
- // Don't keep the element (issue #299)
- input[0] = null;
- return !results.pop();
- };
- }),
-
- "has": markFunction(function( selector ) {
- return function( elem ) {
- return Sizzle( selector, elem ).length > 0;
- };
- }),
-
- "contains": markFunction(function( text ) {
- text = text.replace( runescape, funescape );
- 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 negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
- // but not by others (comment: 8; processing instruction: 7; etc.)
- // nodeType < 6 works because attributes (2) do not appear as children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- if ( elem.nodeType < 6 ) {
- 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;
- return elem.nodeName.toLowerCase() === "input" &&
- elem.type === "text" &&
-
- // Support: IE<8
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
- },
-
- // 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;
- })
- }
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// 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 );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( 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 oldCache, uniqueCache, outerCache,
- newCache = [ dirruns, doneName ];
-
- // We can't set arbitrary data on XML nodes, so they don't benefit from combinator 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 ] = {});
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
- if ( (oldCache = uniqueCache[ dir ]) &&
- oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
- // Assign to newCache so results back-propagate to previous elements
- return (newCache[ 2 ] = oldCache[ 2 ]);
- } else {
- // Reuse newcache so results back-propagate to previous elements
- uniqueCache[ dir ] = newCache;
-
- // A match means we're done; a fail means we have to keep checking
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
- 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 multipleContexts( selector, contexts, results ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results );
- }
- return results;
-}
-
-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( 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( checkContext, elem ) > -1;
- }, implicitRelative, true ),
- matchers = [ function( elem, context, xml ) {
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- (checkContext = context).nodeType ?
- matchContext( elem, context, xml ) :
- matchAnyContext( elem, context, xml ) );
- // Avoid hanging onto element (issue #299)
- checkContext = null;
- return ret;
- } ];
-
- 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 ) {
- var bySet = setMatchers.length > 0,
- byElement = elementMatchers.length > 0,
- superMatcher = function( seed, context, xml, results, outermost ) {
- var elem, j, matcher,
- matchedCount = 0,
- i = "0",
- unmatched = seed && [],
- setMatched = [],
- contextBackup = outermostContext,
- // We must always have either seed elements or outermost context
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
- // Use integer dirruns iff this is the outermost matcher
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
- len = elems.length;
-
- if ( outermost ) {
- outermostContext = context === document || context || outermost;
- }
-
- // Add elements passing elementMatchers directly to results
- // Support: IE<9, Safari
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
- if ( byElement && elem ) {
- j = 0;
- if ( !context && elem.ownerDocument !== document ) {
- setDocument( elem );
- xml = !documentIsHTML;
- }
- while ( (matcher = elementMatchers[j++]) ) {
- if ( matcher( elem, context || document, xml) ) {
- results.push( elem );
- break;
- }
- }
- if ( outermost ) {
- dirruns = dirrunsUnique;
- }
- }
-
- // 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 );
- }
- }
- }
-
- // `i` is now the count of elements visited above, and adding it to `matchedCount`
- // makes the latter nonnegative.
- matchedCount += i;
-
- // Apply set filters to unmatched elements
- // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
- // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
- // no element matchers and no seed.
- // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
- // case, which will result in a "00" `matchedCount` that differs from `i` but is also
- // numerically zero.
- 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, match /* 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 ( !match ) {
- match = tokenize( selector );
- }
- i = match.length;
- while ( i-- ) {
- cached = matcherFromTokens( match[i] );
- if ( cached[ expando ] ) {
- setMatchers.push( cached );
- } else {
- elementMatchers.push( cached );
- }
- }
-
- // Cache the compiled function
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
- // Save selector and tokenization
- cached.selector = selector;
- }
- return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- * selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- * selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
- var i, tokens, token, type, find,
- compiled = typeof selector === "function" && selector,
- match = !seed && tokenize( (selector = compiled.selector || selector) );
-
- results = results || [];
-
- // Try to minimize operations if there is only one selector in the list and no seed
- // (the latter of which guarantees us context)
- if ( match.length === 1 ) {
-
- // Reduce context if the leading compound 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;
-
- // Precompiled matchers will still verify ancestry, so step up a level
- } else if ( compiled ) {
- context = context.parentNode;
- }
-
- 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 ) && testContext( 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 if one is not provided
- // Provide `match` to avoid retokenization if we modified the selector above
- ( compiled || compile( selector, match ) )(
- seed,
- context,
- !documentIsHTML,
- results,
- !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
- );
- return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// 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( document.createElement("div") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( div ) {
- div.innerHTML = "<a href='#'></a>";
- return div.firstChild.getAttribute("href") === "#" ;
-}) ) {
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
- if ( !isXML ) {
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
- }
- });
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( div ) {
- div.innerHTML = "<input/>";
- div.firstChild.setAttribute( "value", "" );
- return div.firstChild.getAttribute( "value" ) === "";
-}) ) {
- addHandle( "value", function( elem, name, isXML ) {
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
- return elem.defaultValue;
- }
- });
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( div ) {
- return div.getAttribute("disabled") == null;
-}) ) {
- addHandle( booleans, function( elem, name, isXML ) {
- var val;
- if ( !isXML ) {
- return elem[ name ] === true ? name.toLowerCase() :
- (val = elem.getAttributeNode( name )) && val.specified ?
- val.value :
- null;
- }
- });
-}
-
-return Sizzle;
-
-})( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-
-var dir = function( elem, dir, until ) {
- var matched = [],
- truncate = until !== undefined;
-
- while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
- if ( elem.nodeType === 1 ) {
- if ( truncate && jQuery( elem ).is( until ) ) {
- break;
- }
- matched.push( elem );
- }
- }
- return matched;
-};
-
-
-var siblings = function( n, elem ) {
- var matched = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- matched.push( n );
- }
- }
-
- return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
-
-
-
-var risSimple = /^.[^:#\[\.,]*$/;
-
-// 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 ( risSimple.test( qualifier ) ) {
- return jQuery.filter( qualifier, elements, not );
- }
-
- qualifier = jQuery.filter( qualifier, elements );
- }
-
- return jQuery.grep( elements, function( elem ) {
- return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
- } );
-}
-
-jQuery.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;
- } ) );
-};
-
-jQuery.fn.extend( {
- find: function( selector ) {
- var i,
- len = this.length,
- ret = [],
- self = this;
-
- 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;
- },
- filter: function( selector ) {
- return this.pushStack( winnow( this, selector || [], false ) );
- },
- not: function( selector ) {
- return this.pushStack( winnow( this, selector || [], true ) );
- },
- 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;
- }
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
- // 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-]*))$/,
-
- init = jQuery.fn.init = function( selector, context, root ) {
- var match, elem;
-
- // HANDLE: $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // Method init() accepts an alternate rootjQuery
- // so migrate can support jQuery.sub (gh-2101)
- root = root || rootjQuery;
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector[ 0 ] === "<" &&
- selector[ 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;
-
- // Option to run scripts is true for back-compat
- // Intentionally let the error be thrown if parseHTML is not present
- 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 ] );
-
- // Support: Blackberry 4.6
- // gEBID returns nodes no longer in the document (#6963)
- if ( elem && elem.parentNode ) {
-
- // 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 || root ).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 root.ready !== undefined ?
- root.ready( selector ) :
-
- // Execute immediately if ready is not present
- selector( jQuery );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- };
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
- // 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( {
- has: function( target ) {
- var targets = jQuery( target, this ),
- l = targets.length;
-
- return this.filter( function() {
- var i = 0;
- for ( ; i < l; i++ ) {
- if ( jQuery.contains( this, targets[ i ] ) ) {
- return true;
- }
- }
- } );
- },
-
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- matched = [],
- 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 ) ) ) {
-
- matched.push( cur );
- break;
- }
- }
- }
-
- return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
- },
-
- // Determine the position of an element within the set
- 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 indexOf.call( jQuery( elem ), this[ 0 ] );
- }
-
- // Locate the position of the desired element
- return indexOf.call( this,
-
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[ 0 ] : elem
- );
- },
-
- add: function( selector, context ) {
- return this.pushStack(
- jQuery.uniqueSort(
- jQuery.merge( this.get(), jQuery( selector, context ) )
- )
- );
- },
-
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
- );
- }
-} );
-
-function sibling( cur, dir ) {
- while ( ( cur = cur[ dir ] ) && 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 dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return siblings( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return siblings( elem.firstChild );
- },
- contents: function( elem ) {
- return elem.contentDocument || jQuery.merge( [], elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var matched = jQuery.map( this, fn, until );
-
- if ( name.slice( -5 ) !== "Until" ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- matched = jQuery.filter( selector, matched );
- }
-
- if ( this.length > 1 ) {
-
- // Remove duplicates
- if ( !guaranteedUnique[ name ] ) {
- jQuery.uniqueSort( matched );
- }
-
- // Reverse order for parents* and prev-derivatives
- if ( rparentsprev.test( name ) ) {
- matched.reverse();
- }
- }
-
- return this.pushStack( matched );
- };
-} );
-var rnotwhite = ( /\S+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
- var object = {};
- jQuery.each( options.match( 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" ?
- 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,
-
- // Flag to prevent firing
- locked,
-
- // Actual callback list
- list = [],
-
- // Queue of execution data for repeatable lists
- queue = [],
-
- // Index of currently firing callback (modified by add/remove as needed)
- firingIndex = -1,
-
- // Fire callbacks
- fire = function() {
-
- // Enforce single-firing
- locked = options.once;
-
- // Execute callbacks for all pending executions,
- // respecting firingIndex overrides and runtime changes
- fired = firing = true;
- for ( ; queue.length; firingIndex = -1 ) {
- memory = queue.shift();
- while ( ++firingIndex < list.length ) {
-
- // Run callback and check for early termination
- if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
- options.stopOnFalse ) {
-
- // Jump to end and forget the data so .add doesn't re-fire
- firingIndex = list.length;
- memory = false;
- }
- }
- }
-
- // Forget the data if we're done with it
- if ( !options.memory ) {
- memory = false;
- }
-
- firing = false;
-
- // Clean up if we're done firing for good
- if ( locked ) {
-
- // Keep an empty list if we have data for future add calls
- if ( memory ) {
- list = [];
-
- // Otherwise, this object is spent
- } else {
- list = "";
- }
- }
- },
-
- // Actual Callbacks object
- self = {
-
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
-
- // If we have memory from a past run, we should fire after adding
- if ( memory && !firing ) {
- firingIndex = list.length - 1;
- queue.push( memory );
- }
-
- ( function add( args ) {
- jQuery.each( args, function( _, arg ) {
- if ( jQuery.isFunction( arg ) ) {
- if ( !options.unique || !self.has( arg ) ) {
- list.push( arg );
- }
- } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
-
- // Inspect recursively
- add( arg );
- }
- } );
- } )( arguments );
-
- if ( memory && !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Remove a callback from the list
- remove: function() {
- jQuery.each( arguments, function( _, arg ) {
- var index;
- while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
- list.splice( index, 1 );
-
- // Handle firing indexes
- 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.length > 0;
- },
-
- // Remove all callbacks from the list
- empty: function() {
- if ( list ) {
- list = [];
- }
- return this;
- },
-
- // Disable .fire and .add
- // Abort any current/pending executions
- // Clear all callbacks and values
- disable: function() {
- locked = queue = [];
- list = memory = "";
- return this;
- },
- disabled: function() {
- return !list;
- },
-
- // Disable .fire
- // Also disable .add unless we have memory (since it would have no effect)
- // Abort any pending executions
- lock: function() {
- locked = queue = [];
- if ( !memory ) {
- list = memory = "";
- }
- return this;
- },
- locked: function() {
- return !!locked;
- },
-
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- if ( !locked ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
- queue.push( args );
- if ( !firing ) {
- fire();
- }
- }
- 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 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()
- .progress( newDefer.notify )
- .done( newDefer.resolve )
- .fail( newDefer.reject );
- } else {
- newDefer[ tuple[ 0 ] + "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 = 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 ? 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()
- .progress( updateFunc( i, progressContexts, progressValues ) )
- .done( updateFunc( i, resolveContexts, resolveValues ) )
- .fail( deferred.reject );
- } else {
- --remaining;
- }
- }
- }
-
- // If we're not waiting on anything, resolve the master
- if ( !remaining ) {
- deferred.resolveWith( resolveContexts, resolveValues );
- }
-
- return deferred.promise();
- }
-} );
-
-
-// The deferred used on DOM ready
-var readyList;
-
-jQuery.fn.ready = function( fn ) {
-
- // Add the callback
- jQuery.ready.promise().done( fn );
-
- return this;
-};
-
-jQuery.extend( {
-
- // 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;
- }
-
- // 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.triggerHandler ) {
- jQuery( document ).triggerHandler( "ready" );
- jQuery( document ).off( "ready" );
- }
- }
-} );
-
-/**
- * The ready event handler and self cleanup method
- */
-function completed() {
- document.removeEventListener( "DOMContentLoaded", completed );
- window.removeEventListener( "load", completed );
- jQuery.ready();
-}
-
-jQuery.ready.promise = function( obj ) {
- if ( !readyList ) {
-
- readyList = jQuery.Deferred();
-
- // Catch cases where $(document).ready() is called
- // after the browser event has already occurred.
- // Support: IE9-10 only
- // Older IE sometimes signals "interactive" too soon
- if ( document.readyState === "complete" ||
- ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- window.setTimeout( jQuery.ready );
-
- } else {
-
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", completed );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", completed );
- }
- }
- return readyList.promise( obj );
-};
-
-// Kick off the DOM ready check even if the user does not
-jQuery.ready.promise();
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
- var i = 0,
- len = elems.length,
- bulk = key == null;
-
- // Sets many values
- if ( jQuery.type( key ) === "object" ) {
- chainable = true;
- for ( i in key ) {
- 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 < len; i++ ) {
- fn(
- elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
- );
- }
- }
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-var acceptData = function( owner ) {
-
- // Accepts only:
- // - Node
- // - Node.ELEMENT_NODE
- // - Node.DOCUMENT_NODE
- // - Object
- // - Any
- /* jshint -W018 */
- return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-
-
-
-function Data() {
- this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
- register: function( owner, initial ) {
- var value = initial || {};
-
- // If it is a node unlikely to be stringify-ed or looped over
- // use plain assignment
- if ( owner.nodeType ) {
- owner[ this.expando ] = value;
-
- // Otherwise secure it in a non-enumerable, non-writable property
- // configurability must be true to allow the property to be
- // deleted with the delete operator
- } else {
- Object.defineProperty( owner, this.expando, {
- value: value,
- writable: true,
- configurable: true
- } );
- }
- return owner[ this.expando ];
- },
- cache: function( owner ) {
-
- // We can accept data for non-element nodes in modern browsers,
- // but we should not, see #8335.
- // Always return an empty object.
- if ( !acceptData( owner ) ) {
- return {};
- }
-
- // Check if the owner object already has a cache
- var value = owner[ this.expando ];
-
- // If not, create one
- if ( !value ) {
- value = {};
-
- // We can accept data for non-element nodes in modern browsers,
- // but we should not, see #8335.
- // Always return an empty object.
- if ( acceptData( owner ) ) {
-
- // If it is a node unlikely to be stringify-ed or looped over
- // use plain assignment
- if ( owner.nodeType ) {
- owner[ this.expando ] = value;
-
- // Otherwise secure it in a non-enumerable property
- // configurable must be true to allow the property to be
- // deleted when data is removed
- } else {
- Object.defineProperty( owner, this.expando, {
- value: value,
- configurable: true
- } );
- }
- }
- }
-
- return value;
- },
- set: function( owner, data, value ) {
- var prop,
- cache = this.cache( owner );
-
- // Handle: [ owner, key, value ] args
- if ( typeof data === "string" ) {
- cache[ data ] = value;
-
- // Handle: [ owner, { properties } ] args
- } else {
-
- // Copy the properties one-by-one to the cache object
- for ( prop in data ) {
- cache[ prop ] = data[ prop ];
- }
- }
- return cache;
- },
- get: function( owner, key ) {
- return key === undefined ?
- this.cache( owner ) :
- owner[ this.expando ] && owner[ this.expando ][ key ];
- },
- access: function( owner, key, value ) {
- var stored;
-
- // In cases where either:
- //
- // 1. No key was specified
- // 2. A string key was specified, but no value provided
- //
- // Take the "read" path and allow the get method to determine
- // which value to return, respectively either:
- //
- // 1. The entire cache object
- // 2. The data stored at the key
- //
- if ( key === undefined ||
- ( ( key && typeof key === "string" ) && value === undefined ) ) {
-
- stored = this.get( owner, key );
-
- return stored !== undefined ?
- stored : this.get( owner, jQuery.camelCase( key ) );
- }
-
- // When the key is not a string, or both a key and value
- // are specified, set or extend (existing objects) with either:
- //
- // 1. An object of properties
- // 2. A key and value
- //
- this.set( owner, key, value );
-
- // Since the "set" path can have two possible entry points
- // return the expected data based on which path was taken[*]
- return value !== undefined ? value : key;
- },
- remove: function( owner, key ) {
- var i, name, camel,
- cache = owner[ this.expando ];
-
- if ( cache === undefined ) {
- return;
- }
-
- if ( key === undefined ) {
- this.register( owner );
-
- } else {
-
- // Support array or space separated string of keys
- if ( jQuery.isArray( key ) ) {
-
- // 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 = key.concat( key.map( jQuery.camelCase ) );
- } else {
- camel = jQuery.camelCase( key );
-
- // Try the string as a key before any manipulation
- if ( key in cache ) {
- name = [ key, camel ];
- } else {
-
- // If a key with the spaces exists, use it.
- // Otherwise, create an array by matching non-whitespace
- name = camel;
- name = name in cache ?
- [ name ] : ( name.match( rnotwhite ) || [] );
- }
- }
-
- i = name.length;
-
- while ( i-- ) {
- delete cache[ name[ i ] ];
- }
- }
-
- // Remove the expando if there's no more data
- if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
- // Support: Chrome <= 35-45+
- // Webkit & Blink performance suffers when deleting properties
- // from DOM nodes, so set to undefined instead
- // https://code.google.com/p/chromium/issues/detail?id=378607
- if ( owner.nodeType ) {
- owner[ this.expando ] = undefined;
- } else {
- delete owner[ this.expando ];
- }
- }
- },
- hasData: function( owner ) {
- var cache = owner[ this.expando ];
- return cache !== undefined && !jQuery.isEmptyObject( cache );
- }
-};
-var dataPriv = new Data();
-
-var dataUser = new Data();
-
-
-
-// Implementation Summary
-//
-// 1. Enforce API surface and semantic compatibility with 1.9.x branch
-// 2. Improve the module's maintainability by reducing the storage
-// paths to a single mechanism.
-// 3. Use the same single mechanism to support "private" and "user" data.
-// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-// 5. Avoid exposing implementation details on user objects (eg. expando properties)
-// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
- rmultiDash = /[A-Z]/g;
-
-function dataAttr( elem, key, data ) {
- var name;
-
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
- name = "data-" + key.replace( rmultiDash, "-$&" ).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
- dataUser.set( elem, key, data );
- } else {
- data = undefined;
- }
- }
- return data;
-}
-
-jQuery.extend( {
- hasData: function( elem ) {
- return dataUser.hasData( elem ) || dataPriv.hasData( elem );
- },
-
- data: function( elem, name, data ) {
- return dataUser.access( elem, name, data );
- },
-
- removeData: function( elem, name ) {
- dataUser.remove( elem, name );
- },
-
- // TODO: Now that all calls to _data and _removeData have been replaced
- // with direct calls to dataPriv methods, these can be deprecated.
- _data: function( elem, name, data ) {
- return dataPriv.access( elem, name, data );
- },
-
- _removeData: function( elem, name ) {
- dataPriv.remove( elem, name );
- }
-} );
-
-jQuery.fn.extend( {
- data: function( key, value ) {
- var i, name, data,
- elem = this[ 0 ],
- attrs = elem && elem.attributes;
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = dataUser.get( elem );
-
- if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
- i = attrs.length;
- while ( i-- ) {
-
- // Support: IE11+
- // The attrs elements can be null (#14894)
- if ( attrs[ i ] ) {
- name = attrs[ i ].name;
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.slice( 5 ) );
- dataAttr( elem, name, data[ name ] );
- }
- }
- }
- dataPriv.set( elem, "hasDataAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each( function() {
- dataUser.set( this, key );
- } );
- }
-
- return access( this, function( value ) {
- var data, camelKey;
-
- // The calling jQuery object (element matches) is not empty
- // (and therefore has an element appears at this[ 0 ]) and the
- // `value` parameter was not undefined. An empty jQuery object
- // will result in `undefined` for elem = this[ 0 ] which will
- // throw an exception if an attempt to read a data cache is made.
- if ( elem && value === undefined ) {
-
- // Attempt to get data from the cache
- // with the key as-is
- data = dataUser.get( elem, key ) ||
-
- // Try to find dashed key if it exists (gh-2779)
- // This is for 2.2.x only
- dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );
-
- if ( data !== undefined ) {
- return data;
- }
-
- camelKey = jQuery.camelCase( key );
-
- // Attempt to get data from the cache
- // with the key camelized
- data = dataUser.get( elem, camelKey );
- if ( data !== undefined ) {
- return data;
- }
-
- // Attempt to "discover" the data in
- // HTML5 custom data-* attrs
- data = dataAttr( elem, camelKey, undefined );
- if ( data !== undefined ) {
- return data;
- }
-
- // We tried really hard, but the data doesn't exist.
- return;
- }
-
- // Set the data...
- camelKey = jQuery.camelCase( key );
- this.each( function() {
-
- // First, attempt to store a copy or reference of any
- // data that might've been store with a camelCased key.
- var data = dataUser.get( this, camelKey );
-
- // For HTML5 data-* attribute interop, we have to
- // store property names with dashes in a camelCase form.
- // This might not apply to all properties...*
- dataUser.set( this, camelKey, value );
-
- // *... In the case of properties that might _actually_
- // have dashes, we need to also store a copy of that
- // unchanged property.
- if ( key.indexOf( "-" ) > -1 && data !== undefined ) {
- dataUser.set( this, key, value );
- }
- } );
- }, null, value, arguments.length > 1, null, true );
- },
-
- removeData: function( key ) {
- return this.each( function() {
- dataUser.remove( this, key );
- } );
- }
-} );
-
-
-jQuery.extend( {
- queue: function( elem, type, data ) {
- var queue;
-
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- queue = dataPriv.get( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !queue || jQuery.isArray( data ) ) {
- queue = dataPriv.access( 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 public - generate a queueHooks object, or return the current one
- _queueHooks: function( elem, type ) {
- var key = type + "queueHooks";
- return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
- empty: jQuery.Callbacks( "once memory" ).add( function() {
- dataPriv.remove( elem, [ type + "queue", 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 );
- } );
- },
- 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 = dataPriv.get( elements[ i ], type + "queueHooks" );
- if ( tmp && tmp.empty ) {
- count++;
- tmp.empty.add( resolve );
- }
- }
- resolve();
- return defer.promise( obj );
- }
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var isHidden = function( 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 adjustCSS( elem, prop, valueParts, tween ) {
- var adjusted,
- scale = 1,
- maxIterations = 20,
- currentValue = tween ?
- function() { return tween.cur(); } :
- function() { return jQuery.css( elem, prop, "" ); },
- initial = currentValue(),
- unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
- // Starting value computation is required for potential unit mismatches
- initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
- rcssNum.exec( jQuery.css( elem, prop ) );
-
- if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
- // Trust units reported by jQuery.css
- unit = unit || initialInUnit[ 3 ];
-
- // Make sure we update the tween properties later on
- valueParts = valueParts || [];
-
- // Iteratively approximate from a nonzero starting point
- initialInUnit = +initial || 1;
-
- do {
-
- // If previous iteration zeroed out, double until we get *something*.
- // Use string for doubling so we don't accidentally see scale as unchanged below
- scale = scale || ".5";
-
- // Adjust and apply
- initialInUnit = initialInUnit / scale;
- jQuery.style( elem, prop, initialInUnit + unit );
-
- // Update scale, tolerating zero or NaN from tween.cur()
- // Break the loop if scale is unchanged or perfect, or if we've just had enough.
- } while (
- scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
- );
- }
-
- if ( valueParts ) {
- initialInUnit = +initialInUnit || +initial || 0;
-
- // Apply relative offset (+=/-=) if specified
- adjusted = valueParts[ 1 ] ?
- initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
- +valueParts[ 2 ];
- if ( tween ) {
- tween.unit = unit;
- tween.start = initialInUnit;
- tween.end = adjusted;
- }
- }
- return adjusted;
-}
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([\w:-]+)/ );
-
-var rscriptType = ( /^$|\/(?:java|ecma)script/i );
-
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
- // Support: IE9
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
-
- // XHTML parsers do not magically insert elements in the
- // same way that tag soup parsers do. So we cannot shorten
- // this by omitting <tbody> or other required elements.
- 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, "", "" ]
-};
-
-// Support: IE9
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-
-function getAll( context, tag ) {
-
- // Support: IE9-11+
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
- var ret = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( tag || "*" ) :
- typeof context.querySelectorAll !== "undefined" ?
- context.querySelectorAll( tag || "*" ) :
- [];
-
- return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
- jQuery.merge( [ context ], ret ) :
- ret;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
- var i = 0,
- l = elems.length;
-
- for ( ; i < l; i++ ) {
- dataPriv.set(
- elems[ i ],
- "globalEval",
- !refElements || dataPriv.get( refElements[ i ], "globalEval" )
- );
- }
-}
-
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
- var elem, tmp, tag, wrap, contains, j,
- fragment = context.createDocumentFragment(),
- nodes = [],
- i = 0,
- l = elems.length;
-
- for ( ; i < l; i++ ) {
- elem = elems[ i ];
-
- if ( elem || elem === 0 ) {
-
- // Add nodes directly
- if ( jQuery.type( elem ) === "object" ) {
-
- // Support: Android<4.1, PhantomJS<2
- // push.apply(_, arraylike) throws on ancient WebKit
- 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 || fragment.appendChild( context.createElement( "div" ) );
-
- // Deserialize a standard representation
- tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
- wrap = wrapMap[ tag ] || wrapMap._default;
- tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
- // Descend through wrappers to the right content
- j = wrap[ 0 ];
- while ( j-- ) {
- tmp = tmp.lastChild;
- }
-
- // Support: Android<4.1, PhantomJS<2
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( nodes, tmp.childNodes );
-
- // Remember the top-level container
- tmp = fragment.firstChild;
-
- // Ensure the created nodes are orphaned (#12392)
- tmp.textContent = "";
- }
- }
- }
-
- // Remove wrapper from fragment
- fragment.textContent = "";
-
- i = 0;
- while ( ( elem = nodes[ i++ ] ) ) {
-
- // Skip elements already in the context collection (trac-4087)
- if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
- if ( ignored ) {
- ignored.push( elem );
- }
- continue;
- }
-
- contains = jQuery.contains( elem.ownerDocument, elem );
-
- // Append to fragment
- tmp = getAll( fragment.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 );
- }
- }
- }
- }
-
- return fragment;
-}
-
-
-( function() {
- var fragment = document.createDocumentFragment(),
- div = fragment.appendChild( document.createElement( "div" ) ),
- input = document.createElement( "input" );
-
- // Support: Android 4.0-4.3, Safari<=5.1
- // Check state lost if the name is set (#11217)
- // Support: Windows Web Apps (WWA)
- // `name` and `type` must use .setAttribute for WWA (#14901)
- input.setAttribute( "type", "radio" );
- input.setAttribute( "checked", "checked" );
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
-
- // Support: Safari<=5.1, Android<4.2
- // Older WebKit doesn't clone checked state correctly in fragments
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Support: IE<=11+
- // Make sure textarea (and checkbox) defaultValue is properly cloned
- div.innerHTML = "<textarea>x</textarea>";
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-
-
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
- return true;
-}
-
-function returnFalse() {
- return false;
-}
-
-// Support: IE9
-// See #13393 for more info
-function safeActiveElement() {
- try {
- return document.activeElement;
- } catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
- var origFn, type;
-
- // 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 ) {
- on( elem, type, selector, data, types[ type ], one );
- }
- return elem;
- }
-
- 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 elem;
- }
-
- 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 elem.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- } );
-}
-
-/*
- * 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 handleObjIn, eventHandle, tmp,
- events, t, handleObj,
- special, handlers, type, namespaces, origType,
- elemData = dataPriv.get( 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 !== "undefined" && jQuery.event.triggered !== e.type ?
- jQuery.event.dispatch.apply( elem, arguments ) : undefined;
- };
- }
-
- // Handle multiple events separated by a space
- types = ( types || "" ).match( 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 if the special events handler returns false
- if ( !special.setup ||
- special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
- if ( elem.addEventListener ) {
- elem.addEventListener( 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;
- }
-
- },
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
-
- var j, origCount, tmp,
- events, t, handleObj,
- special, handlers, type, namespaces, origType,
- elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
- if ( !elemData || !( events = elemData.events ) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( 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 data and the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- dataPriv.remove( elem, "handle events" );
- }
- },
-
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event );
-
- var i, j, ret, matched, handleObj,
- handlerQueue = [],
- args = slice.call( arguments ),
- handlers = ( dataPriv.get( 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.rnamespace || event.rnamespace.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 i, matches, sel, handleObj,
- handlerQueue = [],
- delegateCount = handlers.delegateCount,
- cur = event.target;
-
- // Support (at least): Chrome, IE9
- // Find delegate handlers
- // Black-hole SVG <use> instance trees (#13180)
- //
- // Support: Firefox<=42+
- // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
- if ( delegateCount && cur.nodeType &&
- ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
-
- for ( ; cur !== this; cur = cur.parentNode || this ) {
-
- // 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 ) > -1 :
- 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;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- props: ( "altKey bubbles cancelable ctrlKey currentTarget detail 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 offsetX offsetY pageX pageY " +
- "screenX screenY toElement" ).split( " " ),
- filter: function( event, original ) {
- var eventDoc, doc, body,
- button = original.button;
-
- // 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 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;
- }
- },
-
- 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: Cordova 2.5 (WebKit) (#13255)
- // All events should have a target; Cordova deviceready doesn't
- if ( !event.target ) {
- event.target = document;
- }
-
- // Support: Safari 6.0+, Chrome<28
- // Target should not be a text node (#504, #13143)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- return fixHook.filter ? fixHook.filter( event, originalEvent ) : 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 ) {
- this.focus();
- return false;
- }
- },
- 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 ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
- 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 ) {
-
- // Support: Firefox 20+
- // Firefox doesn't alert if the returnValue field is not set.
- if ( event.result !== undefined && event.originalEvent ) {
- event.originalEvent.returnValue = event.result;
- }
- }
- }
- }
-};
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
- // This "if" is needed for plain objects
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, 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.defaultPrevented === undefined &&
-
- // Support: Android<4.0
- src.returnValue === false ?
- 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 = {
- constructor: jQuery.Event,
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse,
-
- preventDefault: function() {
- var e = this.originalEvent;
-
- this.isDefaultPrevented = returnTrue;
-
- if ( e ) {
- e.preventDefault();
- }
- },
- stopPropagation: function() {
- var e = this.originalEvent;
-
- this.isPropagationStopped = returnTrue;
-
- if ( e ) {
- e.stopPropagation();
- }
- },
- stopImmediatePropagation: function() {
- var e = this.originalEvent;
-
- this.isImmediatePropagationStopped = returnTrue;
-
- if ( e ) {
- e.stopImmediatePropagation();
- }
-
- this.stopPropagation();
- }
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://code.google.com/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
- mouseenter: "mouseover",
- mouseleave: "mouseout",
- pointerenter: "pointerover",
- pointerleave: "pointerout"
-}, 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 mouseenter/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;
- }
- };
-} );
-
-jQuery.fn.extend( {
- on: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn );
- },
- one: function( types, selector, data, fn ) {
- return on( this, 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 );
- } );
- }
-} );
-
-
-var
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
-
- // Support: IE 10-11, Edge 10240+
- // In IE/Edge using regex groups here causes severe slowdowns.
- // See https://connect.microsoft.com/IE/feedback/details/1736512/
- rnoInnerhtml = /<script|<style|<link/i,
-
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptTypeMasked = /^true\/(.*)/,
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
- return jQuery.nodeName( elem, "table" ) &&
- jQuery.nodeName( content.nodeType !== 11 ? 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 = ( elem.getAttribute( "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;
-}
-
-function cloneCopyEvent( src, dest ) {
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
-
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // 1. Copy private data: events, handlers, etc.
- if ( dataPriv.hasData( src ) ) {
- pdataOld = dataPriv.access( src );
- pdataCur = dataPriv.set( dest, pdataOld );
- events = pdataOld.events;
-
- if ( events ) {
- delete pdataCur.handle;
- pdataCur.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
- }
-
- // 2. Copy user data
- if ( dataUser.hasData( src ) ) {
- udataOld = dataUser.access( src );
- udataCur = jQuery.extend( {}, udataOld );
-
- dataUser.set( dest, udataCur );
- }
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
- var nodeName = dest.nodeName.toLowerCase();
-
- // Fails to persist the checked state of a cloned checkbox or radio button.
- if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
- dest.checked = src.checked;
-
- // Fails to return the selected option to the default selected state when cloning options
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-}
-
-function domManip( collection, args, callback, ignored ) {
-
- // Flatten any nested arrays
- args = concat.apply( [], args );
-
- var fragment, first, scripts, hasScripts, node, doc,
- i = 0,
- l = collection.length,
- 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" &&
- !support.checkClone && rchecked.test( value ) ) ) {
- return collection.each( function( index ) {
- var self = collection.eq( index );
- if ( isFunction ) {
- args[ 0 ] = value.call( this, index, self.html() );
- }
- domManip( self, args, callback, ignored );
- } );
- }
-
- if ( l ) {
- fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
- first = fragment.firstChild;
-
- if ( fragment.childNodes.length === 1 ) {
- fragment = first;
- }
-
- // Require either new content or an interest in ignored elements to invoke the callback
- if ( first || ignored ) {
- 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 ) {
-
- // Support: Android<4.1, PhantomJS<2
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( scripts, getAll( node, "script" ) );
- }
- }
-
- callback.call( collection[ 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 || "" ) &&
- !dataPriv.access( node, "globalEval" ) &&
- jQuery.contains( doc, node ) ) {
-
- if ( node.src ) {
-
- // Optional AJAX dependency, but won't run scripts if not present
- if ( jQuery._evalUrl ) {
- jQuery._evalUrl( node.src );
- }
- } else {
- jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
- }
- }
- }
- }
- }
- }
-
- return collection;
-}
-
-function remove( elem, selector, keepData ) {
- var node,
- nodes = selector ? jQuery.filter( selector, elem ) : elem,
- i = 0;
-
- for ( ; ( node = nodes[ i ] ) != null; i++ ) {
- if ( !keepData && node.nodeType === 1 ) {
- jQuery.cleanData( getAll( node ) );
- }
-
- if ( node.parentNode ) {
- if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
- setGlobalEval( getAll( node, "script" ) );
- }
- node.parentNode.removeChild( node );
- }
- }
-
- return elem;
-}
-
-jQuery.extend( {
- htmlPrefilter: function( html ) {
- return html.replace( rxhtmlTag, "<$1></$2>" );
- },
-
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var i, l, srcElements, destElements,
- clone = elem.cloneNode( true ),
- inPage = jQuery.contains( elem.ownerDocument, elem );
-
- // Fix IE cloning issues
- if ( !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 );
-
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
- fixInput( srcElements[ i ], 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, l = srcElements.length; i < l; i++ ) {
- cloneCopyEvent( srcElements[ i ], destElements[ i ] );
- }
- } else {
- cloneCopyEvent( elem, clone );
- }
- }
-
- // Preserve script evaluation history
- destElements = getAll( clone, "script" );
- if ( destElements.length > 0 ) {
- setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
- }
-
- // Return the cloned set
- return clone;
- },
-
- cleanData: function( elems ) {
- var data, elem, type,
- special = jQuery.event.special,
- i = 0;
-
- for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
- if ( acceptData( elem ) ) {
- if ( ( data = elem[ dataPriv.expando ] ) ) {
- 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 );
- }
- }
- }
-
- // Support: Chrome <= 35-45+
- // Assign undefined instead of using delete, see Data#remove
- elem[ dataPriv.expando ] = undefined;
- }
- if ( elem[ dataUser.expando ] ) {
-
- // Support: Chrome <= 35-45+
- // Assign undefined instead of using delete, see Data#remove
- elem[ dataUser.expando ] = undefined;
- }
- }
- }
- }
-} );
-
-jQuery.fn.extend( {
-
- // Keep domManip exposed until 3.0 (gh-2225)
- domManip: domManip,
-
- detach: function( selector ) {
- return remove( this, selector, true );
- },
-
- remove: function( selector ) {
- return remove( this, selector );
- },
-
- text: function( value ) {
- return access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().each( function() {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- this.textContent = value;
- }
- } );
- }, null, value, arguments.length );
- },
-
- append: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.appendChild( elem );
- }
- } );
- },
-
- prepend: function() {
- return domManip( this, 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 domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this );
- }
- } );
- },
-
- after: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- }
- } );
- },
-
- empty: function() {
- var elem,
- i = 0;
-
- for ( ; ( elem = this[ i ] ) != null; i++ ) {
- if ( elem.nodeType === 1 ) {
-
- // Prevent memory leaks
- jQuery.cleanData( getAll( elem, false ) );
-
- // Remove any remaining nodes
- elem.textContent = "";
- }
- }
-
- 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 access( this, function( value ) {
- var elem = this[ 0 ] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined && elem.nodeType === 1 ) {
- return elem.innerHTML;
- }
-
- // See if we can take a shortcut and just use innerHTML
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
- value = jQuery.htmlPrefilter( value );
-
- try {
- for ( ; i < l; i++ ) {
- elem = this[ i ] || {};
-
- // Remove element nodes and prevent memory leaks
- 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 ignored = [];
-
- // Make the changes, replacing each non-ignored context element with the new content
- return domManip( this, arguments, function( elem ) {
- var parent = this.parentNode;
-
- if ( jQuery.inArray( this, ignored ) < 0 ) {
- jQuery.cleanData( getAll( this ) );
- if ( parent ) {
- parent.replaceChild( elem, this );
- }
- }
-
- // Force callback invocation
- }, ignored );
- }
-} );
-
-jQuery.each( {
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var elems,
- ret = [],
- insert = jQuery( selector ),
- last = insert.length - 1,
- i = 0;
-
- for ( ; i <= last; i++ ) {
- elems = i === last ? this : this.clone( true );
- jQuery( insert[ i ] )[ original ]( elems );
-
- // Support: QtWebKit
- // .get() because push.apply(_, arraylike) throws
- push.apply( ret, elems.get() );
- }
-
- return this.pushStack( ret );
- };
-} );
-
-
-var iframe,
- elemdisplay = {
-
- // Support: Firefox
- // We have to pre-define these values for FF (#10227)
- HTML: "block",
- BODY: "block"
- };
-
-/**
- * Retrieve the actual display of a element
- * @param {String} name nodeName of the element
- * @param {Object} doc Document object
- */
-
-// Called only from within defaultDisplay
-function actualDisplay( name, doc ) {
- var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-
- display = jQuery.css( elem[ 0 ], "display" );
-
- // We don't have any data stored on the element,
- // so use "detach" method as fast way to get rid of the element
- elem.detach();
-
- return display;
-}
-
-/**
- * Try to determine the default display value of an element
- * @param {String} nodeName
- */
-function 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'/>" ) )
- .appendTo( doc.documentElement );
-
- // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
- doc = iframe[ 0 ].contentDocument;
-
- // Support: IE
- doc.write();
- doc.close();
-
- display = actualDisplay( nodeName, doc );
- iframe.detach();
- }
-
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
- }
-
- return display;
-}
-var rmargin = ( /^margin/ );
-
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var getStyles = function( elem ) {
-
- // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
- // IE throws on elements created in popups
- // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
- var view = elem.ownerDocument.defaultView;
-
- if ( !view || !view.opener ) {
- view = window;
- }
-
- return view.getComputedStyle( elem );
- };
-
-var 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;
-};
-
-
-var documentElement = document.documentElement;
-
-
-
-( function() {
- var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
- container = document.createElement( "div" ),
- div = document.createElement( "div" );
-
- // Finish early in limited (non-browser) environments
- if ( !div.style ) {
- return;
- }
-
- // Support: IE9-11+
- // Style of cloned element affects source element cloned (#8908)
- div.style.backgroundClip = "content-box";
- div.cloneNode( true ).style.backgroundClip = "";
- support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
- container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
- "padding:0;margin-top:1px;position:absolute";
- container.appendChild( div );
-
- // Executing both pixelPosition & boxSizingReliable tests require only one layout
- // so they're executed at the same time to save the second computation.
- function computeStyleTests() {
- div.style.cssText =
-
- // Support: Firefox<29, Android 2.3
- // Vendor-prefix box-sizing
- "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" +
- "position:relative;display:block;" +
- "margin:auto;border:1px;padding:1px;" +
- "top:1%;width:50%";
- div.innerHTML = "";
- documentElement.appendChild( container );
-
- var divStyle = window.getComputedStyle( div );
- pixelPositionVal = divStyle.top !== "1%";
- reliableMarginLeftVal = divStyle.marginLeft === "2px";
- boxSizingReliableVal = divStyle.width === "4px";
-
- // Support: Android 4.0 - 4.3 only
- // Some styles come back with percentage values, even though they shouldn't
- div.style.marginRight = "50%";
- pixelMarginRightVal = divStyle.marginRight === "4px";
-
- documentElement.removeChild( container );
- }
-
- jQuery.extend( support, {
- pixelPosition: function() {
-
- // This test is executed only once but we still do memoizing
- // since we can use the boxSizingReliable pre-computing.
- // No need to check if the test was already performed, though.
- computeStyleTests();
- return pixelPositionVal;
- },
- boxSizingReliable: function() {
- if ( boxSizingReliableVal == null ) {
- computeStyleTests();
- }
- return boxSizingReliableVal;
- },
- pixelMarginRight: function() {
-
- // Support: Android 4.0-4.3
- // We're checking for boxSizingReliableVal here instead of pixelMarginRightVal
- // since that compresses better and they're computed together anyway.
- if ( boxSizingReliableVal == null ) {
- computeStyleTests();
- }
- return pixelMarginRightVal;
- },
- reliableMarginLeft: function() {
-
- // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
- if ( boxSizingReliableVal == null ) {
- computeStyleTests();
- }
- return reliableMarginLeftVal;
- },
- reliableMarginRight: function() {
-
- // Support: Android 2.3
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. (#3333)
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // This support function is only executed once so no memoizing is needed.
- var ret,
- marginDiv = div.appendChild( document.createElement( "div" ) );
-
- // Reset CSS: box-sizing; display; margin; border; padding
- marginDiv.style.cssText = div.style.cssText =
-
- // Support: Android 2.3
- // Vendor-prefix box-sizing
- "-webkit-box-sizing:content-box;box-sizing:content-box;" +
- "display:block;margin:0;border:0;padding:0";
- marginDiv.style.marginRight = marginDiv.style.width = "0";
- div.style.width = "1px";
- documentElement.appendChild( container );
-
- ret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight );
-
- documentElement.removeChild( container );
- div.removeChild( marginDiv );
-
- return ret;
- }
- } );
-} )();
-
-
-function curCSS( elem, name, computed ) {
- var width, minWidth, maxWidth, ret,
- style = elem.style;
-
- computed = computed || getStyles( elem );
- ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
-
- // Support: Opera 12.1x only
- // Fall back to style even without computed
- // computed is undefined for elems on document fragments
- if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
- ret = jQuery.style( elem, name );
- }
-
- // Support: IE9
- // getPropertyValue is only needed for .css('filter') (#12537)
- if ( computed ) {
-
- // A tribute to the "awesome hack by Dean Edwards"
- // Android Browser returns percentage for some values,
- // but width seems to be reliably pixels.
- // This is against the CSSOM draft spec:
- // http://dev.w3.org/csswg/cssom/#resolved-values
- if ( !support.pixelMarginRight() && 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 !== undefined ?
-
- // Support: IE9-11+
- // IE returns zIndex value as an integer.
- ret + "" :
- ret;
-}
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
- // Define the hook, we'll check on the first run if it's really needed.
- return {
- get: function() {
- if ( conditionFn() ) {
-
- // Hook not needed (or it's not possible to use it due
- // to missing dependency), remove it.
- delete this.get;
- return;
- }
-
- // Hook needed; redefine it so that the support test is not executed again.
- return ( this.get = hookFn ).apply( this, arguments );
- }
- };
-}
-
-
-var
-
- // 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]).+)/,
-
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssNormalTransform = {
- letterSpacing: "0",
- fontWeight: "400"
- },
-
- cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
- emptyStyle = document.createElement( "div" ).style;
-
-// Return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( name ) {
-
- // Shortcut for names that are not vendor prefixed
- if ( name in emptyStyle ) {
- return name;
- }
-
- // Check for vendor prefixed names
- var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
- i = cssPrefixes.length;
-
- while ( i-- ) {
- name = cssPrefixes[ i ] + capName;
- if ( name in emptyStyle ) {
- return name;
- }
- }
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-
- // Any relative (+/-) values have already been
- // normalized at this point
- var matches = rcssNum.exec( value );
- return matches ?
-
- // Guard against undefined "subtract", e.g., when used as in cssHooks
- Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "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.css( elem, "boxSizing", false, styles ) === "border-box";
-
- // Support: IE11 only
- // In IE 11 fullscreen elements inside of an iframe have
- // 100x too small dimensions (gh-1764).
- if ( document.msFullscreenElement && window.top !== window ) {
-
- // Support: IE11 only
- // Running getBoundingClientRect on a disconnected node
- // in IE throws an error.
- if ( elem.getClientRects().length ) {
- val = Math.round( elem.getBoundingClientRect()[ name ] * 100 );
- }
- }
-
- // 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;
- }
-
- // Check for style in case a browser which returns unreliable values
- // for getComputedStyle silently falls back to the reliable elem.style
- valueIsBorderBox = isBorderBox &&
- ( 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";
-}
-
-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 ] = dataPriv.get( 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 ] = dataPriv.access(
- elem,
- "olddisplay",
- defaultDisplay( elem.nodeName )
- );
- }
- } else {
- hidden = isHidden( elem );
-
- if ( display !== "none" || !hidden ) {
- dataPriv.set(
- 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.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: {
- "animationIterationCount": true,
- "columnCount": true,
- "fillOpacity": true,
- "flexGrow": true,
- "flexShrink": true,
- "fontWeight": true,
- "lineHeight": true,
- "opacity": true,
- "order": 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: {
- "float": "cssFloat"
- },
-
- // 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( origName ) || origName );
-
- // Gets hook for the prefixed version, then unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // Convert "+=" or "-=" to relative numbers (#7345)
- if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
- value = adjustCSS( elem, name, ret );
-
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that null and NaN values aren't set (#7116)
- if ( value == null || value !== value ) {
- return;
- }
-
- // If a number was passed in, add the unit (except for certain CSS properties)
- if ( type === "number" ) {
- value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
- }
-
- // Support: IE9-11+
- // background-* props affect original clone's values
- if ( !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 ) {
-
- style[ name ] = value;
- }
-
- } 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 val, num, hooks,
- origName = jQuery.camelCase( name );
-
- // Make sure that we're working with the right name
- name = jQuery.cssProps[ origName ] ||
- ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
- // Try prefixed name followed by the unprefixed name
- 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 ];
- }
-
- // Make numeric if forced or a qualifier was provided and val looks numeric
- if ( extra === "" || extra ) {
- num = parseFloat( val );
- return extra === true || isFinite( num ) ? num || 0 : val;
- }
- return val;
- }
-} );
-
-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
- // but it must have a current display style that would benefit
- return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
- elem.offsetWidth === 0 ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, name, extra );
- } ) :
- getWidthOrHeight( elem, name, extra );
- }
- },
-
- set: function( elem, value, extra ) {
- var matches,
- styles = extra && getStyles( elem ),
- subtract = extra && augmentWidthOrHeight(
- elem,
- name,
- extra,
- jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- styles
- );
-
- // Convert to pixels if value adjustment is needed
- if ( subtract && ( matches = rcssNum.exec( value ) ) &&
- ( matches[ 3 ] || "px" ) !== "px" ) {
-
- elem.style[ name ] = value;
- value = jQuery.css( elem, name );
- }
-
- return setPositiveNumber( elem, value, subtract );
- }
- };
-} );
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
- function( elem, computed ) {
- if ( computed ) {
- return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
- elem.getBoundingClientRect().left -
- swap( elem, { marginLeft: 0 }, function() {
- return elem.getBoundingClientRect().left;
- } )
- ) + "px";
- }
- }
-);
-
-// Support: Android 2.3
-jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
- function( elem, computed ) {
- if ( computed ) {
- return swap( elem, { "display": "inline-block" },
- curCSS, [ elem, "marginRight" ] );
- }
- }
-);
-
-// 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;
- }
-} );
-
-jQuery.fn.extend( {
- css: function( name, value ) {
- return access( this, function( elem, name, value ) {
- var styles, len,
- 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 ) {
- if ( typeof state === "boolean" ) {
- return state ? this.show() : this.hide();
- }
-
- return this.each( function() {
- if ( isHidden( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- } );
- }
-} );
-
-
-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 || jQuery.easing._default;
- 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;
-
- // Use a property on the element directly when it is not a DOM element,
- // or when there is no matching style property that exists.
- if ( tween.elem.nodeType !== 1 ||
- tween.elem[ tween.prop ] != null && 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.
- // 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 available and use plain properties where available.
- if ( jQuery.fx.step[ tween.prop ] ) {
- jQuery.fx.step[ tween.prop ]( tween );
- } else if ( tween.elem.nodeType === 1 &&
- ( 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: IE9
-// 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.easing = {
- linear: function( p ) {
- return p;
- },
- swing: function( p ) {
- return 0.5 - Math.cos( p * Math.PI ) / 2;
- },
- _default: "swing"
-};
-
-jQuery.fx = Tween.prototype.init;
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-
-
-
-var
- fxNow, timerId,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rrun = /queueHooks$/;
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- window.setTimeout( function() {
- fxNow = undefined;
- } );
- return ( fxNow = jQuery.now() );
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
- var which,
- i = 0,
- attrs = { height: type };
-
- // If we include width, step value is 1 to do all cssExpand values,
- // otherwise 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;
-}
-
-function createTween( value, prop, animation ) {
- var tween,
- collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.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 defaultPrefilter( elem, props, opts ) {
- /* jshint validthis: true */
- var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
- anim = this,
- orig = {},
- style = elem.style,
- hidden = elem.nodeType && isHidden( elem ),
- dataShow = dataPriv.get( 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() {
-
- // Ensure the complete handler is 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 IE9-10 do 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
- display = jQuery.css( elem, "display" );
-
- // Test default display if display is currently "none"
- checkDisplay = display === "none" ?
- dataPriv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
-
- if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
- style.display = "inline-block";
- }
- }
-
- if ( opts.overflow ) {
- style.overflow = "hidden";
- 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" ) ) {
-
- // If there is dataShow left over from a stopped hide or show
- // and we are going to proceed with show, we should pretend to be hidden
- if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
- hidden = true;
- } else {
- continue;
- }
- }
- orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-
- // Any non-fx value stops us from restoring the original display value
- } else {
- display = undefined;
- }
- }
-
- if ( !jQuery.isEmptyObject( orig ) ) {
- if ( dataShow ) {
- if ( "hidden" in dataShow ) {
- hidden = dataShow.hidden;
- }
- } else {
- dataShow = dataPriv.access( 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;
-
- dataPriv.remove( 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;
- }
- }
- }
-
- // If this is a noop like .hide().hide(), restore an overwritten display value
- } else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
- style.display = display;
- }
-}
-
-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 won't overwrite existing keys.
- // Reusing 'index' 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;
- }
- }
-}
-
-function Animation( elem, properties, options ) {
- var result,
- stopped,
- index = 0,
- length = Animation.prefilters.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 ),
-
- // Support: Android 2.3
- // 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: {},
- easing: jQuery.easing._default
- }, 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.notifyWith( elem, [ animation, 1, 0 ] );
- 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 = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
- if ( result ) {
- if ( jQuery.isFunction( result.stop ) ) {
- jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
- jQuery.proxy( result.stop, 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 );
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
- tweeners: {
- "*": [ function( prop, value ) {
- var tween = this.createTween( prop, value );
- adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
- return tween;
- } ]
- },
-
- tweener: function( props, callback ) {
- if ( jQuery.isFunction( props ) ) {
- callback = props;
- props = [ "*" ];
- } else {
- props = props.match( rnotwhite );
- }
-
- var prop,
- index = 0,
- length = props.length;
-
- for ( ; index < length ; index++ ) {
- prop = props[ index ];
- Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
- Animation.tweeners[ prop ].unshift( callback );
- }
- },
-
- prefilters: [ defaultPrefilter ],
-
- prefilter: function( callback, prepend ) {
- if ( prepend ) {
- Animation.prefilters.unshift( callback );
- } else {
- Animation.prefilters.push( 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.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 || dataPriv.get( 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 = dataPriv.get( 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 = dataPriv.get( 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;
- } );
- }
-} );
-
-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 );
- };
-} );
-
-// 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.timers = [];
-jQuery.fx.tick = function() {
- var timer,
- i = 0,
- timers = jQuery.timers;
-
- 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 ) {
- jQuery.timers.push( timer );
- if ( timer() ) {
- jQuery.fx.start();
- } else {
- jQuery.timers.pop();
- }
-};
-
-jQuery.fx.interval = 13;
-jQuery.fx.start = function() {
- if ( !timerId ) {
- timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
- }
-};
-
-jQuery.fx.stop = function() {
- window.clearInterval( timerId );
-
- timerId = null;
-};
-
-jQuery.fx.speeds = {
- slow: 600,
- fast: 200,
-
- // Default speed
- _default: 400
-};
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.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 = window.setTimeout( next, time );
- hooks.stop = function() {
- window.clearTimeout( timeout );
- };
- } );
-};
-
-
-( function() {
- var input = document.createElement( "input" ),
- select = document.createElement( "select" ),
- opt = select.appendChild( document.createElement( "option" ) );
-
- input.type = "checkbox";
-
- // Support: iOS<=5.1, Android<=4.2+
- // Default value for a checkbox should be "on"
- support.checkOn = input.value !== "";
-
- // Support: IE<=11+
- // Must access selectedIndex to make default options select
- support.optSelected = opt.selected;
-
- // Support: Android<=2.3
- // Options inside disabled selects are incorrectly marked as disabled
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Support: IE<=11+
- // An input loses its value after becoming a radio
- input = document.createElement( "input" );
- input.value = "t";
- input.type = "radio";
- support.radioValue = input.value === "t";
-} )();
-
-
-var boolHook,
- attrHandle = jQuery.expr.attrHandle;
-
-jQuery.fn.extend( {
- attr: function( name, value ) {
- return access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each( function() {
- jQuery.removeAttr( this, name );
- } );
- }
-} );
-
-jQuery.extend( {
- attr: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set attributes on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- 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 : undefined );
- }
-
- if ( value !== undefined ) {
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
- }
-
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- elem.setAttribute( name, value + "" );
- return value;
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- ret = jQuery.find.attr( elem, name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret == null ? undefined : ret;
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- if ( !support.radioValue && value === "radio" &&
- jQuery.nodeName( elem, "input" ) ) {
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- }
- },
-
- removeAttr: function( elem, value ) {
- var name, propName,
- i = 0,
- attrNames = value && value.match( 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
- elem[ propName ] = false;
- }
-
- elem.removeAttribute( name );
- }
- }
- }
-} );
-
-// 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 {
- elem.setAttribute( name, name );
- }
- return name;
- }
-};
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
- var getter = attrHandle[ name ] || jQuery.find.attr;
-
- attrHandle[ name ] = function( elem, name, isXML ) {
- var ret, handle;
- if ( !isXML ) {
-
- // Avoid an infinite loop by temporarily removing this function from the getter
- handle = attrHandle[ name ];
- attrHandle[ name ] = ret;
- ret = getter( elem, name, isXML ) != null ?
- name.toLowerCase() :
- null;
- attrHandle[ name ] = handle;
- }
- return ret;
- };
-} );
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button)$/i,
- rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
- prop: function( name, value ) {
- return access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- return this.each( function() {
- delete this[ jQuery.propFix[ name ] || name ];
- } );
- }
-} );
-
-jQuery.extend( {
- prop: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set properties on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- return ( elem[ name ] = value );
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- return 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;
- }
- }
- },
-
- propFix: {
- "for": "htmlFor",
- "class": "className"
- }
-} );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-if ( !support.optSelected ) {
- jQuery.propHooks.selected = {
- get: function( elem ) {
- var parent = elem.parentNode;
- if ( parent && parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- return null;
- },
- set: function( elem ) {
- var parent = elem.parentNode;
- if ( parent ) {
- parent.selectedIndex;
-
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- }
- };
-}
-
-jQuery.each( [
- "tabIndex",
- "readOnly",
- "maxLength",
- "cellSpacing",
- "cellPadding",
- "rowSpan",
- "colSpan",
- "useMap",
- "frameBorder",
- "contentEditable"
-], function() {
- jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-
-
-
-var rclass = /[\t\r\n\f]/g;
-
-function getClass( elem ) {
- return elem.getAttribute && elem.getAttribute( "class" ) || "";
-}
-
-jQuery.fn.extend( {
- addClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- if ( typeof value === "string" && value ) {
- classes = value.match( rnotwhite ) || [];
-
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
- cur = elem.nodeType === 1 &&
- ( " " + curValue + " " ).replace( rclass, " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
- cur += clazz + " ";
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = jQuery.trim( cur );
- if ( curValue !== finalValue ) {
- elem.setAttribute( "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- if ( !arguments.length ) {
- return this.attr( "class", "" );
- }
-
- if ( typeof value === "string" && value ) {
- classes = value.match( rnotwhite ) || [];
-
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
-
- // This expression is here for better compressibility (see addClass)
- cur = elem.nodeType === 1 &&
- ( " " + curValue + " " ).replace( rclass, " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
-
- // Remove *all* instances
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
- cur = cur.replace( " " + clazz + " ", " " );
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = jQuery.trim( cur );
- if ( curValue !== finalValue ) {
- elem.setAttribute( "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value;
-
- if ( typeof stateVal === "boolean" && type === "string" ) {
- return stateVal ? this.addClass( value ) : this.removeClass( value );
- }
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( i ) {
- jQuery( this ).toggleClass(
- value.call( this, i, getClass( this ), stateVal ),
- stateVal
- );
- } );
- }
-
- return this.each( function() {
- var className, i, self, classNames;
-
- if ( type === "string" ) {
-
- // Toggle individual class names
- i = 0;
- self = jQuery( this );
- classNames = value.match( rnotwhite ) || [];
-
- while ( ( className = classNames[ i++ ] ) ) {
-
- // Check each className given, space separated list
- if ( self.hasClass( className ) ) {
- self.removeClass( className );
- } else {
- self.addClass( className );
- }
- }
-
- // Toggle whole class name
- } else if ( value === undefined || type === "boolean" ) {
- className = getClass( this );
- if ( className ) {
-
- // Store className if set
- dataPriv.set( this, "__className__", 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.
- if ( this.setAttribute ) {
- this.setAttribute( "class",
- className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
- );
- }
- }
- } );
- },
-
- hasClass: function( selector ) {
- var className, elem,
- i = 0;
-
- className = " " + selector + " ";
- while ( ( elem = this[ i++ ] ) ) {
- if ( elem.nodeType === 1 &&
- ( " " + getClass( elem ) + " " ).replace( rclass, " " )
- .indexOf( className ) > -1
- ) {
- return true;
- }
- }
-
- return false;
- }
-} );
-
-
-
-
-var rreturn = /\r/g,
- rspaces = /[\x20\t\r\n\f]+/g;
-
-jQuery.fn.extend( {
- val: function( value ) {
- var hooks, ret, 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 ) {
-
- var val = jQuery.find.attr( elem, "value" );
- return val != null ?
- val :
-
- // Support: IE10-11+
- // option.text throws exceptions (#14686, #14858)
- // Strip and collapse whitespace
- // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
- jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
- }
- },
- 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 ];
-
- // IE8-9 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
- ( 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.valHooks.option.get( option ), values ) > -1
- ) {
- optionSet = true;
- }
- }
-
- // Force browsers to behave consistently when non-matching value is set
- if ( !optionSet ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- }
-} );
-
-// 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 ) > -1 );
- }
- }
- };
- if ( !support.checkOn ) {
- jQuery.valHooks[ this ].get = function( elem ) {
- return elem.getAttribute( "value" ) === null ? "on" : elem.value;
- };
- }
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
-
-jQuery.extend( jQuery.event, {
-
- trigger: function( event, data, elem, onlyHandlers ) {
-
- var i, cur, tmp, bubbleType, ontype, handle, special,
- eventPath = [ elem || document ],
- type = hasOwn.call( event, "type" ) ? event.type : event,
- namespaces = 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( "." ) > -1 ) {
-
- // 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.rnamespace = 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 = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
- dataPriv.get( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Native handler
- handle = ontype && cur[ ontype ];
- if ( handle && handle.apply && acceptData( cur ) ) {
- event.result = handle.apply( cur, data );
- if ( event.result === 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 ) &&
- acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Don't do default actions on window, that's where global variables be (#6170)
- if ( ontype && jQuery.isFunction( 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;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( tmp ) {
- elem[ ontype ] = tmp;
- }
- }
- }
- }
-
- return event.result;
- },
-
- // Piggyback on a donor event to simulate a different one
- simulate: function( type, elem, event ) {
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- {
- type: type,
- isSimulated: true
-
- // Previously, `originalEvent: {}` was set here, so stopPropagation call
- // would not be triggered on donor event, since in our own
- // jQuery.event.stopPropagation function we had a check for existence of
- // originalEvent.stopPropagation method, so, consequently it would be a noop.
- //
- // But now, this "simulate" function is used only for events
- // for which stopPropagation() is noop, so there is no need for that anymore.
- //
- // For the 1.x branch though, guard for "click" and "submit"
- // events is still used, but was moved to jQuery.event.stopPropagation function
- // because `originalEvent` should point to the original event for the constancy
- // with other events and for more focused logic
- }
- );
-
- jQuery.event.trigger( e, null, elem );
-
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
-
-} );
-
-jQuery.fn.extend( {
-
- 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 );
- }
- }
-} );
-
-
-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 );
- }
-} );
-
-
-
-
-support.focusin = "onfocusin" in window;
-
-
-// Support: Firefox
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome, Safari
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler on the document while someone wants focusin/focusout
- var handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- var doc = this.ownerDocument || this,
- attaches = dataPriv.access( doc, fix );
-
- if ( !attaches ) {
- doc.addEventListener( orig, handler, true );
- }
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
- },
- teardown: function() {
- var doc = this.ownerDocument || this,
- attaches = dataPriv.access( doc, fix ) - 1;
-
- if ( !attaches ) {
- doc.removeEventListener( orig, handler, true );
- dataPriv.remove( doc, fix );
-
- } else {
- dataPriv.access( doc, fix, attaches );
- }
- }
- };
- } );
-}
-var location = window.location;
-
-var nonce = jQuery.now();
-
-var rquery = ( /\?/ );
-
-
-
-// Support: Android 2.3
-// Workaround failure to string-cast null input
-jQuery.parseJSON = function( data ) {
- return JSON.parse( data + "" );
-};
-
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
- var xml;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
-
- // Support: IE9
- try {
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
-
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
-};
-
-
-var
- rhash = /#.*$/,
- rts = /([?&])_=[^&]*/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
-
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
-
- /* 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( "*" ),
-
- // Anchor tag for parsing the document origin
- originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
-
-// 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( 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 key, deep,
- 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;
-}
-
-/* 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 ct, type, finalDataType, firstDataType,
- 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 };
-}
-
-jQuery.extend( {
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {},
-
- ajaxSettings: {
- url: location.href,
- type: "GET",
- isLocal: rlocalProtocol.test( location.protocol ),
- 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: /\bxml\b/,
- html: /\bhtml/,
- json: /\bjson\b/
- },
-
- 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 transport,
-
- // URL without anti-cache param
- cacheURL,
-
- // Response headers
- responseHeadersString,
- responseHeaders,
-
- // timeout handle
- timeoutTimer,
-
- // Url cleanup var
- urlAnchor,
-
- // To know if global events are to be dispatched
- fireGlobals,
-
- // Loop variable
- i,
-
- // 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 (prefilters might expect it)
- // 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 || location.href ) + "" ).replace( rhash, "" )
- .replace( rprotocol, location.protocol + "//" );
-
- // 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( rnotwhite ) || [ "" ];
-
- // A cross-domain request is in order when the origin doesn't match the current origin.
- if ( s.crossDomain == null ) {
- urlAnchor = document.createElement( "a" );
-
- // Support: IE8-11+
- // IE throws exception if url is malformed, e.g. http://example.com:80x/
- try {
- urlAnchor.href = s.url;
-
- // Support: IE8-11+
- // Anchor's host property isn't correctly set when s.url is relative
- urlAnchor.href = urlAnchor.href;
- s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
- urlAnchor.protocol + "//" + urlAnchor.host;
- } catch ( e ) {
-
- // If there is an error parsing the URL, assume it is crossDomain,
- // it can be rejected by the transport if it is invalid
- s.crossDomain = true;
- }
- }
-
- // 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
- // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
- fireGlobals = jQuery.event && 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 += ( 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_=" + nonce++ ) :
-
- // Otherwise add one to the end
- cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + 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 ] );
- }
-
- // If request was aborted inside ajaxSend, stop there
- if ( state === 2 ) {
- return jqXHR;
- }
-
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = window.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 ) {
- window.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 {
-
- // Extract error from statusText and normalize 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;
- }
-
- // The url can be an options object (which then must have .url)
- return jQuery.ajax( jQuery.extend( {
- url: url,
- type: method,
- dataType: type,
- data: data,
- success: callback
- }, jQuery.isPlainObject( url ) && url ) );
- };
-} );
-
-
-jQuery._evalUrl = function( url ) {
- return jQuery.ajax( {
- url: url,
-
- // Make this explicit, since user can override this through ajaxSetup (#11264)
- type: "GET",
- dataType: "script",
- async: false,
- global: false,
- "throws": true
- } );
-};
-
-
-jQuery.fn.extend( {
- wrapAll: function( html ) {
- var wrap;
-
- 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
- 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.firstElementChild ) {
- elem = elem.firstElementChild;
- }
-
- 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();
- }
-} );
-
-
-jQuery.expr.filters.hidden = function( elem ) {
- return !jQuery.expr.filters.visible( elem );
-};
-jQuery.expr.filters.visible = function( elem ) {
-
- // Support: Opera <= 12.12
- // Opera reports offsetWidths and offsetHeights less than zero on some elements
- // Use OR instead of AND as the element is not visible if either is true
- // See tickets #10406 and #13132
- return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;
-};
-
-
-
-
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
- rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-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" && v != null ? 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 );
- }
-}
-
-// 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, "+" );
-};
-
-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 || !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();
- }
-} );
-
-
-jQuery.ajaxSettings.xhr = function() {
- try {
- return new window.XMLHttpRequest();
- } catch ( e ) {}
-};
-
-var xhrSuccessStatus = {
-
- // File protocol always yields status code 0, assume 200
- 0: 200,
-
- // Support: IE9
- // #1450: sometimes IE returns 1223 when it should be 204
- 1223: 204
- },
- xhrSupported = jQuery.ajaxSettings.xhr();
-
-support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-support.ajax = xhrSupported = !!xhrSupported;
-
-jQuery.ajaxTransport( function( options ) {
- var callback, errorCallback;
-
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( support.cors || xhrSupported && !options.crossDomain ) {
- return {
- send: function( headers, complete ) {
- var i,
- xhr = options.xhr();
-
- xhr.open(
- options.type,
- options.url,
- options.async,
- options.username,
- options.password
- );
-
- // Apply custom fields if provided
- if ( options.xhrFields ) {
- for ( i in options.xhrFields ) {
- xhr[ i ] = options.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( options.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( options.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 ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
- }
-
- // Set headers
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
-
- // Callback
- callback = function( type ) {
- return function() {
- if ( callback ) {
- callback = errorCallback = xhr.onload =
- xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
-
- if ( type === "abort" ) {
- xhr.abort();
- } else if ( type === "error" ) {
-
- // Support: IE9
- // On a manual native abort, IE9 throws
- // errors on any property access that is not readyState
- if ( typeof xhr.status !== "number" ) {
- complete( 0, "error" );
- } else {
- complete(
-
- // File: protocol always yields status 0; see #8605, #14207
- xhr.status,
- xhr.statusText
- );
- }
- } else {
- complete(
- xhrSuccessStatus[ xhr.status ] || xhr.status,
- xhr.statusText,
-
- // Support: IE9 only
- // IE9 has no XHR2 but throws on binary (trac-11426)
- // For XHR2 non-text, let the caller handle it (gh-2498)
- ( xhr.responseType || "text" ) !== "text" ||
- typeof xhr.responseText !== "string" ?
- { binary: xhr.response } :
- { text: xhr.responseText },
- xhr.getAllResponseHeaders()
- );
- }
- }
- };
- };
-
- // Listen to events
- xhr.onload = callback();
- errorCallback = xhr.onerror = callback( "error" );
-
- // Support: IE9
- // Use onreadystatechange to replace onabort
- // to handle uncaught aborts
- if ( xhr.onabort !== undefined ) {
- xhr.onabort = errorCallback;
- } else {
- xhr.onreadystatechange = function() {
-
- // Check readyState before timeout as it changes
- if ( xhr.readyState === 4 ) {
-
- // Allow onerror to be called first,
- // but that will not handle a native abort
- // Also, save errorCallback to a variable
- // as xhr.onerror cannot be accessed
- window.setTimeout( function() {
- if ( callback ) {
- errorCallback();
- }
- } );
- }
- };
- }
-
- // Create the abort callback
- callback = callback( "abort" );
-
- try {
-
- // Do send the request (this may raise an exception)
- xhr.send( options.hasContent && options.data || null );
- } catch ( e ) {
-
- // #14683: Only rethrow if this hasn't been notified as an error yet
- if ( callback ) {
- throw e;
- }
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback();
- }
- }
- };
- }
-} );
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup( {
- accepts: {
- script: "text/javascript, application/javascript, " +
- "application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /\b(?:java|ecma)script\b/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-} );
-
-// Handle cache's special case and crossDomain
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- }
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function( s ) {
-
- // This transport only deals with cross domain requests
- if ( s.crossDomain ) {
- var script, callback;
- return {
- send: function( _, complete ) {
- script = jQuery( "<script>" ).prop( {
- charset: s.scriptCharset,
- src: s.url
- } ).on(
- "load error",
- callback = function( evt ) {
- script.remove();
- callback = null;
- if ( evt ) {
- complete( evt.type === "error" ? 404 : 200, evt.type );
- }
- }
- );
-
- // Use native DOM manipulation to avoid our domManip AJAX trickery
- document.head.appendChild( script[ 0 ] );
- },
- abort: function() {
- if ( callback ) {
- callback();
- }
- }
- };
- }
-} );
-
-
-
-
-var oldCallbacks = [],
- rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup( {
- jsonp: "callback",
- jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( 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" ) === 0 &&
- 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 += ( 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() {
-
- // If previous value didn't exist - remove it
- if ( overwritten === undefined ) {
- jQuery( window ).removeProp( callbackName );
-
- // Otherwise restore preexisting value
- } else {
- 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";
- }
-} );
-
-
-
-
-// Argument "data" should be 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
-jQuery.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 = buildFragment( [ data ], context, scripts );
-
- if ( scripts && scripts.length ) {
- jQuery( scripts ).remove();
- }
-
- return jQuery.merge( [], parsed.childNodes );
-};
-
-
-// Keep a copy of the old load method
-var _load = jQuery.fn.load;
-
-/**
- * Load a url into a page
- */
-jQuery.fn.load = function( url, params, callback ) {
- if ( typeof url !== "string" && _load ) {
- return _load.apply( this, arguments );
- }
-
- var selector, type, response,
- self = this,
- off = url.indexOf( " " );
-
- if ( off > -1 ) {
- selector = jQuery.trim( url.slice( off ) );
- 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.
- // Make value of this field explicit since
- // user can override it through ajaxSetup method
- type: type || "GET",
- 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 );
-
- // If the request succeeds, this function gets "data", "status", "jqXHR"
- // but they are ignored because response was set above.
- // If it fails, this function gets "jqXHR", "status", "error"
- } ).always( callback && function( jqXHR, status ) {
- self.each( function() {
- callback.apply( self, 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.expr.filters.animated = function( elem ) {
- return jQuery.grep( jQuery.timers, function( fn ) {
- return elem === fn.elem;
- } ).length;
-};
-
-
-
-
-/**
- * Gets a window from an element
- */
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
-}
-
-jQuery.offset = {
- setOffset: function( elem, options, i ) {
- var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
- position = jQuery.css( elem, "position" ),
- curElem = jQuery( elem ),
- props = {};
-
- // Set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- curOffset = curElem.offset();
- curCSSTop = jQuery.css( elem, "top" );
- curCSSLeft = jQuery.css( elem, "left" );
- calculatePosition = ( position === "absolute" || position === "fixed" ) &&
- ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
- // 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 ) ) {
-
- // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
- options = options.call( elem, i, jQuery.extend( {}, 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( {
- offset: function( options ) {
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each( function( i ) {
- jQuery.offset.setOffset( this, options, i );
- } );
- }
-
- var docElem, win,
- elem = this[ 0 ],
- box = { top: 0, left: 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;
- }
-
- box = elem.getBoundingClientRect();
- win = getWindow( doc );
- return {
- top: box.top + win.pageYOffset - docElem.clientTop,
- left: box.left + win.pageXOffset - docElem.clientLeft
- };
- },
-
- position: function() {
- if ( !this[ 0 ] ) {
- return;
- }
-
- var offsetParent, offset,
- elem = this[ 0 ],
- parentOffset = { top: 0, left: 0 };
-
- // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
- // because it is its only offset parent
- if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
- // Assume getBoundingClientRect is there 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
- return {
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
- };
- },
-
- // This method will return documentElement in the following cases:
- // 1) For the element inside the iframe without offsetParent, this method will return
- // documentElement of the parent window
- // 2) For the hidden or detached element
- // 3) For body or html element, i.e. in case of the html node - it will return itself
- //
- // but those exceptions were never presented as a real life use-cases
- // and might be considered as more preferable results.
- //
- // This logic, however, is not guaranteed and can change at any point in the future
- offsetParent: function() {
- return this.map( function() {
- var offsetParent = this.offsetParent;
-
- while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
- offsetParent = offsetParent.offsetParent;
- }
-
- return offsetParent || documentElement;
- } );
- }
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
- var top = "pageYOffset" === prop;
-
- jQuery.fn[ method ] = function( val ) {
- return access( this, function( elem, method, val ) {
- var win = getWindow( elem );
-
- if ( val === undefined ) {
- return win ? win[ prop ] : elem[ method ];
- }
-
- if ( win ) {
- win.scrollTo(
- !top ? val : win.pageXOffset,
- top ? val : win.pageYOffset
- );
-
- } else {
- elem[ method ] = val;
- }
- }, method, val, arguments.length );
- };
-} );
-
-// Support: Safari<7-8+, Chrome<37-44+
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
- jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
- 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;
- }
- }
- );
-} );
-
-
-// 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 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
- 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 );
- };
- } );
-} );
-
-
-jQuery.fn.extend( {
-
- 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 );
- },
- size: function() {
- return this.length;
- }
-} );
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-
-
-
-// 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.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
- define( "jquery", [], function() {
- return jQuery;
- } );
-}
-
-
-
-var
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$;
-
-jQuery.noConflict = function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
- window.jQuery = window.$ = jQuery;
-}
-
-return jQuery;
-}));
diff --git a/examplesite/themes/hugof/static/js/what-input.js b/examplesite/themes/hugof/static/js/what-input.js
deleted file mode 100644
index 5d23671..0000000
--- a/examplesite/themes/hugof/static/js/what-input.js
+++ /dev/null
@@ -1,295 +0,0 @@
-window.whatInput = (function() {
-
- 'use strict';
-
- /*
- ---------------
- variables
- ---------------
- */
-
- // array of actively pressed keys
- var activeKeys = [];
-
- // cache document.body
- var body;
-
- // boolean: true if touch buffer timer is running
- var buffer = false;
-
- // the last used input type
- var currentInput = null;
-
- // `input` types that don't accept text
- var nonTypingInputs = [
- 'button',
- 'checkbox',
- 'file',
- 'image',
- 'radio',
- 'reset',
- 'submit'
- ];
-
- // detect version of mouse wheel event to use
- // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel
- var mouseWheel = detectWheel();
-
- // list of modifier keys commonly used with the mouse and
- // can be safely ignored to prevent false keyboard detection
- var ignoreMap = [
- 16, // shift
- 17, // control
- 18, // alt
- 91, // Windows key / left Apple cmd
- 93 // Windows menu / right Apple cmd
- ];
-
- // mapping of events to input types
- var inputMap = {
- 'keydown': 'keyboard',
- 'keyup': 'keyboard',
- 'mousedown': 'mouse',
- 'mousemove': 'mouse',
- 'MSPointerDown': 'pointer',
- 'MSPointerMove': 'pointer',
- 'pointerdown': 'pointer',
- 'pointermove': 'pointer',
- 'touchstart': 'touch'
- };
-
- // add correct mouse wheel event mapping to `inputMap`
- inputMap[detectWheel()] = 'mouse';
-
- // array of all used input types
- var inputTypes = [];
-
- // mapping of key codes to a common name
- var keyMap = {
- 9: 'tab',
- 13: 'enter',
- 16: 'shift',
- 27: 'esc',
- 32: 'space',
- 37: 'left',
- 38: 'up',
- 39: 'right',
- 40: 'down'
- };
-
- // map of IE 10 pointer events
- var pointerMap = {
- 2: 'touch',
- 3: 'touch', // treat pen like touch
- 4: 'mouse'
- };
-
- // touch buffer timer
- var timer;
-
-
- /*
- ---------------
- functions
- ---------------
- */
-
- // allows events that are also triggered to be filtered out for `touchstart`
- function eventBuffer() {
- clearTimer();
- setInput(event);
-
- buffer = true;
- timer = window.setTimeout(function() {
- buffer = false;
- }, 650);
- }
-
- function bufferedEvent(event) {
- if (!buffer) setInput(event);
- }
-
- function unBufferedEvent(event) {
- clearTimer();
- setInput(event);
- }
-
- function clearTimer() {
- window.clearTimeout(timer);
- }
-
- function setInput(event) {
- var eventKey = key(event);
- var value = inputMap[event.type];
- if (value === 'pointer') value = pointerType(event);
-
- // don't do anything if the value matches the input type already set
- if (currentInput !== value) {
- var eventTarget = target(event);
- var eventTargetNode = eventTarget.nodeName.toLowerCase();
- var eventTargetType = (eventTargetNode === 'input') ? eventTarget.getAttribute('type') : null;
-
- if (
- (// only if the user flag to allow typing in form fields isn't set
- !body.hasAttribute('data-whatinput-formtyping') &&
-
- // only if currentInput has a value
- currentInput &&
-
- // only if the input is `keyboard`
- value === 'keyboard' &&
-
- // not if the key is `TAB`
- keyMap[eventKey] !== 'tab' &&
-
- // only if the target is a form input that accepts text
- (
- eventTargetNode === 'textarea' ||
- eventTargetNode === 'select' ||
- (eventTargetNode === 'input' && nonTypingInputs.indexOf(eventTargetType) < 0)
- )) || (
- // ignore modifier keys
- ignoreMap.indexOf(eventKey) > -1
- )
- ) {
- // ignore keyboard typing
- } else {
- switchInput(value);
- }
- }
-
- if (value === 'keyboard') logKeys(eventKey);
- }
-
- function switchInput(string) {
- currentInput = string;
- body.setAttribute('data-whatinput', currentInput);
-
- if (inputTypes.indexOf(currentInput) === -1) inputTypes.push(currentInput);
- }
-
- function key(event) {
- return (event.keyCode) ? event.keyCode : event.which;
- }
-
- function target(event) {
- return event.target || event.srcElement;
- }
-
- function pointerType(event) {
- if (typeof event.pointerType === 'number') {
- return pointerMap[event.pointerType];
- } else {
- return (event.pointerType === 'pen') ? 'touch' : event.pointerType; // treat pen like touch
- }
- }
-
- // keyboard logging
- function logKeys(eventKey) {
- if (activeKeys.indexOf(keyMap[eventKey]) === -1 && keyMap[eventKey]) activeKeys.push(keyMap[eventKey]);
- }
-
- function unLogKeys(event) {
- var eventKey = key(event);
- var arrayPos = activeKeys.indexOf(keyMap[eventKey]);
-
- if (arrayPos !== -1) activeKeys.splice(arrayPos, 1);
- }
-
- function bindEvents() {
- body = document.body;
-
- // pointer events (mouse, pen, touch)
- if (window.PointerEvent) {
- body.addEventListener('pointerdown', bufferedEvent);
- body.addEventListener('pointermove', bufferedEvent);
- } else if (window.MSPointerEvent) {
- body.addEventListener('MSPointerDown', bufferedEvent);
- body.addEventListener('MSPointerMove', bufferedEvent);
- } else {
-
- // mouse events
- body.addEventListener('mousedown', bufferedEvent);
- body.addEventListener('mousemove', bufferedEvent);
-
- // touch events
- if ('ontouchstart' in window) {
- body.addEventListener('touchstart', eventBuffer);
- }
- }
-
- // mouse wheel
- body.addEventListener(mouseWheel, bufferedEvent);
-
- // keyboard events
- body.addEventListener('keydown', unBufferedEvent);
- body.addEventListener('keyup', unBufferedEvent);
- document.addEventListener('keyup', unLogKeys);
- }
-
-
- /*
- ---------------
- utilities
- ---------------
- */
-
- // detect version of mouse wheel event to use
- // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel
- function detectWheel() {
- return mouseWheel = 'onwheel' in document.createElement('div') ?
- 'wheel' : // Modern browsers support "wheel"
-
- document.onmousewheel !== undefined ?
- 'mousewheel' : // Webkit and IE support at least "mousewheel"
- 'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox
- }
-
-
- /*
- ---------------
- init
-
- don't start script unless browser cuts the mustard,
- also passes if polyfills are used
- ---------------
- */
-
- if (
- 'addEventListener' in window &&
- Array.prototype.indexOf
- ) {
-
- // if the dom is already ready already (script was placed at bottom of <body>)
- if (document.body) {
- bindEvents();
-
- // otherwise wait for the dom to load (script was placed in the <head>)
- } else {
- document.addEventListener('DOMContentLoaded', bindEvents);
- }
- }
-
-
- /*
- ---------------
- api
- ---------------
- */
-
- return {
-
- // returns string: the current input type
- ask: function() { return currentInput; },
-
- // returns array: currently pressed keys
- keys: function() { return activeKeys; },
-
- // returns array: all the detected input types
- types: function() { return inputTypes; },
-
- // accepts string: manually set the input type
- set: switchInput
- };
-
-}());
diff --git a/examplesite/themes/hugof/theme.toml b/examplesite/themes/hugof/theme.toml
deleted file mode 100644
index 0773047..0000000
--- a/examplesite/themes/hugof/theme.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-# theme.toml template for a Hugo theme
-# See https://github.com/spf13/hugoThemes#themetoml for an example
-
-name = "Hugof"
-license = "MIT"
-licenselink = "https://github.com/yourname/yourtheme/blob/master/LICENSE.md"
-description = "Hugo Foundation Starter"
-homepage = "https://github.com/hdcdstr8fwd/hugo-foundation"
-tags = ["hugo", "foundation"]
-features = ["foundation", "hugo", "mobile"]
-min_version = 0.17
-
-[author]
- name = "Howard Colin"
- homepage = "https://straightfwd.co.uk"
diff --git a/images/screenshot.png b/images/screenshot.png
deleted file mode 100644
index 4007a08..0000000
--- a/images/screenshot.png
+++ /dev/null
Binary files differ
diff --git a/images/tn.png b/images/tn.png
deleted file mode 100644
index 4b909f2..0000000
--- a/images/tn.png
+++ /dev/null
Binary files differ